aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio
diff options
context:
space:
mode:
authorJavier Martinez Canillas <javier.martinez@collabora.co.uk>2013-06-28 11:27:03 -0400
committerLinus Walleij <linus.walleij@linaro.org>2013-07-20 12:57:28 -0400
commitb4419e1a15905191661ffe75ba2f9e649f5d565e (patch)
treecec09fc04bf75a666a9ba3524d197a9704d37d0c /drivers/gpio
parent0e970cec05635adbe7b686063e2548a8e4afb8f4 (diff)
gpio/omap: auto request GPIO as input if used as IRQ via DT
When an OMAP GPIO is used as an IRQ line, a call to gpio_request() has to be made to initialize the OMAP GPIO bank before a driver request the IRQ. Otherwise the call to request_irq() fails. Drives should not be aware of this neither care wether an IRQ line is a GPIO or not. They should just request the IRQ and this has to be handled by the irq_chip driver. With the current OMAP GPIO DT binding, if we define: gpio6: gpio@49058000 { compatible = "ti,omap3-gpio"; reg = <0x49058000 0x200>; interrupts = <34>; ti,hwmods = "gpio6"; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; }; interrupt-parent = <&gpio6>; interrupts = <16 8>; The GPIO is correctly mapped as an IRQ but a call to gpio_request() is never made. Since a call to the custom IRQ domain .map function handler is made for each GPIO used as an IRQ, the GPIO can be setup and configured as input there automatically. 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 - Add a comment that this is just a temporary solution until and that it has to be removed once is handled by the IRQ core. Changes since v2: - Only make the call to gpio_request_one() conditional in the DT case as suggested by Grant Likely. Changes since v1: - Split the irq domain mapping function handler and the GPIO request in two different patches. 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> Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/gpio')
-rw-r--r--drivers/gpio/gpio-omap.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 5e667ff91dc3..3a0c1606f885 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -1090,6 +1090,8 @@ static int omap_gpio_irq_map(struct irq_domain *d, unsigned int virq,
1090 irq_hw_number_t hwirq) 1090 irq_hw_number_t hwirq)
1091{ 1091{
1092 struct gpio_bank *bank = d->host_data; 1092 struct gpio_bank *bank = d->host_data;
1093 int gpio;
1094 int ret;
1093 1095
1094 if (!bank) 1096 if (!bank)
1095 return -EINVAL; 1097 return -EINVAL;
@@ -1104,6 +1106,22 @@ static int omap_gpio_irq_map(struct irq_domain *d, unsigned int virq,
1104 set_irq_flags(virq, IRQF_VALID); 1106 set_irq_flags(virq, IRQF_VALID);
1105 } 1107 }
1106 1108
1109 /*
1110 * REVISIT most GPIO IRQ chip drivers need to call
1111 * gpio_request() before a GPIO line can be used as an
1112 * IRQ. Ideally this should be handled by the IRQ core
1113 * but until then this has to be done on a per driver
1114 * basis. Remove this once this is managed by the core.
1115 */
1116 if (bank->chip.of_node) {
1117 gpio = irq_to_gpio(bank, hwirq);
1118 ret = gpio_request_one(gpio, GPIOF_IN, NULL);
1119 if (ret) {
1120 dev_err(bank->dev, "Could not request GPIO%d\n", gpio);
1121 return ret;
1122 }
1123 }
1124
1107 return 0; 1125 return 0;
1108} 1126}
1109 1127