Skip to content

Commit

Permalink
gpio: pl061: lock IRQs when starting them
Browse files Browse the repository at this point in the history
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.

Cc: Haojian Zhuang <haojian.zhuang@linaro.org>
Cc: Deepak Sikri <deepak.sikri@st.com>
Acked-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
  • Loading branch information
Linus Walleij committed Feb 3, 2014
1 parent 7808755 commit f6f2931
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions drivers/gpio/gpio-pl061.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,11 +231,33 @@ static void pl061_irq_unmask(struct irq_data *d)
spin_unlock(&chip->lock);
}

static unsigned int pl061_irq_startup(struct irq_data *d)
{
struct pl061_gpio *chip = irq_data_get_irq_chip_data(d);

if (gpio_lock_as_irq(&chip->gc, irqd_to_hwirq(d)))
dev_err(chip->gc.dev,
"unable to lock HW IRQ %lu for IRQ\n",
irqd_to_hwirq(d));
pl061_irq_unmask(d);
return 0;
}

static void pl061_irq_shutdown(struct irq_data *d)
{
struct pl061_gpio *chip = irq_data_get_irq_chip_data(d);

pl061_irq_mask(d);
gpio_unlock_as_irq(&chip->gc, irqd_to_hwirq(d));
}

static struct irq_chip pl061_irqchip = {
.name = "pl061 gpio",
.irq_mask = pl061_irq_mask,
.irq_unmask = pl061_irq_unmask,
.irq_set_type = pl061_irq_type,
.irq_startup = pl061_irq_startup,
.irq_shutdown = pl061_irq_shutdown,
};

static int pl061_irq_map(struct irq_domain *d, unsigned int irq,
Expand Down

0 comments on commit f6f2931

Please sign in to comment.