Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpio: Pass GPIO label down to gpiod_request

Currently all users of fwnode_get_named_gpiod() have no way to
specify a label for the GPIO. So GPIOs listed in debugfs are shown
with label "?". With this change a proper label is used.

Also adjust all users so they can pass a label, properly retrieved
from device tree properties.

Signed-off-by: Alexander Stein <alexander.stein@systec-electronic.com>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Alexander Stein and committed by
Linus Walleij
b2987d74 a264d10f

+33 -20
+3 -2
drivers/gpio/devres.c
··· 138 138 struct gpio_desc *devm_get_gpiod_from_child(struct device *dev, 139 139 const char *con_id, 140 140 struct fwnode_handle *child, 141 - enum gpiod_flags flags) 141 + enum gpiod_flags flags, 142 + const char *label) 142 143 { 143 144 static const char * const suffixes[] = { "gpios", "gpio" }; 144 145 char prop_name[32]; /* 32 is max size of property name */ ··· 160 159 snprintf(prop_name, sizeof(prop_name), "%s", 161 160 suffixes[i]); 162 161 163 - desc = fwnode_get_named_gpiod(child, prop_name, flags); 162 + desc = fwnode_get_named_gpiod(child, prop_name, flags, label); 164 163 if (!IS_ERR(desc) || (PTR_ERR(desc) != -ENOENT)) 165 164 break; 166 165 }
+3 -2
drivers/gpio/gpiolib.c
··· 3325 3325 */ 3326 3326 struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, 3327 3327 const char *propname, 3328 - enum gpiod_flags dflags) 3328 + enum gpiod_flags dflags, 3329 + const char *label) 3329 3330 { 3330 3331 struct gpio_desc *desc = ERR_PTR(-ENODEV); 3331 3332 unsigned long lflags = 0; ··· 3357 3356 if (IS_ERR(desc)) 3358 3357 return desc; 3359 3358 3360 - ret = gpiod_request(desc, NULL); 3359 + ret = gpiod_request(desc, label); 3361 3360 if (ret) 3362 3361 return ERR_PTR(ret); 3363 3362
+2 -1
drivers/input/keyboard/gpio_keys.c
··· 481 481 spin_lock_init(&bdata->lock); 482 482 483 483 if (child) { 484 - bdata->gpiod = devm_get_gpiod_from_child(dev, NULL, child, GPIOD_IN); 484 + bdata->gpiod = devm_get_gpiod_from_child(dev, NULL, child, 485 + GPIOD_IN, desc); 485 486 if (IS_ERR(bdata->gpiod)) { 486 487 error = PTR_ERR(bdata->gpiod); 487 488 if (error == -ENOENT) {
+2 -1
drivers/input/keyboard/gpio_keys_polled.c
··· 305 305 306 306 bdata->gpiod = devm_get_gpiod_from_child(dev, NULL, 307 307 child, 308 - GPIOD_IN); 308 + GPIOD_IN, 309 + button->desc); 309 310 if (IS_ERR(bdata->gpiod)) { 310 311 error = PTR_ERR(bdata->gpiod); 311 312 if (error != -EPROBE_DEFER)
+7 -6
drivers/leds/leds-gpio.c
··· 174 174 const char *state = NULL; 175 175 struct device_node *np = to_of_node(child); 176 176 177 - led.gpiod = devm_get_gpiod_from_child(dev, NULL, child, GPIOD_ASIS); 178 - if (IS_ERR(led.gpiod)) { 179 - fwnode_handle_put(child); 180 - return ERR_CAST(led.gpiod); 181 - } 182 - 183 177 ret = fwnode_property_read_string(child, "label", &led.name); 184 178 if (ret && IS_ENABLED(CONFIG_OF) && np) 185 179 led.name = np->name; 186 180 if (!led.name) { 187 181 fwnode_handle_put(child); 188 182 return ERR_PTR(-EINVAL); 183 + } 184 + 185 + led.gpiod = devm_get_gpiod_from_child(dev, NULL, child, 186 + GPIOD_ASIS, led.name); 187 + if (IS_ERR(led.gpiod)) { 188 + fwnode_handle_put(child); 189 + return ERR_CAST(led.gpiod); 189 190 } 190 191 191 192 fwnode_property_read_string(child, "linux,default-trigger",
+8 -4
drivers/video/fbdev/amba-clcd-nomadik.c
··· 185 185 dev_info(dev, "TPG110 display init\n"); 186 186 187 187 /* This asserts the GRESTB signal, putting the display into reset */ 188 - grestb = devm_get_gpiod_from_child(dev, "grestb", &np->fwnode, GPIOD_OUT_HIGH); 188 + grestb = devm_get_gpiod_from_child(dev, "grestb", &np->fwnode, 189 + GPIOD_OUT_HIGH, "grestb"); 189 190 if (IS_ERR(grestb)) { 190 191 dev_err(dev, "no GRESTB GPIO\n"); 191 192 return; 192 193 } 193 - scen = devm_get_gpiod_from_child(dev, "scen", &np->fwnode, GPIOD_OUT_LOW); 194 + scen = devm_get_gpiod_from_child(dev, "scen", &np->fwnode, 195 + GPIOD_OUT_LOW, "scen"); 194 196 if (IS_ERR(scen)) { 195 197 dev_err(dev, "no SCEN GPIO\n"); 196 198 return; 197 199 } 198 - scl = devm_get_gpiod_from_child(dev, "scl", &np->fwnode, GPIOD_OUT_LOW); 200 + scl = devm_get_gpiod_from_child(dev, "scl", &np->fwnode, GPIOD_OUT_LOW, 201 + "scl"); 199 202 if (IS_ERR(scl)) { 200 203 dev_err(dev, "no SCL GPIO\n"); 201 204 return; 202 205 } 203 - sda = devm_get_gpiod_from_child(dev, "sda", &np->fwnode, GPIOD_OUT_LOW); 206 + sda = devm_get_gpiod_from_child(dev, "sda", &np->fwnode, GPIOD_OUT_LOW, 207 + "sda"); 204 208 if (IS_ERR(sda)) { 205 209 dev_err(dev, "no SDA GPIO\n"); 206 210 return;
+8 -4
include/linux/gpio/consumer.h
··· 136 136 137 137 struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, 138 138 const char *propname, 139 - enum gpiod_flags dflags); 139 + enum gpiod_flags dflags, 140 + const char *label); 140 141 struct gpio_desc *devm_get_gpiod_from_child(struct device *dev, 141 142 const char *con_id, 142 143 struct fwnode_handle *child, 143 - enum gpiod_flags flags); 144 + enum gpiod_flags flags, 145 + const char *label); 144 146 #else /* CONFIG_GPIOLIB */ 145 147 146 148 static inline int gpiod_count(struct device *dev, const char *con_id) ··· 418 416 static inline 419 417 struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, 420 418 const char *propname, 421 - enum gpiod_flags dflags) 419 + enum gpiod_flags dflags, 420 + const char *label) 422 421 { 423 422 return ERR_PTR(-ENOSYS); 424 423 } ··· 428 425 struct gpio_desc *devm_get_gpiod_from_child(struct device *dev, 429 426 const char *con_id, 430 427 struct fwnode_handle *child, 431 - enum gpiod_flags flags) 428 + enum gpiod_flags flags, 429 + const char *label) 432 430 { 433 431 return ERR_PTR(-ENOSYS); 434 432 }