mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 14:56:54 -04:00
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: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user