return !mcpm_wait_for_cpu_powerdown(pcpu, pcluster);
 }
 
-static int mcpm_cpu_disable(unsigned int cpu)
+static bool mcpm_cpu_can_disable(unsigned int cpu)
 {
-       /*
-        * We assume all CPUs may be shut down.
-        * This would be the hook to use for eventual Secure
-        * OS migration requests as described in the PSCI spec.
-        */
-       return 0;
+       /* We assume all CPUs may be shut down. */
+       return true;
 }
 
 static void mcpm_cpu_die(unsigned int cpu)
        .smp_secondary_init     = mcpm_secondary_init,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_kill               = mcpm_cpu_kill,
-       .cpu_disable            = mcpm_cpu_disable,
+       .cpu_can_disable        = mcpm_cpu_can_disable,
        .cpu_die                = mcpm_cpu_die,
 #endif
 };
 
 #ifdef CONFIG_HOTPLUG_CPU
        int  (*cpu_kill)(unsigned int cpu);
        void (*cpu_die)(unsigned int cpu);
+       bool  (*cpu_can_disable)(unsigned int cpu);
        int  (*cpu_disable)(unsigned int cpu);
 #endif
 #endif
 
 extern int platform_can_secondary_boot(void);
 extern int platform_can_cpu_hotplug(void);
 
+#ifdef CONFIG_HOTPLUG_CPU
+extern int platform_can_hotplug_cpu(unsigned int cpu);
+#else
+static inline int platform_can_hotplug_cpu(unsigned int cpu)
+{
+       return 0;
+}
+#endif
+
 #endif
 
 
        for_each_possible_cpu(cpu) {
                struct cpuinfo_arm *cpuinfo = &per_cpu(cpu_data, cpu);
-               cpuinfo->cpu.hotpluggable = 1;
+               cpuinfo->cpu.hotpluggable = platform_can_hotplug_cpu(cpu);
                register_cpu(&cpuinfo->cpu, cpu);
        }
 
 
        if (smp_ops.cpu_disable)
                return smp_ops.cpu_disable(cpu);
 
+       return 0;
+}
+
+int platform_can_hotplug_cpu(unsigned int cpu)
+{
+       /* cpu_die must be specified to support hotplug */
+       if (!smp_ops.cpu_die)
+               return 0;
+
+       if (smp_ops.cpu_can_disable)
+               return smp_ops.cpu_can_disable(cpu);
+
        /*
         * By default, allow disabling all CPUs except the first one,
         * since this is special on a lot of platforms, e.g. because
         * of clock tick interrupts.
         */
-       return cpu == 0 ? -EPERM : 0;
+       return cpu != 0;
 }
+
 /*
  * __cpu_disable runs on the processor to be shutdown.
  */
 
 extern void shmobile_smp_sleep(void);
 extern void shmobile_smp_hook(unsigned int cpu, unsigned long fn,
                              unsigned long arg);
-extern int shmobile_smp_cpu_disable(unsigned int cpu);
+extern bool shmobile_smp_cpu_can_disable(unsigned int cpu);
 extern void shmobile_boot_scu(void);
 extern void shmobile_smp_scu_prepare_cpus(unsigned int max_cpus);
 extern void shmobile_smp_scu_cpu_die(unsigned int cpu);
 
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
-int shmobile_smp_cpu_disable(unsigned int cpu)
+bool shmobile_smp_cpu_can_disable(unsigned int cpu)
 {
-       return 0; /* Hotplug of any CPU is supported */
+       return true; /* Hotplug of any CPU is supported */
 }
 #endif
 
        .smp_prepare_cpus       = r8a7790_smp_prepare_cpus,
        .smp_boot_secondary     = shmobile_smp_apmu_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
-       .cpu_disable            = shmobile_smp_cpu_disable,
+       .cpu_can_disable        = shmobile_smp_cpu_can_disable,
        .cpu_die                = shmobile_smp_apmu_cpu_die,
        .cpu_kill               = shmobile_smp_apmu_cpu_kill,
 #endif
 
        .smp_prepare_cpus       = r8a7791_smp_prepare_cpus,
        .smp_boot_secondary     = r8a7791_smp_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
-       .cpu_disable            = shmobile_smp_cpu_disable,
+       .cpu_can_disable        = shmobile_smp_cpu_can_disable,
        .cpu_die                = shmobile_smp_apmu_cpu_die,
        .cpu_kill               = shmobile_smp_apmu_cpu_kill,
 #endif
 
        .smp_prepare_cpus       = sh73a0_smp_prepare_cpus,
        .smp_boot_secondary     = sh73a0_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
-       .cpu_disable            = shmobile_smp_cpu_disable,
+       .cpu_can_disable        = shmobile_smp_cpu_can_disable,
        .cpu_die                = shmobile_smp_scu_cpu_die,
        .cpu_kill               = shmobile_smp_scu_cpu_kill,
 #endif