Commit 9413ad4f0def2e06a5042106a6e1650a1aa03a5a
1 parent
8f4b612333
Exists in
smarc_8mq_lf_v2020.04
and in
17 other branches
dm: led: Support toggling LEDs
Add support for toggling an LED into the uclass interface. This can be efficiently implemented by the driver. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Ziping Chen <techping.chan@gmail.com>
Showing 3 changed files with 33 additions and 0 deletions Side-by-side Diff
drivers/led/led_gpio.c
... | ... | @@ -21,12 +21,19 @@ |
21 | 21 | static int gpio_led_set_state(struct udevice *dev, enum led_state_t state) |
22 | 22 | { |
23 | 23 | struct led_gpio_priv *priv = dev_get_priv(dev); |
24 | + int ret; | |
24 | 25 | |
25 | 26 | if (!dm_gpio_is_valid(&priv->gpio)) |
26 | 27 | return -EREMOTEIO; |
27 | 28 | switch (state) { |
28 | 29 | case LEDST_OFF: |
29 | 30 | case LEDST_ON: |
31 | + break; | |
32 | + case LEDST_TOGGLE: | |
33 | + ret = dm_gpio_get_value(&priv->gpio); | |
34 | + if (ret < 0) | |
35 | + return ret; | |
36 | + state = !ret; | |
30 | 37 | break; |
31 | 38 | default: |
32 | 39 | return -ENOSYS; |
include/led.h
test/dm/led.c
... | ... | @@ -53,6 +53,31 @@ |
53 | 53 | } |
54 | 54 | DM_TEST(dm_test_led_gpio, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); |
55 | 55 | |
56 | +/* Test that we can toggle LEDs */ | |
57 | +static int dm_test_led_toggle(struct unit_test_state *uts) | |
58 | +{ | |
59 | + const int offset = 1; | |
60 | + struct udevice *dev, *gpio; | |
61 | + | |
62 | + /* | |
63 | + * Check that we can manipulate an LED. LED 1 is connected to GPIO | |
64 | + * bank gpio_a, offset 1. | |
65 | + */ | |
66 | + ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev)); | |
67 | + ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio)); | |
68 | + ut_asserteq(0, sandbox_gpio_get_value(gpio, offset)); | |
69 | + ut_assertok(led_set_state(dev, LEDST_TOGGLE)); | |
70 | + ut_asserteq(1, sandbox_gpio_get_value(gpio, offset)); | |
71 | + ut_asserteq(LEDST_ON, led_get_state(dev)); | |
72 | + | |
73 | + ut_assertok(led_set_state(dev, LEDST_TOGGLE)); | |
74 | + ut_asserteq(0, sandbox_gpio_get_value(gpio, offset)); | |
75 | + ut_asserteq(LEDST_OFF, led_get_state(dev)); | |
76 | + | |
77 | + return 0; | |
78 | +} | |
79 | +DM_TEST(dm_test_led_toggle, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | |
80 | + | |
56 | 81 | /* Test obtaining an LED by label */ |
57 | 82 | static int dm_test_led_label(struct unit_test_state *uts) |
58 | 83 | { |