[PATCH RFC] pinctrl: bcm2835: Make the irqchip immutable
Marc Zyngier
maz at misterjones.org
Fri Jun 10 01:51:22 PDT 2022
On 2022-06-07 11:33, Stefan Wahren wrote:
> Commit 6c846d026d49 ("gpio: Don't fiddle with irqchips marked as
> immutable") added a warning to indicate if the gpiolib is altering the
> internals of irqchips. The bcm2835 pinctrl is also affected by this
> warning.
>
> Fix this by making the irqchip in the bcm2835 pinctrl driver immutable.
>
> Signed-off-by: Stefan Wahren <stefan.wahren at i2se.com>
> ---
>
> Hi, not sure about this change because irq_mask/unmask also uses the
> enable/disable callbacks.
Yeah, that's totally broken.
If you have both enable and mask, they *must* be doing something
different (the names are pretty unambiguous...). If they do the
same thing, then enable/disable has to go.
>
> drivers/pinctrl/bcm/pinctrl-bcm2835.c | 10 +++++++---
> 1 file changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
> b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
> index dad453054776..f754f7ed9eb9 100644
> --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
> +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
> @@ -516,6 +516,8 @@ static void bcm2835_gpio_irq_enable(struct irq_data
> *data)
> unsigned bank = GPIO_REG_OFFSET(gpio);
> unsigned long flags;
>
> + gpiochip_enable_irq(chip, gpio);
> +
> raw_spin_lock_irqsave(&pc->irq_lock[bank], flags);
> set_bit(offset, &pc->enabled_irq_map[bank]);
> bcm2835_gpio_irq_config(pc, gpio, true);
> @@ -537,6 +539,8 @@ static void bcm2835_gpio_irq_disable(struct
> irq_data *data)
> bcm2835_gpio_set_bit(pc, GPEDS0, gpio);
> clear_bit(offset, &pc->enabled_irq_map[bank]);
> raw_spin_unlock_irqrestore(&pc->irq_lock[bank], flags);
> +
> + gpiochip_disable_irq(chip, gpio);
> }
>
> static int __bcm2835_gpio_irq_set_type_disabled(struct bcm2835_pinctrl
> *pc,
> @@ -693,7 +697,7 @@ static int bcm2835_gpio_irq_set_wake(struct
> irq_data *data, unsigned int on)
> return ret;
> }
>
> -static struct irq_chip bcm2835_gpio_irq_chip = {
> +static const struct irq_chip bcm2835_gpio_irq_chip = {
> .name = MODULE_NAME,
> .irq_enable = bcm2835_gpio_irq_enable,
> .irq_disable = bcm2835_gpio_irq_disable,
> @@ -702,7 +706,7 @@ static struct irq_chip bcm2835_gpio_irq_chip = {
> .irq_mask = bcm2835_gpio_irq_disable,
> .irq_unmask = bcm2835_gpio_irq_enable,
> .irq_set_wake = bcm2835_gpio_irq_set_wake,
> - .flags = IRQCHIP_MASK_ON_SUSPEND,
> + .flags = (IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_IMMUTABLE),
You are missing the callbacks into the resource management
code (GPIOCHIP_IRQ_RESOURCE_HELPERS).
Thanks,
M.
--
Who you jivin' with that Cosmik Debris?
More information about the linux-arm-kernel
mailing list