]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpio: cadence: use new generic GPIO chip API
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 2 Jul 2025 09:22:13 +0000 (11:22 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 7 Jul 2025 07:43:53 +0000 (09:43 +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/20250702-gpio-mmio-rework-v2-6-6b77aab684d8@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpio-cadence.c

index e6ec341d55e9047b2fa8718799ba72d54624388e..8243eddcd5bbe537bab1bedc72c80ee88839f5d3 100644 (file)
@@ -12,6 +12,8 @@
 #include <linux/clk.h>
 #include <linux/gpio/driver.h>
 #include <linux/interrupt.h>
+#include <linux/gpio/driver.h>
+#include <linux/gpio/generic.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
@@ -31,7 +33,7 @@
 #define CDNS_GPIO_IRQ_ANY_EDGE         0x2c
 
 struct cdns_gpio_chip {
-       struct gpio_chip gc;
+       struct gpio_generic_chip gen_gc;
        void __iomem *regs;
        u32 bypass_orig;
 };
@@ -40,7 +42,7 @@ static int cdns_gpio_request(struct gpio_chip *chip, unsigned int offset)
 {
        struct cdns_gpio_chip *cgpio = gpiochip_get_data(chip);
 
-       guard(raw_spinlock)(&chip->bgpio_lock);
+       guard(gpio_generic_lock)(&cgpio->gen_gc);
 
        iowrite32(ioread32(cgpio->regs + CDNS_GPIO_BYPASS_MODE) & ~BIT(offset),
                  cgpio->regs + CDNS_GPIO_BYPASS_MODE);
@@ -52,7 +54,7 @@ static void cdns_gpio_free(struct gpio_chip *chip, unsigned int offset)
 {
        struct cdns_gpio_chip *cgpio = gpiochip_get_data(chip);
 
-       guard(raw_spinlock)(&chip->bgpio_lock);
+       guard(gpio_generic_lock)(&cgpio->gen_gc);
 
        iowrite32(ioread32(cgpio->regs + CDNS_GPIO_BYPASS_MODE) |
                  (BIT(offset) & cgpio->bypass_orig),
@@ -86,7 +88,7 @@ static int cdns_gpio_irq_set_type(struct irq_data *d, unsigned int type)
        u32 mask = BIT(d->hwirq);
        int ret = 0;
 
-       guard(raw_spinlock)(&chip->bgpio_lock);
+       guard(gpio_generic_lock)(&cgpio->gen_gc);
 
        int_value = ioread32(cgpio->regs + CDNS_GPIO_IRQ_VALUE) & ~mask;
        int_type = ioread32(cgpio->regs + CDNS_GPIO_IRQ_TYPE) & ~mask;
@@ -142,6 +144,7 @@ static const struct irq_chip cdns_gpio_irqchip = {
 
 static int cdns_gpio_probe(struct platform_device *pdev)
 {
+       struct gpio_generic_chip_config config = { };
        struct cdns_gpio_chip *cgpio;
        int ret, irq;
        u32 dir_prev;
@@ -168,32 +171,33 @@ static int cdns_gpio_probe(struct platform_device *pdev)
         * gpiochip_lock_as_irq:
         * tried to flag a GPIO set as output for IRQ
         * Generic GPIO driver stores the direction value internally,
-        * so it needs to be changed before bgpio_init() is called.
+        * so it needs to be changed before gpio_generic_chip_init() is called.
         */
        dir_prev = ioread32(cgpio->regs + CDNS_GPIO_DIRECTION_MODE);
        iowrite32(GENMASK(num_gpios - 1, 0),
                  cgpio->regs + CDNS_GPIO_DIRECTION_MODE);
 
-       ret = bgpio_init(&cgpio->gc, &pdev->dev, 4,
-                        cgpio->regs + CDNS_GPIO_INPUT_VALUE,
-                        cgpio->regs + CDNS_GPIO_OUTPUT_VALUE,
-                        NULL,
-                        NULL,
-                        cgpio->regs + CDNS_GPIO_DIRECTION_MODE,
-                        BGPIOF_READ_OUTPUT_REG_SET);
+       config.dev = &pdev->dev;
+       config.sz = 4;
+       config.dat = cgpio->regs + CDNS_GPIO_INPUT_VALUE;
+       config.set = cgpio->regs + CDNS_GPIO_OUTPUT_VALUE;
+       config.dirin = cgpio->regs + CDNS_GPIO_DIRECTION_MODE;
+       config.flags = BGPIOF_READ_OUTPUT_REG_SET;
+
+       ret = gpio_generic_chip_init(&cgpio->gen_gc, &config);
        if (ret) {
                dev_err(&pdev->dev, "Failed to register generic gpio, %d\n",
                        ret);
                goto err_revert_dir;
        }
 
-       cgpio->gc.label = dev_name(&pdev->dev);
-       cgpio->gc.ngpio = num_gpios;
-       cgpio->gc.parent = &pdev->dev;
-       cgpio->gc.base = -1;
-       cgpio->gc.owner = THIS_MODULE;
-       cgpio->gc.request = cdns_gpio_request;
-       cgpio->gc.free = cdns_gpio_free;
+       cgpio->gen_gc.gc.label = dev_name(&pdev->dev);
+       cgpio->gen_gc.gc.ngpio = num_gpios;
+       cgpio->gen_gc.gc.parent = &pdev->dev;
+       cgpio->gen_gc.gc.base = -1;
+       cgpio->gen_gc.gc.owner = THIS_MODULE;
+       cgpio->gen_gc.gc.request = cdns_gpio_request;
+       cgpio->gen_gc.gc.free = cdns_gpio_free;
 
        clk = devm_clk_get_enabled(&pdev->dev, NULL);
        if (IS_ERR(clk)) {
@@ -210,7 +214,7 @@ static int cdns_gpio_probe(struct platform_device *pdev)
        if (irq >= 0) {
                struct gpio_irq_chip *girq;
 
-               girq = &cgpio->gc.irq;
+               girq = &cgpio->gen_gc.gc.irq;
                gpio_irq_chip_set_chip(girq, &cdns_gpio_irqchip);
                girq->parent_handler = cdns_gpio_irq_handler;
                girq->num_parents = 1;
@@ -226,7 +230,7 @@ static int cdns_gpio_probe(struct platform_device *pdev)
                girq->handler = handle_level_irq;
        }
 
-       ret = devm_gpiochip_add_data(&pdev->dev, &cgpio->gc, cgpio);
+       ret = devm_gpiochip_add_data(&pdev->dev, &cgpio->gen_gc.gc, cgpio);
        if (ret < 0) {
                dev_err(&pdev->dev, "Could not register gpiochip, %d\n", ret);
                goto err_revert_dir;