mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	The common ARM architecture code provides a generic function to exit coherency called v7_exit_coherency_flush(). Replace the machine specific implementation using the generic function. Tested on a i.MX 6Dual by hotplugging the secondary CPU under load through sysfs several 1000 times. Tested-by: Stefan Agner <stefan@agner.ch> Signed-off-by: Stefan Agner <stefan@agner.ch> Signed-off-by: Shawn Guo <shawnguo@kernel.org>
		
			
				
	
	
		
			44 lines
		
	
	
	
		
			915 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
	
		
			915 B
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
						|
/*
 | 
						|
 * Copyright 2011 Freescale Semiconductor, Inc.
 | 
						|
 * Copyright 2011 Linaro Ltd.
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/errno.h>
 | 
						|
#include <linux/jiffies.h>
 | 
						|
#include <asm/cacheflush.h>
 | 
						|
#include <asm/cp15.h>
 | 
						|
#include <asm/proc-fns.h>
 | 
						|
 | 
						|
#include "common.h"
 | 
						|
 | 
						|
/*
 | 
						|
 * platform-specific code to shutdown a CPU
 | 
						|
 *
 | 
						|
 * Called with IRQs disabled
 | 
						|
 */
 | 
						|
void imx_cpu_die(unsigned int cpu)
 | 
						|
{
 | 
						|
	v7_exit_coherency_flush(louis);
 | 
						|
	/*
 | 
						|
	 * We use the cpu jumping argument register to sync with
 | 
						|
	 * imx_cpu_kill() which is running on cpu0 and waiting for
 | 
						|
	 * the register being cleared to kill the cpu.
 | 
						|
	 */
 | 
						|
	imx_set_cpu_arg(cpu, ~0);
 | 
						|
 | 
						|
	while (1)
 | 
						|
		cpu_do_idle();
 | 
						|
}
 | 
						|
 | 
						|
int imx_cpu_kill(unsigned int cpu)
 | 
						|
{
 | 
						|
	unsigned long timeout = jiffies + msecs_to_jiffies(50);
 | 
						|
 | 
						|
	while (imx_get_cpu_arg(cpu) == 0)
 | 
						|
		if (time_after(jiffies, timeout))
 | 
						|
			return 0;
 | 
						|
	imx_enable_cpu(cpu, false);
 | 
						|
	imx_set_cpu_arg(cpu, 0);
 | 
						|
	return 1;
 | 
						|
}
 |