summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinctrl-at91.c
diff options
context:
space:
mode:
authorJean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>2012-10-23 15:56:41 +0200
committerLinus Walleij <linus.walleij@linaro.org>2012-10-24 14:01:15 +0200
commita728c7cdd033f0cbeacc302d2409a2428e68e1be (patch)
tree2b34e56140060750b691f5c7479a76df3862fa67 /drivers/pinctrl/pinctrl-at91.c
parent525fae21317658ae556ca850f3004319004641d1 (diff)
downloadlinux-a728c7cdd033f0cbeacc302d2409a2428e68e1be.tar.gz
linux-a728c7cdd033f0cbeacc302d2409a2428e68e1be.tar.bz2
linux-a728c7cdd033f0cbeacc302d2409a2428e68e1be.zip
gpio/at91: auto request and configure the pio as input when the interrupt is used via DT
If we do this interrupt-parent = <&pioA>; interrupts = <7 0x0>; The current core map the irq correctly but the gpio is not configured as input. The pinctrl configure the pin as gpio with the correct mux parameter but is not responsible to configure it as input. So do it during the xlate Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinctrl-at91.c')
-rw-r--r--drivers/pinctrl/pinctrl-at91.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/pinctrl/pinctrl-at91.c b/drivers/pinctrl/pinctrl-at91.c
index f10fad2079c5..676b199d6d22 100644
--- a/drivers/pinctrl/pinctrl-at91.c
+++ b/drivers/pinctrl/pinctrl-at91.c
@@ -1255,9 +1255,33 @@ static int at91_gpio_irq_map(struct irq_domain *h, unsigned int virq,
return 0;
}
+int at91_gpio_irq_domain_xlate(struct irq_domain *d, struct device_node *ctrlr,
+ const u32 *intspec, unsigned int intsize,
+ irq_hw_number_t *out_hwirq, unsigned int *out_type)
+{
+ struct at91_gpio_chip *at91_gpio = d->host_data;
+ int ret;
+ int pin = at91_gpio->chip.base + intspec[0];
+
+ if (WARN_ON(intsize < 2))
+ return -EINVAL;
+ *out_hwirq = intspec[0];
+ *out_type = intspec[1] & IRQ_TYPE_SENSE_MASK;
+
+ ret = gpio_request(pin, ctrlr->full_name);
+ if (ret)
+ return ret;
+
+ ret = gpio_direction_input(pin);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static struct irq_domain_ops at91_gpio_ops = {
.map = at91_gpio_irq_map,
- .xlate = irq_domain_xlate_twocell,
+ .xlate = at91_gpio_irq_domain_xlate,
};
static int at91_gpio_of_irq_setup(struct device_node *node,