aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/common/gic.c
diff options
context:
space:
mode:
authorRob Herring <rob.herring@calxeda.com>2012-11-26 16:05:48 -0500
committerRob Herring <rob.herring@calxeda.com>2013-01-10 12:45:43 -0500
commitb1cffebf1029c87e1f1984d48463ee21093a6bc7 (patch)
tree43d297e7557685d57e7fa9595726f2846a8815ef /arch/arm/common/gic.c
parent428fef8ad855c03b9f61c226c63df61bb43dc3e1 (diff)
ARM: GIC: remove direct use of gic_raise_softirq
In preparation of moving gic code to drivers/irqchip, remove the direct platform dependencies on gic_raise_softirq. Move the setup of smp_cross_call into the gic code and use arch_send_wakeup_ipi_mask function to trigger wake-up IPIs. Signed-off-by: Rob Herring <rob.herring@calxeda.com> Cc: Russell King <linux@arm.linux.org.uk> Cc: Kukjin Kim <kgene.kim@samsung.com> Cc: Sascha Hauer <kernel@pengutronix.de> Cc: David Brown <davidb@codeaurora.org> Cc: Daniel Walker <dwalker@fifo99.com> Cc: Bryan Huntsman <bryanh@codeaurora.org> Acked-by: Tony Lindgren <tony@atomide.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Cc: Paul Mundt <lethal@linux-sh.org> Cc: Magnus Damm <magnus.damm@gmail.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Cc: Shiraz Hashim <shiraz.hashim@st.com> Acked-by: Stephen Warren <swarren@nvidia.com> Cc: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> Cc: Linus Walleij <linus.walleij@linaro.org> Acked-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'arch/arm/common/gic.c')
-rw-r--r--arch/arm/common/gic.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
index 36ae03a3f5d1..788658cca960 100644
--- a/arch/arm/common/gic.c
+++ b/arch/arm/common/gic.c
@@ -617,6 +617,27 @@ static void __init gic_pm_init(struct gic_chip_data *gic)
617} 617}
618#endif 618#endif
619 619
620#ifdef CONFIG_SMP
621void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
622{
623 int cpu;
624 unsigned long map = 0;
625
626 /* Convert our logical CPU mask into a physical one. */
627 for_each_cpu(cpu, mask)
628 map |= 1 << cpu_logical_map(cpu);
629
630 /*
631 * Ensure that stores to Normal memory are visible to the
632 * other CPUs before issuing the IPI.
633 */
634 dsb();
635
636 /* this always happens on GIC0 */
637 writel_relaxed(map << 16 | irq, gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT);
638}
639#endif
640
620static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq, 641static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
621 irq_hw_number_t hw) 642 irq_hw_number_t hw)
622{ 643{
@@ -743,6 +764,9 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
743 if (WARN_ON(!gic->domain)) 764 if (WARN_ON(!gic->domain))
744 return; 765 return;
745 766
767#ifdef CONFIG_SMP
768 set_smp_cross_call(gic_raise_softirq);
769#endif
746 gic_chip.flags |= gic_arch_extn.flags; 770 gic_chip.flags |= gic_arch_extn.flags;
747 gic_dist_init(gic); 771 gic_dist_init(gic);
748 gic_cpu_init(gic); 772 gic_cpu_init(gic);
@@ -756,27 +780,6 @@ void __cpuinit gic_secondary_init(unsigned int gic_nr)
756 gic_cpu_init(&gic_data[gic_nr]); 780 gic_cpu_init(&gic_data[gic_nr]);
757} 781}
758 782
759#ifdef CONFIG_SMP
760void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
761{
762 int cpu;
763 unsigned long map = 0;
764
765 /* Convert our logical CPU mask into a physical one. */
766 for_each_cpu(cpu, mask)
767 map |= gic_cpu_map[cpu];
768
769 /*
770 * Ensure that stores to Normal memory are visible to the
771 * other CPUs before issuing the IPI.
772 */
773 dsb();
774
775 /* this always happens on GIC0 */
776 writel_relaxed(map << 16 | irq, gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT);
777}
778#endif
779
780#ifdef CONFIG_OF 783#ifdef CONFIG_OF
781static int gic_cnt __initdata = 0; 784static int gic_cnt __initdata = 0;
782 785