]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpio: cs5535: use dynamically allocated priv struct
authorRosen Penev <rosenp@gmail.com>
Fri, 13 Mar 2026 00:12:09 +0000 (17:12 -0700)
committerBartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
Mon, 16 Mar 2026 09:11:02 +0000 (10:11 +0100)
Static allocation is deprecated.

Remove the FIXME as gpiochip_add_data allows using gpiod_get_data.
No need for container_of.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://patch.msgid.link/20260313001209.117823-1-rosenp@gmail.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
drivers/gpio/gpio-cs5535.c

index 8affe4e9f90e940b0e7bab13be072dfc340e5969..5f5373d86397c0962c13b7fc337e59adc07eaef5 100644 (file)
@@ -39,10 +39,6 @@ static ulong mask = GPIO_DEFAULT_MASK;
 module_param_named(mask, mask, ulong, 0444);
 MODULE_PARM_DESC(mask, "GPIO channel mask.");
 
-/*
- * FIXME: convert this singleton driver to use the state container
- * design pattern, see Documentation/driver-api/driver-model/design-patterns.rst
- */
 static struct cs5535_gpio_chip {
        struct gpio_chip chip;
        resource_size_t base;
@@ -285,30 +281,29 @@ static const char * const cs5535_gpio_names[] = {
        "GPIO28", NULL, NULL, NULL,
 };
 
-static struct cs5535_gpio_chip cs5535_gpio_chip = {
-       .chip = {
-               .owner = THIS_MODULE,
-               .label = DRV_NAME,
-
-               .base = 0,
-               .ngpio = 32,
-               .names = cs5535_gpio_names,
-               .request = chip_gpio_request,
-
-               .get = chip_gpio_get,
-               .set = chip_gpio_set,
-
-               .direction_input = chip_direction_input,
-               .direction_output = chip_direction_output,
-       },
-};
-
 static int cs5535_gpio_probe(struct platform_device *pdev)
 {
+       struct cs5535_gpio_chip *priv;
+       struct gpio_chip *gc;
        struct resource *res;
        int err = -EIO;
        ulong mask_orig = mask;
 
+       priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
+       if (!priv)
+               return -ENOMEM;
+
+       gc = &priv->chip;
+       gc->owner = THIS_MODULE;
+       gc->label = DRV_NAME;
+       gc->ngpio = 32;
+       gc->names = cs5535_gpio_names;
+       gc->request = chip_gpio_request;
+       gc->get = chip_gpio_get;
+       gc->set = chip_gpio_set;
+       gc->direction_input = chip_direction_input;
+       gc->direction_output = chip_direction_output;
+
        /* There are two ways to get the GPIO base address; one is by
         * fetching it from MSR_LBAR_GPIO, the other is by reading the
         * PCI BAR info.  The latter method is easier (especially across
@@ -329,9 +324,9 @@ static int cs5535_gpio_probe(struct platform_device *pdev)
        }
 
        /* set up the driver-specific struct */
-       cs5535_gpio_chip.base = res->start;
-       cs5535_gpio_chip.pdev = pdev;
-       spin_lock_init(&cs5535_gpio_chip.lock);
+       priv->base = res->start;
+       priv->pdev = pdev;
+       spin_lock_init(&priv->lock);
 
        dev_info(&pdev->dev, "reserved resource region %pR\n", res);
 
@@ -347,8 +342,7 @@ static int cs5535_gpio_probe(struct platform_device *pdev)
                                mask_orig, mask);
 
        /* finally, register with the generic GPIO API */
-       return devm_gpiochip_add_data(&pdev->dev, &cs5535_gpio_chip.chip,
-                                     &cs5535_gpio_chip);
+       return devm_gpiochip_add_data(&pdev->dev, gc, priv);
 }
 
 static struct platform_driver cs5535_gpio_driver = {