diff options
Diffstat (limited to 'arch/arm/mach-exynos/mcpm-exynos.c')
-rw-r--r-- | arch/arm/mach-exynos/mcpm-exynos.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/arch/arm/mach-exynos/mcpm-exynos.c b/arch/arm/mach-exynos/mcpm-exynos.c index 9bdf54795f05..56978199c479 100644 --- a/arch/arm/mach-exynos/mcpm-exynos.c +++ b/arch/arm/mach-exynos/mcpm-exynos.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/cputype.h> | 20 | #include <asm/cputype.h> |
21 | #include <asm/cp15.h> | 21 | #include <asm/cp15.h> |
22 | #include <asm/mcpm.h> | 22 | #include <asm/mcpm.h> |
23 | #include <asm/smp_plat.h> | ||
23 | 24 | ||
24 | #include "regs-pmu.h" | 25 | #include "regs-pmu.h" |
25 | #include "common.h" | 26 | #include "common.h" |
@@ -70,7 +71,31 @@ static int exynos_cpu_powerup(unsigned int cpu, unsigned int cluster) | |||
70 | cluster >= EXYNOS5420_NR_CLUSTERS) | 71 | cluster >= EXYNOS5420_NR_CLUSTERS) |
71 | return -EINVAL; | 72 | return -EINVAL; |
72 | 73 | ||
73 | exynos_cpu_power_up(cpunr); | 74 | if (!exynos_cpu_power_state(cpunr)) { |
75 | exynos_cpu_power_up(cpunr); | ||
76 | |||
77 | /* | ||
78 | * This assumes the cluster number of the big cores(Cortex A15) | ||
79 | * is 0 and the Little cores(Cortex A7) is 1. | ||
80 | * When the system was booted from the Little core, | ||
81 | * they should be reset during power up cpu. | ||
82 | */ | ||
83 | if (cluster && | ||
84 | cluster == MPIDR_AFFINITY_LEVEL(cpu_logical_map(0), 1)) { | ||
85 | /* | ||
86 | * Before we reset the Little cores, we should wait | ||
87 | * the SPARE2 register is set to 1 because the init | ||
88 | * codes of the iROM will set the register after | ||
89 | * initialization. | ||
90 | */ | ||
91 | while (!pmu_raw_readl(S5P_PMU_SPARE2)) | ||
92 | udelay(10); | ||
93 | |||
94 | pmu_raw_writel(EXYNOS5420_KFC_CORE_RESET(cpu), | ||
95 | EXYNOS_SWRESET); | ||
96 | } | ||
97 | } | ||
98 | |||
74 | return 0; | 99 | return 0; |
75 | } | 100 | } |
76 | 101 | ||