diff options
author | Shawn Guo <shawn.guo@linaro.org> | 2011-09-28 05:16:06 -0400 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2011-10-04 04:55:06 -0400 |
commit | 41e7daf27a321848adcfcea9764ac8665133f3ea (patch) | |
tree | 9bc9f65b5a0b1a5b1e13ec31e2c919ca307eb559 | |
parent | ddd5f51bf661f49fb5f2be371ff1cf9cfe5fa98b (diff) |
arm/imx: remove cpu_is_xxx() from arch_idle()
This patch adds an idle hook imx_idle to be called in arch_idle().
Any soc that needs a customized idle implementation other than
cpu_do_idle() can set up this hook in soc specific call.
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | arch/arm/mach-imx/mm-imx3.c | 30 | ||||
-rw-r--r-- | arch/arm/mach-imx/pm-imx27.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-mx5/mm.c | 6 | ||||
-rw-r--r-- | arch/arm/mach-mx5/pm-imx5.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-mx5/system.c | 1 | ||||
-rw-r--r-- | arch/arm/plat-mxc/include/mach/common.h | 11 | ||||
-rw-r--r-- | arch/arm/plat-mxc/include/mach/mxc.h | 7 | ||||
-rw-r--r-- | arch/arm/plat-mxc/include/mach/system.h | 35 | ||||
-rw-r--r-- | arch/arm/plat-mxc/system.c | 2 |
9 files changed, 56 insertions, 41 deletions
diff --git a/arch/arm/mach-imx/mm-imx3.c b/arch/arm/mach-imx/mm-imx3.c index ffa33b4dedde..6fad0d62052e 100644 --- a/arch/arm/mach-imx/mm-imx3.c +++ b/arch/arm/mach-imx/mm-imx3.c | |||
@@ -30,6 +30,34 @@ | |||
30 | #include <mach/iomux-v3.h> | 30 | #include <mach/iomux-v3.h> |
31 | #include <mach/irqs.h> | 31 | #include <mach/irqs.h> |
32 | 32 | ||
33 | static void imx3_idle(void) | ||
34 | { | ||
35 | unsigned long reg = 0; | ||
36 | __asm__ __volatile__( | ||
37 | /* disable I and D cache */ | ||
38 | "mrc p15, 0, %0, c1, c0, 0\n" | ||
39 | "bic %0, %0, #0x00001000\n" | ||
40 | "bic %0, %0, #0x00000004\n" | ||
41 | "mcr p15, 0, %0, c1, c0, 0\n" | ||
42 | /* invalidate I cache */ | ||
43 | "mov %0, #0\n" | ||
44 | "mcr p15, 0, %0, c7, c5, 0\n" | ||
45 | /* clear and invalidate D cache */ | ||
46 | "mov %0, #0\n" | ||
47 | "mcr p15, 0, %0, c7, c14, 0\n" | ||
48 | /* WFI */ | ||
49 | "mov %0, #0\n" | ||
50 | "mcr p15, 0, %0, c7, c0, 4\n" | ||
51 | "nop\n" "nop\n" "nop\n" "nop\n" | ||
52 | "nop\n" "nop\n" "nop\n" | ||
53 | /* enable I and D cache */ | ||
54 | "mrc p15, 0, %0, c1, c0, 0\n" | ||
55 | "orr %0, %0, #0x00001000\n" | ||
56 | "orr %0, %0, #0x00000004\n" | ||
57 | "mcr p15, 0, %0, c1, c0, 0\n" | ||
58 | : "=r" (reg)); | ||
59 | } | ||
60 | |||
33 | void imx3_init_l2x0(void) | 61 | void imx3_init_l2x0(void) |
34 | { | 62 | { |
35 | void __iomem *l2x0_base; | 63 | void __iomem *l2x0_base; |
@@ -98,6 +126,7 @@ void __init imx31_init_early(void) | |||
98 | { | 126 | { |
99 | mxc_set_cpu_type(MXC_CPU_MX31); | 127 | mxc_set_cpu_type(MXC_CPU_MX31); |
100 | mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); | 128 | mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR)); |
129 | imx_idle = imx3_idle; | ||
101 | } | 130 | } |
102 | 131 | ||
103 | void __init imx35_init_early(void) | 132 | void __init imx35_init_early(void) |
@@ -105,6 +134,7 @@ void __init imx35_init_early(void) | |||
105 | mxc_set_cpu_type(MXC_CPU_MX35); | 134 | mxc_set_cpu_type(MXC_CPU_MX35); |
106 | mxc_iomux_v3_init(MX35_IO_ADDRESS(MX35_IOMUXC_BASE_ADDR)); | 135 | mxc_iomux_v3_init(MX35_IO_ADDRESS(MX35_IOMUXC_BASE_ADDR)); |
107 | mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR)); | 136 | mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR)); |
137 | imx_idle = imx3_idle; | ||
108 | } | 138 | } |
109 | 139 | ||
110 | void __init mx31_init_irq(void) | 140 | void __init mx31_init_irq(void) |
diff --git a/arch/arm/mach-imx/pm-imx27.c b/arch/arm/mach-imx/pm-imx27.c index acf17691d2cc..e455d2f855bf 100644 --- a/arch/arm/mach-imx/pm-imx27.c +++ b/arch/arm/mach-imx/pm-imx27.c | |||
@@ -11,7 +11,7 @@ | |||
11 | #include <linux/suspend.h> | 11 | #include <linux/suspend.h> |
12 | #include <linux/io.h> | 12 | #include <linux/io.h> |
13 | #include <mach/system.h> | 13 | #include <mach/system.h> |
14 | #include <mach/mx27.h> | 14 | #include <mach/hardware.h> |
15 | 15 | ||
16 | static int mx27_suspend_enter(suspend_state_t state) | 16 | static int mx27_suspend_enter(suspend_state_t state) |
17 | { | 17 | { |
diff --git a/arch/arm/mach-mx5/mm.c b/arch/arm/mach-mx5/mm.c index baea6e5cddd9..379593e19e33 100644 --- a/arch/arm/mach-mx5/mm.c +++ b/arch/arm/mach-mx5/mm.c | |||
@@ -21,6 +21,11 @@ | |||
21 | #include <mach/devices-common.h> | 21 | #include <mach/devices-common.h> |
22 | #include <mach/iomux-v3.h> | 22 | #include <mach/iomux-v3.h> |
23 | 23 | ||
24 | static void imx5_idle(void) | ||
25 | { | ||
26 | mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); | ||
27 | } | ||
28 | |||
24 | /* | 29 | /* |
25 | * Define the MX51 memory map. | 30 | * Define the MX51 memory map. |
26 | */ | 31 | */ |
@@ -56,6 +61,7 @@ void __init imx51_init_early(void) | |||
56 | mxc_set_cpu_type(MXC_CPU_MX51); | 61 | mxc_set_cpu_type(MXC_CPU_MX51); |
57 | mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR)); | 62 | mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR)); |
58 | mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); | 63 | mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR)); |
64 | imx_idle = imx5_idle; | ||
59 | } | 65 | } |
60 | 66 | ||
61 | void __init mx53_map_io(void) | 67 | void __init mx53_map_io(void) |
diff --git a/arch/arm/mach-mx5/pm-imx5.c b/arch/arm/mach-mx5/pm-imx5.c index e4529af0da72..0624fb8edffb 100644 --- a/arch/arm/mach-mx5/pm-imx5.c +++ b/arch/arm/mach-mx5/pm-imx5.c | |||
@@ -14,7 +14,8 @@ | |||
14 | #include <linux/err.h> | 14 | #include <linux/err.h> |
15 | #include <asm/cacheflush.h> | 15 | #include <asm/cacheflush.h> |
16 | #include <asm/tlbflush.h> | 16 | #include <asm/tlbflush.h> |
17 | #include <mach/system.h> | 17 | #include <mach/common.h> |
18 | #include <mach/hardware.h> | ||
18 | #include "crm_regs.h" | 19 | #include "crm_regs.h" |
19 | 20 | ||
20 | static struct clk *gpc_dvfs_clk; | 21 | static struct clk *gpc_dvfs_clk; |
diff --git a/arch/arm/mach-mx5/system.c b/arch/arm/mach-mx5/system.c index 76ae8dc33e00..144ebebc4a61 100644 --- a/arch/arm/mach-mx5/system.c +++ b/arch/arm/mach-mx5/system.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
15 | #include <mach/hardware.h> | 15 | #include <mach/hardware.h> |
16 | #include <mach/common.h> | ||
16 | #include "crm_regs.h" | 17 | #include "crm_regs.h" |
17 | 18 | ||
18 | /* set cpu low power mode before WFI instruction. This function is called | 19 | /* set cpu low power mode before WFI instruction. This function is called |
diff --git a/arch/arm/plat-mxc/include/mach/common.h b/arch/arm/plat-mxc/include/mach/common.h index 4e3d97890d69..afaa96733c9b 100644 --- a/arch/arm/plat-mxc/include/mach/common.h +++ b/arch/arm/plat-mxc/include/mach/common.h | |||
@@ -72,4 +72,15 @@ extern void mxc_arch_reset_init(void __iomem *); | |||
72 | extern void mx51_efikamx_reset(void); | 72 | extern void mx51_efikamx_reset(void); |
73 | extern int mx53_revision(void); | 73 | extern int mx53_revision(void); |
74 | extern int mx53_display_revision(void); | 74 | extern int mx53_display_revision(void); |
75 | |||
76 | enum mxc_cpu_pwr_mode { | ||
77 | WAIT_CLOCKED, /* wfi only */ | ||
78 | WAIT_UNCLOCKED, /* WAIT */ | ||
79 | WAIT_UNCLOCKED_POWER_OFF, /* WAIT + SRPG */ | ||
80 | STOP_POWER_ON, /* just STOP */ | ||
81 | STOP_POWER_OFF, /* STOP + SRPG */ | ||
82 | }; | ||
83 | |||
84 | extern void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode); | ||
85 | extern void (*imx_idle)(void); | ||
75 | #endif | 86 | #endif |
diff --git a/arch/arm/plat-mxc/include/mach/mxc.h b/arch/arm/plat-mxc/include/mach/mxc.h index 09879235a9f5..00a78193c681 100644 --- a/arch/arm/plat-mxc/include/mach/mxc.h +++ b/arch/arm/plat-mxc/include/mach/mxc.h | |||
@@ -183,13 +183,6 @@ struct cpu_op { | |||
183 | }; | 183 | }; |
184 | 184 | ||
185 | int tzic_enable_wake(int is_idle); | 185 | int tzic_enable_wake(int is_idle); |
186 | enum mxc_cpu_pwr_mode { | ||
187 | WAIT_CLOCKED, /* wfi only */ | ||
188 | WAIT_UNCLOCKED, /* WAIT */ | ||
189 | WAIT_UNCLOCKED_POWER_OFF, /* WAIT + SRPG */ | ||
190 | STOP_POWER_ON, /* just STOP */ | ||
191 | STOP_POWER_OFF, /* STOP + SRPG */ | ||
192 | }; | ||
193 | 186 | ||
194 | extern struct cpu_op *(*get_cpu_op)(int *op); | 187 | extern struct cpu_op *(*get_cpu_op)(int *op); |
195 | #endif | 188 | #endif |
diff --git a/arch/arm/plat-mxc/include/mach/system.h b/arch/arm/plat-mxc/include/mach/system.h index 51f02a9d41a3..cf88b3593fba 100644 --- a/arch/arm/plat-mxc/include/mach/system.h +++ b/arch/arm/plat-mxc/include/mach/system.h | |||
@@ -17,41 +17,12 @@ | |||
17 | #ifndef __ASM_ARCH_MXC_SYSTEM_H__ | 17 | #ifndef __ASM_ARCH_MXC_SYSTEM_H__ |
18 | #define __ASM_ARCH_MXC_SYSTEM_H__ | 18 | #define __ASM_ARCH_MXC_SYSTEM_H__ |
19 | 19 | ||
20 | #include <mach/hardware.h> | 20 | extern void (*imx_idle)(void); |
21 | #include <mach/common.h> | ||
22 | |||
23 | extern void mx5_cpu_lp_set(enum mxc_cpu_pwr_mode mode); | ||
24 | 21 | ||
25 | static inline void arch_idle(void) | 22 | static inline void arch_idle(void) |
26 | { | 23 | { |
27 | /* fix i.MX31 errata TLSbo65953 and i.MX35 errata ENGcm09472 */ | 24 | if (imx_idle != NULL) |
28 | if (cpu_is_mx31() || cpu_is_mx35()) { | 25 | (imx_idle)(); |
29 | unsigned long reg = 0; | ||
30 | __asm__ __volatile__( | ||
31 | /* disable I and D cache */ | ||
32 | "mrc p15, 0, %0, c1, c0, 0\n" | ||
33 | "bic %0, %0, #0x00001000\n" | ||
34 | "bic %0, %0, #0x00000004\n" | ||
35 | "mcr p15, 0, %0, c1, c0, 0\n" | ||
36 | /* invalidate I cache */ | ||
37 | "mov %0, #0\n" | ||
38 | "mcr p15, 0, %0, c7, c5, 0\n" | ||
39 | /* clear and invalidate D cache */ | ||
40 | "mov %0, #0\n" | ||
41 | "mcr p15, 0, %0, c7, c14, 0\n" | ||
42 | /* WFI */ | ||
43 | "mov %0, #0\n" | ||
44 | "mcr p15, 0, %0, c7, c0, 4\n" | ||
45 | "nop\n" "nop\n" "nop\n" "nop\n" | ||
46 | "nop\n" "nop\n" "nop\n" | ||
47 | /* enable I and D cache */ | ||
48 | "mrc p15, 0, %0, c1, c0, 0\n" | ||
49 | "orr %0, %0, #0x00001000\n" | ||
50 | "orr %0, %0, #0x00000004\n" | ||
51 | "mcr p15, 0, %0, c1, c0, 0\n" | ||
52 | : "=r" (reg)); | ||
53 | } else if (cpu_is_mx51()) | ||
54 | mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); | ||
55 | else | 26 | else |
56 | cpu_do_idle(); | 27 | cpu_do_idle(); |
57 | } | 28 | } |
diff --git a/arch/arm/plat-mxc/system.c b/arch/arm/plat-mxc/system.c index 8024f2ac177c..5fa03e7548ee 100644 --- a/arch/arm/plat-mxc/system.c +++ b/arch/arm/plat-mxc/system.c | |||
@@ -28,6 +28,8 @@ | |||
28 | #include <asm/system.h> | 28 | #include <asm/system.h> |
29 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
30 | 30 | ||
31 | void (*imx_idle)(void) = NULL; | ||
32 | |||
31 | static void __iomem *wdog_base; | 33 | static void __iomem *wdog_base; |
32 | 34 | ||
33 | /* | 35 | /* |