Commit 9b3c47f1 authored by Michael Walle's avatar Michael Walle Committed by Bartosz Golaszewski

gpio: regmap: move drvdata to config data

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: default avatarMatti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Signed-off-by: default avatarMichael Walle <michael@walle.cc>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarBartosz Golaszewski <bgolaszewski@baylibre.com>
parent 043a0c9f
...@@ -178,12 +178,6 @@ static int gpio_regmap_direction_output(struct gpio_chip *chip, ...@@ -178,12 +178,6 @@ static int gpio_regmap_direction_output(struct gpio_chip *chip,
return gpio_regmap_set_direction(chip, offset, true); 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) void *gpio_regmap_get_drvdata(struct gpio_regmap *gpio)
{ {
return gpio->driver_data; return gpio->driver_data;
...@@ -226,6 +220,7 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config ...@@ -226,6 +220,7 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
gpio->parent = config->parent; gpio->parent = config->parent;
gpio->driver_data = config->drvdata;
gpio->regmap = config->regmap; gpio->regmap = config->regmap;
gpio->ngpio_per_reg = config->ngpio_per_reg; gpio->ngpio_per_reg = config->ngpio_per_reg;
gpio->reg_stride = config->reg_stride; gpio->reg_stride = config->reg_stride;
......
...@@ -37,6 +37,9 @@ struct regmap; ...@@ -37,6 +37,9 @@ struct regmap;
* offset to a register/bitmask pair. If not * offset to a register/bitmask pair. If not
* given the default gpio_regmap_simple_xlate() * given the default gpio_regmap_simple_xlate()
* is used. * 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 * 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 * register and mask pair. The base address is one of the given register
...@@ -78,13 +81,14 @@ struct gpio_regmap_config { ...@@ -78,13 +81,14 @@ struct gpio_regmap_config {
int (*reg_mask_xlate)(struct gpio_regmap *gpio, unsigned int base, int (*reg_mask_xlate)(struct gpio_regmap *gpio, unsigned int base,
unsigned int offset, unsigned int *reg, unsigned int offset, unsigned int *reg,
unsigned int *mask); unsigned int *mask);
void *drvdata;
}; };
struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config); struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config);
void gpio_regmap_unregister(struct gpio_regmap *gpio); void gpio_regmap_unregister(struct gpio_regmap *gpio);
struct gpio_regmap *devm_gpio_regmap_register(struct device *dev, struct gpio_regmap *devm_gpio_regmap_register(struct device *dev,
const struct gpio_regmap_config *config); 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); void *gpio_regmap_get_drvdata(struct gpio_regmap *gpio);
#endif /* _LINUX_GPIO_REGMAP_H */ #endif /* _LINUX_GPIO_REGMAP_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment