[PATCH] arm: exynos: Modify pm code to check for cortex A9 rather than the SoC
Kukjin Kim
kgene.kim at samsung.com
Mon Jun 16 19:50:22 PDT 2014
Abhilash Kesavan wrote:
>
> We have an soc check to ensure that the scu and certain A9 specific
> registers are not accessed on Exynos5250 (which is A15 based).
> Rather than adding another soc specific check for 5420 let us test
> for the Cortex A9 primary part number.
>
> This resolves the below crash seen on exynos5420 during core switching
> after the CPUIdle consolidation series was merged.
>
> [ 155.975589] [<c0013174>] (scu_enable) from [<c001b0dc>]
> (exynos_cpu_pm_notifier+0x80/0xc4)
> [ 155.983833] [<c001b0dc>] (exynos_cpu_pm_notifier) from [<c003c1b0>]
> (notifier_call_chain+0x44/0x84)
> [ 155.992851] [<c003c1b0>] (notifier_call_chain) from [<c007a49c>]
> (cpu_pm_notify+0x20/0x3c)
> [ 156.001089] [<c007a49c>] (cpu_pm_notify) from [<c007a564>] (cpu_pm_exit+0x20/0x38)
> [ 156.008635] [<c007a564>] (cpu_pm_exit) from [<c0019e98>]
> (bL_switcher_thread+0x298/0x40c)
> [ 156.016788] [<c0019e98>] (bL_switcher_thread) from [<c003842c>] (kthread+0xcc/0xe8)
> [ 156.024426] [<c003842c>] (kthread) from [<c000e438>] (ret_from_fork+0x14/0x3c)
> [ 156.031621] Code: ea017fec c0530a00 c052e3f8 c0012dcc (e5903000
>
> Signed-off-by: Abhilash Kesavan <a.kesavan at samsung.com>
> ---
> arch/arm/mach-exynos/pm.c | 15 +++++++++------
> 1 file changed, 9 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/mach-exynos/pm.c b/arch/arm/mach-exynos/pm.c
> index d10c351..6dd4a11 100644
> --- a/arch/arm/mach-exynos/pm.c
> +++ b/arch/arm/mach-exynos/pm.c
> @@ -300,7 +300,7 @@ static int exynos_pm_suspend(void)
> tmp = (S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0);
> __raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION);
>
> - if (!soc_is_exynos5250())
> + if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9)
> exynos_cpu_save_register();
>
> return 0;
> @@ -334,7 +334,7 @@ static void exynos_pm_resume(void)
> if (exynos_pm_central_resume())
> goto early_wakeup;
>
> - if (!soc_is_exynos5250())
> + if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9)
> exynos_cpu_restore_register();
>
> /* For release retention */
> @@ -353,7 +353,7 @@ static void exynos_pm_resume(void)
>
> s3c_pm_do_restore_core(exynos_core_save, ARRAY_SIZE(exynos_core_save));
>
> - if (!soc_is_exynos5250())
> + if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9)
> scu_enable(S5P_VA_SCU);
>
> early_wakeup:
> @@ -440,15 +440,18 @@ static int exynos_cpu_pm_notifier(struct notifier_block *self,
> case CPU_PM_ENTER:
> if (cpu == 0) {
> exynos_pm_central_suspend();
> - exynos_cpu_save_register();
> + if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A9)
> + exynos_cpu_save_register();
> }
> break;
>
> case CPU_PM_EXIT:
> if (cpu == 0) {
> - if (!soc_is_exynos5250())
> + if (read_cpuid_part_number() ==
> + ARM_CPU_PART_CORTEX_A9) {
> scu_enable(S5P_VA_SCU);
> - exynos_cpu_restore_register();
> + exynos_cpu_restore_register();
> + }
> exynos_pm_central_resume();
> }
> break;
> --
> 1.7.9.5
Yes, looks good to me.
I've applied this into fixes for 3.16.
Thanks,
Kukjin
More information about the linux-arm-kernel
mailing list