gpiolib: Add support for GPIO lookup by line name
Currently a GPIO lookup table can only refer to a specific GPIO by a tuple, consisting of a GPIO controller label and a GPIO offset inside the controller. However, a GPIO may also carry a line name, defined by DT or ACPI. If present, the line name is the most use-centric way to refer to a GPIO. Hence add support for looking up GPIOs by line name. Note that there is no guarantee that GPIO line names are globally unique, so this will use the first match found. Implement this by reusing the existing gpiod_lookup infrastructure. Rename gpiod_lookup.chip_label to gpiod_lookup.key, to make it clear that this field can have two meanings, and update the kerneldoc and GPIO_LOOKUP*() macros. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Tested-by: Eugeniu Rosca <erosca@de.adit-jv.com> Reviewed-by: Ulrich Hecht <uli+renesas@fpond.eu> Reviewed-by: Eugeniu Rosca <erosca@de.adit-jv.com> Link: https://lore.kernel.org/r/20200511145257.22970-4-geert+renesas@glider.be Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:

committed by
Linus Walleij

父節點
7b67b83662
當前提交
4c033b5499
@@ -4618,7 +4618,7 @@ static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id,
|
||||
if (!table)
|
||||
return desc;
|
||||
|
||||
for (p = &table->table[0]; p->chip_label; p++) {
|
||||
for (p = &table->table[0]; p->key; p++) {
|
||||
struct gpio_chip *gc;
|
||||
|
||||
/* idx must always match exactly */
|
||||
@@ -4629,18 +4629,30 @@ static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id,
|
||||
if (p->con_id && (!con_id || strcmp(p->con_id, con_id)))
|
||||
continue;
|
||||
|
||||
gc = find_chip_by_name(p->chip_label);
|
||||
if (p->chip_hwnum == U16_MAX) {
|
||||
desc = gpio_name_to_desc(p->key);
|
||||
if (desc) {
|
||||
*flags = p->flags;
|
||||
return desc;
|
||||
}
|
||||
|
||||
dev_warn(dev, "cannot find GPIO line %s, deferring\n",
|
||||
p->key);
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
|
||||
gc = find_chip_by_name(p->key);
|
||||
|
||||
if (!gc) {
|
||||
/*
|
||||
* As the lookup table indicates a chip with
|
||||
* p->chip_label should exist, assume it may
|
||||
* p->key should exist, assume it may
|
||||
* still appear later and let the interested
|
||||
* consumer be probed again or let the Deferred
|
||||
* Probe infrastructure handle the error.
|
||||
*/
|
||||
dev_warn(dev, "cannot find GPIO chip %s, deferring\n",
|
||||
p->chip_label);
|
||||
p->key);
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
|
||||
@@ -4671,7 +4683,7 @@ static int platform_gpio_count(struct device *dev, const char *con_id)
|
||||
if (!table)
|
||||
return -ENOENT;
|
||||
|
||||
for (p = &table->table[0]; p->chip_label; p++) {
|
||||
for (p = &table->table[0]; p->key; p++) {
|
||||
if ((con_id && p->con_id && !strcmp(con_id, p->con_id)) ||
|
||||
(!con_id && !p->con_id))
|
||||
count++;
|
||||
|
Reference in New Issue
Block a user