aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-dwapb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpio/gpio-dwapb.c')
-rw-r--r--drivers/gpio/gpio-dwapb.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index ed5711f77e2d..cd3b81435274 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -198,6 +198,8 @@ static int dwapb_irq_set_type(struct irq_data *d, u32 type)
198 break; 198 break;
199 } 199 }
200 200
201 irq_setup_alt_chip(d, type);
202
201 writel(level, gpio->regs + GPIO_INTTYPE_LEVEL); 203 writel(level, gpio->regs + GPIO_INTTYPE_LEVEL);
202 writel(polarity, gpio->regs + GPIO_INT_POLARITY); 204 writel(polarity, gpio->regs + GPIO_INT_POLARITY);
203 spin_unlock_irqrestore(&bgc->lock, flags); 205 spin_unlock_irqrestore(&bgc->lock, flags);
@@ -213,7 +215,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
213 struct irq_chip_generic *irq_gc; 215 struct irq_chip_generic *irq_gc;
214 unsigned int hwirq, ngpio = gc->ngpio; 216 unsigned int hwirq, ngpio = gc->ngpio;
215 struct irq_chip_type *ct; 217 struct irq_chip_type *ct;
216 int err, irq; 218 int err, irq, i;
217 219
218 irq = irq_of_parse_and_map(node, 0); 220 irq = irq_of_parse_and_map(node, 0);
219 if (!irq) { 221 if (!irq) {
@@ -227,7 +229,7 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
227 if (!gpio->domain) 229 if (!gpio->domain)
228 return; 230 return;
229 231
230 err = irq_alloc_domain_generic_chips(gpio->domain, ngpio, 1, 232 err = irq_alloc_domain_generic_chips(gpio->domain, ngpio, 2,
231 "gpio-dwapb", handle_level_irq, 233 "gpio-dwapb", handle_level_irq,
232 IRQ_NOREQUEST, 0, 234 IRQ_NOREQUEST, 0,
233 IRQ_GC_INIT_NESTED_LOCK); 235 IRQ_GC_INIT_NESTED_LOCK);
@@ -248,20 +250,24 @@ static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
248 irq_gc->reg_base = gpio->regs; 250 irq_gc->reg_base = gpio->regs;
249 irq_gc->private = gpio; 251 irq_gc->private = gpio;
250 252
251 ct = irq_gc->chip_types; 253 for (i = 0; i < 2; i++) {
252 ct->chip.irq_ack = irq_gc_ack_set_bit; 254 ct = &irq_gc->chip_types[i];
253 ct->chip.irq_mask = irq_gc_mask_set_bit; 255 ct->chip.irq_ack = irq_gc_ack_set_bit;
254 ct->chip.irq_unmask = irq_gc_mask_clr_bit; 256 ct->chip.irq_mask = irq_gc_mask_set_bit;
255 ct->chip.irq_set_type = dwapb_irq_set_type; 257 ct->chip.irq_unmask = irq_gc_mask_clr_bit;
256 ct->chip.irq_enable = dwapb_irq_enable; 258 ct->chip.irq_set_type = dwapb_irq_set_type;
257 ct->chip.irq_disable = dwapb_irq_disable; 259 ct->chip.irq_enable = dwapb_irq_enable;
258 ct->chip.irq_request_resources = dwapb_irq_reqres; 260 ct->chip.irq_disable = dwapb_irq_disable;
259 ct->chip.irq_release_resources = dwapb_irq_relres; 261 ct->chip.irq_request_resources = dwapb_irq_reqres;
260 ct->regs.ack = GPIO_PORTA_EOI; 262 ct->chip.irq_release_resources = dwapb_irq_relres;
261 ct->regs.mask = GPIO_INTMASK; 263 ct->regs.ack = GPIO_PORTA_EOI;
262 264 ct->regs.mask = GPIO_INTMASK;
263 irq_setup_generic_chip(irq_gc, IRQ_MSK(port->bgc.gc.ngpio), 265 ct->type = IRQ_TYPE_LEVEL_MASK;
264 IRQ_GC_INIT_NESTED_LOCK, IRQ_NOREQUEST, 0); 266 }
267
268 irq_gc->chip_types[0].type = IRQ_TYPE_LEVEL_MASK;
269 irq_gc->chip_types[1].type = IRQ_TYPE_EDGE_BOTH;
270 irq_gc->chip_types[1].handler = handle_edge_irq;
265 271
266 irq_set_chained_handler(irq, dwapb_irq_handler); 272 irq_set_chained_handler(irq, dwapb_irq_handler);
267 irq_set_handler_data(irq, gpio); 273 irq_set_handler_data(irq, gpio);