]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gpio: sysfs: pass gpiod_data directly to internal GPIO sysfs functions
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 4 Jul 2025 12:58:51 +0000 (14:58 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 16 Jul 2025 08:27:07 +0000 (10:27 +0200)
We don't use any fields from struct device in gpio_sysfs_request_irq(),
gpio_sysfs_free_irq() and gpio_sysfs_set_active_low(). We only use the
dev argument to get the associated struct gpiod_data pointer with
dev_get_drvdata().

To make the transition to not using dev_get_drvdata() across line
callbacks for sysfs attributes easier, pass gpiod_data directly to
these functions instead of having it wrapped in struct device.

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20250704-gpio-sysfs-chip-export-v4-4-9289d8758243@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpiolib-sysfs.c

index 39e9ca31f034e20abd08fb5e9b4eecf24f127d5e..0cfa73e92b47fd089b973e96b5062694b7f8abd3 100644 (file)
@@ -162,9 +162,8 @@ static irqreturn_t gpio_sysfs_irq(int irq, void *priv)
 }
 
 /* Caller holds gpiod-data mutex. */
-static int gpio_sysfs_request_irq(struct device *dev, unsigned char flags)
+static int gpio_sysfs_request_irq(struct gpiod_data *data, unsigned char flags)
 {
-       struct gpiod_data *data = dev_get_drvdata(dev);
        struct gpio_desc *desc = data->desc;
        unsigned long irq_flags;
        int ret;
@@ -223,9 +222,8 @@ err_clr_bits:
  * Caller holds gpiod-data mutex (unless called after class-device
  * deregistration).
  */
-static void gpio_sysfs_free_irq(struct device *dev)
+static void gpio_sysfs_free_irq(struct gpiod_data *data)
 {
-       struct gpiod_data *data = dev_get_drvdata(dev);
        struct gpio_desc *desc = data->desc;
 
        CLASS(gpio_chip_guard, guard)(desc);
@@ -278,12 +276,12 @@ static ssize_t edge_store(struct device *dev, struct device_attribute *attr,
                return size;
 
        if (data->irq_flags)
-               gpio_sysfs_free_irq(dev);
+               gpio_sysfs_free_irq(data);
 
        if (!flags)
                return size;
 
-       status = gpio_sysfs_request_irq(dev, flags);
+       status = gpio_sysfs_request_irq(data, flags);
        if (status)
                return status;
 
@@ -294,9 +292,8 @@ static ssize_t edge_store(struct device *dev, struct device_attribute *attr,
 static DEVICE_ATTR_RW(edge);
 
 /* Caller holds gpiod-data mutex. */
-static int gpio_sysfs_set_active_low(struct device *dev, int value)
+static int gpio_sysfs_set_active_low(struct gpiod_data *data, int value)
 {
-       struct gpiod_data *data = dev_get_drvdata(dev);
        unsigned int flags = data->irq_flags;
        struct gpio_desc *desc = data->desc;
        int status = 0;
@@ -309,8 +306,8 @@ static int gpio_sysfs_set_active_low(struct device *dev, int value)
        /* reconfigure poll(2) support if enabled on one edge only */
        if (flags == GPIO_IRQF_TRIGGER_FALLING ||
            flags == GPIO_IRQF_TRIGGER_RISING) {
-               gpio_sysfs_free_irq(dev);
-               status = gpio_sysfs_request_irq(dev, flags);
+               gpio_sysfs_free_irq(data);
+               status = gpio_sysfs_request_irq(data, flags);
        }
 
        gpiod_line_state_notify(desc, GPIO_V2_LINE_CHANGED_CONFIG);
@@ -345,7 +342,7 @@ static ssize_t active_low_store(struct device *dev,
 
        guard(mutex)(&data->mutex);
 
-       return gpio_sysfs_set_active_low(dev, value) ?: size;
+       return gpio_sysfs_set_active_low(data, value) ?: size;
 }
 static DEVICE_ATTR_RW(active_low);
 
@@ -814,7 +811,7 @@ void gpiod_unexport(struct gpio_desc *desc)
                 * edge_store.
                 */
                if (data->irq_flags)
-                       gpio_sysfs_free_irq(dev);
+                       gpio_sysfs_free_irq(data);
        }
 
        put_device(dev);