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: 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>
This commit is contained in:
parent
043a0c9fe7
commit
9b3c47f124
@ -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
|
|||||||
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;
|
|||||||
* 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 {
|
|||||||
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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user