mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	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
					
				
					 2 changed files with 6 additions and 7 deletions
				
			
		|  | @ -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…
	
	Add table
		
		Reference in a new issue
	
	 Michael Walle
						Michael Walle