diff options
author | Linus Walleij <linus.walleij@linaro.org> | 2014-01-15 04:07:07 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2014-01-15 07:59:44 -0500 |
commit | 655dada62779917e2337b9abf8ab95e891cc0938 (patch) | |
tree | aea78ed54dd956163418259153b396b0ae22c7b3 /drivers/pinctrl/sirf | |
parent | b07ddcdcb28764d4deb26933d803cb38c370f01b (diff) |
pinctrl: sirf: lock IRQs when starting them
This uses the new API for tagging GPIO lines as in use by
IRQs. This enforces a few semantic checks on how the underlying
GPIO line is used.
Also assign the gpio_chip.dev pointer to be used for error
messages.
Cc: Barry Song <Baohua.Song@csr.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/sirf')
-rw-r--r-- | drivers/pinctrl/sirf/pinctrl-sirf.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/pinctrl/sirf/pinctrl-sirf.c b/drivers/pinctrl/sirf/pinctrl-sirf.c index b637f5ab022c..a0d6152701cd 100644 --- a/drivers/pinctrl/sirf/pinctrl-sirf.c +++ b/drivers/pinctrl/sirf/pinctrl-sirf.c | |||
@@ -594,12 +594,34 @@ static int sirfsoc_gpio_irq_type(struct irq_data *d, unsigned type) | |||
594 | return 0; | 594 | return 0; |
595 | } | 595 | } |
596 | 596 | ||
597 | static unsigned int sirfsoc_gpio_irq_startup(struct irq_data *d) | ||
598 | { | ||
599 | struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); | ||
600 | |||
601 | if (gpio_lock_as_irq(&bank->chip.gc, d->hwirq)) | ||
602 | dev_err(bank->chip.gc.dev, | ||
603 | "unable to lock HW IRQ %lu for IRQ\n", | ||
604 | d->hwirq); | ||
605 | sirfsoc_gpio_irq_unmask(d); | ||
606 | return 0; | ||
607 | } | ||
608 | |||
609 | static void sirfsoc_gpio_irq_shutdown(struct irq_data *d) | ||
610 | { | ||
611 | struct sirfsoc_gpio_bank *bank = irq_data_get_irq_chip_data(d); | ||
612 | |||
613 | sirfsoc_gpio_irq_mask(d); | ||
614 | gpio_unlock_as_irq(&bank->chip.gc, d->hwirq); | ||
615 | } | ||
616 | |||
597 | static struct irq_chip sirfsoc_irq_chip = { | 617 | static struct irq_chip sirfsoc_irq_chip = { |
598 | .name = "sirf-gpio-irq", | 618 | .name = "sirf-gpio-irq", |
599 | .irq_ack = sirfsoc_gpio_irq_ack, | 619 | .irq_ack = sirfsoc_gpio_irq_ack, |
600 | .irq_mask = sirfsoc_gpio_irq_mask, | 620 | .irq_mask = sirfsoc_gpio_irq_mask, |
601 | .irq_unmask = sirfsoc_gpio_irq_unmask, | 621 | .irq_unmask = sirfsoc_gpio_irq_unmask, |
602 | .irq_set_type = sirfsoc_gpio_irq_type, | 622 | .irq_set_type = sirfsoc_gpio_irq_type, |
623 | .irq_startup = sirfsoc_gpio_irq_startup, | ||
624 | .irq_shutdown = sirfsoc_gpio_irq_shutdown, | ||
603 | }; | 625 | }; |
604 | 626 | ||
605 | static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc) | 627 | static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc) |
@@ -877,6 +899,7 @@ static int sirfsoc_gpio_probe(struct device_node *np) | |||
877 | bank->chip.gc.of_node = np; | 899 | bank->chip.gc.of_node = np; |
878 | bank->chip.gc.of_xlate = sirfsoc_gpio_of_xlate; | 900 | bank->chip.gc.of_xlate = sirfsoc_gpio_of_xlate; |
879 | bank->chip.gc.of_gpio_n_cells = 2; | 901 | bank->chip.gc.of_gpio_n_cells = 2; |
902 | bank->chip.gc.dev = &pdev->dev; | ||
880 | bank->chip.regs = regs; | 903 | bank->chip.regs = regs; |
881 | bank->id = i; | 904 | bank->id = i; |
882 | bank->is_marco = is_marco; | 905 | bank->is_marco = is_marco; |