dm: pmic: Add 'reg status' to show all regulators
[oweals/u-boot.git] / common / cmd_regulator.c
index 793f08e81a92fef5c996b9518c7f00f7ed81c6e3..bfea6e04b6746dbb5d8efaa26073761ad9d390f9 100644 (file)
@@ -180,18 +180,13 @@ static int do_info(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        return CMD_RET_SUCCESS;
 }
 
-static int do_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+static void do_status_detail(struct udevice *dev,
+                            struct dm_regulator_uclass_platdata *uc_pdata)
 {
-       struct dm_regulator_uclass_platdata *uc_pdata;
-       int current, value, mode, ret;
-       const char *mode_name = NULL;
-       struct udevice *dev;
+       int current, value, mode;
+       const char *mode_name;
        bool enabled;
 
-       ret = curr_dev_and_platdata(&dev, &uc_pdata, true);
-       if (ret)
-               return ret;
-
        printf("Regulator %s status:\n", uc_pdata->name);
 
        enabled = regulator_get_enable(dev);
@@ -206,6 +201,57 @@ static int do_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        mode = regulator_get_mode(dev);
        mode_name = get_mode_name(uc_pdata->mode, uc_pdata->mode_count, mode);
        constraint(" * mode id:", mode, mode_name);
+}
+
+static void do_status_line(struct udevice *dev)
+{
+       struct dm_regulator_uclass_platdata *pdata;
+       int current, value, mode;
+       const char *mode_name;
+       bool enabled;
+
+       pdata = dev_get_uclass_platdata(dev);
+       enabled = regulator_get_enable(dev);
+       value = regulator_get_value(dev);
+       current = regulator_get_current(dev);
+       mode = regulator_get_mode(dev);
+       mode_name = get_mode_name(pdata->mode, pdata->mode_count, mode);
+       printf("%-20s %-10s ", pdata->name, enabled ? "enabled" : "disabled");
+       if (value >= 0)
+               printf("%10d ", value);
+       else
+               printf("%10s ", "-");
+       if (current >= 0)
+               printf("%10d ", current);
+       else
+               printf("%10s ", "-");
+       if (mode >= 0)
+               printf("%-10s", mode_name);
+       else
+               printf("%-10s", "-");
+       printf("\n");
+}
+
+static int do_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       struct dm_regulator_uclass_platdata *uc_pdata;
+       struct udevice *dev;
+       int ret;
+
+       if (currdev && (argc < 2 || strcmp(argv[1], "-a"))) {
+               ret = curr_dev_and_platdata(&dev, &uc_pdata, true);
+               if (ret)
+                       return CMD_RET_FAILURE;
+               do_status_detail(dev, uc_pdata);
+               return 0;
+       }
+
+       /* Show all of them in a list, probing them as needed */
+       printf("%-20s %-10s %10s %10s %-10s\n", "Name", "Enabled", "uV", "mA",
+              "Mode");
+       for (ret = uclass_first_device(UCLASS_REGULATOR, &dev); dev;
+            ret = uclass_next_device(&dev))
+               do_status_line(dev);
 
        return CMD_RET_SUCCESS;
 }
@@ -400,7 +446,7 @@ U_BOOT_CMD(regulator, CONFIG_SYS_MAXARGS, 1, do_regulator,
        "list             - list UCLASS regulator devices\n"
        "regulator dev [regulator-name] - show/[set] operating regulator device\n"
        "regulator info                 - print constraints info\n"
-       "regulator status               - print operating status\n"
+       "regulator status [-a]          - print operating status [for all]\n"
        "regulator value [val] [-f]     - print/[set] voltage value [uV] (force)\n"
        "regulator current [val]        - print/[set] current value [uA]\n"
        "regulator mode [id]            - print/[set] operating mode id\n"