]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gpio: ath79: use new generic GPIO chip API
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 10 Sep 2025 07:12:40 +0000 (09:12 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 12 Sep 2025 07:22:44 +0000 (09:22 +0200)
Convert the driver to using the new generic GPIO chip interfaces from
linux/gpio/generic.h.

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20250910-gpio-mmio-gpio-conv-part4-v2-4-f3d1a4c57124@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpio-ath79.c

index de4cc12e5e0399abcef61a89c8c91a1b203d20fb..8879f23f1871ed323513082f4d2ebb2c40544cde 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <linux/device.h>
 #include <linux/gpio/driver.h>
+#include <linux/gpio/generic.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/mod_devicetable.h>
@@ -28,7 +29,7 @@
 #define AR71XX_GPIO_REG_INT_MASK       0x24
 
 struct ath79_gpio_ctrl {
-       struct gpio_chip gc;
+       struct gpio_generic_chip chip;
        void __iomem *base;
        raw_spinlock_t lock;
        unsigned long both_edges;
@@ -37,8 +38,9 @@ struct ath79_gpio_ctrl {
 static struct ath79_gpio_ctrl *irq_data_to_ath79_gpio(struct irq_data *data)
 {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
+       struct gpio_generic_chip *gen_gc = to_gpio_generic_chip(gc);
 
-       return container_of(gc, struct ath79_gpio_ctrl, gc);
+       return container_of(gen_gc, struct ath79_gpio_ctrl, chip);
 }
 
 static u32 ath79_gpio_read(struct ath79_gpio_ctrl *ctrl, unsigned reg)
@@ -72,7 +74,7 @@ static void ath79_gpio_irq_unmask(struct irq_data *data)
        u32 mask = BIT(irqd_to_hwirq(data));
        unsigned long flags;
 
-       gpiochip_enable_irq(&ctrl->gc, irqd_to_hwirq(data));
+       gpiochip_enable_irq(&ctrl->chip.gc, irqd_to_hwirq(data));
        raw_spin_lock_irqsave(&ctrl->lock, flags);
        ath79_gpio_update_bits(ctrl, AR71XX_GPIO_REG_INT_MASK, mask, mask);
        raw_spin_unlock_irqrestore(&ctrl->lock, flags);
@@ -87,7 +89,7 @@ static void ath79_gpio_irq_mask(struct irq_data *data)
        raw_spin_lock_irqsave(&ctrl->lock, flags);
        ath79_gpio_update_bits(ctrl, AR71XX_GPIO_REG_INT_MASK, mask, 0);
        raw_spin_unlock_irqrestore(&ctrl->lock, flags);
-       gpiochip_disable_irq(&ctrl->gc, irqd_to_hwirq(data));
+       gpiochip_disable_irq(&ctrl->chip.gc, irqd_to_hwirq(data));
 }
 
 static void ath79_gpio_irq_enable(struct irq_data *data)
@@ -187,8 +189,9 @@ static void ath79_gpio_irq_handler(struct irq_desc *desc)
 {
        struct gpio_chip *gc = irq_desc_get_handler_data(desc);
        struct irq_chip *irqchip = irq_desc_get_chip(desc);
+       struct gpio_generic_chip *gen_gc = to_gpio_generic_chip(gc);
        struct ath79_gpio_ctrl *ctrl =
-               container_of(gc, struct ath79_gpio_ctrl, gc);
+               container_of(gen_gc, struct ath79_gpio_ctrl, chip);
        unsigned long flags, pending;
        u32 both_edges, state;
        int irq;
@@ -224,6 +227,7 @@ MODULE_DEVICE_TABLE(of, ath79_gpio_of_match);
 
 static int ath79_gpio_probe(struct platform_device *pdev)
 {
+       struct gpio_generic_chip_config config;
        struct device *dev = &pdev->dev;
        struct ath79_gpio_ctrl *ctrl;
        struct gpio_irq_chip *girq;
@@ -253,21 +257,26 @@ static int ath79_gpio_probe(struct platform_device *pdev)
                return PTR_ERR(ctrl->base);
 
        raw_spin_lock_init(&ctrl->lock);
-       err = bgpio_init(&ctrl->gc, dev, 4,
-                       ctrl->base + AR71XX_GPIO_REG_IN,
-                       ctrl->base + AR71XX_GPIO_REG_SET,
-                       ctrl->base + AR71XX_GPIO_REG_CLEAR,
-                       oe_inverted ? NULL : ctrl->base + AR71XX_GPIO_REG_OE,
-                       oe_inverted ? ctrl->base + AR71XX_GPIO_REG_OE : NULL,
-                       0);
+
+       config = (struct gpio_generic_chip_config) {
+               .dev = dev,
+               .sz = 4,
+               .dat = ctrl->base + AR71XX_GPIO_REG_IN,
+               .set = ctrl->base + AR71XX_GPIO_REG_SET,
+               .clr = ctrl->base + AR71XX_GPIO_REG_CLEAR,
+               .dirout = oe_inverted ? NULL : ctrl->base + AR71XX_GPIO_REG_OE,
+               .dirin = oe_inverted ? ctrl->base + AR71XX_GPIO_REG_OE : NULL,
+       };
+
+       err = gpio_generic_chip_init(&ctrl->chip, &config);
        if (err) {
-               dev_err(dev, "bgpio_init failed\n");
+               dev_err(dev, "failed to initialize generic GPIO chip\n");
                return err;
        }
 
        /* Optional interrupt setup */
        if (device_property_read_bool(dev, "interrupt-controller")) {
-               girq = &ctrl->gc.irq;
+               girq = &ctrl->chip.gc.irq;
                gpio_irq_chip_set_chip(girq, &ath79_gpio_irqchip);
                girq->parent_handler = ath79_gpio_irq_handler;
                girq->num_parents = 1;
@@ -280,7 +289,7 @@ static int ath79_gpio_probe(struct platform_device *pdev)
                girq->handler = handle_simple_irq;
        }
 
-       return devm_gpiochip_add_data(dev, &ctrl->gc, ctrl);
+       return devm_gpiochip_add_data(dev, &ctrl->chip.gc, ctrl);
 }
 
 static struct platform_driver ath79_gpio_driver = {