From: Benjamin Tietz <benja...@micronet24.de> Extend the LED API to support toggling an LED. If the device provides a direct way for this, it can implement the corresponding op.
If not supported directly by the driver, the led will be toggled by calling led_set_on(!led_get_on()), transparently. --- drivers/led/led-uclass.c | 14 ++++++++++++++ include/led.h | 21 +++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/drivers/led/led-uclass.c b/drivers/led/led-uclass.c index 7d7dec3..22d2264 100644 --- a/drivers/led/led-uclass.c +++ b/drivers/led/led-uclass.c @@ -111,6 +111,20 @@ int led_get_on(struct udevice *dev) return ops->get_on(dev); } +int led_toggle(struct udevice *dev) +{ + struct led_ops *ops = led_get_ops(dev); + int on; + + if (ops->toggle) + return ops->toggle(dev); + + on = led_get_on(dev); + if(on < 0) + return -ENOSYS; + return led_set_on(dev, !on); +} + UCLASS_DRIVER(led) = { .id = UCLASS_LED, .name = "led", diff --git a/include/led.h b/include/led.h index 4709013..f70db00 100644 --- a/include/led.h +++ b/include/led.h @@ -36,6 +36,17 @@ struct led_ops { * @return 0 if OFF, 1 if ON, -ve on error */ int (*get_on)(struct udevice *dev); + + /** + * toggle() - toggle the state of an LED + * + * will turn off the LED if it's on and vice versa. + * Optional. If not given, a fallback using get_on/set_on is provided. + * + * @dev: LED device to change + * @return 0 if OK, -ve on error + */ + int (*toggle)(struct udevice *dev); }; #define led_get_ops(dev) ((struct led_ops *)(dev)->driver->ops) @@ -92,4 +103,14 @@ int led_set_on(struct udevice *dev, int on); */ int led_get_on(struct udevice *dev); +/** + * led_toggle() - toggle the state of an LED + * + * will turn off the LED if it's on and vice versa. + * + * @dev: LED device to change + * @return 0 if OK, -ve on error + */ +int led_toggle(struct udevice *dev); + #endif _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot