Commit d99c980c authored by Bartosz Golaszewski's avatar Bartosz Golaszewski
Browse files

gpio: sysfs: use cleanup guards for gpiod_data::mutex



Shrink the code and drop some goto labels by using lock guards around
gpiod_data::mutex.

Reviewed-by: default avatarKent Gibson <warthog618@gmail.com>
Link: https://lore.kernel.org/r/20241031-gpio-notify-sysfs-v4-1-142021c2195c@linaro.org


Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent b9b7e4a6
Loading
Loading
Loading
Loading
+30 −52
Original line number Diff line number Diff line
@@ -77,12 +77,10 @@ static ssize_t direction_show(struct device *dev,
	struct gpio_desc *desc = data->desc;
	int value;

	mutex_lock(&data->mutex);

	scoped_guard(mutex, &data->mutex) {
		gpiod_get_direction(desc);
		value = !!test_bit(FLAG_IS_OUT, &desc->flags);

	mutex_unlock(&data->mutex);
	}

	return sysfs_emit(buf, "%s\n", value ? "out" : "in");
}
@@ -94,7 +92,7 @@ static ssize_t direction_store(struct device *dev,
	struct gpio_desc *desc = data->desc;
	ssize_t			status;

	mutex_lock(&data->mutex);
	guard(mutex)(&data->mutex);

	if (sysfs_streq(buf, "high"))
		status = gpiod_direction_output_raw(desc, 1);
@@ -105,8 +103,6 @@ static ssize_t direction_store(struct device *dev,
	else
		status = -EINVAL;

	mutex_unlock(&data->mutex);

	return status ? : size;
}
static DEVICE_ATTR_RW(direction);
@@ -118,12 +114,9 @@ static ssize_t value_show(struct device *dev,
	struct gpio_desc *desc = data->desc;
	ssize_t			status;

	mutex_lock(&data->mutex);

	scoped_guard(mutex, &data->mutex)
		status = gpiod_get_value_cansleep(desc);

	mutex_unlock(&data->mutex);

	if (status < 0)
		return status;

@@ -140,18 +133,17 @@ static ssize_t value_store(struct device *dev,

	status = kstrtol(buf, 0, &value);

	mutex_lock(&data->mutex);
	guard(mutex)(&data->mutex);

	if (!test_bit(FLAG_IS_OUT, &desc->flags)) {
		status = -EPERM;
	} else if (status == 0) {
		gpiod_set_value_cansleep(desc, value);
		status = size;
	}

	mutex_unlock(&data->mutex);
	if (!test_bit(FLAG_IS_OUT, &desc->flags))
		return -EPERM;

	if (status)
		return status;

	gpiod_set_value_cansleep(desc, value);

	return size;
}
static DEVICE_ATTR_PREALLOC(value, S_IWUSR | S_IRUGO, value_show, value_store);

@@ -253,12 +245,9 @@ static ssize_t edge_show(struct device *dev,
	struct gpiod_data *data = dev_get_drvdata(dev);
	int flags;

	mutex_lock(&data->mutex);

	scoped_guard(mutex, &data->mutex)
		flags = data->irq_flags;

	mutex_unlock(&data->mutex);

	if (flags >= ARRAY_SIZE(trigger_names))
		return 0;

@@ -276,26 +265,22 @@ static ssize_t edge_store(struct device *dev,
	if (flags < 0)
		return flags;

	mutex_lock(&data->mutex);
	guard(mutex)(&data->mutex);

	if (flags == data->irq_flags) {
		status = size;
		goto out_unlock;
	}
	if (flags == data->irq_flags)
		return size;

	if (data->irq_flags)
		gpio_sysfs_free_irq(dev);

	if (flags) {
		status = gpio_sysfs_request_irq(dev, flags);
		if (!status)
			status = size;
	}

out_unlock:
	mutex_unlock(&data->mutex);
	if (!flags)
		return size;

	status = gpio_sysfs_request_irq(dev, flags);
	if (status)
		return status;

	return size;
}
static DEVICE_ATTR_RW(edge);

@@ -330,12 +315,9 @@ static ssize_t active_low_show(struct device *dev,
	struct gpio_desc *desc = data->desc;
	int value;

	mutex_lock(&data->mutex);

	scoped_guard(mutex, &data->mutex)
		value = !!test_bit(FLAG_ACTIVE_LOW, &desc->flags);

	mutex_unlock(&data->mutex);

	return sysfs_emit(buf, "%d\n", value);
}

@@ -350,13 +332,9 @@ static ssize_t active_low_store(struct device *dev,
	if (status)
		return status;

	mutex_lock(&data->mutex);
	guard(mutex)(&data->mutex);

	status = gpio_sysfs_set_active_low(dev, value);

	mutex_unlock(&data->mutex);

	return status ? : size;
	return gpio_sysfs_set_active_low(dev, value) ?: size;
}
static DEVICE_ATTR_RW(active_low);