xref: /OK3568_Linux_fs/u-boot/test/dm/led.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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