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