Message ID | 20221226123630.6515-3-pali@kernel.org (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | Resend LED patches | expand |
On Mon, 26 Dec 2022, Pali Rohár wrote: > This new active-low property specify that LED has inverted logic > (0 - enable LED, 1 - disable LED). > > Signed-off-by: Pali Rohár <pali@kernel.org> > Acked-by: Linus Walleij <linus.walleij@linaro.org> > --- > drivers/leds/leds-syscon.c | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-) Reviewed-by: Lee Jones <lee@kernel.org> > diff --git a/drivers/leds/leds-syscon.c b/drivers/leds/leds-syscon.c > index 7eddb8ecb44e..5e605d8438e9 100644 > --- a/drivers/leds/leds-syscon.c > +++ b/drivers/leds/leds-syscon.c > @@ -29,6 +29,7 @@ struct syscon_led { > struct regmap *map; > u32 offset; > u32 mask; > + bool active_low; > bool state; > }; > > @@ -41,10 +42,10 @@ static void syscon_led_set(struct led_classdev *led_cdev, > int ret; > > if (value == LED_OFF) { > - val = 0; > + val = sled->active_low ? sled->mask : 0; > sled->state = false; > } else { > - val = sled->mask; > + val = sled->active_low ? 0 : sled->mask; > sled->state = true; > } > > @@ -85,6 +86,8 @@ static int syscon_led_probe(struct platform_device *pdev) > return -EINVAL; > if (of_property_read_u32(np, "mask", &sled->mask)) > return -EINVAL; > + if (of_find_property(np, "active-low", NULL)) > + sled->active_low = true; > > state = of_get_property(np, "default-state", NULL); > if (state) { > @@ -95,17 +98,20 @@ static int syscon_led_probe(struct platform_device *pdev) > if (ret < 0) > return ret; > sled->state = !!(val & sled->mask); > + if (sled->active_low) > + sled->state = !sled->state; > } else if (!strcmp(state, "on")) { > sled->state = true; > ret = regmap_update_bits(map, sled->offset, > sled->mask, > - sled->mask); > + sled->active_low ? 0 : sled->mask); > if (ret < 0) > return ret; > } else { > sled->state = false; > ret = regmap_update_bits(map, sled->offset, > - sled->mask, 0); > + sled->mask, > + sled->active_low ? sled->mask : 0); > if (ret < 0) > return ret; > } > -- > 2.20.1 >
diff --git a/drivers/leds/leds-syscon.c b/drivers/leds/leds-syscon.c index 7eddb8ecb44e..5e605d8438e9 100644 --- a/drivers/leds/leds-syscon.c +++ b/drivers/leds/leds-syscon.c @@ -29,6 +29,7 @@ struct syscon_led { struct regmap *map; u32 offset; u32 mask; + bool active_low; bool state; }; @@ -41,10 +42,10 @@ static void syscon_led_set(struct led_classdev *led_cdev, int ret; if (value == LED_OFF) { - val = 0; + val = sled->active_low ? sled->mask : 0; sled->state = false; } else { - val = sled->mask; + val = sled->active_low ? 0 : sled->mask; sled->state = true; } @@ -85,6 +86,8 @@ static int syscon_led_probe(struct platform_device *pdev) return -EINVAL; if (of_property_read_u32(np, "mask", &sled->mask)) return -EINVAL; + if (of_find_property(np, "active-low", NULL)) + sled->active_low = true; state = of_get_property(np, "default-state", NULL); if (state) { @@ -95,17 +98,20 @@ static int syscon_led_probe(struct platform_device *pdev) if (ret < 0) return ret; sled->state = !!(val & sled->mask); + if (sled->active_low) + sled->state = !sled->state; } else if (!strcmp(state, "on")) { sled->state = true; ret = regmap_update_bits(map, sled->offset, sled->mask, - sled->mask); + sled->active_low ? 0 : sled->mask); if (ret < 0) return ret; } else { sled->state = false; ret = regmap_update_bits(map, sled->offset, - sled->mask, 0); + sled->mask, + sled->active_low ? sled->mask : 0); if (ret < 0) return ret; }