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 20 static void (*tegra_hotplug_shutdown)(void); 21 22 int 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 */ 38 void 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 55 static 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 } 74 pure_initcall(tegra_hotplug_init); 75