aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/sirf
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2014-01-15 04:07:07 -0500
committerLinus Walleij <linus.walleij@linaro.org>2014-01-15 07:59:44 -0500
commit655dada62779917e2337b9abf8ab95e891cc0938 (patch)
treeaea78ed54dd956163418259153b396b0ae22c7b3 /drivers/pinctrl/sirf
parentb07ddcdcb28764d4deb26933d803cb38c370f01b (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.c23
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
597static 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
609static 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
597static struct irq_chip sirfsoc_irq_chip = { 617static 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
605static void sirfsoc_gpio_handle_irq(unsigned int irq, struct irq_desc *desc) 627static 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;