hotplug.c (1711B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2002 ARM Ltd. 4 * All Rights Reserved 5 * Copyright (c) 2010, 2012-2013, NVIDIA Corporation. All rights reserved. 6 */ 7 8#include <linux/clk/tegra.h> 9#include <linux/kernel.h> 10#include <linux/smp.h> 11 12#include <soc/tegra/common.h> 13#include <soc/tegra/fuse.h> 14 15#include <asm/smp_plat.h> 16 17#include "common.h" 18#include "sleep.h" 19 20static void (*tegra_hotplug_shutdown)(void); 21 22int tegra_cpu_kill(unsigned cpu) 23{ 24 cpu = cpu_logical_map(cpu); 25 26 /* Clock gate the CPU */ 27 tegra_wait_cpu_in_reset(cpu); 28 tegra_disable_cpu_clock(cpu); 29 30 return 1; 31} 32 33/* 34 * platform-specific code to shutdown a CPU 35 * 36 * Called with IRQs disabled 37 */ 38void tegra_cpu_die(unsigned int cpu) 39{ 40 if (!tegra_hotplug_shutdown) { 41 WARN(1, "hotplug is not yet initialized\n"); 42 return; 43 } 44 45 /* Clean L1 data cache */ 46 tegra_disable_clean_inv_dcache(TEGRA_FLUSH_CACHE_LOUIS); 47 48 /* Shut down the current CPU. */ 49 tegra_hotplug_shutdown(); 50 51 /* Should never return here. */ 52 BUG(); 53} 54 55static int __init tegra_hotplug_init(void) 56{ 57 if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) 58 return 0; 59 60 if (!soc_is_tegra()) 61 return 0; 62 63 if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && tegra_get_chip_id() == TEGRA20) 64 tegra_hotplug_shutdown = tegra20_hotplug_shutdown; 65 if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) && tegra_get_chip_id() == TEGRA30) 66 tegra_hotplug_shutdown = tegra30_hotplug_shutdown; 67 if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) && tegra_get_chip_id() == TEGRA114) 68 tegra_hotplug_shutdown = tegra30_hotplug_shutdown; 69 if (IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC) && tegra_get_chip_id() == TEGRA124) 70 tegra_hotplug_shutdown = tegra30_hotplug_shutdown; 71 72 return 0; 73} 74pure_initcall(tegra_hotplug_init);