Merge branch '2022-08-04-Kconfig-migrations'
[platform/kernel/u-boot.git] / cmd / cros_ec.c
index 77656a2..90921ce 100644 (file)
@@ -10,7 +10,6 @@
 #include <command.h>
 #include <cros_ec.h>
 #include <dm.h>
-#include <flash.h>
 #include <log.h>
 #include <dm/device-internal.h>
 #include <dm/uclass-internal.h>
@@ -23,7 +22,7 @@ static const char * const ec_current_image_name[] = {"unknown", "RO", "RW"};
  *
  * @param argc Number of params remaining
  * @param argv List of remaining parameters
- * @return flash region (EC_FLASH_REGION_...) or -1 on error
+ * Return: flash region (EC_FLASH_REGION_...) or -1 on error
  */
 static int cros_ec_decode_region(int argc, char *const argv[])
 {
@@ -48,7 +47,7 @@ static int cros_ec_decode_region(int argc, char *const argv[])
  * @param is_write     1 do to a write, 0 to do a read
  * @param argc         Number of arguments
  * @param argv         Arguments (2 is region, 3 is address)
- * @return 0 for ok, 1 for a usage error or -ve for ec command error
+ * Return: 0 for ok, 1 for a usage error or -ve for ec command error
  *     (negative EC_RES_...)
  */
 static int do_read_write(struct udevice *dev, int is_write, int argc,
@@ -65,11 +64,11 @@ static int do_read_write(struct udevice *dev, int is_write, int argc,
                return 1;
        if (argc < 4)
                return 1;
-       addr = simple_strtoul(argv[3], &endp, 16);
+       addr = hextoul(argv[3], &endp);
        if (*argv[3] == 0 || *endp != 0)
                return 1;
        if (argc > 4) {
-               size = simple_strtoul(argv[4], &endp, 16);
+               size = hextoul(argv[4], &endp);
                if (*argv[4] == 0 || *endp != 0)
                        return 1;
        }
@@ -162,6 +161,101 @@ static int do_show_features(struct udevice *dev)
        return 0;
 }
 
+static const char *const switch_name[8] = {
+       "lid open",
+       "power button pressed",
+       "write-protect disabled",
+       NULL,
+       "dedicated recovery",
+       NULL,
+       NULL,
+       NULL,
+};
+
+static int do_show_switches(struct udevice *dev)
+{
+       uint switches;
+       int ret;
+       uint i;
+
+       ret = cros_ec_get_switches(dev);
+       if (ret < 0)
+               return log_msg_ret("get", ret);
+       switches = ret;
+       for (i = 0; i < ARRAY_SIZE(switch_name); i++) {
+               uint mask = 1 << i;
+
+               if (switches & mask) {
+                       if (switch_name[i])
+                               printf("%s\n", switch_name[i]);
+                       else
+                               printf("unknown %02x\n", mask);
+               }
+       }
+
+       return 0;
+}
+
+static const char *const event_name[] = {
+       "lid_closed",
+       "lid_open",
+       "power_button",
+       "ac_connected",
+       "ac_disconnected",
+       "battery_low",
+       "battery_critical",
+       "battery",
+       "thermal_threshold",
+       "device",
+       "thermal",
+       "usb_charger",
+       "key_pressed",
+       "interface_ready",
+       "keyboard_recovery",
+       "thermal_shutdown",
+       "battery_shutdown",
+       "throttle_start",
+       "throttle_stop",
+       "hang_detect",
+       "hang_reboot",
+       "pd_mcu",
+       "battery_status",
+       "panic",
+       "keyboard_fastboot",
+       "rtc",
+       "mkbp",
+       "usb_mux",
+       "mode_change",
+       "keyboard_recovery_hw_reinit",
+       "extended",
+       "invalid",
+};
+
+static int do_show_events(struct udevice *dev)
+{
+       u32 events;
+       int ret;
+       uint i;
+
+       ret = cros_ec_get_host_events(dev, &events);
+       if (ret)
+               return ret;
+       printf("%08x\n", events);
+       for (i = 0; i < ARRAY_SIZE(event_name); i++) {
+               enum host_event_code code = i + 1;
+               u64 mask = EC_HOST_EVENT_MASK(code);
+
+               if (events & mask) {
+                       if (event_name[i])
+                               printf("%s\n", event_name[i]);
+                       else
+                               printf("unknown code %#x\n", code);
+               }
+       }
+
+       return 0;
+}
+
 static int do_cros_ec(struct cmd_tbl *cmdtp, int flag, int argc,
                      char *const argv[])
 {
@@ -213,6 +307,11 @@ static int do_cros_ec(struct cmd_tbl *cmdtp, int flag, int argc,
 
                if (ret)
                        printf("Error: %d\n", ret);
+       } else if (!strcmp("switches", cmd)) {
+               ret = do_show_switches(dev);
+
+               if (ret)
+                       printf("Error: %d\n", ret);
        } else if (0 == strcmp("curimage", cmd)) {
                enum ec_current_image image;
 
@@ -263,13 +362,10 @@ static int do_cros_ec(struct cmd_tbl *cmdtp, int flag, int argc,
                        return 1;
                }
        } else if (0 == strcmp("events", cmd)) {
-               uint32_t events;
+               ret = do_show_events(dev);
 
-               if (cros_ec_get_host_events(dev, &events)) {
-                       debug("%s: Could not read host events\n", __func__);
-                       return 1;
-               }
-               printf("0x%08x\n", events);
+               if (ret)
+                       printf("Error: %d\n", ret);
        } else if (0 == strcmp("clrevents", cmd)) {
                uint32_t events = 0x7fffffff;
 
@@ -404,11 +500,11 @@ static int do_cros_ec(struct cmd_tbl *cmdtp, int flag, int argc,
 
                if (argc < 3)
                        return CMD_RET_USAGE;
-               index = simple_strtoul(argv[2], &endp, 10);
+               index = dectoul(argv[2], &endp);
                if (*argv[2] == 0 || *endp != 0)
                        return CMD_RET_USAGE;
                if (argc > 3) {
-                       state = simple_strtoul(argv[3], &endp, 10);
+                       state = dectoul(argv[3], &endp);
                        if (*argv[3] == 0 || *endp != 0)
                                return CMD_RET_USAGE;
                        ret = cros_ec_set_ldo(dev, index, state);
@@ -453,10 +549,12 @@ U_BOOT_CMD(
        "crosec id                  Read CROS-EC ID\n"
        "crosec info                Read CROS-EC info\n"
        "crosec features            Read CROS-EC features\n"
+       "crosec switches            Read CROS-EC switches\n"
        "crosec curimage            Read CROS-EC current image\n"
        "crosec hash                Read CROS-EC hash\n"
        "crosec reboot [rw | ro | cold]  Reboot CROS-EC\n"
        "crosec events              Read CROS-EC host events\n"
+       "crosec eventsb             Read CROS-EC host events_b\n"
        "crosec clrevents [mask]    Clear CROS-EC host events\n"
        "crosec regioninfo <ro|rw>  Read image info\n"
        "crosec flashinfo           Read flash info\n"