Skip to contentSkip to conversation

gpio: omap: Fix regression for MPUIO interrupts

PATCH New Tony Lindgren 5 participants 6 messages Apr 23, 2015 – May 6, 2015

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 gpio: omap: Fix regression for MPUIO interrupts

At some point with all the GPIO clean-up we've broken the MPUIO interrupts. Those are just a little bit different from the GPIO interrupts, so we can fix it up just by setting different irqchip functions for it. And then we can just remove all old code trying to do the same.

Cc Aaro Koskinen <[email protected]>
Cc Felipe Balbi <[email protected]>
Cc Javier Martinez Canillas <[email protected]>
Cc Grygorii Strashko <[email protected]>
Cc Kevin Hilman <[email protected]>
Cc Nishanth Menon <[email protected]>
Cc Santosh Shilimkar <[email protected]>
---
 drivers/gpio/gpio-omap.c | 48 +++++++++---------------------------------------
 1 file changed, 9 insertions(+), 39 deletions(-)
drivers/gpio/gpio-omap.c +9 -39
index 6553361..b59c3ca 100644
@@ -1023,38 +1023,8 @@ static void omap_gpio_mod_init(struct gpio_bank *bank)
 		dev_err(bank->dev, "Could not get gpio dbck\n");
 }
 
-static void
-omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start,
-		    unsigned int num)
-{
-	struct irq_chip_generic *gc;
-	struct irq_chip_type *ct;
-
-	gc = irq_alloc_generic_chip("MPUIO", 1, irq_start, bank->base,
-				    handle_simple_irq);
-	if (!gc) {
-		dev_err(bank->dev, "Memory alloc failed for gc\n");
-		return;
-	}
-
-	ct = gc->chip_types;
-
-	/* NOTE: No ack required, reading IRQ status clears it. */
-	ct->chip.irq_mask = irq_gc_mask_set_bit;
-	ct->chip.irq_unmask = irq_gc_mask_clr_bit;
-	ct->chip.irq_set_type = omap_gpio_irq_type;
-
-	if (bank->regs->wkup_en)
-		ct->chip.irq_set_wake = omap_gpio_wake_enable;
-
-	ct->regs.mask = OMAP_MPUIO_GPIO_INT / bank->stride;
-	irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
-			       IRQ_NOREQUEST | IRQ_NOPROBE, 0);
-}
-
 static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
 {
-	int j;
 	static int gpio;
 	int irq_base = 0;
 	int ret;
@@ -1101,6 +1071,15 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
 	}
 #endif
 
+	/* MPUIO is a bit different, reading IRQ status clears it */
+	if (bank->is_mpuio) {
+		irqc->irq_ack = dummy_irq_chip.irq_ack;
+		irqc->irq_mask = irq_gc_mask_set_bit;
+		irqc->irq_unmask = irq_gc_mask_clr_bit;
+		if (!bank->regs->wkup_en)
+			irqc->irq_set_wake = NULL;
+	}
+
 	ret = gpiochip_irqchip_add(&bank->chip, irqc,
 				   irq_base, omap_gpio_irq_handler,
 				   IRQ_TYPE_NONE);
@@ -1114,15 +1093,6 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
 	gpiochip_set_chained_irqchip(&bank->chip, irqc,
 				     bank->irq, omap_gpio_irq_handler);
 
-	for (j = 0; j < bank->width; j++) {
-		int irq = irq_find_mapping(bank->chip.irqdomain, j);
-		if (bank->is_mpuio) {
-			omap_mpuio_alloc_gc(bank, irq, bank->width);
-			irq_set_chip_and_handler(irq, NULL, NULL);
-			set_irq_flags(irq, 0);
-		}
-	}
-
 	return 0;
 }
 
Signature · 1 line
2.1.4
#1 lore raw

PATCH 1/1 gpio: omap: Fix regression for MPUIO interrupts

Quoted 5 lines · Tony Lindgren

At some point with all the GPIO clean-up we've broken the MPUIO interrupts. Those are just a little bit different from the GPIO interrupts, so we can fix it up just by setting different irqchip functions for it. And then we can just remove all old code trying to do the same.

Quoted 89 lines
Cc Aaro Koskinen <[email protected]>
Cc Felipe Balbi <[email protected]>
Cc Javier Martinez Canillas <[email protected]>
Cc Grygorii Strashko <[email protected]>
Cc Kevin Hilman <[email protected]>
Cc Nishanth Menon <[email protected]>
Cc Santosh Shilimkar <[email protected]>
---
  drivers/gpio/gpio-omap.c | 48 +++++++++---------------------------------------
  1 file changed, 9 insertions(+), 39 deletions(-)
drivers/gpio/gpio-omap.c +9 -39
index 6553361..b59c3ca 100644
@@ -1023,38 +1023,8 @@ static void omap_gpio_mod_init(struct gpio_bank *bank)
  		dev_err(bank->dev, "Could not get gpio dbck\n");
  }
 
-static void
-omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start,
-		    unsigned int num)
-{
-	struct irq_chip_generic *gc;
-	struct irq_chip_type *ct;
-
-	gc = irq_alloc_generic_chip("MPUIO", 1, irq_start, bank->base,
-				    handle_simple_irq);
-	if (!gc) {
-		dev_err(bank->dev, "Memory alloc failed for gc\n");
-		return;
-	}
-
-	ct = gc->chip_types;
-
-	/* NOTE: No ack required, reading IRQ status clears it. */
-	ct->chip.irq_mask = irq_gc_mask_set_bit;
-	ct->chip.irq_unmask = irq_gc_mask_clr_bit;
-	ct->chip.irq_set_type = omap_gpio_irq_type;
-
-	if (bank->regs->wkup_en)
-		ct->chip.irq_set_wake = omap_gpio_wake_enable;
-
-	ct->regs.mask = OMAP_MPUIO_GPIO_INT / bank->stride;
-	irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
-			       IRQ_NOREQUEST | IRQ_NOPROBE, 0);
-}
-
  static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
  {
-	int j;
  	static int gpio;
  	int irq_base = 0;
  	int ret;
@@ -1101,6 +1071,15 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
  	}
  #endif
 
+	/* MPUIO is a bit different, reading IRQ status clears it */
+	if (bank->is_mpuio) {
+		irqc->irq_ack = dummy_irq_chip.irq_ack;
+		irqc->irq_mask = irq_gc_mask_set_bit;
+		irqc->irq_unmask = irq_gc_mask_clr_bit;
+		if (!bank->regs->wkup_en)
+			irqc->irq_set_wake = NULL;
+	}
+
  	ret = gpiochip_irqchip_add(&bank->chip, irqc,
  				   irq_base, omap_gpio_irq_handler,
  				   IRQ_TYPE_NONE);
@@ -1114,15 +1093,6 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
  	gpiochip_set_chained_irqchip(&bank->chip, irqc,
  				     bank->irq, omap_gpio_irq_handler);
 
-	for (j = 0; j < bank->width; j++) {
-		int irq = irq_find_mapping(bank->chip.irqdomain, j);
-		if (bank->is_mpuio) {
-			omap_mpuio_alloc_gc(bank, irq, bank->width);
-			irq_set_chip_and_handler(irq, NULL, NULL);
-			set_irq_flags(irq, 0);
-		}
-	}
-
  	return 0;
  }
 
Signature · 2 lines
regards,
-grygorii
#2 lore raw

PATCH 1/1 gpio: omap: Fix regression for MPUIO interrupts

In reply to Tony Lindgren
Quoted 14 lines · Tony Lindgren

At some point with all the GPIO clean-up we've broken the MPUIO interrupts. Those are just a little bit different from the GPIO interrupts, so we can fix it up just by setting different irqchip functions for it. And then we can just remove all old code trying to do the same.

Cc Aaro Koskinen <[email protected]>
Cc Felipe Balbi <[email protected]>
Cc Javier Martinez Canillas <[email protected]>
Cc Grygorii Strashko <[email protected]>
Cc Kevin Hilman <[email protected]>
Cc Nishanth Menon <[email protected]>
Cc Santosh Shilimkar <[email protected]>
Quoted 1 line

---

#3 lore raw

PATCH 1/1 gpio: omap: Fix regression for MPUIO interrupts

In reply to Tony Lindgren
Quoted 6 lines · Tony Lindgren

At some point with all the GPIO clean-up we've broken the MPUIO interrupts. Those are just a little bit different from the GPIO interrupts, so we can fix it up just by setting different irqchip functions for it. And then we can just remove all old code trying to do the same.

Quoted 8 lines
Cc Aaro Koskinen <[email protected]>
Cc Felipe Balbi <[email protected]>
Cc Javier Martinez Canillas <[email protected]>
Cc Grygorii Strashko <[email protected]>
Cc Kevin Hilman <[email protected]>
Cc Nishanth Menon <[email protected]>
Cc Santosh Shilimkar <[email protected]>
Quoted 82 lines
---
 drivers/gpio/gpio-omap.c | 48 +++++++++---------------------------------------
 1 file changed, 9 insertions(+), 39 deletions(-)
drivers/gpio/gpio-omap.c +9 -39
index 6553361..b59c3ca 100644
@@ -1023,38 +1023,8 @@ static void omap_gpio_mod_init(struct gpio_bank *bank)
 		dev_err(bank->dev, "Could not get gpio dbck\n");
 }
 
-static void
-omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start,
-		    unsigned int num)
-{
-	struct irq_chip_generic *gc;
-	struct irq_chip_type *ct;
-
-	gc = irq_alloc_generic_chip("MPUIO", 1, irq_start, bank->base,
-				    handle_simple_irq);
-	if (!gc) {
-		dev_err(bank->dev, "Memory alloc failed for gc\n");
-		return;
-	}
-
-	ct = gc->chip_types;
-
-	/* NOTE: No ack required, reading IRQ status clears it. */
-	ct->chip.irq_mask = irq_gc_mask_set_bit;
-	ct->chip.irq_unmask = irq_gc_mask_clr_bit;
-	ct->chip.irq_set_type = omap_gpio_irq_type;
-
-	if (bank->regs->wkup_en)
-		ct->chip.irq_set_wake = omap_gpio_wake_enable;
-
-	ct->regs.mask = OMAP_MPUIO_GPIO_INT / bank->stride;
-	irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
-			       IRQ_NOREQUEST | IRQ_NOPROBE, 0);
-}
-
 static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
 {
-	int j;
 	static int gpio;
 	int irq_base = 0;
 	int ret;
@@ -1101,6 +1071,15 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
 	}
 #endif
 
+	/* MPUIO is a bit different, reading IRQ status clears it */
+	if (bank->is_mpuio) {
+		irqc->irq_ack = dummy_irq_chip.irq_ack;
+		irqc->irq_mask = irq_gc_mask_set_bit;
+		irqc->irq_unmask = irq_gc_mask_clr_bit;
+		if (!bank->regs->wkup_en)
+			irqc->irq_set_wake = NULL;
+	}
+
 	ret = gpiochip_irqchip_add(&bank->chip, irqc,
 				   irq_base, omap_gpio_irq_handler,
 				   IRQ_TYPE_NONE);
@@ -1114,15 +1093,6 @@ static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)
 	gpiochip_set_chained_irqchip(&bank->chip, irqc,
 				     bank->irq, omap_gpio_irq_handler);
 
-	for (j = 0; j < bank->width; j++) {
-		int irq = irq_find_mapping(bank->chip.irqdomain, j);
-		if (bank->is_mpuio) {
-			omap_mpuio_alloc_gc(bank, irq, bank->width);
-			irq_set_chip_and_handler(irq, NULL, NULL);
-			set_irq_flags(irq, 0);
-		}
-	}
-
 	return 0;
 }
 
Signature · 1 line
2.1.4
Signature · 8 lines
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150424/ad5a0d54/attachment.sig>
#4 lore raw

PATCH 1/1 gpio: omap: Fix regression for MPUIO interrupts

In reply to Tony Lindgren
Quoted 6 lines · Tony Lindgren

At some point with all the GPIO clean-up we've broken the MPUIO interrupts. Those are just a little bit different from the GPIO interrupts, so we can fix it up just by setting different irqchip functions for it. And then we can just remove all old code trying to do the same.

Quoted 8 lines
Cc Aaro Koskinen <[email protected]>
Cc Felipe Balbi <[email protected]>
Cc Javier Martinez Canillas <[email protected]>
Cc Grygorii Strashko <[email protected]>
Cc Kevin Hilman <[email protected]>
Cc Nishanth Menon <[email protected]>
Cc Santosh Shilimkar <[email protected]>

Patch applied for fixes with the ACKs etc,

Yours,
Linus Walleij

#5 lore raw

PATCH 1/1 gpio: omap: Fix regression for MPUIO interrupts

Quoted 17 lines · Linus Walleij
Quoted 6 lines · Tony Lindgren

At some point with all the GPIO clean-up we've broken the MPUIO interrupts. Those are just a little bit different from the GPIO interrupts, so we can fix it up just by setting different irqchip functions for it. And then we can just remove all old code trying to do the same.

Quoted 8 lines
Cc Aaro Koskinen <[email protected]>
Cc Felipe Balbi <[email protected]>
Cc Javier Martinez Canillas <[email protected]>
Cc Grygorii Strashko <[email protected]>
Cc Kevin Hilman <[email protected]>
Cc Nishanth Menon <[email protected]>
Cc Santosh Shilimkar <[email protected]>
Quoted 1 line

Patch applied for fixes with the ACKs etc,

Thanks. Yes this should go in during the -rc cycle as a regresion fix. Sorry I could not exactly pinpoint where we've broken the MPUIO interrupts with all the clean-up.

Also the omap1 SPARSE_IRQ changes I recently posted have a dependency to this one so that's another reason to get this one out of the way.

No rush with the other ones, those should be OK for v4.2.

Regards,

Tony