|
@@ -19,6 +19,7 @@
|
|
|
#include <linux/irq.h>
|
|
|
#include <linux/interrupt.h>
|
|
|
#include <linux/irqchip/chained_irq.h>
|
|
|
+#include <linux/cpu.h>
|
|
|
#include <linux/io.h>
|
|
|
#include <linux/of_address.h>
|
|
|
#include <linux/of_irq.h>
|
|
@@ -310,7 +311,8 @@ static int armada_370_xp_mpic_irq_map(struct irq_domain *h,
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
-void armada_mpic_send_doorbell(const struct cpumask *mask, unsigned int irq)
|
|
|
+static void armada_mpic_send_doorbell(const struct cpumask *mask,
|
|
|
+ unsigned int irq)
|
|
|
{
|
|
|
int cpu;
|
|
|
unsigned long map = 0;
|
|
@@ -330,7 +332,7 @@ void armada_mpic_send_doorbell(const struct cpumask *mask, unsigned int irq)
|
|
|
ARMADA_370_XP_SW_TRIG_INT_OFFS);
|
|
|
}
|
|
|
|
|
|
-void armada_xp_mpic_smp_cpu_init(void)
|
|
|
+static void armada_xp_mpic_smp_cpu_init(void)
|
|
|
{
|
|
|
/* Clear pending IPIs */
|
|
|
writel(0, per_cpu_int_base + ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS);
|
|
@@ -342,6 +344,20 @@ void armada_xp_mpic_smp_cpu_init(void)
|
|
|
/* Unmask IPI interrupt */
|
|
|
writel(0, per_cpu_int_base + ARMADA_370_XP_INT_CLEAR_MASK_OFFS);
|
|
|
}
|
|
|
+
|
|
|
+static int armada_xp_mpic_secondary_init(struct notifier_block *nfb,
|
|
|
+ unsigned long action, void *hcpu)
|
|
|
+{
|
|
|
+ if (action == CPU_STARTING || action == CPU_STARTING_FROZEN)
|
|
|
+ armada_xp_mpic_smp_cpu_init();
|
|
|
+ return NOTIFY_OK;
|
|
|
+}
|
|
|
+
|
|
|
+static struct notifier_block armada_370_xp_mpic_cpu_notifier = {
|
|
|
+ .notifier_call = armada_xp_mpic_secondary_init,
|
|
|
+ .priority = 100,
|
|
|
+};
|
|
|
+
|
|
|
#endif /* CONFIG_SMP */
|
|
|
|
|
|
static struct irq_domain_ops armada_370_xp_mpic_irq_ops = {
|
|
@@ -497,6 +513,10 @@ static int __init armada_370_xp_mpic_of_init(struct device_node *node,
|
|
|
if (parent_irq <= 0) {
|
|
|
irq_set_default_host(armada_370_xp_mpic_domain);
|
|
|
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);
|
|
|
+#endif
|
|
|
} else {
|
|
|
irq_set_chained_handler(parent_irq,
|
|
|
armada_370_xp_mpic_handle_cascade_irq);
|