// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2020 Philippe Reynes * * Based on led.c */ #include #include #include #include #include static const char *const state_label[] = { [BUTTON_OFF] = "off", [BUTTON_ON] = "on", }; static int show_button_state(struct udevice *dev) { int ret; ret = button_get_state(dev); if (ret >= BUTTON_COUNT) ret = -EINVAL; if (ret >= 0) printf("%s\n", state_label[ret]); return ret; } static int list_buttons(void) { struct udevice *dev; int ret; for (uclass_find_first_device(UCLASS_BUTTON, &dev); dev; uclass_find_next_device(&dev)) { struct button_uc_plat *plat = dev_get_uclass_plat(dev); if (!plat->label) continue; printf("%-15s ", plat->label); if (device_active(dev)) { ret = show_button_state(dev); if (ret < 0) printf("Error %d\n", ret); } else { printf("\n"); } } return 0; } int do_button(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { const char *button_label; struct udevice *dev; int ret; /* Validate arguments */ if (argc < 2) return CMD_RET_USAGE; button_label = argv[1]; if (strncmp(button_label, "list", 4) == 0) return list_buttons(); ret = button_get_by_label(button_label, &dev); if (ret) { printf("Button '%s' not found (err=%d)\n", button_label, ret); return CMD_RET_FAILURE; } ret = show_button_state(dev); return !ret; } U_BOOT_CMD( button, 2, 1, do_button, "manage buttons", " \tGet button state\n" "button list\t\tShow a list of buttons" );