diff options
Diffstat (limited to 'arch/arm/common/mcpm_platsmp.c')
| -rw-r--r-- | arch/arm/common/mcpm_platsmp.c | 27 | 
1 files changed, 23 insertions, 4 deletions
diff --git a/arch/arm/common/mcpm_platsmp.c b/arch/arm/common/mcpm_platsmp.c index 1bc34c7567f..92e54d7c6f4 100644 --- a/arch/arm/common/mcpm_platsmp.c +++ b/arch/arm/common/mcpm_platsmp.c @@ -19,14 +19,23 @@  #include <asm/smp.h>  #include <asm/smp_plat.h> +static void cpu_to_pcpu(unsigned int cpu, +			unsigned int *pcpu, unsigned int *pcluster) +{ +	unsigned int mpidr; + +	mpidr = cpu_logical_map(cpu); +	*pcpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); +	*pcluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); +} +  static int mcpm_boot_secondary(unsigned int cpu, struct task_struct *idle)  { -	unsigned int mpidr, pcpu, pcluster, ret; +	unsigned int pcpu, pcluster, ret;  	extern void secondary_startup(void); -	mpidr = cpu_logical_map(cpu); -	pcpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); -	pcluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); +	cpu_to_pcpu(cpu, &pcpu, &pcluster); +  	pr_debug("%s: logical CPU %d is physical CPU %d cluster %d\n",  		 __func__, cpu, pcpu, pcluster); @@ -47,6 +56,15 @@ static void mcpm_secondary_init(unsigned int cpu)  #ifdef CONFIG_HOTPLUG_CPU +static int mcpm_cpu_kill(unsigned int cpu) +{ +	unsigned int pcpu, pcluster; + +	cpu_to_pcpu(cpu, &pcpu, &pcluster); + +	return !mcpm_wait_for_cpu_powerdown(pcpu, pcluster); +} +  static int mcpm_cpu_disable(unsigned int cpu)  {  	/* @@ -73,6 +91,7 @@ static struct smp_operations __initdata mcpm_smp_ops = {  	.smp_boot_secondary	= mcpm_boot_secondary,  	.smp_secondary_init	= mcpm_secondary_init,  #ifdef CONFIG_HOTPLUG_CPU +	.cpu_kill		= mcpm_cpu_kill,  	.cpu_disable		= mcpm_cpu_disable,  	.cpu_die		= mcpm_cpu_die,  #endif  | 
