ARM: tegra: Setup CPU hotplug in a pure initcall
authorThierry Reding <treding@nvidia.com>
Fri, 11 Jul 2014 09:00:37 +0000 (11:00 +0200)
committerThierry Reding <treding@nvidia.com>
Thu, 17 Jul 2014 12:58:41 +0000 (14:58 +0200)
CPU hotplug support doesn't have to be set up until fairly late in the
boot process, so it can be done in a regular initcall. To make sure that
we don't miss any ordering problems in the future, output a warning if
any of the functions are called before initialization has completed.

This is part of untangling the boot order dependencies on Tegra so that
more code can be shared between 32-bit and 64-bit ARM.

Signed-off-by: Thierry Reding <treding@nvidia.com>
arch/arm/mach-tegra/hotplug.c
arch/arm/mach-tegra/sleep.h
arch/arm/mach-tegra/tegra.c

index d60339c996cbdf645f715ac52319c98dfc932094..6fc71f1534b069f9f8d28e0283e6a37812c3802d 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/kernel.h>
 #include <linux/smp.h>
 
+#include <soc/tegra/common.h>
 #include <soc/tegra/fuse.h>
 
 #include <asm/smp_plat.h>
@@ -38,6 +39,11 @@ int tegra_cpu_kill(unsigned cpu)
  */
 void __ref tegra_cpu_die(unsigned int cpu)
 {
+       if (!tegra_hotplug_shutdown) {
+               WARN(1, "hotplug is not yet initialized\n");
+               return;
+       }
+
        /* Clean L1 data cache */
        tegra_disable_clean_inv_dcache(TEGRA_FLUSH_CACHE_LOUIS);
 
@@ -48,10 +54,13 @@ void __ref tegra_cpu_die(unsigned int cpu)
        BUG();
 }
 
-void __init tegra_hotplug_init(void)
+static int __init tegra_hotplug_init(void)
 {
        if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
-               return;
+               return 0;
+
+       if (!soc_is_tegra())
+               return 0;
 
        if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC) && tegra_get_chip_id() == TEGRA20)
                tegra_hotplug_shutdown = tegra20_hotplug_shutdown;
@@ -61,4 +70,7 @@ void __init tegra_hotplug_init(void)
                tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
        if (IS_ENABLED(CONFIG_ARCH_TEGRA_124_SOC) && tegra_get_chip_id() == TEGRA124)
                tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
+
+       return 0;
 }
+pure_initcall(tegra_hotplug_init);
index 339fe42cd6fb2635f37c1f34f4b6530a5f86daeb..92d46ec1361abba6f8beb6130d753ea634c8933a 100644 (file)
@@ -130,9 +130,6 @@ void tegra_disable_clean_inv_dcache(u32 flag);
 #ifdef CONFIG_HOTPLUG_CPU
 void tegra20_hotplug_shutdown(void);
 void tegra30_hotplug_shutdown(void);
-void tegra_hotplug_init(void);
-#else
-static inline void tegra_hotplug_init(void) {}
 #endif
 
 void tegra20_cpu_shutdown(int cpu);
index 6ccbc8ca1db5217e5a75d7889b5a9f7abb4277cd..e5733fa78911a09c74595aa577ab9ebb7061b52a 100644 (file)
@@ -76,7 +76,6 @@ static void __init tegra_init_early(void)
        tegra_init_fuse();
        tegra_cpu_reset_handler_init();
        tegra_powergate_init();
-       tegra_hotplug_init();
 }
 
 static void __init tegra_dt_init_irq(void)