On Wed, Jun 26, 2013 at 8:50 PM, Javier Martinez Canillas <javier.martinez@xxxxxxxxxxxxxxx> wrote: > When a GPIO is defined as an interrupt line using Device > Tree, a call to irq_create_of_mapping() is made that calls > irq_create_mapping(). So, is not necessary to do the mapping > for all OMAP GPIO lines and explicitly call irq_create_mapping() > on the driver probe() when booting with Device Tree. > > Add a custom IRQ domain .map function handler that will be > called by irq_create_mapping() to map the GPIO lines used as IRQ. > This also allows to execute needed setup code such as configuring > a GPIO as input and enabling the GPIO bank. > > Signed-off-by: Javier Martinez Canillas <javier.martinez@xxxxxxxxxxxxxxx> Acked-by: Grant Likely <grant.likely@xxxxxxxxxx> > --- > > Changes since v2: > - Unconditionally do the IRQ setup in the .map() function and > only call irq_create_mapping() in the gpio chip init to avoid > code duplication as suggested by Grant Likely. > > Changes since v1: > - Split the addition of the .map function handler and the > automatic gpio request in two different patches. > - Add GPIO IRQ setup logic to the irq domain mapping function. > - Only call irq_create_mapping for every GPIO on legacy boot. > - Only setup a GPIO IRQ on the .map function for DeviceTree boot. > > drivers/gpio/gpio-omap.c | 54 ++++++++++++++++++++++++++++++++++------------ > 1 files changed, 40 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c > index 4a43036..42f04ff 100644 > --- a/drivers/gpio/gpio-omap.c > +++ b/drivers/gpio/gpio-omap.c > @@ -1068,24 +1068,50 @@ static void omap_gpio_chip_init(struct gpio_bank *bank) > > gpiochip_add(&bank->chip); > > - for (j = 0; j < bank->width; j++) { > - int irq = irq_create_mapping(bank->domain, j); > - irq_set_lockdep_class(irq, &gpio_lock_class); > - irq_set_chip_data(irq, bank); > - if (bank->is_mpuio) { > - omap_mpuio_alloc_gc(bank, irq, bank->width); > - } else { > - irq_set_chip_and_handler(irq, &gpio_irq_chip, > - handle_simple_irq); > - set_irq_flags(irq, IRQF_VALID); > - } > - } > + /* > + * REVISIT these explicit calls to irq_create_mapping() > + * to do the GPIO to IRQ domain mapping for each GPIO in > + * the bank can be removed once all OMAP platforms have > + * been migrated to Device Tree boot only. > + * Since in DT boot irq_create_mapping() is called from > + * irq_create_of_mapping() only for the GPIO lines that > + * are used as interrupts. > + */ > + if (!of_have_populated_dt()) > + for (j = 0; j < bank->width; j++) > + irq_create_mapping(bank->domain, j); > irq_set_chained_handler(bank->irq, gpio_irq_handler); > irq_set_handler_data(bank->irq, bank); > } > > static const struct of_device_id omap_gpio_match[]; > > +static int omap_gpio_irq_map(struct irq_domain *d, unsigned int virq, > + irq_hw_number_t hwirq) > +{ > + struct gpio_bank *bank = d->host_data; > + > + if (!bank) > + return -EINVAL; > + > + irq_set_lockdep_class(virq, &gpio_lock_class); > + irq_set_chip_data(virq, bank); > + if (bank->is_mpuio) { > + omap_mpuio_alloc_gc(bank, virq, bank->width); > + } else { > + irq_set_chip_and_handler(virq, &gpio_irq_chip, > + handle_simple_irq); > + set_irq_flags(virq, IRQF_VALID); > + } > + > + return 0; > +} > + > +static struct irq_domain_ops omap_gpio_irq_ops = { > + .xlate = irq_domain_xlate_onetwocell, > + .map = omap_gpio_irq_map, > +}; > + > static int omap_gpio_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > @@ -1151,10 +1177,10 @@ static int omap_gpio_probe(struct platform_device *pdev) > } > > bank->domain = irq_domain_add_legacy(node, bank->width, irq_base, > - 0, &irq_domain_simple_ops, NULL); > + 0, &omap_gpio_irq_ops, bank); > #else > bank->domain = irq_domain_add_linear(node, bank->width, > - &irq_domain_simple_ops, NULL); > + &omap_gpio_irq_ops, bank); > #endif > if (!bank->domain) { > dev_err(dev, "Couldn't register an IRQ domain\n"); > -- > 1.7.7.6 > -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html