diff options
author | Joseph Lo <josephl@nvidia.com> | 2012-10-31 05:41:15 -0400 |
---|---|---|
committer | Stephen Warren <swarren@nvidia.com> | 2012-11-15 17:09:20 -0500 |
commit | 0b25e25bef0e03c0465c3eb1119b32cb906db689 (patch) | |
tree | 1a36d929038a7f4e4c0fccc3b4ad8e126d787be3 /arch/arm/mach-tegra/cpuidle.c | |
parent | 641b4ef8f1fea88803cc1ff3f34d93ba6bcd8106 (diff) |
ARM: tegra: cpuidle: separate cpuidle driver for different chips
The different Tegra chips may have different CPU idle states and data.
Individual CPU idle driver make it more easy to maintain.
Signed-off-by: Joseph Lo <josephl@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/cpuidle.c')
-rw-r--r-- | arch/arm/mach-tegra/cpuidle.c | 47 |
1 files changed, 13 insertions, 34 deletions
diff --git a/arch/arm/mach-tegra/cpuidle.c b/arch/arm/mach-tegra/cpuidle.c index 4e0b07c7963c..d0651397aec7 100644 --- a/arch/arm/mach-tegra/cpuidle.c +++ b/arch/arm/mach-tegra/cpuidle.c | |||
@@ -23,47 +23,26 @@ | |||
23 | 23 | ||
24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/cpuidle.h> | ||
27 | 26 | ||
28 | #include <asm/cpuidle.h> | 27 | #include "fuse.h" |
29 | 28 | #include "cpuidle.h" | |
30 | struct cpuidle_driver tegra_idle_driver = { | ||
31 | .name = "tegra_idle", | ||
32 | .owner = THIS_MODULE, | ||
33 | .en_core_tk_irqen = 1, | ||
34 | .state_count = 1, | ||
35 | .states = { | ||
36 | [0] = ARM_CPUIDLE_WFI_STATE_PWR(600), | ||
37 | }, | ||
38 | }; | ||
39 | |||
40 | static DEFINE_PER_CPU(struct cpuidle_device, tegra_idle_device); | ||
41 | 29 | ||
42 | static int __init tegra_cpuidle_init(void) | 30 | static int __init tegra_cpuidle_init(void) |
43 | { | 31 | { |
44 | int ret; | 32 | int ret; |
45 | unsigned int cpu; | ||
46 | struct cpuidle_device *dev; | ||
47 | struct cpuidle_driver *drv = &tegra_idle_driver; | ||
48 | 33 | ||
49 | ret = cpuidle_register_driver(&tegra_idle_driver); | 34 | switch (tegra_chip_id) { |
50 | if (ret) { | 35 | case TEGRA20: |
51 | pr_err("CPUidle driver registration failed\n"); | 36 | ret = tegra20_cpuidle_init(); |
52 | return ret; | 37 | break; |
38 | case TEGRA30: | ||
39 | ret = tegra30_cpuidle_init(); | ||
40 | break; | ||
41 | default: | ||
42 | ret = -ENODEV; | ||
43 | break; | ||
53 | } | 44 | } |
54 | 45 | ||
55 | for_each_possible_cpu(cpu) { | 46 | return ret; |
56 | dev = &per_cpu(tegra_idle_device, cpu); | ||
57 | dev->cpu = cpu; | ||
58 | |||
59 | dev->state_count = drv->state_count; | ||
60 | ret = cpuidle_register_device(dev); | ||
61 | if (ret) { | ||
62 | pr_err("CPU%u: CPUidle device registration failed\n", | ||
63 | cpu); | ||
64 | return ret; | ||
65 | } | ||
66 | } | ||
67 | return 0; | ||
68 | } | 47 | } |
69 | device_initcall(tegra_cpuidle_init); | 48 | device_initcall(tegra_cpuidle_init); |