Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

pinctrl: equilibrium: Convert to immutable irq_chip

Convert the driver to immutable irq-chip with a bit of
intuition.

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-5-503788a7f6e6@linaro.org

+14 -10
+14 -8
drivers/pinctrl/pinctrl-equilibrium.c
··· 32 32 raw_spin_lock_irqsave(&gctrl->lock, flags); 33 33 writel(BIT(offset), gctrl->membase + GPIO_IRNENCLR); 34 34 raw_spin_unlock_irqrestore(&gctrl->lock, flags); 35 + gpiochip_disable_irq(gc, offset); 35 36 } 36 37 37 38 static void eqbr_gpio_enable_irq(struct irq_data *d) ··· 43 42 unsigned long flags; 44 43 45 44 gc->direction_input(gc, offset); 45 + gpiochip_enable_irq(gc, offset); 46 46 raw_spin_lock_irqsave(&gctrl->lock, flags); 47 47 writel(BIT(offset), gctrl->membase + GPIO_IRNRNSET); 48 48 raw_spin_unlock_irqrestore(&gctrl->lock, flags); ··· 163 161 chained_irq_exit(ic, desc); 164 162 } 165 163 164 + static const struct irq_chip eqbr_irq_chip = { 165 + .name = "gpio_irq", 166 + .irq_mask = eqbr_gpio_disable_irq, 167 + .irq_unmask = eqbr_gpio_enable_irq, 168 + .irq_ack = eqbr_gpio_ack_irq, 169 + .irq_mask_ack = eqbr_gpio_mask_ack_irq, 170 + .irq_set_type = eqbr_gpio_set_irq_type, 171 + .flags = IRQCHIP_IMMUTABLE, 172 + GPIOCHIP_IRQ_RESOURCE_HELPERS, 173 + }; 174 + 166 175 static int gpiochip_setup(struct device *dev, struct eqbr_gpio_ctrl *gctrl) 167 176 { 168 177 struct gpio_irq_chip *girq; ··· 189 176 return 0; 190 177 } 191 178 192 - gctrl->ic.name = "gpio_irq"; 193 - gctrl->ic.irq_mask = eqbr_gpio_disable_irq; 194 - gctrl->ic.irq_unmask = eqbr_gpio_enable_irq; 195 - gctrl->ic.irq_ack = eqbr_gpio_ack_irq; 196 - gctrl->ic.irq_mask_ack = eqbr_gpio_mask_ack_irq; 197 - gctrl->ic.irq_set_type = eqbr_gpio_set_irq_type; 198 - 199 179 girq = &gctrl->chip.irq; 200 - girq->chip = &gctrl->ic; 180 + gpio_irq_chip_set_chip(girq, &eqbr_irq_chip); 201 181 girq->parent_handler = eqbr_irq_handler; 202 182 girq->num_parents = 1; 203 183 girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents), GFP_KERNEL);
-2
drivers/pinctrl/pinctrl-equilibrium.h
··· 103 103 * @fwnode: firmware node of gpio controller. 104 104 * @bank: pointer to corresponding pin bank. 105 105 * @membase: base address of the gpio controller. 106 - * @ic: irq chip. 107 106 * @name: gpio chip name. 108 107 * @virq: irq number of the gpio chip to parent's irq domain. 109 108 * @lock: spin lock to protect gpio register write. ··· 112 113 struct fwnode_handle *fwnode; 113 114 struct eqbr_pin_bank *bank; 114 115 void __iomem *membase; 115 - struct irq_chip ic; 116 116 const char *name; 117 117 unsigned int virq; 118 118 raw_spinlock_t lock; /* protect gpio register */