12e192b24SSimon Glass /* 22e192b24SSimon Glass * Copyright (C) 2014-2015 Samsung Electronics 32e192b24SSimon Glass * Przemyslaw Marczak <p.marczak@samsung.com> 42e192b24SSimon Glass * 52e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 62e192b24SSimon Glass */ 72e192b24SSimon Glass #include <common.h> 82e192b24SSimon Glass #include <errno.h> 92e192b24SSimon Glass #include <dm.h> 102e192b24SSimon Glass #include <dm/uclass-internal.h> 112e192b24SSimon Glass #include <power/regulator.h> 122e192b24SSimon Glass 132e192b24SSimon Glass #define LIMIT_DEVNAME 20 142e192b24SSimon Glass #define LIMIT_OFNAME 32 152e192b24SSimon Glass #define LIMIT_INFO 18 162e192b24SSimon Glass 172e192b24SSimon Glass static struct udevice *currdev; 182e192b24SSimon Glass 192e192b24SSimon Glass static int failure(int ret) 202e192b24SSimon Glass { 212e192b24SSimon Glass printf("Error: %d (%s)\n", ret, errno_str(ret)); 222e192b24SSimon Glass 232e192b24SSimon Glass return CMD_RET_FAILURE; 242e192b24SSimon Glass } 252e192b24SSimon Glass 262e192b24SSimon Glass static int do_dev(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 272e192b24SSimon Glass { 282e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 292e192b24SSimon Glass const char *name; 302e192b24SSimon Glass int ret = -ENXIO; 312e192b24SSimon Glass 322e192b24SSimon Glass switch (argc) { 332e192b24SSimon Glass case 2: 342e192b24SSimon Glass name = argv[1]; 352e192b24SSimon Glass ret = regulator_get_by_platname(name, &currdev); 362e192b24SSimon Glass if (ret) { 372e192b24SSimon Glass printf("Can't get the regulator: %s!\n", name); 382e192b24SSimon Glass return failure(ret); 392e192b24SSimon Glass } 402e192b24SSimon Glass case 1: 412e192b24SSimon Glass if (!currdev) { 422e192b24SSimon Glass printf("Regulator device is not set!\n\n"); 432e192b24SSimon Glass return CMD_RET_USAGE; 442e192b24SSimon Glass } 452e192b24SSimon Glass 462e192b24SSimon Glass uc_pdata = dev_get_uclass_platdata(currdev); 472e192b24SSimon Glass if (!uc_pdata) { 482e192b24SSimon Glass printf("%s: no regulator platform data!\n", currdev->name); 492e192b24SSimon Glass return failure(ret); 502e192b24SSimon Glass } 512e192b24SSimon Glass 522e192b24SSimon Glass printf("dev: %s @ %s\n", uc_pdata->name, currdev->name); 532e192b24SSimon Glass } 542e192b24SSimon Glass 552e192b24SSimon Glass return CMD_RET_SUCCESS; 562e192b24SSimon Glass } 572e192b24SSimon Glass 582e192b24SSimon Glass static int curr_dev_and_platdata(struct udevice **devp, 592e192b24SSimon Glass struct dm_regulator_uclass_platdata **uc_pdata, 602e192b24SSimon Glass bool allow_type_fixed) 612e192b24SSimon Glass { 622e192b24SSimon Glass *devp = NULL; 632e192b24SSimon Glass *uc_pdata = NULL; 642e192b24SSimon Glass 652e192b24SSimon Glass if (!currdev) { 662e192b24SSimon Glass printf("First, set the regulator device!\n"); 672e192b24SSimon Glass return CMD_RET_FAILURE; 682e192b24SSimon Glass } 692e192b24SSimon Glass 702e192b24SSimon Glass *devp = currdev; 712e192b24SSimon Glass 722e192b24SSimon Glass *uc_pdata = dev_get_uclass_platdata(*devp); 732e192b24SSimon Glass if (!*uc_pdata) { 742e192b24SSimon Glass error("Regulator: %s - missing platform data!", currdev->name); 752e192b24SSimon Glass return CMD_RET_FAILURE; 762e192b24SSimon Glass } 772e192b24SSimon Glass 782e192b24SSimon Glass if (!allow_type_fixed && (*uc_pdata)->type == REGULATOR_TYPE_FIXED) { 792e192b24SSimon Glass printf("Operation not allowed for fixed regulator!\n"); 802e192b24SSimon Glass return CMD_RET_FAILURE; 812e192b24SSimon Glass } 822e192b24SSimon Glass 832e192b24SSimon Glass return CMD_RET_SUCCESS; 842e192b24SSimon Glass } 852e192b24SSimon Glass 862e192b24SSimon Glass static int do_list(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 872e192b24SSimon Glass { 882e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 892e192b24SSimon Glass struct udevice *dev; 902e192b24SSimon Glass int ret; 912e192b24SSimon Glass 922e192b24SSimon Glass printf("| %-*.*s| %-*.*s| %s\n", 932e192b24SSimon Glass LIMIT_DEVNAME, LIMIT_DEVNAME, "Device", 942e192b24SSimon Glass LIMIT_OFNAME, LIMIT_OFNAME, "regulator-name", 952e192b24SSimon Glass "Parent"); 962e192b24SSimon Glass 972e192b24SSimon Glass for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev; 982e192b24SSimon Glass ret = uclass_find_next_device(&dev)) { 992e192b24SSimon Glass if (ret) 1002e192b24SSimon Glass continue; 1012e192b24SSimon Glass 1022e192b24SSimon Glass uc_pdata = dev_get_uclass_platdata(dev); 1032e192b24SSimon Glass printf("| %-*.*s| %-*.*s| %s\n", 1042e192b24SSimon Glass LIMIT_DEVNAME, LIMIT_DEVNAME, dev->name, 1052e192b24SSimon Glass LIMIT_OFNAME, LIMIT_OFNAME, uc_pdata->name, 1062e192b24SSimon Glass dev->parent->name); 1072e192b24SSimon Glass } 1082e192b24SSimon Glass 1092e192b24SSimon Glass return ret; 1102e192b24SSimon Glass } 1112e192b24SSimon Glass 1122e192b24SSimon Glass static int constraint(const char *name, int val, const char *val_name) 1132e192b24SSimon Glass { 1142e192b24SSimon Glass printf("%-*s", LIMIT_INFO, name); 1152e192b24SSimon Glass if (val < 0) { 1162e192b24SSimon Glass printf(" %s (err: %d)\n", errno_str(val), val); 1172e192b24SSimon Glass return val; 1182e192b24SSimon Glass } 1192e192b24SSimon Glass 1202e192b24SSimon Glass if (val_name) 1212e192b24SSimon Glass printf(" %d (%s)\n", val, val_name); 1222e192b24SSimon Glass else 1232e192b24SSimon Glass printf(" %d\n", val); 1242e192b24SSimon Glass 1252e192b24SSimon Glass return 0; 1262e192b24SSimon Glass } 1272e192b24SSimon Glass 1282e192b24SSimon Glass static const char *get_mode_name(struct dm_regulator_mode *mode, 1292e192b24SSimon Glass int mode_count, 1302e192b24SSimon Glass int mode_id) 1312e192b24SSimon Glass { 1322e192b24SSimon Glass while (mode_count--) { 1332e192b24SSimon Glass if (mode->id == mode_id) 1342e192b24SSimon Glass return mode->name; 1352e192b24SSimon Glass mode++; 1362e192b24SSimon Glass } 1372e192b24SSimon Glass 1382e192b24SSimon Glass return NULL; 1392e192b24SSimon Glass } 1402e192b24SSimon Glass 1412e192b24SSimon Glass static int do_info(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 1422e192b24SSimon Glass { 1432e192b24SSimon Glass struct udevice *dev; 1442e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 1452e192b24SSimon Glass struct dm_regulator_mode *modes; 1462e192b24SSimon Glass const char *parent_uc; 1472e192b24SSimon Glass int mode_count; 1482e192b24SSimon Glass int ret; 1492e192b24SSimon Glass int i; 1502e192b24SSimon Glass 1512e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, true); 1522e192b24SSimon Glass if (ret) 1532e192b24SSimon Glass return ret; 1542e192b24SSimon Glass 1552e192b24SSimon Glass parent_uc = dev_get_uclass_name(dev->parent); 1562e192b24SSimon Glass 1572e192b24SSimon Glass printf("%s\n%-*s %s\n%-*s %s\n%-*s %s\n%-*s %s\n%-*s\n", 1582e192b24SSimon Glass "Regulator info:", 1592e192b24SSimon Glass LIMIT_INFO, "* regulator-name:", uc_pdata->name, 1602e192b24SSimon Glass LIMIT_INFO, "* device name:", dev->name, 1612e192b24SSimon Glass LIMIT_INFO, "* parent name:", dev->parent->name, 1622e192b24SSimon Glass LIMIT_INFO, "* parent uclass:", parent_uc, 1632e192b24SSimon Glass LIMIT_INFO, "* constraints:"); 1642e192b24SSimon Glass 1652e192b24SSimon Glass constraint(" - min uV:", uc_pdata->min_uV, NULL); 1662e192b24SSimon Glass constraint(" - max uV:", uc_pdata->max_uV, NULL); 1672e192b24SSimon Glass constraint(" - min uA:", uc_pdata->min_uA, NULL); 1682e192b24SSimon Glass constraint(" - max uA:", uc_pdata->max_uA, NULL); 1692e192b24SSimon Glass constraint(" - always on:", uc_pdata->always_on, 1702e192b24SSimon Glass uc_pdata->always_on ? "true" : "false"); 1712e192b24SSimon Glass constraint(" - boot on:", uc_pdata->boot_on, 1722e192b24SSimon Glass uc_pdata->boot_on ? "true" : "false"); 1732e192b24SSimon Glass 1742e192b24SSimon Glass mode_count = regulator_mode(dev, &modes); 1752e192b24SSimon Glass constraint("* op modes:", mode_count, NULL); 1762e192b24SSimon Glass 1772e192b24SSimon Glass for (i = 0; i < mode_count; i++, modes++) 1782e192b24SSimon Glass constraint(" - mode id:", modes->id, modes->name); 1792e192b24SSimon Glass 1802e192b24SSimon Glass return CMD_RET_SUCCESS; 1812e192b24SSimon Glass } 1822e192b24SSimon Glass 1832e192b24SSimon Glass static void do_status_detail(struct udevice *dev, 1842e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata) 1852e192b24SSimon Glass { 1862e192b24SSimon Glass int current, value, mode; 1872e192b24SSimon Glass const char *mode_name; 1882e192b24SSimon Glass bool enabled; 1892e192b24SSimon Glass 1902e192b24SSimon Glass printf("Regulator %s status:\n", uc_pdata->name); 1912e192b24SSimon Glass 1922e192b24SSimon Glass enabled = regulator_get_enable(dev); 1932e192b24SSimon Glass constraint(" * enable:", enabled, enabled ? "true" : "false"); 1942e192b24SSimon Glass 1952e192b24SSimon Glass value = regulator_get_value(dev); 1962e192b24SSimon Glass constraint(" * value uV:", value, NULL); 1972e192b24SSimon Glass 1982e192b24SSimon Glass current = regulator_get_current(dev); 1992e192b24SSimon Glass constraint(" * current uA:", current, NULL); 2002e192b24SSimon Glass 2012e192b24SSimon Glass mode = regulator_get_mode(dev); 2022e192b24SSimon Glass mode_name = get_mode_name(uc_pdata->mode, uc_pdata->mode_count, mode); 2032e192b24SSimon Glass constraint(" * mode id:", mode, mode_name); 2042e192b24SSimon Glass } 2052e192b24SSimon Glass 2062e192b24SSimon Glass static void do_status_line(struct udevice *dev) 2072e192b24SSimon Glass { 2082e192b24SSimon Glass struct dm_regulator_uclass_platdata *pdata; 2092e192b24SSimon Glass int current, value, mode; 2102e192b24SSimon Glass const char *mode_name; 2112e192b24SSimon Glass bool enabled; 2122e192b24SSimon Glass 2132e192b24SSimon Glass pdata = dev_get_uclass_platdata(dev); 2142e192b24SSimon Glass enabled = regulator_get_enable(dev); 2152e192b24SSimon Glass value = regulator_get_value(dev); 2162e192b24SSimon Glass current = regulator_get_current(dev); 2172e192b24SSimon Glass mode = regulator_get_mode(dev); 2182e192b24SSimon Glass mode_name = get_mode_name(pdata->mode, pdata->mode_count, mode); 2192e192b24SSimon Glass printf("%-20s %-10s ", pdata->name, enabled ? "enabled" : "disabled"); 2202e192b24SSimon Glass if (value >= 0) 2212e192b24SSimon Glass printf("%10d ", value); 2222e192b24SSimon Glass else 2232e192b24SSimon Glass printf("%10s ", "-"); 2242e192b24SSimon Glass if (current >= 0) 2252e192b24SSimon Glass printf("%10d ", current); 2262e192b24SSimon Glass else 2272e192b24SSimon Glass printf("%10s ", "-"); 2282e192b24SSimon Glass if (mode >= 0) 2292e192b24SSimon Glass printf("%-10s", mode_name); 2302e192b24SSimon Glass else 2312e192b24SSimon Glass printf("%-10s", "-"); 2322e192b24SSimon Glass printf("\n"); 2332e192b24SSimon Glass } 2342e192b24SSimon Glass 2352e192b24SSimon Glass static int do_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 2362e192b24SSimon Glass { 2372e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 2382e192b24SSimon Glass struct udevice *dev; 2392e192b24SSimon Glass int ret; 2402e192b24SSimon Glass 2412e192b24SSimon Glass if (currdev && (argc < 2 || strcmp(argv[1], "-a"))) { 2422e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, true); 2432e192b24SSimon Glass if (ret) 2442e192b24SSimon Glass return CMD_RET_FAILURE; 2452e192b24SSimon Glass do_status_detail(dev, uc_pdata); 2462e192b24SSimon Glass return 0; 2472e192b24SSimon Glass } 2482e192b24SSimon Glass 2492e192b24SSimon Glass /* Show all of them in a list, probing them as needed */ 2502e192b24SSimon Glass printf("%-20s %-10s %10s %10s %-10s\n", "Name", "Enabled", "uV", "mA", 2512e192b24SSimon Glass "Mode"); 2522e192b24SSimon Glass for (ret = uclass_first_device(UCLASS_REGULATOR, &dev); dev; 2532e192b24SSimon Glass ret = uclass_next_device(&dev)) 2542e192b24SSimon Glass do_status_line(dev); 2552e192b24SSimon Glass 2562e192b24SSimon Glass return CMD_RET_SUCCESS; 2572e192b24SSimon Glass } 2582e192b24SSimon Glass 2592e192b24SSimon Glass static int do_value(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 2602e192b24SSimon Glass { 2612e192b24SSimon Glass struct udevice *dev; 2622e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 2632e192b24SSimon Glass int value; 2642e192b24SSimon Glass int force; 2652e192b24SSimon Glass int ret; 2662e192b24SSimon Glass 2672e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, argc == 1); 2682e192b24SSimon Glass if (ret) 2692e192b24SSimon Glass return ret; 2702e192b24SSimon Glass 2712e192b24SSimon Glass if (argc == 1) { 2722e192b24SSimon Glass ret = regulator_get_value(dev); 2732e192b24SSimon Glass if (ret < 0) { 2742e192b24SSimon Glass printf("Regulator: %s - can't get the Voltage!\n", 2752e192b24SSimon Glass uc_pdata->name); 2762e192b24SSimon Glass return failure(ret); 2772e192b24SSimon Glass } 2782e192b24SSimon Glass 2792e192b24SSimon Glass printf("%d uV\n", ret); 2802e192b24SSimon Glass return CMD_RET_SUCCESS; 2812e192b24SSimon Glass } 2822e192b24SSimon Glass 2832e192b24SSimon Glass if (argc == 3) 2842e192b24SSimon Glass force = !strcmp("-f", argv[2]); 2852e192b24SSimon Glass else 2862e192b24SSimon Glass force = 0; 2872e192b24SSimon Glass 2882e192b24SSimon Glass value = simple_strtoul(argv[1], NULL, 0); 2892e192b24SSimon Glass if ((value < uc_pdata->min_uV || value > uc_pdata->max_uV) && !force) { 2902e192b24SSimon Glass printf("Value exceeds regulator constraint limits %d..%d uV\n", 2912e192b24SSimon Glass uc_pdata->min_uV, uc_pdata->max_uV); 2922e192b24SSimon Glass return CMD_RET_FAILURE; 2932e192b24SSimon Glass } 2942e192b24SSimon Glass 295*2f5d532fSKeerthy if (!force) 2962e192b24SSimon Glass ret = regulator_set_value(dev, value); 297*2f5d532fSKeerthy else 298*2f5d532fSKeerthy ret = regulator_set_value_force(dev, value); 2992e192b24SSimon Glass if (ret) { 3002e192b24SSimon Glass printf("Regulator: %s - can't set the Voltage!\n", 3012e192b24SSimon Glass uc_pdata->name); 3022e192b24SSimon Glass return failure(ret); 3032e192b24SSimon Glass } 3042e192b24SSimon Glass 3052e192b24SSimon Glass return CMD_RET_SUCCESS; 3062e192b24SSimon Glass } 3072e192b24SSimon Glass 3082e192b24SSimon Glass static int do_current(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 3092e192b24SSimon Glass { 3102e192b24SSimon Glass struct udevice *dev; 3112e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 3122e192b24SSimon Glass int current; 3132e192b24SSimon Glass int ret; 3142e192b24SSimon Glass 3152e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, argc == 1); 3162e192b24SSimon Glass if (ret) 3172e192b24SSimon Glass return ret; 3182e192b24SSimon Glass 3192e192b24SSimon Glass if (argc == 1) { 3202e192b24SSimon Glass ret = regulator_get_current(dev); 3212e192b24SSimon Glass if (ret < 0) { 3222e192b24SSimon Glass printf("Regulator: %s - can't get the Current!\n", 3232e192b24SSimon Glass uc_pdata->name); 3242e192b24SSimon Glass return failure(ret); 3252e192b24SSimon Glass } 3262e192b24SSimon Glass 3272e192b24SSimon Glass printf("%d uA\n", ret); 3282e192b24SSimon Glass return CMD_RET_SUCCESS; 3292e192b24SSimon Glass } 3302e192b24SSimon Glass 3312e192b24SSimon Glass current = simple_strtoul(argv[1], NULL, 0); 3322e192b24SSimon Glass if (current < uc_pdata->min_uA || current > uc_pdata->max_uA) { 3332e192b24SSimon Glass printf("Current exceeds regulator constraint limits\n"); 3342e192b24SSimon Glass return CMD_RET_FAILURE; 3352e192b24SSimon Glass } 3362e192b24SSimon Glass 3372e192b24SSimon Glass ret = regulator_set_current(dev, current); 3382e192b24SSimon Glass if (ret) { 3392e192b24SSimon Glass printf("Regulator: %s - can't set the Current!\n", 3402e192b24SSimon Glass uc_pdata->name); 3412e192b24SSimon Glass return failure(ret); 3422e192b24SSimon Glass } 3432e192b24SSimon Glass 3442e192b24SSimon Glass return CMD_RET_SUCCESS; 3452e192b24SSimon Glass } 3462e192b24SSimon Glass 3472e192b24SSimon Glass static int do_mode(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 3482e192b24SSimon Glass { 3492e192b24SSimon Glass struct udevice *dev; 3502e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 3512e192b24SSimon Glass int mode; 3522e192b24SSimon Glass int ret; 3532e192b24SSimon Glass 3542e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, false); 3552e192b24SSimon Glass if (ret) 3562e192b24SSimon Glass return ret; 3572e192b24SSimon Glass 3582e192b24SSimon Glass if (argc == 1) { 3592e192b24SSimon Glass ret = regulator_get_mode(dev); 3602e192b24SSimon Glass if (ret < 0) { 3612e192b24SSimon Glass printf("Regulator: %s - can't get the operation mode!\n", 3622e192b24SSimon Glass uc_pdata->name); 3632e192b24SSimon Glass return failure(ret); 3642e192b24SSimon Glass } 3652e192b24SSimon Glass 3662e192b24SSimon Glass printf("mode id: %d\n", ret); 3672e192b24SSimon Glass return CMD_RET_SUCCESS; 3682e192b24SSimon Glass } 3692e192b24SSimon Glass 3702e192b24SSimon Glass mode = simple_strtoul(argv[1], NULL, 0); 3712e192b24SSimon Glass 3722e192b24SSimon Glass ret = regulator_set_mode(dev, mode); 3732e192b24SSimon Glass if (ret) { 3742e192b24SSimon Glass printf("Regulator: %s - can't set the operation mode!\n", 3752e192b24SSimon Glass uc_pdata->name); 3762e192b24SSimon Glass return failure(ret); 3772e192b24SSimon Glass } 3782e192b24SSimon Glass 3792e192b24SSimon Glass return CMD_RET_SUCCESS; 3802e192b24SSimon Glass } 3812e192b24SSimon Glass 3822e192b24SSimon Glass static int do_enable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 3832e192b24SSimon Glass { 3842e192b24SSimon Glass struct udevice *dev; 3852e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 3862e192b24SSimon Glass int ret; 3872e192b24SSimon Glass 3882e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, true); 3892e192b24SSimon Glass if (ret) 3902e192b24SSimon Glass return ret; 3912e192b24SSimon Glass 3922e192b24SSimon Glass ret = regulator_set_enable(dev, true); 3932e192b24SSimon Glass if (ret) { 3942e192b24SSimon Glass printf("Regulator: %s - can't enable!\n", uc_pdata->name); 3952e192b24SSimon Glass return failure(ret); 3962e192b24SSimon Glass } 3972e192b24SSimon Glass 3982e192b24SSimon Glass return CMD_RET_SUCCESS; 3992e192b24SSimon Glass } 4002e192b24SSimon Glass 4012e192b24SSimon Glass static int do_disable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 4022e192b24SSimon Glass { 4032e192b24SSimon Glass struct udevice *dev; 4042e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 4052e192b24SSimon Glass int ret; 4062e192b24SSimon Glass 4072e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, true); 4082e192b24SSimon Glass if (ret) 4092e192b24SSimon Glass return ret; 4102e192b24SSimon Glass 4112e192b24SSimon Glass ret = regulator_set_enable(dev, false); 4122e192b24SSimon Glass if (ret) { 4132e192b24SSimon Glass printf("Regulator: %s - can't disable!\n", uc_pdata->name); 4142e192b24SSimon Glass return failure(ret); 4152e192b24SSimon Glass } 4162e192b24SSimon Glass 4172e192b24SSimon Glass return CMD_RET_SUCCESS; 4182e192b24SSimon Glass } 4192e192b24SSimon Glass 4202e192b24SSimon Glass static cmd_tbl_t subcmd[] = { 4212e192b24SSimon Glass U_BOOT_CMD_MKENT(dev, 2, 1, do_dev, "", ""), 4222e192b24SSimon Glass U_BOOT_CMD_MKENT(list, 1, 1, do_list, "", ""), 4232e192b24SSimon Glass U_BOOT_CMD_MKENT(info, 2, 1, do_info, "", ""), 4242e192b24SSimon Glass U_BOOT_CMD_MKENT(status, 2, 1, do_status, "", ""), 4252e192b24SSimon Glass U_BOOT_CMD_MKENT(value, 3, 1, do_value, "", ""), 4262e192b24SSimon Glass U_BOOT_CMD_MKENT(current, 3, 1, do_current, "", ""), 4272e192b24SSimon Glass U_BOOT_CMD_MKENT(mode, 2, 1, do_mode, "", ""), 4282e192b24SSimon Glass U_BOOT_CMD_MKENT(enable, 1, 1, do_enable, "", ""), 4292e192b24SSimon Glass U_BOOT_CMD_MKENT(disable, 1, 1, do_disable, "", ""), 4302e192b24SSimon Glass }; 4312e192b24SSimon Glass 4322e192b24SSimon Glass static int do_regulator(cmd_tbl_t *cmdtp, int flag, int argc, 4332e192b24SSimon Glass char * const argv[]) 4342e192b24SSimon Glass { 4352e192b24SSimon Glass cmd_tbl_t *cmd; 4362e192b24SSimon Glass 4372e192b24SSimon Glass argc--; 4382e192b24SSimon Glass argv++; 4392e192b24SSimon Glass 4402e192b24SSimon Glass cmd = find_cmd_tbl(argv[0], subcmd, ARRAY_SIZE(subcmd)); 4412e192b24SSimon Glass if (cmd == NULL || argc > cmd->maxargs) 4422e192b24SSimon Glass return CMD_RET_USAGE; 4432e192b24SSimon Glass 4442e192b24SSimon Glass return cmd->cmd(cmdtp, flag, argc, argv); 4452e192b24SSimon Glass } 4462e192b24SSimon Glass 4472e192b24SSimon Glass U_BOOT_CMD(regulator, CONFIG_SYS_MAXARGS, 1, do_regulator, 4482e192b24SSimon Glass "uclass operations", 4492e192b24SSimon Glass "list - list UCLASS regulator devices\n" 4502e192b24SSimon Glass "regulator dev [regulator-name] - show/[set] operating regulator device\n" 4512e192b24SSimon Glass "regulator info - print constraints info\n" 4522e192b24SSimon Glass "regulator status [-a] - print operating status [for all]\n" 4532e192b24SSimon Glass "regulator value [val] [-f] - print/[set] voltage value [uV] (force)\n" 4542e192b24SSimon Glass "regulator current [val] - print/[set] current value [uA]\n" 4552e192b24SSimon Glass "regulator mode [id] - print/[set] operating mode id\n" 4562e192b24SSimon Glass "regulator enable - enable the regulator output\n" 4572e192b24SSimon Glass "regulator disable - disable the regulator output\n" 4582e192b24SSimon Glass ); 459