]> www.infradead.org Git - users/hch/block.git/commitdiff
gpio: of: assign and read the hog pointer atomically
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 5 Jan 2024 12:12:45 +0000 (13:12 +0100)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 12 Feb 2024 09:50:24 +0000 (10:50 +0100)
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>
drivers/gpio/gpiolib-of.c
drivers/gpio/gpiolib.c

index 35d717fd393f28e0b35d653ebc97b68254b7ce2b..523b047a28035cb0eb507a868b64e94b160f5347 100644 (file)
@@ -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);
 }
 
index a5598c3299ffeb12e3b81d4169833828dfca60f7..03d7c3f92f5e3d53ed9ff0566f62d9e408a154b0 100644 (file)
@@ -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;
        }