gpio: regmap: move drvdata to config data
authorMichael Walle <michael@walle.cc>
Fri, 4 Jun 2021 22:58:57 +0000 (00:58 +0200)
committerBartosz Golaszewski <bgolaszewski@baylibre.com>
Mon, 7 Jun 2021 13:39:19 +0000 (15:39 +0200)
Drop gpio_regmap_set_drvdata() and instead add it to the configuration
data passed to gpio_regmap_register().

gpio_regmap_set_drvdata() can't really be used in a race free way. This
is because the gpio_regmap object which is needed by _set_drvdata() is
returned by gpio_regmap_register(). On the other hand, the callbacks
which use the drvdata might already be called right after the
gpiochip_add() call in gpio_regmap_register(). Therefore, we have to
provide the drvdata early before we call gpiochip_add().

Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Signed-off-by: Michael Walle <michael@walle.cc>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
drivers/gpio/gpio-regmap.c
include/linux/gpio/regmap.h

index 1ead129..69c2197 100644 (file)
@@ -178,12 +178,6 @@ static int gpio_regmap_direction_output(struct gpio_chip *chip,
        return gpio_regmap_set_direction(chip, offset, true);
 }
 
-void gpio_regmap_set_drvdata(struct gpio_regmap *gpio, void *data)
-{
-       gpio->driver_data = data;
-}
-EXPORT_SYMBOL_GPL(gpio_regmap_set_drvdata);
-
 void *gpio_regmap_get_drvdata(struct gpio_regmap *gpio)
 {
        return gpio->driver_data;
@@ -226,6 +220,7 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config
                return ERR_PTR(-ENOMEM);
 
        gpio->parent = config->parent;
+       gpio->driver_data = config->drvdata;
        gpio->regmap = config->regmap;
        gpio->ngpio_per_reg = config->ngpio_per_reg;
        gpio->reg_stride = config->reg_stride;
index 334dd92..a9f7b7f 100644 (file)
@@ -37,6 +37,9 @@ struct regmap;
  *                     offset to a register/bitmask pair. If not
  *                     given the default gpio_regmap_simple_xlate()
  *                     is used.
+ * @drvdata:           (Optional) Pointer to driver specific data which is
+ *                     not used by gpio-remap but is provided "as is" to the
+ *                     driver callback(s).
  *
  * The ->reg_mask_xlate translates a given base address and GPIO offset to
  * register and mask pair. The base address is one of the given register
@@ -78,13 +81,14 @@ struct gpio_regmap_config {
        int (*reg_mask_xlate)(struct gpio_regmap *gpio, unsigned int base,
                              unsigned int offset, unsigned int *reg,
                              unsigned int *mask);
+
+       void *drvdata;
 };
 
 struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config);
 void gpio_regmap_unregister(struct gpio_regmap *gpio);
 struct gpio_regmap *devm_gpio_regmap_register(struct device *dev,
                                              const struct gpio_regmap_config *config);
-void gpio_regmap_set_drvdata(struct gpio_regmap *gpio, void *data);
 void *gpio_regmap_get_drvdata(struct gpio_regmap *gpio);
 
 #endif /* _LINUX_GPIO_REGMAP_H */