On Mon, Mar 20, 2023 at 10:55:08AM +0100, Linus Walleij wrote: > Convert the driver to immutable irq-chip with a bit of > intuition. > > Cc: Marc Zyngier <maz@xxxxxxxxxx> > Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx> Acked-by: Manivannan Sadhasivam <mani@xxxxxxxxxx> Thanks, Mani > --- > drivers/gpio/gpio-rda.c | 22 +++++++++++++--------- > 1 file changed, 13 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpio/gpio-rda.c b/drivers/gpio/gpio-rda.c > index 62ba18b3a602..dd568907d389 100644 > --- a/drivers/gpio/gpio-rda.c > +++ b/drivers/gpio/gpio-rda.c > @@ -38,7 +38,6 @@ struct rda_gpio { > struct gpio_chip chip; > void __iomem *base; > spinlock_t lock; > - struct irq_chip irq_chip; > int irq; > }; > > @@ -74,6 +73,7 @@ static void rda_gpio_irq_mask(struct irq_data *data) > value |= BIT(offset) << RDA_GPIO_IRQ_FALL_SHIFT; > > writel_relaxed(value, base + RDA_GPIO_INT_CTRL_CLR); > + gpiochip_disable_irq(chip, offset); > } > > static void rda_gpio_irq_ack(struct irq_data *data) > @@ -154,6 +154,7 @@ static void rda_gpio_irq_unmask(struct irq_data *data) > u32 offset = irqd_to_hwirq(data); > u32 trigger = irqd_get_trigger_type(data); > > + gpiochip_enable_irq(chip, offset); > rda_gpio_set_irq(chip, offset, trigger); > } > > @@ -195,6 +196,16 @@ static void rda_gpio_irq_handler(struct irq_desc *desc) > chained_irq_exit(ic, desc); > } > > +static const struct irq_chip rda_gpio_irq_chip = { > + .name = "rda-gpio", > + .irq_ack = rda_gpio_irq_ack, > + .irq_mask = rda_gpio_irq_mask, > + .irq_unmask = rda_gpio_irq_unmask, > + .irq_set_type = rda_gpio_irq_set_type, > + .flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_IMMUTABLE, > + GPIOCHIP_IRQ_RESOURCE_HELPERS, > +}; > + > static int rda_gpio_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > @@ -241,15 +252,8 @@ static int rda_gpio_probe(struct platform_device *pdev) > rda_gpio->chip.base = -1; > > if (rda_gpio->irq >= 0) { > - rda_gpio->irq_chip.name = "rda-gpio", > - rda_gpio->irq_chip.irq_ack = rda_gpio_irq_ack, > - rda_gpio->irq_chip.irq_mask = rda_gpio_irq_mask, > - rda_gpio->irq_chip.irq_unmask = rda_gpio_irq_unmask, > - rda_gpio->irq_chip.irq_set_type = rda_gpio_irq_set_type, > - rda_gpio->irq_chip.flags = IRQCHIP_SKIP_SET_WAKE, > - > girq = &rda_gpio->chip.irq; > - girq->chip = &rda_gpio->irq_chip; > + gpio_irq_chip_set_chip(girq, &rda_gpio_irq_chip); > girq->handler = handle_bad_irq; > girq->default_type = IRQ_TYPE_NONE; > girq->parent_handler = rda_gpio_irq_handler; > > -- > 2.34.1 > -- மணிவண்ணன் சதாசிவம்