Message ID | 20230926-gpio-led-trigger-dt-v2-1-e06e458b788e@linaro.org |
---|---|
State | New |
Headers | show |
Series | Rewrite GPIO LED trigger to use trigger-sources | expand |
On Tue, Sep 26, 2023 at 11:48 PM Linus Walleij <linus.walleij@linaro.org> wrote: > The "trigger-sources" phandle used for LED triggers are special: > the DT bindings mandate that such triggers have the same phandle > references no matter what the trigger is. A GPIO is just another > kind of device that can trigger a LED. > > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Bartosz could you queue this patch? Lee already queued patches 2+3, and there is just runtime dependency with no in-tree users so it's fine to merge them in the different trees. Sorry for missing to CC you directly on the set :/ Yours, Linus Walleij
On Wed, Sep 27, 2023 at 12:41 AM Linus Walleij <linus.walleij@linaro.org> wrote: > > The "trigger-sources" phandle used for LED triggers are special: > the DT bindings mandate that such triggers have the same phandle > references no matter what the trigger is. A GPIO is just another > kind of device that can trigger a LED. > > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > --- > drivers/gpio/gpiolib-of.c | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > > diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c > index 531faabead0f..f4a660bf11fd 100644 > --- a/drivers/gpio/gpiolib-of.c > +++ b/drivers/gpio/gpiolib-of.c > @@ -611,6 +611,33 @@ static struct gpio_desc *of_find_mt2701_gpio(struct device_node *np, > return desc; > } > > +/* > + * Trigger sources are special, they allow us to use any GPIO as a LED trigger > + * and have the name "trigger-sources" no matter which kind of phandle it is > + * pointing to, whether to a GPIO, a USB host, a network PHY etc. So in this case > + * we allow looking something up that is not named "foo-gpios". > + */ > +static struct gpio_desc *of_find_trigger_gpio(struct device_node *np, > + const char *con_id, > + unsigned int idx, > + enum of_gpio_flags *of_flags) > +{ > + struct gpio_desc *desc; > + > + if (!IS_ENABLED(CONFIG_LEDS_TRIGGER_GPIO)) > + return ERR_PTR(-ENOENT); > + > + if (!con_id || strcmp(con_id, "trigger-sources")) > + return ERR_PTR(-ENOENT); > + > + desc = of_get_named_gpiod_flags(np, con_id, idx, of_flags); > + if (!gpiod_not_found(desc)) > + pr_debug("%s is used as a trigger\n", of_node_full_name(np)); > + > + return desc; > +} > + > + > typedef struct gpio_desc *(*of_find_gpio_quirk)(struct device_node *np, > const char *con_id, > unsigned int idx, > @@ -618,6 +645,7 @@ typedef struct gpio_desc *(*of_find_gpio_quirk)(struct device_node *np, > static const of_find_gpio_quirk of_find_gpio_quirks[] = { > of_find_gpio_rename, > of_find_mt2701_gpio, > + of_find_trigger_gpio, > NULL > }; > > > -- > 2.34.1 > Queued, thanks! Bart
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index 531faabead0f..f4a660bf11fd 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c @@ -611,6 +611,33 @@ static struct gpio_desc *of_find_mt2701_gpio(struct device_node *np, return desc; } +/* + * Trigger sources are special, they allow us to use any GPIO as a LED trigger + * and have the name "trigger-sources" no matter which kind of phandle it is + * pointing to, whether to a GPIO, a USB host, a network PHY etc. So in this case + * we allow looking something up that is not named "foo-gpios". + */ +static struct gpio_desc *of_find_trigger_gpio(struct device_node *np, + const char *con_id, + unsigned int idx, + enum of_gpio_flags *of_flags) +{ + struct gpio_desc *desc; + + if (!IS_ENABLED(CONFIG_LEDS_TRIGGER_GPIO)) + return ERR_PTR(-ENOENT); + + if (!con_id || strcmp(con_id, "trigger-sources")) + return ERR_PTR(-ENOENT); + + desc = of_get_named_gpiod_flags(np, con_id, idx, of_flags); + if (!gpiod_not_found(desc)) + pr_debug("%s is used as a trigger\n", of_node_full_name(np)); + + return desc; +} + + typedef struct gpio_desc *(*of_find_gpio_quirk)(struct device_node *np, const char *con_id, unsigned int idx, @@ -618,6 +645,7 @@ typedef struct gpio_desc *(*of_find_gpio_quirk)(struct device_node *np, static const of_find_gpio_quirk of_find_gpio_quirks[] = { of_find_gpio_rename, of_find_mt2701_gpio, + of_find_trigger_gpio, NULL };
The "trigger-sources" phandle used for LED triggers are special: the DT bindings mandate that such triggers have the same phandle references no matter what the trigger is. A GPIO is just another kind of device that can trigger a LED. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> --- drivers/gpio/gpiolib-of.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)