xref: /openbmc/linux/arch/arm/mach-imx/hotplug.c (revision e34645f4)
1fcaf2036SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
269c31b7aSShawn Guo /*
369c31b7aSShawn Guo  * Copyright 2011 Freescale Semiconductor, Inc.
469c31b7aSShawn Guo  * Copyright 2011 Linaro Ltd.
569c31b7aSShawn Guo  */
669c31b7aSShawn Guo 
769c31b7aSShawn Guo #include <linux/errno.h>
8009e63f8SShawn Guo #include <linux/jiffies.h>
9d7eb28d2SStefan Agner #include <asm/cacheflush.h>
10602bf409SShawn Guo #include <asm/cp15.h>
11009e63f8SShawn Guo #include <asm/proc-fns.h>
12e3372474SShawn Guo 
13e3372474SShawn Guo #include "common.h"
14*e34645f4SAnson Huang #include "hardware.h"
1569c31b7aSShawn Guo 
1669c31b7aSShawn Guo /*
1769c31b7aSShawn Guo  * platform-specific code to shutdown a CPU
1869c31b7aSShawn Guo  *
1969c31b7aSShawn Guo  * Called with IRQs disabled
2069c31b7aSShawn Guo  */
imx_cpu_die(unsigned int cpu)21e4f2d979SMarc Zyngier void imx_cpu_die(unsigned int cpu)
2269c31b7aSShawn Guo {
23d7eb28d2SStefan Agner 	v7_exit_coherency_flush(louis);
242f3edfd7SShawn Guo 	/*
252f3edfd7SShawn Guo 	 * We use the cpu jumping argument register to sync with
262f3edfd7SShawn Guo 	 * imx_cpu_kill() which is running on cpu0 and waiting for
272f3edfd7SShawn Guo 	 * the register being cleared to kill the cpu.
282f3edfd7SShawn Guo 	 */
292f3edfd7SShawn Guo 	imx_set_cpu_arg(cpu, ~0);
30fcd75f92SShawn Guo 
31fcd75f92SShawn Guo 	while (1)
3283757664SShawn Guo 		cpu_do_idle();
3383757664SShawn Guo }
3469c31b7aSShawn Guo 
imx_cpu_kill(unsigned int cpu)3583757664SShawn Guo int imx_cpu_kill(unsigned int cpu)
3683757664SShawn Guo {
372f3edfd7SShawn Guo 	unsigned long timeout = jiffies + msecs_to_jiffies(50);
382f3edfd7SShawn Guo 
392f3edfd7SShawn Guo 	while (imx_get_cpu_arg(cpu) == 0)
402f3edfd7SShawn Guo 		if (time_after(jiffies, timeout))
412f3edfd7SShawn Guo 			return 0;
4283757664SShawn Guo 	imx_enable_cpu(cpu, false);
432f3edfd7SShawn Guo 	imx_set_cpu_arg(cpu, 0);
44*e34645f4SAnson Huang 	if (cpu_is_imx7d())
45*e34645f4SAnson Huang 		imx_gpcv2_set_core1_pdn_pup_by_software(true);
4683757664SShawn Guo 	return 1;
4769c31b7aSShawn Guo }
48