Commit 8f4b612333ee0381eedf767c1c005a830886df27

Authored by Simon Glass
1 parent ddae9fcddc

dm: led: Add support for getting the state of an LED

It is useful to be able to read the LED as well as write it. Add this to
the uclass and update the GPIO driver.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Ziping Chen <techping.chan@gmail.com>

Showing 4 changed files with 50 additions and 0 deletions Side-by-side Diff

drivers/led/led-uclass.c
... ... @@ -42,6 +42,16 @@
42 42 return ops->set_state(dev, state);
43 43 }
44 44  
  45 +enum led_state_t led_get_state(struct udevice *dev)
  46 +{
  47 + struct led_ops *ops = led_get_ops(dev);
  48 +
  49 + if (!ops->get_state)
  50 + return -ENOSYS;
  51 +
  52 + return ops->get_state(dev);
  53 +}
  54 +
45 55 UCLASS_DRIVER(led) = {
46 56 .id = UCLASS_LED,
47 57 .name = "led",
drivers/led/led_gpio.c
... ... @@ -24,10 +24,31 @@
24 24  
25 25 if (!dm_gpio_is_valid(&priv->gpio))
26 26 return -EREMOTEIO;
  27 + switch (state) {
  28 + case LEDST_OFF:
  29 + case LEDST_ON:
  30 + break;
  31 + default:
  32 + return -ENOSYS;
  33 + }
27 34  
28 35 return dm_gpio_set_value(&priv->gpio, state);
29 36 }
30 37  
  38 +static enum led_state_t gpio_led_get_state(struct udevice *dev)
  39 +{
  40 + struct led_gpio_priv *priv = dev_get_priv(dev);
  41 + int ret;
  42 +
  43 + if (!dm_gpio_is_valid(&priv->gpio))
  44 + return -EREMOTEIO;
  45 + ret = dm_gpio_get_value(&priv->gpio);
  46 + if (ret < 0)
  47 + return ret;
  48 +
  49 + return ret ? LEDST_ON : LEDST_OFF;
  50 +}
  51 +
31 52 static int led_gpio_probe(struct udevice *dev)
32 53 {
33 54 struct led_uc_plat *uc_plat = dev_get_uclass_platdata(dev);
... ... @@ -88,6 +109,7 @@
88 109  
89 110 static const struct led_ops gpio_led_ops = {
90 111 .set_state = gpio_led_set_state,
  112 + .get_state = gpio_led_get_state,
91 113 };
92 114  
93 115 static const struct udevice_id led_gpio_ids[] = {
... ... @@ -33,6 +33,14 @@
33 33 * @return 0 if OK, -ve on error
34 34 */
35 35 int (*set_state)(struct udevice *dev, enum led_state_t state);
  36 +
  37 + /**
  38 + * led_get_state() - get the state of an LED
  39 + *
  40 + * @dev: LED device to change
  41 + * @return LED state led_state_t, or -ve on error
  42 + */
  43 + enum led_state_t (*get_state)(struct udevice *dev);
36 44 };
37 45  
38 46 #define led_get_ops(dev) ((struct led_ops *)(dev)->driver->ops)
... ... @@ -54,6 +62,14 @@
54 62 * @return 0 if OK, -ve on error
55 63 */
56 64 int led_set_state(struct udevice *dev, enum led_state_t state);
  65 +
  66 +/**
  67 + * led_get_state() - get the state of an LED
  68 + *
  69 + * @dev: LED device to change
  70 + * @return LED state led_state_t, or -ve on error
  71 + */
  72 +enum led_state_t led_get_state(struct udevice *dev);
57 73  
58 74 #endif
... ... @@ -43,9 +43,11 @@
43 43 ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
44 44 ut_assertok(led_set_state(dev, LEDST_ON));
45 45 ut_asserteq(1, sandbox_gpio_get_value(gpio, offset));
  46 + ut_asserteq(LEDST_ON, led_get_state(dev));
46 47  
47 48 ut_assertok(led_set_state(dev, LEDST_OFF));
48 49 ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
  50 + ut_asserteq(LEDST_OFF, led_get_state(dev));
49 51  
50 52 return 0;
51 53 }