diff options
author | Chen-Yu Tsai <wens@csie.org> | 2014-07-14 13:24:36 -0400 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2014-07-28 06:10:46 -0400 |
commit | f83549d61d6de28ea8cbbef9f8d12b697c6ed1dd (patch) | |
tree | 7ebbfd7084b8a99fe991ed7bfa310a4b21b288cf | |
parent | b547c8007e83a476b946237d09227668fe286a57 (diff) |
pinctrl: sunxi: use gpiolib API to mark a GPIO used as an IRQ
When an IRQ is started on a GPIO line, mark this GPIO as IRQ in
the gpiolib so we can keep track of the usage centrally.
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r-- | drivers/pinctrl/sunxi/pinctrl-sunxi.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c index 96ee6bb0fad5..9dba7afe94d6 100644 --- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c | |||
@@ -541,18 +541,33 @@ static int sunxi_pinctrl_irq_request_resources(struct irq_data *d) | |||
541 | { | 541 | { |
542 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); | 542 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); |
543 | struct sunxi_desc_function *func; | 543 | struct sunxi_desc_function *func; |
544 | int ret; | ||
544 | 545 | ||
545 | func = sunxi_pinctrl_desc_find_function_by_pin(pctl, | 546 | func = sunxi_pinctrl_desc_find_function_by_pin(pctl, |
546 | pctl->irq_array[d->hwirq], "irq"); | 547 | pctl->irq_array[d->hwirq], "irq"); |
547 | if (!func) | 548 | if (!func) |
548 | return -EINVAL; | 549 | return -EINVAL; |
549 | 550 | ||
551 | ret = gpio_lock_as_irq(pctl->chip, pctl->irq_array[d->hwirq]); | ||
552 | if (ret) { | ||
553 | dev_err(pctl->dev, "unable to lock HW IRQ %lu for IRQ\n", | ||
554 | irqd_to_hwirq(d)); | ||
555 | return ret; | ||
556 | } | ||
557 | |||
550 | /* Change muxing to INT mode */ | 558 | /* Change muxing to INT mode */ |
551 | sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval); | 559 | sunxi_pmx_set(pctl->pctl_dev, pctl->irq_array[d->hwirq], func->muxval); |
552 | 560 | ||
553 | return 0; | 561 | return 0; |
554 | } | 562 | } |
555 | 563 | ||
564 | static void sunxi_pinctrl_irq_release_resources(struct irq_data *d) | ||
565 | { | ||
566 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); | ||
567 | |||
568 | gpio_unlock_as_irq(pctl->chip, pctl->irq_array[d->hwirq]); | ||
569 | } | ||
570 | |||
556 | static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type) | 571 | static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type) |
557 | { | 572 | { |
558 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); | 573 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); |
@@ -657,6 +672,7 @@ static struct irq_chip sunxi_pinctrl_edge_irq_chip = { | |||
657 | .irq_mask = sunxi_pinctrl_irq_mask, | 672 | .irq_mask = sunxi_pinctrl_irq_mask, |
658 | .irq_unmask = sunxi_pinctrl_irq_unmask, | 673 | .irq_unmask = sunxi_pinctrl_irq_unmask, |
659 | .irq_request_resources = sunxi_pinctrl_irq_request_resources, | 674 | .irq_request_resources = sunxi_pinctrl_irq_request_resources, |
675 | .irq_release_resources = sunxi_pinctrl_irq_release_resources, | ||
660 | .irq_set_type = sunxi_pinctrl_irq_set_type, | 676 | .irq_set_type = sunxi_pinctrl_irq_set_type, |
661 | .flags = IRQCHIP_SKIP_SET_WAKE, | 677 | .flags = IRQCHIP_SKIP_SET_WAKE, |
662 | }; | 678 | }; |
@@ -670,6 +686,7 @@ static struct irq_chip sunxi_pinctrl_level_irq_chip = { | |||
670 | .irq_enable = sunxi_pinctrl_irq_ack_unmask, | 686 | .irq_enable = sunxi_pinctrl_irq_ack_unmask, |
671 | .irq_disable = sunxi_pinctrl_irq_mask, | 687 | .irq_disable = sunxi_pinctrl_irq_mask, |
672 | .irq_request_resources = sunxi_pinctrl_irq_request_resources, | 688 | .irq_request_resources = sunxi_pinctrl_irq_request_resources, |
689 | .irq_release_resources = sunxi_pinctrl_irq_release_resources, | ||
673 | .irq_set_type = sunxi_pinctrl_irq_set_type, | 690 | .irq_set_type = sunxi_pinctrl_irq_set_type, |
674 | .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_EOI_THREADED | | 691 | .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_EOI_THREADED | |
675 | IRQCHIP_EOI_IF_HANDLED, | 692 | IRQCHIP_EOI_IF_HANDLED, |