1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2020 Philippe Reynes <philippe.reynes@softathome.com>
4 *
5 * Based on led.c
6 */
7
8#include <common.h>
9#include <command.h>
10#include <dm.h>
11#include <button.h>
12#include <dm/uclass-internal.h>
13
14static const char *const state_label[] = {
15	[BUTTON_OFF]	= "off",
16	[BUTTON_ON]	= "on",
17};
18
19static int show_button_state(struct udevice *dev)
20{
21	int ret;
22
23	ret = button_get_state(dev);
24	if (ret >= BUTTON_COUNT)
25		ret = -EINVAL;
26	if (ret >= 0)
27		printf("%s\n", state_label[ret]);
28
29	return ret;
30}
31
32static int list_buttons(void)
33{
34	struct udevice *dev;
35	int ret;
36
37	for (uclass_find_first_device(UCLASS_BUTTON, &dev);
38	     dev;
39	     uclass_find_next_device(&dev)) {
40		struct button_uc_plat *plat = dev_get_uclass_plat(dev);
41
42		if (!plat->label)
43			continue;
44		printf("%-15s ", plat->label);
45		if (device_active(dev)) {
46			ret = show_button_state(dev);
47			if (ret < 0)
48				printf("Error %d\n", ret);
49		} else {
50			printf("<inactive>\n");
51		}
52	}
53
54	return 0;
55}
56
57int do_button(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
58{
59	const char *button_label;
60	struct udevice *dev;
61	int ret;
62
63	/* Validate arguments */
64	if (argc < 2)
65		return CMD_RET_USAGE;
66	button_label = argv[1];
67	if (strncmp(button_label, "list", 4) == 0)
68		return list_buttons();
69
70	ret = button_get_by_label(button_label, &dev);
71	if (ret) {
72		printf("Button '%s' not found (err=%d)\n", button_label, ret);
73		return CMD_RET_FAILURE;
74	}
75
76	ret = show_button_state(dev);
77
78	return !ret;
79}
80
81U_BOOT_CMD(
82	button, 2, 1, do_button,
83	"manage buttons",
84	"<button_label> \tGet button state\n"
85	"button list\t\tShow a list of buttons"
86);
87