xref: /openbmc/u-boot/cmd/led.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2ffe2052dSSimon Glass /*
3ffe2052dSSimon Glass  * Copyright (c) 2017 Google, Inc
4ffe2052dSSimon Glass  * Written by Simon Glass <sjg@chromium.org>
5ffe2052dSSimon Glass  */
6ffe2052dSSimon Glass 
7ffe2052dSSimon Glass #include <common.h>
8ffe2052dSSimon Glass #include <command.h>
9ffe2052dSSimon Glass #include <dm.h>
10ffe2052dSSimon Glass #include <led.h>
11ffe2052dSSimon Glass #include <dm/uclass-internal.h>
12ffe2052dSSimon Glass 
13ffe2052dSSimon Glass #define LED_TOGGLE LEDST_COUNT
14ffe2052dSSimon Glass 
15ffe2052dSSimon Glass static const char *const state_label[] = {
16ffe2052dSSimon Glass 	[LEDST_OFF]	= "off",
17ffe2052dSSimon Glass 	[LEDST_ON]	= "on",
18ffe2052dSSimon Glass 	[LEDST_TOGGLE]	= "toggle",
19ffe2052dSSimon Glass #ifdef CONFIG_LED_BLINK
20ffe2052dSSimon Glass 	[LEDST_BLINK]	= "blink",
21ffe2052dSSimon Glass #endif
22ffe2052dSSimon Glass };
23ffe2052dSSimon Glass 
get_led_cmd(char * var)24ffe2052dSSimon Glass enum led_state_t get_led_cmd(char *var)
25ffe2052dSSimon Glass {
26ffe2052dSSimon Glass 	int i;
27ffe2052dSSimon Glass 
28ffe2052dSSimon Glass 	for (i = 0; i < LEDST_COUNT; i++) {
29ffe2052dSSimon Glass 		if (!strncmp(var, state_label[i], strlen(var)))
30ffe2052dSSimon Glass 			return i;
31ffe2052dSSimon Glass 	}
32ffe2052dSSimon Glass 
33ffe2052dSSimon Glass 	return -1;
34ffe2052dSSimon Glass }
35ffe2052dSSimon Glass 
show_led_state(struct udevice * dev)36ffe2052dSSimon Glass static int show_led_state(struct udevice *dev)
37ffe2052dSSimon Glass {
38ffe2052dSSimon Glass 	int ret;
39ffe2052dSSimon Glass 
40ffe2052dSSimon Glass 	ret = led_get_state(dev);
41ffe2052dSSimon Glass 	if (ret >= LEDST_COUNT)
42ffe2052dSSimon Glass 		ret = -EINVAL;
43ffe2052dSSimon Glass 	if (ret >= 0)
44ffe2052dSSimon Glass 		printf("%s\n", state_label[ret]);
45ffe2052dSSimon Glass 
46ffe2052dSSimon Glass 	return ret;
47ffe2052dSSimon Glass }
48ffe2052dSSimon Glass 
list_leds(void)49ffe2052dSSimon Glass static int list_leds(void)
50ffe2052dSSimon Glass {
51ffe2052dSSimon Glass 	struct udevice *dev;
52ffe2052dSSimon Glass 	int ret;
53ffe2052dSSimon Glass 
54ffe2052dSSimon Glass 	for (uclass_find_first_device(UCLASS_LED, &dev);
55ffe2052dSSimon Glass 	     dev;
56ffe2052dSSimon Glass 	     uclass_find_next_device(&dev)) {
57ffe2052dSSimon Glass 		struct led_uc_plat *plat = dev_get_uclass_platdata(dev);
58ffe2052dSSimon Glass 
59ffe2052dSSimon Glass 		if (!plat->label)
60ffe2052dSSimon Glass 			continue;
61ffe2052dSSimon Glass 		printf("%-15s ", plat->label);
62ffe2052dSSimon Glass 		if (device_active(dev)) {
63ffe2052dSSimon Glass 			ret = show_led_state(dev);
64ffe2052dSSimon Glass 			if (ret < 0)
65ffe2052dSSimon Glass 				printf("Error %d\n", ret);
66ffe2052dSSimon Glass 		} else {
67ffe2052dSSimon Glass 			printf("<inactive>\n");
68ffe2052dSSimon Glass 		}
69ffe2052dSSimon Glass 	}
70ffe2052dSSimon Glass 
71ffe2052dSSimon Glass 	return 0;
72ffe2052dSSimon Glass }
73ffe2052dSSimon Glass 
do_led(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])74ffe2052dSSimon Glass int do_led(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
75ffe2052dSSimon Glass {
76ffe2052dSSimon Glass 	enum led_state_t cmd;
77ffe2052dSSimon Glass 	const char *led_label;
78ffe2052dSSimon Glass 	struct udevice *dev;
79ffe2052dSSimon Glass #ifdef CONFIG_LED_BLINK
80ffe2052dSSimon Glass 	int freq_ms = 0;
81ffe2052dSSimon Glass #endif
82ffe2052dSSimon Glass 	int ret;
83ffe2052dSSimon Glass 
84ffe2052dSSimon Glass 	/* Validate arguments */
85ffe2052dSSimon Glass 	if (argc < 2)
86ffe2052dSSimon Glass 		return CMD_RET_USAGE;
87ffe2052dSSimon Glass 	led_label = argv[1];
88ffe2052dSSimon Glass 	if (*led_label == 'l')
89ffe2052dSSimon Glass 		return list_leds();
90ffe2052dSSimon Glass 
91ffe2052dSSimon Glass 	cmd = argc > 2 ? get_led_cmd(argv[2]) : LEDST_COUNT;
92ffe2052dSSimon Glass #ifdef CONFIG_LED_BLINK
93ffe2052dSSimon Glass 	if (cmd == LEDST_BLINK) {
94ffe2052dSSimon Glass 		if (argc < 4)
95ffe2052dSSimon Glass 			return CMD_RET_USAGE;
96ffe2052dSSimon Glass 		freq_ms = simple_strtoul(argv[3], NULL, 10);
97ffe2052dSSimon Glass 	}
98ffe2052dSSimon Glass #endif
99ffe2052dSSimon Glass 	ret = led_get_by_label(led_label, &dev);
100ffe2052dSSimon Glass 	if (ret) {
101ffe2052dSSimon Glass 		printf("LED '%s' not found (err=%d)\n", led_label, ret);
102ffe2052dSSimon Glass 		return CMD_RET_FAILURE;
103ffe2052dSSimon Glass 	}
104ffe2052dSSimon Glass 	switch (cmd) {
105ffe2052dSSimon Glass 	case LEDST_OFF:
106ffe2052dSSimon Glass 	case LEDST_ON:
107ffe2052dSSimon Glass 	case LEDST_TOGGLE:
108ffe2052dSSimon Glass 		ret = led_set_state(dev, cmd);
109ffe2052dSSimon Glass 		break;
110ffe2052dSSimon Glass #ifdef CONFIG_LED_BLINK
111ffe2052dSSimon Glass 	case LEDST_BLINK:
112ffe2052dSSimon Glass 		ret = led_set_period(dev, freq_ms);
113ffe2052dSSimon Glass 		if (!ret)
114ffe2052dSSimon Glass 			ret = led_set_state(dev, LEDST_BLINK);
115ffe2052dSSimon Glass 		break;
116ffe2052dSSimon Glass #endif
117ffe2052dSSimon Glass 	case LEDST_COUNT:
118ffe2052dSSimon Glass 		printf("LED '%s': ", led_label);
119ffe2052dSSimon Glass 		ret = show_led_state(dev);
120ffe2052dSSimon Glass 		break;
121ffe2052dSSimon Glass 	}
122ffe2052dSSimon Glass 	if (ret < 0) {
123ffe2052dSSimon Glass 		printf("LED '%s' operation failed (err=%d)\n", led_label, ret);
124ffe2052dSSimon Glass 		return CMD_RET_FAILURE;
125ffe2052dSSimon Glass 	}
126ffe2052dSSimon Glass 
127ffe2052dSSimon Glass 	return 0;
128ffe2052dSSimon Glass }
129ffe2052dSSimon Glass 
130ffe2052dSSimon Glass #ifdef CONFIG_LED_BLINK
131ffe2052dSSimon Glass #define BLINK "|blink [blink-freq in ms]"
132ffe2052dSSimon Glass #else
133ffe2052dSSimon Glass #define BLINK ""
134ffe2052dSSimon Glass #endif
135ffe2052dSSimon Glass 
136ffe2052dSSimon Glass U_BOOT_CMD(
137ffe2052dSSimon Glass 	led, 4, 1, do_led,
138ffe2052dSSimon Glass 	"manage LEDs",
139ffe2052dSSimon Glass 	"<led_label> on|off|toggle" BLINK "\tChange LED state\n"
140ffe2052dSSimon Glass 	"led [<led_label>\tGet LED state\n"
141ffe2052dSSimon Glass 	"led list\t\tshow a list of LEDs"
142ffe2052dSSimon Glass );
143