The CPU hotplug needs accessing the PMSU register through the CPU Idle
functions. If we fail accessing these registers we need disabling
the CPU hotplug.

Cc: <[email protected]> # v3.17+
Signed-off-by: Gregory CLEMENT <[email protected]>
---
 arch/arm/mach-mvebu/pmsu.c | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/arch/arm/mach-mvebu/pmsu.c b/arch/arm/mach-mvebu/pmsu.c
index d8ab605a44fa..0a8e2f548466 100644
--- a/arch/arm/mach-mvebu/pmsu.c
+++ b/arch/arm/mach-mvebu/pmsu.c
@@ -159,6 +159,11 @@ int mvebu_setup_boot_addr_wa(unsigned int 
crypto_eng_target,
        return 0;
 }
 
+/*
+ * The CPU hotplug needs to access the PMSU register through the CPU
+ * Idle functions, if we fail to access these registers we need to
+ * disable the CPU hotplug.
+ */
 static int __init mvebu_v7_pmsu_init(void)
 {
        struct device_node *np;
@@ -166,8 +171,10 @@ static int __init mvebu_v7_pmsu_init(void)
        int ret = 0;
 
        np = of_find_matching_node(NULL, of_pmsu_table);
-       if (!np)
+       if (!np) {
+               cpu_hotplug_disable();
                return 0;
+       }
 
        pr_info("Initializing Power Management Service Unit\n");
 
@@ -202,6 +209,8 @@ static int __init mvebu_v7_pmsu_init(void)
 
  out:
        of_node_put(np);
+       if (ret)
+               cpu_hotplug_disable();
        return ret;
 }
 
@@ -466,10 +475,15 @@ static __init int armada_xp_cpuidle_init(void)
        return 0;
 }
 
+/*
+ * The CPU hotplug needs to access the PMSU register through the CPU
+ * Idle functions, if we fail to access these registers we need to
+ * disable the CPU hotplug.
+ */
 static int __init mvebu_v7_cpu_pm_init(void)
 {
        struct device_node *np;
-       int ret;
+       int ret = 0;
 
        np = of_find_matching_node(NULL, of_pmsu_table);
        if (!np)
@@ -483,16 +497,20 @@ static int __init mvebu_v7_cpu_pm_init(void)
        else if (of_machine_is_compatible("marvell,armada380"))
                ret = armada_38x_cpuidle_init();
        else
-               return 0;
+               goto pm_init_failed;
 
        if (ret)
-               return ret;
+               goto pm_init_failed;
 
        mvebu_v7_pmsu_enable_l2_powerdown_onidle();
        platform_device_register(&mvebu_v7_cpuidle_device);
        cpu_pm_register_notifier(&mvebu_v7_cpu_pm_notifier);
 
        return 0;
+
+pm_init_failed:
+       cpu_hotplug_disable();
+       return ret;
 }
 
 arch_initcall(mvebu_v7_cpu_pm_init);
-- 
2.1.0

--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to