18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2011 Freescale Semiconductor, Inc. 48c2ecf20Sopenharmony_ci * Copyright 2011 Linaro Ltd. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/errno.h> 88c2ecf20Sopenharmony_ci#include <linux/jiffies.h> 98c2ecf20Sopenharmony_ci#include <asm/cacheflush.h> 108c2ecf20Sopenharmony_ci#include <asm/cp15.h> 118c2ecf20Sopenharmony_ci#include <asm/proc-fns.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include "common.h" 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci/* 168c2ecf20Sopenharmony_ci * platform-specific code to shutdown a CPU 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * Called with IRQs disabled 198c2ecf20Sopenharmony_ci */ 208c2ecf20Sopenharmony_civoid imx_cpu_die(unsigned int cpu) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci v7_exit_coherency_flush(louis); 238c2ecf20Sopenharmony_ci /* 248c2ecf20Sopenharmony_ci * We use the cpu jumping argument register to sync with 258c2ecf20Sopenharmony_ci * imx_cpu_kill() which is running on cpu0 and waiting for 268c2ecf20Sopenharmony_ci * the register being cleared to kill the cpu. 278c2ecf20Sopenharmony_ci */ 288c2ecf20Sopenharmony_ci imx_set_cpu_arg(cpu, ~0); 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci while (1) 318c2ecf20Sopenharmony_ci cpu_do_idle(); 328c2ecf20Sopenharmony_ci} 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ciint imx_cpu_kill(unsigned int cpu) 358c2ecf20Sopenharmony_ci{ 368c2ecf20Sopenharmony_ci unsigned long timeout = jiffies + msecs_to_jiffies(50); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci while (imx_get_cpu_arg(cpu) == 0) 398c2ecf20Sopenharmony_ci if (time_after(jiffies, timeout)) 408c2ecf20Sopenharmony_ci return 0; 418c2ecf20Sopenharmony_ci imx_enable_cpu(cpu, false); 428c2ecf20Sopenharmony_ci imx_set_cpu_arg(cpu, 0); 438c2ecf20Sopenharmony_ci return 1; 448c2ecf20Sopenharmony_ci} 45