diff options
author | Marek Vasut <marex@denx.de> | 2023-05-23 20:31:51 +0200 |
---|---|---|
committer | Lee Jones <lee@kernel.org> | 2023-05-25 12:34:30 +0100 |
commit | 2d6180147e924b76b75b8b1e59bbf0c59c2a29d2 (patch) | |
tree | d39a1afc439a7ada6a5bbb3a1ef543e8393ee785 | |
parent | bf4a35e9201d30b63a8d276797d6ecfaa596ccd3 (diff) | |
download | linux-stable-2d6180147e924b76b75b8b1e59bbf0c59c2a29d2.tar.gz linux-stable-2d6180147e924b76b75b8b1e59bbf0c59c2a29d2.tar.bz2 linux-stable-2d6180147e924b76b75b8b1e59bbf0c59c2a29d2.zip |
leds: gpio: Configure per-LED pin control
Each gpio-leds DT node DT subnode can have a pinctrl property assigned
to it, parse the DT subnode pinctrl properties and configure each pin
accordingly.
Tested-by: Christoph Niedermaier <cniedermaier@dh-electronics.com>
Signed-off-by: Marek Vasut <marex@denx.de>
Link: https://lore.kernel.org/r/20230523183151.5460-1-marex@denx.de
Signed-off-by: Lee Jones <lee@kernel.org>
-rw-r--r-- | drivers/leds/leds-gpio.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index ce4e79939731..7bfe40a6bfdd 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -13,6 +13,7 @@ #include <linux/leds.h> #include <linux/module.h> #include <linux/of.h> +#include <linux/pinctrl/consumer.h> #include <linux/platform_device.h> #include <linux/property.h> #include <linux/slab.h> @@ -77,6 +78,7 @@ static int create_gpio_led(const struct gpio_led *template, struct fwnode_handle *fwnode, gpio_blink_set_t blink_set) { struct led_init_data init_data = {}; + struct pinctrl *pinctrl; int ret, state; led_dat->cdev.default_trigger = template->default_trigger; @@ -119,6 +121,22 @@ static int create_gpio_led(const struct gpio_led *template, &init_data); } + if (ret) + return ret; + + pinctrl = devm_pinctrl_get_select_default(led_dat->cdev.dev); + if (IS_ERR(pinctrl)) { + ret = PTR_ERR(pinctrl); + if (ret != -ENODEV) { + dev_warn(led_dat->cdev.dev, + "Failed to select %pOF pinctrl: %d\n", + to_of_node(fwnode), ret); + } else { + /* pinctrl-%d not present, not an error */ + ret = 0; + } + } + return ret; } |