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 |