irqchip/armada-370-xp: Convert to hotplug state machine
authorRichard Cochran <rcochran@linutronix.de>
Wed, 13 Jul 2016 17:16:07 +0000 (17:16 +0000)
committerIngo Molnar <mingo@kernel.org>
Thu, 14 Jul 2016 07:34:29 +0000 (09:34 +0200)
Install the callbacks via the state machine.

Signed-off-by: Richard Cochran <rcochran@linutronix.de>
Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de>
Acked-by: Jason Cooper <jason@lakedaemon.net>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: rt@linutronix.de
Link: http://lkml.kernel.org/r/20160713153333.330661455@linutronix.de
Signed-off-by: Ingo Molnar <mingo@kernel.org>
drivers/irqchip/irq-armada-370-xp.c
include/linux/cpuhotplug.h

index e7dc6cbda2a1bb61d5b4817dc14649133f1ab5eb..e2b8feedc5d8a6202a0fd834f67244f28aede0f5 100644 (file)
@@ -344,40 +344,22 @@ static void armada_mpic_send_doorbell(const struct cpumask *mask,
        writel((map << 8) | irq, main_int_base +
                ARMADA_370_XP_SW_TRIG_INT_OFFS);
 }
+#endif
 
-static int armada_xp_mpic_secondary_init(struct notifier_block *nfb,
-                                        unsigned long action, void *hcpu)
+static int armada_xp_mpic_starting_cpu(unsigned int cpu)
 {
-       if (action == CPU_STARTING || action == CPU_STARTING_FROZEN) {
-               armada_xp_mpic_perf_init();
-               armada_xp_mpic_smp_cpu_init();
-       }
-
-       return NOTIFY_OK;
+       armada_xp_mpic_perf_init();
+       armada_xp_mpic_smp_cpu_init();
+       return 0;
 }
 
-static struct notifier_block armada_370_xp_mpic_cpu_notifier = {
-       .notifier_call = armada_xp_mpic_secondary_init,
-       .priority = 100,
-};
-
-static int mpic_cascaded_secondary_init(struct notifier_block *nfb,
-                                       unsigned long action, void *hcpu)
+static int mpic_cascaded_starting_cpu(unsigned int cpu)
 {
-       if (action == CPU_STARTING || action == CPU_STARTING_FROZEN) {
-               armada_xp_mpic_perf_init();
-               enable_percpu_irq(parent_irq, IRQ_TYPE_NONE);
-       }
-
-       return NOTIFY_OK;
+       armada_xp_mpic_perf_init();
+       enable_percpu_irq(parent_irq, IRQ_TYPE_NONE);
+       return 0;
 }
 
-static struct notifier_block mpic_cascaded_cpu_notifier = {
-       .notifier_call = mpic_cascaded_secondary_init,
-       .priority = 100,
-};
-#endif /* CONFIG_SMP */
-
 static const struct irq_domain_ops armada_370_xp_mpic_irq_ops = {
        .map = armada_370_xp_mpic_irq_map,
        .xlate = irq_domain_xlate_onecell,
@@ -595,11 +577,15 @@ static int __init armada_370_xp_mpic_of_init(struct device_node *node,
                set_handle_irq(armada_370_xp_handle_irq);
 #ifdef CONFIG_SMP
                set_smp_cross_call(armada_mpic_send_doorbell);
-               register_cpu_notifier(&armada_370_xp_mpic_cpu_notifier);
+               cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_ARMADA_XP_STARTING,
+                                         "AP_IRQ_ARMADA_XP_STARTING",
+                                         armada_xp_mpic_starting_cpu, NULL);
 #endif
        } else {
 #ifdef CONFIG_SMP
-               register_cpu_notifier(&mpic_cascaded_cpu_notifier);
+               cpuhp_setup_state_nocalls(CPUHP_AP_IRQ_ARMADA_CASC_STARTING,
+                                         "AP_IRQ_ARMADA_CASC_STARTING",
+                                         mpic_cascaded_starting_cpu, NULL);
 #endif
                irq_set_chained_handler(parent_irq,
                                        armada_370_xp_mpic_handle_cascade_irq);
index 62ab4ff985210a356f1ceaefae2cae8dbeabe25f..3a08ab9623465a4879d7cf84d72656b414f0726a 100644 (file)
@@ -12,6 +12,8 @@ enum cpuhp_state {
        CPUHP_AP_IRQ_GIC_STARTING,
        CPUHP_AP_IRQ_GICV3_STARTING,
        CPUHP_AP_IRQ_HIP04_STARTING,
+       CPUHP_AP_IRQ_ARMADA_XP_STARTING,
+       CPUHP_AP_IRQ_ARMADA_CASC_STARTING,
        CPUHP_AP_NOTIFY_STARTING,
        CPUHP_AP_ONLINE,
        CPUHP_TEARDOWN_CPU,