forked from mirrors/linux
		
	gpio: of: Support regulator nonstandard GPIO properties
Before it was clearly established that all GPIO properties in the device tree shall be named "foo-gpios" (with the deprecated variant "foo-gpio" for single lines) we unfortunately merged a few bindings for regulators with random phandle names. As we want to switch the GPIO regulator driver to using descriptors, we need devm_gpiod_get() to return something reasonable when looking up these in the device tree. Put in a special #ifdef:ed kludge to do this special lookup only for the regulator case and gets compiled out if we're not enabling regulators. Supply a whitelist with properties we accept. Cc: Rob Herring <robh@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
		
							parent
							
								
									76e28f5ffe
								
							
						
					
					
						commit
						6a537d4846
					
				
					 1 changed files with 39 additions and 0 deletions
				
			
		|  | @ -147,6 +147,41 @@ static struct gpio_desc *of_find_spi_gpio(struct device *dev, const char *con_id | |||
| 	return desc; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * Some regulator bindings happened before we managed to establish that GPIO | ||||
|  * properties should be named "foo-gpios" so we have this special kludge for | ||||
|  * them. | ||||
|  */ | ||||
| static struct gpio_desc *of_find_regulator_gpio(struct device *dev, const char *con_id, | ||||
| 						enum of_gpio_flags *of_flags) | ||||
| { | ||||
| 	/* These are the connection IDs we accept as legacy GPIO phandles */ | ||||
| 	const char *whitelist[] = { | ||||
| 		"wlf,ldoena", /* Arizona */ | ||||
| 		"wlf,ldo1ena", /* WM8994 */ | ||||
| 		"wlf,ldo2ena", /* WM8994 */ | ||||
| 	}; | ||||
| 	struct device_node *np = dev->of_node; | ||||
| 	struct gpio_desc *desc; | ||||
| 	int i; | ||||
| 
 | ||||
| 	if (!IS_ENABLED(CONFIG_REGULATOR)) | ||||
| 		return ERR_PTR(-ENOENT); | ||||
| 
 | ||||
| 	if (!con_id) | ||||
| 		return ERR_PTR(-ENOENT); | ||||
| 
 | ||||
| 	for (i = 0; i < ARRAY_SIZE(whitelist); i++) | ||||
| 		if (!strcmp(con_id, whitelist[i])) | ||||
| 			break; | ||||
| 
 | ||||
| 	if (i == ARRAY_SIZE(whitelist)) | ||||
| 		return ERR_PTR(-ENOENT); | ||||
| 
 | ||||
| 	desc = of_get_named_gpiod_flags(np, con_id, 0, of_flags); | ||||
| 	return desc; | ||||
| } | ||||
| 
 | ||||
| struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, | ||||
| 			       unsigned int idx, | ||||
| 			       enum gpio_lookup_flags *flags) | ||||
|  | @ -175,6 +210,10 @@ struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, | |||
| 	if (IS_ERR(desc)) | ||||
| 		desc = of_find_spi_gpio(dev, con_id, &of_flags); | ||||
| 
 | ||||
| 	/* Special handling for regulator GPIOs if used */ | ||||
| 	if (IS_ERR(desc)) | ||||
| 		desc = of_find_regulator_gpio(dev, con_id, &of_flags); | ||||
| 
 | ||||
| 	if (IS_ERR(desc)) | ||||
| 		return desc; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Linus Walleij
						Linus Walleij