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

gpio: hisi: Convert to immutable irq_chip

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

The IRQ chip was unnamed which seems unwise, so we just
assign the name "HISI-GPIO".

Cc: Marc Zyngier <maz@kernel.org>
Acked-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

authored by

Linus Walleij and committed by
Bartosz Golaszewski
39bdd6bd 150a9880

+15 -10
+15 -10
drivers/gpio/gpio-hisi.c
··· 37 37 struct device *dev; 38 38 void __iomem *reg_base; 39 39 unsigned int line_num; 40 - struct irq_chip irq_chip; 41 40 int irq; 42 41 }; 43 42 ··· 99 100 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); 100 101 101 102 hisi_gpio_write_reg(chip, HISI_GPIO_INTMASK_SET_WX, BIT(irqd_to_hwirq(d))); 103 + gpiochip_disable_irq(chip, irqd_to_hwirq(d)); 102 104 } 103 105 104 106 static void hisi_gpio_irq_clr_mask(struct irq_data *d) 105 107 { 106 108 struct gpio_chip *chip = irq_data_get_irq_chip_data(d); 107 109 110 + gpiochip_enable_irq(chip, irqd_to_hwirq(d)); 108 111 hisi_gpio_write_reg(chip, HISI_GPIO_INTMASK_CLR_WX, BIT(irqd_to_hwirq(d))); 109 112 } 110 113 ··· 192 191 chained_irq_exit(irq_c, desc); 193 192 } 194 193 194 + static const struct irq_chip hisi_gpio_irq_chip = { 195 + .name = "HISI-GPIO", 196 + .irq_ack = hisi_gpio_set_ack, 197 + .irq_mask = hisi_gpio_irq_set_mask, 198 + .irq_unmask = hisi_gpio_irq_clr_mask, 199 + .irq_set_type = hisi_gpio_irq_set_type, 200 + .irq_enable = hisi_gpio_irq_enable, 201 + .irq_disable = hisi_gpio_irq_disable, 202 + .flags = IRQCHIP_IMMUTABLE, 203 + GPIOCHIP_IRQ_RESOURCE_HELPERS, 204 + }; 205 + 195 206 static void hisi_gpio_init_irq(struct hisi_gpio *hisi_gpio) 196 207 { 197 208 struct gpio_chip *chip = &hisi_gpio->chip; 198 209 struct gpio_irq_chip *girq_chip = &chip->irq; 199 210 200 - /* Set hooks for irq_chip */ 201 - hisi_gpio->irq_chip.irq_ack = hisi_gpio_set_ack; 202 - hisi_gpio->irq_chip.irq_mask = hisi_gpio_irq_set_mask; 203 - hisi_gpio->irq_chip.irq_unmask = hisi_gpio_irq_clr_mask; 204 - hisi_gpio->irq_chip.irq_set_type = hisi_gpio_irq_set_type; 205 - hisi_gpio->irq_chip.irq_enable = hisi_gpio_irq_enable; 206 - hisi_gpio->irq_chip.irq_disable = hisi_gpio_irq_disable; 207 - 208 - girq_chip->chip = &hisi_gpio->irq_chip; 211 + gpio_irq_chip_set_chip(girq_chip, &hisi_gpio_irq_chip); 209 212 girq_chip->default_type = IRQ_TYPE_NONE; 210 213 girq_chip->num_parents = 1; 211 214 girq_chip->parents = &hisi_gpio->irq;