Skip to content

Commit c36f8c0

Browse files
author
Linus Walleij
committed
pinctrl: st: Convert to immutable irq_chip
Convert the driver to immutable irq-chip with a bit of intuition. I switched to using irqd_to_hwirq() consistently while we are at it. This driver does not use the GPIOCHIP_IRQ_RESOURCE_HELPERS as it defines its own resource reservations, simply in order to turn IRQ lines into inputs on initialization. Also switched the open coded calls to gpiochip_lock_as_irq() to gpiochip_reqres_irq() so we also get the right module reference counting. Cc: Marc Zyngier <maz@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Link: https://lore.kernel.org/r/20230403-immutable-irqchips-v1-7-503788a7f6e6@linaro.org
1 parent cca973a commit c36f8c0

1 file changed

Lines changed: 9 additions & 7 deletions

File tree

drivers/pinctrl/pinctrl-st.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,15 +1313,17 @@ static void st_gpio_irq_mask(struct irq_data *d)
13131313
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
13141314
struct st_gpio_bank *bank = gpiochip_get_data(gc);
13151315

1316-
writel(BIT(d->hwirq), bank->base + REG_PIO_CLR_PMASK);
1316+
writel(BIT(irqd_to_hwirq(d)), bank->base + REG_PIO_CLR_PMASK);
1317+
gpiochip_disable_irq(gc, irqd_to_hwirq(d));
13171318
}
13181319

13191320
static void st_gpio_irq_unmask(struct irq_data *d)
13201321
{
13211322
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
13221323
struct st_gpio_bank *bank = gpiochip_get_data(gc);
13231324

1324-
writel(BIT(d->hwirq), bank->base + REG_PIO_SET_PMASK);
1325+
gpiochip_enable_irq(gc, irqd_to_hwirq(d));
1326+
writel(BIT(irqd_to_hwirq(d)), bank->base + REG_PIO_SET_PMASK);
13251327
}
13261328

13271329
static int st_gpio_irq_request_resources(struct irq_data *d)
@@ -1330,14 +1332,14 @@ static int st_gpio_irq_request_resources(struct irq_data *d)
13301332

13311333
st_gpio_direction_input(gc, d->hwirq);
13321334

1333-
return gpiochip_lock_as_irq(gc, d->hwirq);
1335+
return gpiochip_reqres_irq(gc, d->hwirq);
13341336
}
13351337

13361338
static void st_gpio_irq_release_resources(struct irq_data *d)
13371339
{
13381340
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
13391341

1340-
gpiochip_unlock_as_irq(gc, d->hwirq);
1342+
gpiochip_relres_irq(gc, d->hwirq);
13411343
}
13421344

13431345
static int st_gpio_irq_set_type(struct irq_data *d, unsigned type)
@@ -1492,15 +1494,15 @@ static const struct gpio_chip st_gpio_template = {
14921494
.ngpio = ST_GPIO_PINS_PER_BANK,
14931495
};
14941496

1495-
static struct irq_chip st_gpio_irqchip = {
1497+
static const struct irq_chip st_gpio_irqchip = {
14961498
.name = "GPIO",
14971499
.irq_request_resources = st_gpio_irq_request_resources,
14981500
.irq_release_resources = st_gpio_irq_release_resources,
14991501
.irq_disable = st_gpio_irq_mask,
15001502
.irq_mask = st_gpio_irq_mask,
15011503
.irq_unmask = st_gpio_irq_unmask,
15021504
.irq_set_type = st_gpio_irq_set_type,
1503-
.flags = IRQCHIP_SKIP_SET_WAKE,
1505+
.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_IMMUTABLE,
15041506
};
15051507

15061508
static int st_gpiolib_register_bank(struct st_pinctrl *info,
@@ -1570,7 +1572,7 @@ static int st_gpiolib_register_bank(struct st_pinctrl *info,
15701572
}
15711573

15721574
girq = &bank->gpio_chip.irq;
1573-
girq->chip = &st_gpio_irqchip;
1575+
gpio_irq_chip_set_chip(girq, &st_gpio_irqchip);
15741576
girq->parent_handler = st_gpio_irq_handler;
15751577
girq->num_parents = 1;
15761578
girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents),

0 commit comments

Comments
 (0)