aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/irqchip/exynos-combiner.c
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2013-04-18 17:57:26 -0400
committerArnd Bergmann <arnd@arndb.de>2013-04-19 17:00:43 -0400
commit20adee8fa06ef69012bc277739e9e3762c78b7b7 (patch)
tree2dc5d7ca8c7b460eef5d6d7d4609203cf5615fc1 /drivers/irqchip/exynos-combiner.c
parent863a08dc8bc7ce32ecc9136671610a93a0dd68b1 (diff)
irqchip: exynos: look up irq using irq_find_mapping
Since we want to move to using the linear IRQ domain in the future, we cannot rely on the irq numbers to be contiguous and need to look up the irq from the hwirq using the domain. This also turns the bogus comparison with NR_IRQ into a more meaningful check to see if the number has a valid mapping. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'drivers/irqchip/exynos-combiner.c')
-rw-r--r--drivers/irqchip/exynos-combiner.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/drivers/irqchip/exynos-combiner.c b/drivers/irqchip/exynos-combiner.c
index 6855c92c2262..494c2e21b538 100644
--- a/drivers/irqchip/exynos-combiner.c
+++ b/drivers/irqchip/exynos-combiner.c
@@ -33,7 +33,7 @@
33static DEFINE_SPINLOCK(irq_controller_lock); 33static DEFINE_SPINLOCK(irq_controller_lock);
34 34
35struct combiner_chip_data { 35struct combiner_chip_data {
36 unsigned int irq_offset; 36 unsigned int hwirq_offset;
37 unsigned int irq_mask; 37 unsigned int irq_mask;
38 void __iomem *base; 38 void __iomem *base;
39 unsigned int parent_irq; 39 unsigned int parent_irq;
@@ -80,11 +80,11 @@ static void combiner_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
80 if (status == 0) 80 if (status == 0)
81 goto out; 81 goto out;
82 82
83 combiner_irq = __ffs(status); 83 combiner_irq = chip_data->hwirq_offset + __ffs(status);
84 cascade_irq = irq_find_mapping(combiner_irq_domain, combiner_irq);
84 85
85 cascade_irq = combiner_irq + (chip_data->irq_offset & ~31); 86 if (unlikely(!cascade_irq))
86 if (unlikely(cascade_irq >= NR_IRQS)) 87 do_bad_IRQ(irq, desc);
87 do_bad_IRQ(cascade_irq, desc);
88 else 88 else
89 generic_handle_irq(cascade_irq); 89 generic_handle_irq(cascade_irq);
90 90
@@ -129,8 +129,7 @@ static void __init combiner_init_one(struct combiner_chip_data *combiner_data,
129 void __iomem *base, unsigned int irq) 129 void __iomem *base, unsigned int irq)
130{ 130{
131 combiner_data->base = base; 131 combiner_data->base = base;
132 combiner_data->irq_offset = irq_find_mapping( 132 combiner_data->hwirq_offset = (combiner_nr & ~3) * IRQ_IN_COMBINER;
133 combiner_irq_domain, combiner_nr * IRQ_IN_COMBINER);
134 combiner_data->irq_mask = 0xff << ((combiner_nr % 4) << 3); 133 combiner_data->irq_mask = 0xff << ((combiner_nr % 4) << 3);
135 combiner_data->parent_irq = irq; 134 combiner_data->parent_irq = irq;
136 135