13
13
#include <linux/init.h>
14
14
#include <linux/irq.h>
15
15
#include <linux/irqchip.h>
16
+ #include <linux/irqchip/chained_irq.h>
16
17
#include <linux/irqdomain.h>
17
18
#include <linux/io.h>
18
19
#include <linux/ioport.h>
@@ -132,11 +133,14 @@ struct irq_chip icu_irq_chip = {
132
133
static void icu_mux_irq_demux (struct irq_desc * desc )
133
134
{
134
135
unsigned int irq = irq_desc_get_irq (desc );
136
+ struct irq_chip * chip = irq_desc_get_chip (desc );
135
137
struct irq_domain * domain ;
136
138
struct icu_chip_data * data ;
137
139
int i ;
138
140
unsigned long mask , status , n ;
139
141
142
+ chained_irq_enter (chip , desc );
143
+
140
144
for (i = 1 ; i < max_icu_nr ; i ++ ) {
141
145
if (irq == icu_data [i ].cascade_irq ) {
142
146
domain = icu_data [i ].domain ;
@@ -146,7 +150,7 @@ static void icu_mux_irq_demux(struct irq_desc *desc)
146
150
}
147
151
if (i >= max_icu_nr ) {
148
152
pr_err ("Spurious irq %d in MMP INTC\n" , irq );
149
- return ;
153
+ goto out ;
150
154
}
151
155
152
156
mask = readl_relaxed (data -> reg_mask );
@@ -158,6 +162,9 @@ static void icu_mux_irq_demux(struct irq_desc *desc)
158
162
generic_handle_irq (icu_data [i ].virq_base + n );
159
163
}
160
164
}
165
+
166
+ out :
167
+ chained_irq_exit (chip , desc );
161
168
}
162
169
163
170
static int mmp_irq_domain_map (struct irq_domain * d , unsigned int irq ,
0 commit comments