Commit 7c49c129 authored by Bartosz Golaszewski's avatar Bartosz Golaszewski
Browse files

gpio: sysfs: pass gpiod_data directly to internal GPIO sysfs functions



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: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20250704-gpio-sysfs-chip-export-v4-4-9289d8758243@linaro.org


Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent c38c3a34
Loading
Loading
Loading
Loading
+9 −12
Original line number Diff line number Diff line
@@ -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 @@ static int gpio_sysfs_request_irq(struct device *dev, unsigned char flags)
 * 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);