Commit 20d9b3b5 authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Bartosz Golaszewski
Browse files

gpiolib: sysfs: Do unexport GPIO when user asks for it



It seems that sysfs interface implicitly relied on the gpiod_free() to
unexport the line. This is logically incorrect as core gpiolib should
not deal with sysfs so instead of restoring it, let's call
gpiod_unexport() from sysfs code.

Fixes: b0ce9ce4 ("gpiolib: Do not unexport GPIO on freeing")
Reported-by: default avatarMarek Behún <kabel@kernel.org>
Closes: https://lore.kernel.org/r/20230808102828.4a9eac09@dellmb


Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tested-by: default avatarMarek Behún <kabel@kernel.org>
[Bartosz: tweaked the commit message]
Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent 2fc8d020
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -515,8 +515,9 @@ static ssize_t unexport_store(const struct class *class,
	 * they may be undone on its behalf too.
	 */
	if (test_and_clear_bit(FLAG_SYSFS, &desc->flags)) {
		status = 0;
		gpiod_unexport(desc);
		gpiod_free(desc);
		status = 0;
	}
done:
	if (status)
@@ -781,9 +782,11 @@ void gpiochip_sysfs_unregister(struct gpio_device *gdev)
	mutex_unlock(&sysfs_lock);

	/* unregister gpiod class devices owned by sysfs */
	for_each_gpio_desc_with_flag(chip, desc, FLAG_SYSFS)
	for_each_gpio_desc_with_flag(chip, desc, FLAG_SYSFS) {
		gpiod_unexport(desc);
		gpiod_free(desc);
	}
}

static int __init gpiolib_sysfs_init(void)
{