162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2011 Freescale Semiconductor, Inc. 462306a36Sopenharmony_ci * Copyright 2011 Linaro Ltd. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/errno.h> 862306a36Sopenharmony_ci#include <linux/jiffies.h> 962306a36Sopenharmony_ci#include <asm/cacheflush.h> 1062306a36Sopenharmony_ci#include <asm/cp15.h> 1162306a36Sopenharmony_ci#include <asm/proc-fns.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "common.h" 1462306a36Sopenharmony_ci#include "hardware.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* 1762306a36Sopenharmony_ci * platform-specific code to shutdown a CPU 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * Called with IRQs disabled 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_civoid imx_cpu_die(unsigned int cpu) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci v7_exit_coherency_flush(louis); 2462306a36Sopenharmony_ci /* 2562306a36Sopenharmony_ci * We use the cpu jumping argument register to sync with 2662306a36Sopenharmony_ci * imx_cpu_kill() which is running on cpu0 and waiting for 2762306a36Sopenharmony_ci * the register being cleared to kill the cpu. 2862306a36Sopenharmony_ci */ 2962306a36Sopenharmony_ci imx_set_cpu_arg(cpu, ~0); 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci while (1) 3262306a36Sopenharmony_ci cpu_do_idle(); 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ciint imx_cpu_kill(unsigned int cpu) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci unsigned long timeout = jiffies + msecs_to_jiffies(50); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci while (imx_get_cpu_arg(cpu) == 0) 4062306a36Sopenharmony_ci if (time_after(jiffies, timeout)) 4162306a36Sopenharmony_ci return 0; 4262306a36Sopenharmony_ci imx_enable_cpu(cpu, false); 4362306a36Sopenharmony_ci imx_set_cpu_arg(cpu, 0); 4462306a36Sopenharmony_ci if (cpu_is_imx7d()) 4562306a36Sopenharmony_ci imx_gpcv2_set_core1_pdn_pup_by_software(true); 4662306a36Sopenharmony_ci return 1; 4762306a36Sopenharmony_ci} 48