mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-04 03:33:58 +08:00
453689e407
Hotplug function put CPU in offline or online mode at runtime. When the CPU been put into offline, it was been clock gated. The offline CPU can be power gated, when the remaining CPU goes into LP2. Based on the worked by: Colin Cross <ccross@android.com> Gary King <gking@nvidia.com> Signed-off-by: Joseph Lo <josephl@nvidia.com> Signed-off-by: Stephen Warren <swarren@nvidia.com>
74 lines
1.5 KiB
C
74 lines
1.5 KiB
C
/*
|
|
*
|
|
* Copyright (C) 2002 ARM Ltd.
|
|
* All Rights Reserved
|
|
* Copyright (c) 2010, 2012 NVIDIA Corporation. All rights reserved.
|
|
*
|
|
* 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>
|
|
#include <asm/smp_plat.h>
|
|
|
|
#include "sleep.h"
|
|
#include "tegra_cpu_car.h"
|
|
|
|
static void (*tegra_hotplug_shutdown)(void);
|
|
|
|
int platform_cpu_kill(unsigned int cpu)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* platform-specific code to shutdown a CPU
|
|
*
|
|
* Called with IRQs disabled
|
|
*/
|
|
void platform_cpu_die(unsigned int cpu)
|
|
{
|
|
cpu = cpu_logical_map(cpu);
|
|
|
|
/* Flush the L1 data cache. */
|
|
flush_cache_all();
|
|
|
|
/* Shut down the current CPU. */
|
|
tegra_hotplug_shutdown();
|
|
|
|
/* Clock gate the CPU */
|
|
tegra_wait_cpu_in_reset(cpu);
|
|
tegra_disable_cpu_clock(cpu);
|
|
|
|
/* Should never return here. */
|
|
BUG();
|
|
}
|
|
|
|
int platform_cpu_disable(unsigned int cpu)
|
|
{
|
|
/*
|
|
* we don't allow CPU 0 to be shutdown (it is still too special
|
|
* e.g. clock tick interrupts)
|
|
*/
|
|
return cpu == 0 ? -EPERM : 0;
|
|
}
|
|
|
|
#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
|
|
|
|
#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
|