Skip to content

Commit

Permalink
gpio/at91: auto request and configure the pio as input when the inter…
Browse files Browse the repository at this point in the history
…rupt 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>
  • Loading branch information
Jean-Christophe PLAGNIOL-VILLARD authored and Linus Walleij committed Oct 24, 2012
1 parent 525fae2 commit a728c7c
Showing 1 changed file with 25 additions and 1 deletion.
26 changes: 25 additions & 1 deletion drivers/pinctrl/pinctrl-at91.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit a728c7c

Please sign in to comment.