Commit 08752e07 authored by Stefan Wahren's avatar Stefan Wahren Committed by Linus Walleij
Browse files

pinctrl: bcm2835: Make the irqchip immutable



Commit 6c846d02 ("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: default avatarStefan Wahren <stefan.wahren@i2se.com>
Reviewed-by: default avatarMarc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20220614202831.236341-3-stefan.wahren@i2se.com


Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent db1b3ece
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -516,6 +516,8 @@ static void bcm2835_gpio_irq_unmask(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_mask(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,14 +697,15 @@ 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_set_type = bcm2835_gpio_irq_set_type,
	.irq_ack = bcm2835_gpio_irq_ack,
	.irq_mask = bcm2835_gpio_irq_mask,
	.irq_unmask = bcm2835_gpio_irq_unmask,
	.irq_set_wake = bcm2835_gpio_irq_set_wake,
	.flags = IRQCHIP_MASK_ON_SUSPEND,
	.flags = (IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_IMMUTABLE),
	GPIOCHIP_IRQ_RESOURCE_HELPERS,
};

static int bcm2835_pctl_get_groups_count(struct pinctrl_dev *pctldev)
@@ -1278,7 +1283,7 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev)
	pinctrl_add_gpio_range(pc->pctl_dev, &pc->gpio_range);

	girq = &pc->gpio_chip.irq;
	girq->chip = &bcm2835_gpio_irq_chip;
	gpio_irq_chip_set_chip(girq, &bcm2835_gpio_irq_chip);
	girq->parent_handler = bcm2835_gpio_irq_handler;
	girq->num_parents = BCM2835_NUM_IRQS;
	girq->parents = devm_kcalloc(dev, BCM2835_NUM_IRQS,