~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/mips/lantiq/xway/pmu.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  This program is free software; you can redistribute it and/or modify it
 
3
 *  under the terms of the GNU General Public License version 2 as published
 
4
 *  by the Free Software Foundation.
 
5
 *
 
6
 *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
 
7
 */
 
8
 
 
9
#include <linux/kernel.h>
 
10
#include <linux/module.h>
 
11
#include <linux/ioport.h>
 
12
 
 
13
#include <lantiq_soc.h>
 
14
 
 
15
/* PMU - the power management unit allows us to turn part of the core
 
16
 * on and off
 
17
 */
 
18
 
 
19
/* the enable / disable registers */
 
20
#define LTQ_PMU_PWDCR   0x1C
 
21
#define LTQ_PMU_PWDSR   0x20
 
22
 
 
23
#define ltq_pmu_w32(x, y)       ltq_w32((x), ltq_pmu_membase + (y))
 
24
#define ltq_pmu_r32(x)          ltq_r32(ltq_pmu_membase + (x))
 
25
 
 
26
static struct resource ltq_pmu_resource = {
 
27
        .name   = "pmu",
 
28
        .start  = LTQ_PMU_BASE_ADDR,
 
29
        .end    = LTQ_PMU_BASE_ADDR + LTQ_PMU_SIZE - 1,
 
30
        .flags  = IORESOURCE_MEM,
 
31
};
 
32
 
 
33
static void __iomem *ltq_pmu_membase;
 
34
 
 
35
void ltq_pmu_enable(unsigned int module)
 
36
{
 
37
        int err = 1000000;
 
38
 
 
39
        ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) & ~module, LTQ_PMU_PWDCR);
 
40
        do {} while (--err && (ltq_pmu_r32(LTQ_PMU_PWDSR) & module));
 
41
 
 
42
        if (!err)
 
43
                panic("activating PMU module failed!\n");
 
44
}
 
45
EXPORT_SYMBOL(ltq_pmu_enable);
 
46
 
 
47
void ltq_pmu_disable(unsigned int module)
 
48
{
 
49
        ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) | module, LTQ_PMU_PWDCR);
 
50
}
 
51
EXPORT_SYMBOL(ltq_pmu_disable);
 
52
 
 
53
int __init ltq_pmu_init(void)
 
54
{
 
55
        if (insert_resource(&iomem_resource, &ltq_pmu_resource) < 0)
 
56
                panic("Failed to insert pmu memory\n");
 
57
 
 
58
        if (request_mem_region(ltq_pmu_resource.start,
 
59
                        resource_size(&ltq_pmu_resource), "pmu") < 0)
 
60
                panic("Failed to request pmu memory\n");
 
61
 
 
62
        ltq_pmu_membase = ioremap_nocache(ltq_pmu_resource.start,
 
63
                                resource_size(&ltq_pmu_resource));
 
64
        if (!ltq_pmu_membase)
 
65
                panic("Failed to remap pmu memory\n");
 
66
        return 0;
 
67
}
 
68
 
 
69
core_initcall(ltq_pmu_init);