[PATCH RFC] pinctrl: bcm2835: Make the irqchip immutable
Stefan Wahren
stefan.wahren at i2se.com
Fri Jun 10 05:53:16 PDT 2022
Hi Marc,
Am 10.06.22 um 10:51 schrieb Marc Zyngier:
> 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.
i will send a seperate fix for this.
>
>>
>> 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
>
> Thanks,
>
> M.
More information about the linux-arm-kernel
mailing list