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