Commit 8ce6fd81 authored by Bartosz Golaszewski's avatar Bartosz Golaszewski
Browse files

gpio: of: assign and read the hog pointer atomically



The device nodes representing GPIO hogs cannot be deleted without
unregistering the GPIO chip so there's no need to serialize their access.
However we must ensure that users can get the right address so write and
read it atomically.

Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
parent e348544f
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -801,7 +801,7 @@ static int of_gpiochip_add_hog(struct gpio_chip *chip, struct device_node *hog)
			return ret;

#ifdef CONFIG_OF_DYNAMIC
		desc->hog = hog;
		WRITE_ONCE(desc->hog, hog);
#endif
	}

@@ -849,7 +849,7 @@ static void of_gpiochip_remove_hog(struct gpio_chip *chip,
	struct gpio_desc *desc;

	for_each_gpio_desc_with_flag(chip, desc, FLAG_IS_HOGGED)
		if (desc->hog == hog)
		if (READ_ONCE(desc->hog) == hog)
			gpiochip_free_own_desc(desc);
}

+1 −1
Original line number Diff line number Diff line
@@ -2330,7 +2330,7 @@ static bool gpiod_free_commit(struct gpio_desc *desc)
		clear_bit(FLAG_EDGE_FALLING, &desc->flags);
		clear_bit(FLAG_IS_HOGGED, &desc->flags);
#ifdef CONFIG_OF_DYNAMIC
		desc->hog = NULL;
		WRITE_ONCE(desc->hog, NULL);
#endif
		ret = true;
	}