mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
gpio: of: make it possible to name GPIO lines
Make it possible to name the producer side of a GPIO line using
a "gpio-line-names" property array, modeled on the
"clock-output-names" property from the clock bindings.
This naming is especially useful for:
- Debugging: lines are named after function, not just opaque
offset numbers.
- Exploration: systems where some or all GPIO lines are available
to end users, such as prototyping, one-off's "makerspace usecases"
users are helped by the names of the GPIO lines when tinkering.
This usecase has been surfacing recently.
The gpio-line-names attribute is completely optional.
Example output from lsgpio on a patched Snowball tree:
GPIO chip: gpiochip6, "8000e180.gpio", 32 GPIO lines
line 0: unnamed unused
line 1: "AP_GPIO161" "extkb3" [kernel]
line 2: "AP_GPIO162" "extkb4" [kernel]
line 3: "ACCELEROMETER_INT1_RDY" unused [kernel]
line 4: "ACCELEROMETER_INT2" unused
line 5: "MAG_DRDY" unused [kernel]
line 6: "GYRO_DRDY" unused [kernel]
line 7: "RSTn_MLC" unused
line 8: "RSTn_SLC" unused
line 9: "GYRO_INT" unused
line 10: "UART_WAKE" unused
line 11: "GBF_RESET" unused
line 12: unnamed unused
Cc: Grant Likely <[email protected]>
Cc: Amit Kucheria <[email protected]>
Cc: David Mandala <[email protected]>
Cc: Lee Campbell <[email protected]>
Cc: [email protected]
Acked-by: Rob Herring <[email protected]>
Reviewed-by: Michael Welling <[email protected]>
Signed-off-by: Linus Walleij <[email protected]>
This commit is contained in:
parent
4c37ce8608
commit
fd9c55315d
2 changed files with 68 additions and 0 deletions
|
|
@ -195,6 +195,51 @@ static struct gpio_desc *of_parse_own_gpio(struct device_node *np,
|
|||
return gg_data.out_gpio;
|
||||
}
|
||||
|
||||
/**
|
||||
* of_gpiochip_set_names() - set up the names of the lines
|
||||
* @chip: GPIO chip whose lines should be named, if possible
|
||||
*/
|
||||
static void of_gpiochip_set_names(struct gpio_chip *gc)
|
||||
{
|
||||
struct gpio_device *gdev = gc->gpiodev;
|
||||
struct device_node *np = gc->of_node;
|
||||
int i;
|
||||
int nstrings;
|
||||
|
||||
nstrings = of_property_count_strings(np, "gpio-line-names");
|
||||
if (nstrings <= 0)
|
||||
/* Lines names not present */
|
||||
return;
|
||||
|
||||
/* This is normally not what you want */
|
||||
if (gdev->ngpio != nstrings)
|
||||
dev_info(&gdev->dev, "gpio-line-names specifies %d line "
|
||||
"names but there are %d lines on the chip\n",
|
||||
nstrings, gdev->ngpio);
|
||||
|
||||
/*
|
||||
* Make sure to not index beyond the end of the number of descriptors
|
||||
* of the GPIO device.
|
||||
*/
|
||||
for (i = 0; i < gdev->ngpio; i++) {
|
||||
const char *name;
|
||||
int ret;
|
||||
|
||||
ret = of_property_read_string_index(np,
|
||||
"gpio-line-names",
|
||||
i,
|
||||
&name);
|
||||
if (ret) {
|
||||
if (ret != -ENODATA)
|
||||
dev_err(&gdev->dev,
|
||||
"unable to name line %d: %d\n",
|
||||
i, ret);
|
||||
break;
|
||||
}
|
||||
gdev->descs[i].name = name;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* of_gpiochip_scan_gpios - Scan gpio-controller for gpio definitions
|
||||
* @chip: gpio chip to act on
|
||||
|
|
@ -445,6 +490,10 @@ int of_gpiochip_add(struct gpio_chip *chip)
|
|||
if (status)
|
||||
return status;
|
||||
|
||||
/* If the chip defines names itself, these take precedence */
|
||||
if (!chip->names)
|
||||
of_gpiochip_set_names(chip);
|
||||
|
||||
of_node_get(chip->of_node);
|
||||
|
||||
return of_gpiochip_scan_gpios(chip);
|
||||
|
|
|
|||
Loading…
Reference in a new issue