2010-02-22 04:46:23 +03:00
/*
*
* Copyright ( C ) 2002 ARM Ltd .
* All Rights Reserved
2012-08-16 13:31:51 +04:00
* Copyright ( c ) 2010 , 2012 NVIDIA Corporation . All rights reserved .
2010-02-22 04:46:23 +03:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/kernel.h>
# include <linux/smp.h>
# include <asm/cacheflush.h>
2012-08-16 13:31:51 +04:00
# include <asm/smp_plat.h>
2010-02-22 04:46:23 +03:00
2012-08-16 13:31:51 +04:00
# include "sleep.h"
# include "tegra_cpu_car.h"
2010-02-22 04:46:23 +03:00
2012-08-16 13:31:51 +04:00
static void ( * tegra_hotplug_shutdown ) ( void ) ;
2010-02-22 04:46:23 +03:00
2013-01-03 10:43:00 +04:00
int tegra_cpu_kill ( unsigned cpu )
{
cpu = cpu_logical_map ( cpu ) ;
/* Clock gate the CPU */
tegra_wait_cpu_in_reset ( cpu ) ;
tegra_disable_cpu_clock ( cpu ) ;
return 1 ;
}
2010-02-22 04:46:23 +03:00
/*
* platform - specific code to shutdown a CPU
*
* Called with IRQs disabled
*/
2011-09-08 16:15:22 +04:00
void __ref tegra_cpu_die ( unsigned int cpu )
2010-02-22 04:46:23 +03:00
{
2013-01-03 10:42:59 +04:00
/* Clean L1 data cache */
tegra_disable_clean_inv_dcache ( ) ;
2010-02-22 04:46:23 +03:00
2012-08-16 13:31:51 +04:00
/* Shut down the current CPU. */
tegra_hotplug_shutdown ( ) ;
/* Should never return here. */
BUG ( ) ;
2010-02-22 04:46:23 +03:00
}
2012-09-22 11:06:21 +04:00
int tegra_cpu_disable ( unsigned int cpu )
2010-02-22 04:46:23 +03:00
{
/*
* we don ' t allow CPU 0 to be shutdown ( it is still too special
* e . g . clock tick interrupts )
*/
return cpu = = 0 ? - EPERM : 0 ;
}
2012-08-16 13:31:51 +04:00
2012-08-16 13:31:52 +04:00
# ifdef CONFIG_ARCH_TEGRA_2x_SOC
extern void tegra20_hotplug_shutdown ( void ) ;
void __init tegra20_hotplug_init ( void )
{
tegra_hotplug_shutdown = tegra20_hotplug_shutdown ;
}
# endif
2012-08-16 13:31:51 +04:00
# ifdef CONFIG_ARCH_TEGRA_3x_SOC
extern void tegra30_hotplug_shutdown ( void ) ;
void __init tegra30_hotplug_init ( void )
{
tegra_hotplug_shutdown = tegra30_hotplug_shutdown ;
}
# endif