diff options
author | JungHi Min <junghi.min@samsung.com> | 2011-07-16 00:39:09 -0400 |
---|---|---|
committer | Kukjin Kim <kgene.kim@samsung.com> | 2011-07-20 10:36:19 -0400 |
commit | 911c29b0e5b299e39ed7875bb96906a9ef8617aa (patch) | |
tree | cc2de5a43e2c5080c536ff6599cc65c9ee05675b /arch/arm/mach-exynos4 | |
parent | 55981f7b3cc9885d300637ea590148db329cb741 (diff) |
ARM: EXYNOS4: Add support Core1 Power On/Off with hotplug in/out
To insert the code for power on/off with pmu control to support hotplug in/out core1
As for hotplug.c, the codes for core1 to be hotplug in/out is inserted.
As for regs-pmu.h, S5P_CORE_LOCAL_PWR_EN is defined.
As for platsmp.c, the codes for core1 to be powered on is inserted.
Signed-off-by: JungHi Min <junghi.min@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Diffstat (limited to 'arch/arm/mach-exynos4')
-rw-r--r-- | arch/arm/mach-exynos4/hotplug.c | 13 | ||||
-rw-r--r-- | arch/arm/mach-exynos4/include/mach/regs-pmu.h | 1 | ||||
-rw-r--r-- | arch/arm/mach-exynos4/platsmp.c | 30 |
3 files changed, 38 insertions, 6 deletions
diff --git a/arch/arm/mach-exynos4/hotplug.c b/arch/arm/mach-exynos4/hotplug.c index 2b5909e2ccd3..7490789784c9 100644 --- a/arch/arm/mach-exynos4/hotplug.c +++ b/arch/arm/mach-exynos4/hotplug.c | |||
@@ -13,9 +13,12 @@ | |||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
15 | #include <linux/smp.h> | 15 | #include <linux/smp.h> |
16 | #include <linux/io.h> | ||
16 | 17 | ||
17 | #include <asm/cacheflush.h> | 18 | #include <asm/cacheflush.h> |
18 | 19 | ||
20 | #include <mach/regs-pmu.h> | ||
21 | |||
19 | extern volatile int pen_release; | 22 | extern volatile int pen_release; |
20 | 23 | ||
21 | static inline void cpu_enter_lowpower(void) | 24 | static inline void cpu_enter_lowpower(void) |
@@ -58,12 +61,12 @@ static inline void cpu_leave_lowpower(void) | |||
58 | 61 | ||
59 | static inline void platform_do_lowpower(unsigned int cpu, int *spurious) | 62 | static inline void platform_do_lowpower(unsigned int cpu, int *spurious) |
60 | { | 63 | { |
61 | /* | ||
62 | * there is no power-control hardware on this platform, so all | ||
63 | * we can do is put the core into WFI; this is safe as the calling | ||
64 | * code will have already disabled interrupts | ||
65 | */ | ||
66 | for (;;) { | 64 | for (;;) { |
65 | |||
66 | /* make cpu1 to be turned off at next WFI command */ | ||
67 | if (cpu == 1) | ||
68 | __raw_writel(0, S5P_ARM_CORE1_CONFIGURATION); | ||
69 | |||
67 | /* | 70 | /* |
68 | * here's the WFI | 71 | * here's the WFI |
69 | */ | 72 | */ |
diff --git a/arch/arm/mach-exynos4/include/mach/regs-pmu.h b/arch/arm/mach-exynos4/include/mach/regs-pmu.h index a9643371f8e7..fa49bbb8e7b0 100644 --- a/arch/arm/mach-exynos4/include/mach/regs-pmu.h +++ b/arch/arm/mach-exynos4/include/mach/regs-pmu.h | |||
@@ -158,6 +158,7 @@ | |||
158 | #define S5P_PMU_GPS_CONF S5P_PMUREG(0x3CE0) | 158 | #define S5P_PMU_GPS_CONF S5P_PMUREG(0x3CE0) |
159 | 159 | ||
160 | #define S5P_PMU_SATA_PHY_CONTROL_EN 0x1 | 160 | #define S5P_PMU_SATA_PHY_CONTROL_EN 0x1 |
161 | #define S5P_CORE_LOCAL_PWR_EN 0x3 | ||
161 | #define S5P_INT_LOCAL_PWR_EN 0x7 | 162 | #define S5P_INT_LOCAL_PWR_EN 0x7 |
162 | 163 | ||
163 | #define S5P_CHECK_SLEEP 0x00000BAD | 164 | #define S5P_CHECK_SLEEP 0x00000BAD |
diff --git a/arch/arm/mach-exynos4/platsmp.c b/arch/arm/mach-exynos4/platsmp.c index a79863cb7f79..a7f312c12893 100644 --- a/arch/arm/mach-exynos4/platsmp.c +++ b/arch/arm/mach-exynos4/platsmp.c | |||
@@ -28,9 +28,12 @@ | |||
28 | 28 | ||
29 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
30 | #include <mach/regs-clock.h> | 30 | #include <mach/regs-clock.h> |
31 | #include <mach/regs-pmu.h> | ||
31 | 32 | ||
32 | extern void exynos4_secondary_startup(void); | 33 | extern void exynos4_secondary_startup(void); |
33 | 34 | ||
35 | #define CPU1_BOOT_REG S5P_VA_SYSRAM | ||
36 | |||
34 | /* | 37 | /* |
35 | * control for which core is the next to come out of the secondary | 38 | * control for which core is the next to come out of the secondary |
36 | * boot "holding pen" | 39 | * boot "holding pen" |
@@ -125,16 +128,41 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) | |||
125 | */ | 128 | */ |
126 | write_pen_release(cpu); | 129 | write_pen_release(cpu); |
127 | 130 | ||
131 | if (!(__raw_readl(S5P_ARM_CORE1_STATUS) & S5P_CORE_LOCAL_PWR_EN)) { | ||
132 | __raw_writel(S5P_CORE_LOCAL_PWR_EN, | ||
133 | S5P_ARM_CORE1_CONFIGURATION); | ||
134 | |||
135 | timeout = 10; | ||
136 | |||
137 | /* wait max 10 ms until cpu1 is on */ | ||
138 | while ((__raw_readl(S5P_ARM_CORE1_STATUS) | ||
139 | & S5P_CORE_LOCAL_PWR_EN) != S5P_CORE_LOCAL_PWR_EN) { | ||
140 | if (timeout-- == 0) | ||
141 | break; | ||
142 | |||
143 | mdelay(1); | ||
144 | } | ||
145 | |||
146 | if (timeout == 0) { | ||
147 | printk(KERN_ERR "cpu1 power enable failed"); | ||
148 | spin_unlock(&boot_lock); | ||
149 | return -ETIMEDOUT; | ||
150 | } | ||
151 | } | ||
128 | /* | 152 | /* |
129 | * Send the secondary CPU a soft interrupt, thereby causing | 153 | * Send the secondary CPU a soft interrupt, thereby causing |
130 | * the boot monitor to read the system wide flags register, | 154 | * the boot monitor to read the system wide flags register, |
131 | * and branch to the address found there. | 155 | * and branch to the address found there. |
132 | */ | 156 | */ |
133 | gic_raise_softirq(cpumask_of(cpu), 1); | ||
134 | 157 | ||
135 | timeout = jiffies + (1 * HZ); | 158 | timeout = jiffies + (1 * HZ); |
136 | while (time_before(jiffies, timeout)) { | 159 | while (time_before(jiffies, timeout)) { |
137 | smp_rmb(); | 160 | smp_rmb(); |
161 | |||
162 | __raw_writel(BSYM(virt_to_phys(exynos4_secondary_startup)), | ||
163 | CPU1_BOOT_REG); | ||
164 | gic_raise_softirq(cpumask_of(cpu), 1); | ||
165 | |||
138 | if (pen_release == -1) | 166 | if (pen_release == -1) |
139 | break; | 167 | break; |
140 | 168 | ||