Signed-off-by: Kevin Hilman <khil...@ti.com>
---
 arch/arm/plat-omap/gpio.c |   74 ++++++++++++++++++--------------------------
 1 files changed, 30 insertions(+), 44 deletions(-)

diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c
index 17833c8..1b674fd 100644
--- a/arch/arm/plat-omap/gpio.c
+++ b/arch/arm/plat-omap/gpio.c
@@ -877,45 +877,8 @@ static struct irq_chip gpio_irq_chip = {
 
 #ifdef CONFIG_ARCH_OMAP1
 
-/* MPUIO uses the always-on 32k clock */
-
-static void mpuio_ack_irq(struct irq_data *d)
-{
-       /* The ISR is reset automatically, so do nothing here. */
-}
-
-static void mpuio_mask_irq(struct irq_data *d)
-{
-       unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
-       struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
-
-       _set_gpio_irqenable(bank, gpio, 0);
-}
-
-static void mpuio_unmask_irq(struct irq_data *d)
-{
-       unsigned int gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
-       struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
-
-       _set_gpio_irqenable(bank, gpio, 1);
-}
-
-static struct irq_chip mpuio_irq_chip = {
-       .name           = "MPUIO",
-       .irq_ack        = mpuio_ack_irq,
-       .irq_mask       = mpuio_mask_irq,
-       .irq_unmask     = mpuio_unmask_irq,
-       .irq_set_type   = gpio_irq_type,
-#ifdef CONFIG_ARCH_OMAP16XX
-       /* REVISIT: assuming only 16xx supports MPUIO wake events */
-       .irq_set_wake   = gpio_wake_enable,
-#endif
-};
-
-
 #define bank_is_mpuio(bank)    ((bank)->method == METHOD_MPUIO)
 
-
 #ifdef CONFIG_ARCH_OMAP16XX
 
 #include <linux/platform_device.h>
@@ -990,8 +953,6 @@ static inline void mpuio_init(void) {}
 
 #else
 
-extern struct irq_chip mpuio_irq_chip;
-
 #define bank_is_mpuio(bank)    0
 static inline void mpuio_init(void) {}
 
@@ -1191,6 +1152,30 @@ static void omap_gpio_mod_init(struct gpio_bank *bank, 
int id)
        }
 }
 
+static __init 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);
+       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 = gpio_irq_type;
+       /* REVISIT: assuming only 16xx supports MPUIO wake events */
+       if (cpu_is_omap16xx())
+               ct->chip.irq_set_wake = gpio_wake_enable,
+
+       ct->regs.mask = OMAP_MPUIO_GPIO_INT / bank->stride;
+       irq_setup_generic_chip(gc, IRQ_MSK(num),
+                               IRQ_NOREQUEST | IRQ_NOPROBE, 0);
+}
+
 static void __init omap_gpio_chip_init(struct gpio_bank *bank)
 {
        int j;
@@ -1228,12 +1213,13 @@ static void __init omap_gpio_chip_init(struct gpio_bank 
*bank)
                     j < bank->virtual_irq_start + bank->width; j++) {
                irq_set_lockdep_class(j, &gpio_lock_class);
                irq_set_chip_data(j, bank);
-               if (bank_is_mpuio(bank))
-                       irq_set_chip(j, &mpuio_irq_chip);
-               else
+               if (bank_is_mpuio(bank)) {
+                       omap_mpuio_alloc_gc(bank->base, j, bank->width);
+               } else {
                        irq_set_chip(j, &gpio_irq_chip);
-               irq_set_handler(j, handle_simple_irq);
-               set_irq_flags(j, IRQF_VALID);
+                       irq_set_handler(j, handle_simple_irq);
+                       set_irq_flags(j, IRQF_VALID);
+               }
        }
        irq_set_chained_handler(bank->irq, gpio_irq_handler);
        irq_set_handler_data(bank->irq, bank);
-- 
1.7.4

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to