Skip to content

Commit 7341944

Browse files
author
Linus Walleij
committed
pinctrl: stmfx: Convert to immutable irq_chip
Convert the driver to immutable irq-chip with a bit of intuition. This driver rolls it's own resource handling and does not use GPIOCHIP_IRQ_RESOURCE_HELPERS. 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-8-503788a7f6e6@linaro.org
1 parent c36f8c0 commit 7341944

1 file changed

Lines changed: 24 additions & 12 deletions

File tree

drivers/pinctrl/pinctrl-stmfx.c

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ struct stmfx_pinctrl {
8585
struct pinctrl_dev *pctl_dev;
8686
struct pinctrl_desc pctl_desc;
8787
struct gpio_chip gpio_chip;
88-
struct irq_chip irq_chip;
8988
struct mutex lock; /* IRQ bus lock */
9089
unsigned long gpio_valid_mask;
9190
/* Cache of IRQ_GPI_* registers for bus_lock */
@@ -427,6 +426,7 @@ static void stmfx_pinctrl_irq_mask(struct irq_data *data)
427426
u32 mask = get_mask(data->hwirq);
428427

429428
pctl->irq_gpi_src[reg] &= ~mask;
429+
gpiochip_disable_irq(gpio_chip, irqd_to_hwirq(data));
430430
}
431431

432432
static void stmfx_pinctrl_irq_unmask(struct irq_data *data)
@@ -436,6 +436,7 @@ static void stmfx_pinctrl_irq_unmask(struct irq_data *data)
436436
u32 reg = get_reg(data->hwirq);
437437
u32 mask = get_mask(data->hwirq);
438438

439+
gpiochip_enable_irq(gpio_chip, irqd_to_hwirq(data));
439440
pctl->irq_gpi_src[reg] |= mask;
440441
}
441442

@@ -592,6 +593,26 @@ static irqreturn_t stmfx_pinctrl_irq_thread_fn(int irq, void *dev_id)
592593
return IRQ_HANDLED;
593594
}
594595

596+
static void stmfx_pinctrl_irq_print_chip(struct irq_data *d, struct seq_file *p)
597+
{
598+
struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(d);
599+
struct stmfx_pinctrl *pctl = gpiochip_get_data(gpio_chip);
600+
601+
seq_printf(p, dev_name(pctl->dev));
602+
}
603+
604+
static const struct irq_chip stmfx_pinctrl_irq_chip = {
605+
.irq_mask = stmfx_pinctrl_irq_mask,
606+
.irq_unmask = stmfx_pinctrl_irq_unmask,
607+
.irq_set_type = stmfx_pinctrl_irq_set_type,
608+
.irq_bus_lock = stmfx_pinctrl_irq_bus_lock,
609+
.irq_bus_sync_unlock = stmfx_pinctrl_irq_bus_sync_unlock,
610+
.irq_request_resources = stmfx_gpio_irq_request_resources,
611+
.irq_release_resources = stmfx_gpio_irq_release_resources,
612+
.irq_print_chip = stmfx_pinctrl_irq_print_chip,
613+
.flags = IRQCHIP_IMMUTABLE,
614+
};
615+
595616
static int stmfx_pinctrl_gpio_function_enable(struct stmfx_pinctrl *pctl)
596617
{
597618
struct pinctrl_gpio_range *gpio_range;
@@ -678,17 +699,8 @@ static int stmfx_pinctrl_probe(struct platform_device *pdev)
678699
pctl->gpio_chip.ngpio = pctl->pctl_desc.npins;
679700
pctl->gpio_chip.can_sleep = true;
680701

681-
pctl->irq_chip.name = dev_name(pctl->dev);
682-
pctl->irq_chip.irq_mask = stmfx_pinctrl_irq_mask;
683-
pctl->irq_chip.irq_unmask = stmfx_pinctrl_irq_unmask;
684-
pctl->irq_chip.irq_set_type = stmfx_pinctrl_irq_set_type;
685-
pctl->irq_chip.irq_bus_lock = stmfx_pinctrl_irq_bus_lock;
686-
pctl->irq_chip.irq_bus_sync_unlock = stmfx_pinctrl_irq_bus_sync_unlock;
687-
pctl->irq_chip.irq_request_resources = stmfx_gpio_irq_request_resources;
688-
pctl->irq_chip.irq_release_resources = stmfx_gpio_irq_release_resources;
689-
690702
girq = &pctl->gpio_chip.irq;
691-
girq->chip = &pctl->irq_chip;
703+
gpio_irq_chip_set_chip(girq, &stmfx_pinctrl_irq_chip);
692704
/* This will let us handle the parent IRQ in the driver */
693705
girq->parent_handler = NULL;
694706
girq->num_parents = 0;
@@ -710,7 +722,7 @@ static int stmfx_pinctrl_probe(struct platform_device *pdev)
710722
ret = devm_request_threaded_irq(pctl->dev, irq, NULL,
711723
stmfx_pinctrl_irq_thread_fn,
712724
IRQF_ONESHOT,
713-
pctl->irq_chip.name, pctl);
725+
dev_name(pctl->dev), pctl);
714726
if (ret) {
715727
dev_err(pctl->dev, "cannot request irq%d\n", irq);
716728
return ret;

0 commit comments

Comments
 (0)