linux-omap.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 1/2] gpio/omap: don't create an IRQ mapping for every GPIO on DT
@ 2013-06-28 15:27 Javier Martinez Canillas
  2013-06-28 15:27 ` [PATCH v4 2/2] gpio/omap: auto request GPIO as input if used as IRQ via DT Javier Martinez Canillas
                   ` (3 more replies)
  0 siblings, 4 replies; 43+ messages in thread
From: Javier Martinez Canillas @ 2013-06-28 15:27 UTC (permalink / raw)
  To: Linus Walleij
  Cc: Grant Likely, jgchunter, Santosh Shilimkar, Tony Lindgren,
	Jean-Christophe PLAGNIOL-VILLARD, eballetbo, linux-omap,
	Florian Vaussard, aaro.koskinen, Javier Martinez Canillas

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@collabora.co.uk>
Tested-by: Enric Balletbo i Serra <eballetbo@gmail.com>
Acked-by: Grant Likely <grant.likely@secretlab.ca>
Acked-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
---

Changes since v3:
  - Use bank->chip.of_node instead of_have_populated_dt() to check
    DT or legacy boot as suggested by Jean-Christophe PLAGNIOL-VILLARD

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..e260590 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 (!bank->chip.of_node)
+		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


^ permalink raw reply related	[flat|nested] 43+ messages in thread

end of thread, other threads:[~2013-07-29 11:53 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-06-28 15:27 [PATCH v4 1/2] gpio/omap: don't create an IRQ mapping for every GPIO on DT Javier Martinez Canillas
2013-06-28 15:27 ` [PATCH v4 2/2] gpio/omap: auto request GPIO as input if used as IRQ via DT Javier Martinez Canillas
2013-06-28 15:32   ` Santosh Shilimkar
2013-06-28 15:28 ` [PATCH v4 1/2] gpio/omap: don't create an IRQ mapping for every GPIO on DT Santosh Shilimkar
2013-06-29 23:44 ` Linus Walleij
2013-06-30  0:25   ` Javier Martinez Canillas
2013-07-01  8:04     ` Linus Walleij
2013-07-01 11:01       ` Javier Martinez Canillas
2013-07-01 12:35         ` Linus Walleij
2013-07-01 12:49       ` Grant Likely
2013-07-01 13:23         ` Linus Walleij
2013-07-28 10:58 ` Alexander Holler
2013-07-28 11:14   ` Linus Walleij
2013-07-28 12:59     ` Alexander Holler
2013-07-28 14:11       ` Linus Walleij
2013-07-28 14:37         ` Shilimkar, Santosh
2013-07-28 16:29           ` Linus Walleij
2013-07-28 17:13             ` Alexander Holler
2013-07-28 18:10               ` Linus Walleij
2013-07-28 17:33             ` Javier Martinez Canillas
2013-07-28 17:36               ` Javier Martinez Canillas
2013-07-28 18:22               ` Linus Walleij
2013-07-28 19:06                 ` Javier Martinez Canillas
2013-07-29  6:41                   ` Alexander Holler
2013-07-29  8:17                     ` Javier Martinez Canillas
2013-07-29  9:13                       ` Linus Walleij
2013-07-29 10:27                       ` Alexander Holler
2013-07-29 11:11                         ` Javier Martinez Canillas
2013-07-29 11:30                           ` Alexander Holler
2013-07-29 11:33                             ` Alexander Holler
2013-07-29 11:48                           ` Linus Walleij
2013-07-29 11:53                       ` Balaji T K
2013-07-28 19:30                 ` Javier Martinez Canillas
2013-07-29  6:54                   ` Alexander Holler
2013-07-28 14:25   ` Alexander Holler
2013-07-28 16:25     ` Linus Walleij
2013-07-28 16:45       ` Alexander Holler
2013-07-28 17:47         ` Javier Martinez Canillas
2013-07-28 18:06         ` Linus Walleij
2013-07-28 18:50           ` Javier Martinez Canillas
2013-07-29  5:24             ` Alexander Holler
2013-07-29  9:05               ` Linus Walleij
2013-07-29 10:48                 ` Alexander Holler

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).