aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Crispin <john@phrozen.org>2016-06-09 11:09:51 -0400
committerRalf Baechle <ralf@linux-mips.org>2016-07-24 06:31:44 -0400
commitfe46e5032ede30e7a00b713c86dc4f598e7cf99f (patch)
tree58541a99f4e1c1d667f306c93c6a237902f0d97a
parent7840d6188b44d94a0a9a4d9e9e7108f8eef67de2 (diff)
MIPS: Lantiq: Fix eiu interrupt loading code
Using of_irq_count to load the irq index from the devicetree is incorrect. This will cause the kernel to map them regardless, even if they dont actually get used. Change the code to use of_property_count_u32_elems() instead which is the correct API to use in this case. Signed-off-by: John Crispin <john@phrozen.org> Cc: Linux-MIPS <linux-mips@linux-mips.org> Patchwork: https://patchwork.linux-mips.org/patch/13601/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r--arch/mips/lantiq/irq.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c
index ff17669e30a3..bb1c39e0ce4d 100644
--- a/arch/mips/lantiq/irq.c
+++ b/arch/mips/lantiq/irq.c
@@ -66,7 +66,7 @@ int gic_present;
66#endif 66#endif
67 67
68static int exin_avail; 68static int exin_avail;
69static struct resource ltq_eiu_irq[MAX_EIU]; 69static u32 ltq_eiu_irq[MAX_EIU];
70static void __iomem *ltq_icu_membase[MAX_IM]; 70static void __iomem *ltq_icu_membase[MAX_IM];
71static void __iomem *ltq_eiu_membase; 71static void __iomem *ltq_eiu_membase;
72static struct irq_domain *ltq_domain; 72static struct irq_domain *ltq_domain;
@@ -75,7 +75,7 @@ static int ltq_perfcount_irq;
75int ltq_eiu_get_irq(int exin) 75int ltq_eiu_get_irq(int exin)
76{ 76{
77 if (exin < exin_avail) 77 if (exin < exin_avail)
78 return ltq_eiu_irq[exin].start; 78 return ltq_eiu_irq[exin];
79 return -1; 79 return -1;
80} 80}
81 81
@@ -126,7 +126,7 @@ static int ltq_eiu_settype(struct irq_data *d, unsigned int type)
126 int i; 126 int i;
127 127
128 for (i = 0; i < MAX_EIU; i++) { 128 for (i = 0; i < MAX_EIU; i++) {
129 if (d->hwirq == ltq_eiu_irq[i].start) { 129 if (d->hwirq == ltq_eiu_irq[i]) {
130 int val = 0; 130 int val = 0;
131 int edge = 0; 131 int edge = 0;
132 132
@@ -174,7 +174,7 @@ static unsigned int ltq_startup_eiu_irq(struct irq_data *d)
174 174
175 ltq_enable_irq(d); 175 ltq_enable_irq(d);
176 for (i = 0; i < MAX_EIU; i++) { 176 for (i = 0; i < MAX_EIU; i++) {
177 if (d->hwirq == ltq_eiu_irq[i].start) { 177 if (d->hwirq == ltq_eiu_irq[i]) {
178 /* by default we are low level triggered */ 178 /* by default we are low level triggered */
179 ltq_eiu_settype(d, IRQF_TRIGGER_LOW); 179 ltq_eiu_settype(d, IRQF_TRIGGER_LOW);
180 /* clear all pending */ 180 /* clear all pending */
@@ -196,7 +196,7 @@ static void ltq_shutdown_eiu_irq(struct irq_data *d)
196 196
197 ltq_disable_irq(d); 197 ltq_disable_irq(d);
198 for (i = 0; i < MAX_EIU; i++) { 198 for (i = 0; i < MAX_EIU; i++) {
199 if (d->hwirq == ltq_eiu_irq[i].start) { 199 if (d->hwirq == ltq_eiu_irq[i]) {
200 /* disable */ 200 /* disable */
201 ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_INEN) & ~BIT(i), 201 ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_INEN) & ~BIT(i),
202 LTQ_EIU_EXIN_INEN); 202 LTQ_EIU_EXIN_INEN);
@@ -341,7 +341,7 @@ static int icu_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
341 return 0; 341 return 0;
342 342
343 for (i = 0; i < exin_avail; i++) 343 for (i = 0; i < exin_avail; i++)
344 if (hw == ltq_eiu_irq[i].start) 344 if (hw == ltq_eiu_irq[i])
345 chip = &ltq_eiu_type; 345 chip = &ltq_eiu_type;
346 346
347 irq_set_chip_and_handler(hw, chip, handle_level_irq); 347 irq_set_chip_and_handler(hw, chip, handle_level_irq);
@@ -439,14 +439,15 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent)
439 eiu_node = of_find_compatible_node(NULL, NULL, "lantiq,eiu-xway"); 439 eiu_node = of_find_compatible_node(NULL, NULL, "lantiq,eiu-xway");
440 if (eiu_node && !of_address_to_resource(eiu_node, 0, &res)) { 440 if (eiu_node && !of_address_to_resource(eiu_node, 0, &res)) {
441 /* find out how many external irq sources we have */ 441 /* find out how many external irq sources we have */
442 exin_avail = of_irq_count(eiu_node); 442 exin_avail = of_property_count_u32_elems(eiu_node,
443 "lantiq,eiu-irqs");
443 444
444 if (exin_avail > MAX_EIU) 445 if (exin_avail > MAX_EIU)
445 exin_avail = MAX_EIU; 446 exin_avail = MAX_EIU;
446 447
447 ret = of_irq_to_resource_table(eiu_node, 448 ret = of_property_read_u32_array(eiu_node, "lantiq,eiu-irqs",
448 ltq_eiu_irq, exin_avail); 449 ltq_eiu_irq, exin_avail);
449 if (ret != exin_avail) 450 if (ret)
450 panic("failed to load external irq resources"); 451 panic("failed to load external irq resources");
451 452
452 if (!request_mem_region(res.start, resource_size(&res), 453 if (!request_mem_region(res.start, resource_size(&res),