1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2015 Google, Inc
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun #include <common.h>
8*4882a593Smuzhiyun #include <dm.h>
9*4882a593Smuzhiyun #include <led.h>
10*4882a593Smuzhiyun #include <asm/gpio.h>
11*4882a593Smuzhiyun #include <dm/test.h>
12*4882a593Smuzhiyun #include <test/ut.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun /* Base test of the led uclass */
dm_test_led_base(struct unit_test_state * uts)17*4882a593Smuzhiyun static int dm_test_led_base(struct unit_test_state *uts)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun struct udevice *dev;
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun /* Get the top-level device */
22*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_LED, 0, &dev));
23*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
24*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_LED, 2, &dev));
25*4882a593Smuzhiyun ut_asserteq(-ENODEV, uclass_get_device(UCLASS_LED, 3, &dev));
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun return 0;
28*4882a593Smuzhiyun }
29*4882a593Smuzhiyun DM_TEST(dm_test_led_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun /* Test of the led uclass using the led_gpio driver */
dm_test_led_gpio(struct unit_test_state * uts)32*4882a593Smuzhiyun static int dm_test_led_gpio(struct unit_test_state *uts)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun const int offset = 1;
35*4882a593Smuzhiyun struct udevice *dev, *gpio;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun /*
38*4882a593Smuzhiyun * Check that we can manipulate an LED. LED 1 is connected to GPIO
39*4882a593Smuzhiyun * bank gpio_a, offset 1.
40*4882a593Smuzhiyun */
41*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
42*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
43*4882a593Smuzhiyun ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
44*4882a593Smuzhiyun ut_assertok(led_set_state(dev, LEDST_ON));
45*4882a593Smuzhiyun ut_asserteq(1, sandbox_gpio_get_value(gpio, offset));
46*4882a593Smuzhiyun ut_asserteq(LEDST_ON, led_get_state(dev));
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun ut_assertok(led_set_state(dev, LEDST_OFF));
49*4882a593Smuzhiyun ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
50*4882a593Smuzhiyun ut_asserteq(LEDST_OFF, led_get_state(dev));
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun return 0;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun DM_TEST(dm_test_led_gpio, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun /* Test that we can toggle LEDs */
dm_test_led_toggle(struct unit_test_state * uts)57*4882a593Smuzhiyun static int dm_test_led_toggle(struct unit_test_state *uts)
58*4882a593Smuzhiyun {
59*4882a593Smuzhiyun const int offset = 1;
60*4882a593Smuzhiyun struct udevice *dev, *gpio;
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun /*
63*4882a593Smuzhiyun * Check that we can manipulate an LED. LED 1 is connected to GPIO
64*4882a593Smuzhiyun * bank gpio_a, offset 1.
65*4882a593Smuzhiyun */
66*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
67*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
68*4882a593Smuzhiyun ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
69*4882a593Smuzhiyun ut_assertok(led_set_state(dev, LEDST_TOGGLE));
70*4882a593Smuzhiyun ut_asserteq(1, sandbox_gpio_get_value(gpio, offset));
71*4882a593Smuzhiyun ut_asserteq(LEDST_ON, led_get_state(dev));
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun ut_assertok(led_set_state(dev, LEDST_TOGGLE));
74*4882a593Smuzhiyun ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
75*4882a593Smuzhiyun ut_asserteq(LEDST_OFF, led_get_state(dev));
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun return 0;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun DM_TEST(dm_test_led_toggle, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun /* Test obtaining an LED by label */
dm_test_led_label(struct unit_test_state * uts)82*4882a593Smuzhiyun static int dm_test_led_label(struct unit_test_state *uts)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun struct udevice *dev, *cmp;
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun ut_assertok(led_get_by_label("sandbox:red", &dev));
87*4882a593Smuzhiyun ut_asserteq(1, device_active(dev));
88*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_LED, 1, &cmp));
89*4882a593Smuzhiyun ut_asserteq_ptr(dev, cmp);
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun ut_assertok(led_get_by_label("sandbox:green", &dev));
92*4882a593Smuzhiyun ut_asserteq(1, device_active(dev));
93*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_LED, 2, &cmp));
94*4882a593Smuzhiyun ut_asserteq_ptr(dev, cmp);
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun ut_asserteq(-ENODEV, led_get_by_label("sandbox:blue", &dev));
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun return 0;
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun DM_TEST(dm_test_led_label, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun /* Test LED blinking */
103*4882a593Smuzhiyun #ifdef CONFIG_LED_BLINK
dm_test_led_blink(struct unit_test_state * uts)104*4882a593Smuzhiyun static int dm_test_led_blink(struct unit_test_state *uts)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun const int offset = 1;
107*4882a593Smuzhiyun struct udevice *dev, *gpio;
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun /*
110*4882a593Smuzhiyun * Check that we get an error when trying to blink an LED, since it is
111*4882a593Smuzhiyun * not supported by the GPIO LED driver.
112*4882a593Smuzhiyun */
113*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_LED, 1, &dev));
114*4882a593Smuzhiyun ut_assertok(uclass_get_device(UCLASS_GPIO, 1, &gpio));
115*4882a593Smuzhiyun ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
116*4882a593Smuzhiyun ut_asserteq(-ENOSYS, led_set_state(dev, LEDST_BLINK));
117*4882a593Smuzhiyun ut_asserteq(0, sandbox_gpio_get_value(gpio, offset));
118*4882a593Smuzhiyun ut_asserteq(LEDST_OFF, led_get_state(dev));
119*4882a593Smuzhiyun ut_asserteq(-ENOSYS, led_set_period(dev, 100));
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun return 0;
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun DM_TEST(dm_test_led_blink, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
124*4882a593Smuzhiyun #endif
125