1*2e192b24SSimon Glass /* 2*2e192b24SSimon Glass * Copyright (C) 2014-2015 Samsung Electronics 3*2e192b24SSimon Glass * Przemyslaw Marczak <p.marczak@samsung.com> 4*2e192b24SSimon Glass * 5*2e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6*2e192b24SSimon Glass */ 7*2e192b24SSimon Glass #include <common.h> 8*2e192b24SSimon Glass #include <errno.h> 9*2e192b24SSimon Glass #include <dm.h> 10*2e192b24SSimon Glass #include <dm/uclass-internal.h> 11*2e192b24SSimon Glass #include <power/regulator.h> 12*2e192b24SSimon Glass 13*2e192b24SSimon Glass #define LIMIT_DEVNAME 20 14*2e192b24SSimon Glass #define LIMIT_OFNAME 32 15*2e192b24SSimon Glass #define LIMIT_INFO 18 16*2e192b24SSimon Glass 17*2e192b24SSimon Glass static struct udevice *currdev; 18*2e192b24SSimon Glass 19*2e192b24SSimon Glass static int failure(int ret) 20*2e192b24SSimon Glass { 21*2e192b24SSimon Glass printf("Error: %d (%s)\n", ret, errno_str(ret)); 22*2e192b24SSimon Glass 23*2e192b24SSimon Glass return CMD_RET_FAILURE; 24*2e192b24SSimon Glass } 25*2e192b24SSimon Glass 26*2e192b24SSimon Glass static int do_dev(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 27*2e192b24SSimon Glass { 28*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 29*2e192b24SSimon Glass const char *name; 30*2e192b24SSimon Glass int ret = -ENXIO; 31*2e192b24SSimon Glass 32*2e192b24SSimon Glass switch (argc) { 33*2e192b24SSimon Glass case 2: 34*2e192b24SSimon Glass name = argv[1]; 35*2e192b24SSimon Glass ret = regulator_get_by_platname(name, &currdev); 36*2e192b24SSimon Glass if (ret) { 37*2e192b24SSimon Glass printf("Can't get the regulator: %s!\n", name); 38*2e192b24SSimon Glass return failure(ret); 39*2e192b24SSimon Glass } 40*2e192b24SSimon Glass case 1: 41*2e192b24SSimon Glass if (!currdev) { 42*2e192b24SSimon Glass printf("Regulator device is not set!\n\n"); 43*2e192b24SSimon Glass return CMD_RET_USAGE; 44*2e192b24SSimon Glass } 45*2e192b24SSimon Glass 46*2e192b24SSimon Glass uc_pdata = dev_get_uclass_platdata(currdev); 47*2e192b24SSimon Glass if (!uc_pdata) { 48*2e192b24SSimon Glass printf("%s: no regulator platform data!\n", currdev->name); 49*2e192b24SSimon Glass return failure(ret); 50*2e192b24SSimon Glass } 51*2e192b24SSimon Glass 52*2e192b24SSimon Glass printf("dev: %s @ %s\n", uc_pdata->name, currdev->name); 53*2e192b24SSimon Glass } 54*2e192b24SSimon Glass 55*2e192b24SSimon Glass return CMD_RET_SUCCESS; 56*2e192b24SSimon Glass } 57*2e192b24SSimon Glass 58*2e192b24SSimon Glass static int curr_dev_and_platdata(struct udevice **devp, 59*2e192b24SSimon Glass struct dm_regulator_uclass_platdata **uc_pdata, 60*2e192b24SSimon Glass bool allow_type_fixed) 61*2e192b24SSimon Glass { 62*2e192b24SSimon Glass *devp = NULL; 63*2e192b24SSimon Glass *uc_pdata = NULL; 64*2e192b24SSimon Glass 65*2e192b24SSimon Glass if (!currdev) { 66*2e192b24SSimon Glass printf("First, set the regulator device!\n"); 67*2e192b24SSimon Glass return CMD_RET_FAILURE; 68*2e192b24SSimon Glass } 69*2e192b24SSimon Glass 70*2e192b24SSimon Glass *devp = currdev; 71*2e192b24SSimon Glass 72*2e192b24SSimon Glass *uc_pdata = dev_get_uclass_platdata(*devp); 73*2e192b24SSimon Glass if (!*uc_pdata) { 74*2e192b24SSimon Glass error("Regulator: %s - missing platform data!", currdev->name); 75*2e192b24SSimon Glass return CMD_RET_FAILURE; 76*2e192b24SSimon Glass } 77*2e192b24SSimon Glass 78*2e192b24SSimon Glass if (!allow_type_fixed && (*uc_pdata)->type == REGULATOR_TYPE_FIXED) { 79*2e192b24SSimon Glass printf("Operation not allowed for fixed regulator!\n"); 80*2e192b24SSimon Glass return CMD_RET_FAILURE; 81*2e192b24SSimon Glass } 82*2e192b24SSimon Glass 83*2e192b24SSimon Glass return CMD_RET_SUCCESS; 84*2e192b24SSimon Glass } 85*2e192b24SSimon Glass 86*2e192b24SSimon Glass static int do_list(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 87*2e192b24SSimon Glass { 88*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 89*2e192b24SSimon Glass struct udevice *dev; 90*2e192b24SSimon Glass int ret; 91*2e192b24SSimon Glass 92*2e192b24SSimon Glass printf("| %-*.*s| %-*.*s| %s\n", 93*2e192b24SSimon Glass LIMIT_DEVNAME, LIMIT_DEVNAME, "Device", 94*2e192b24SSimon Glass LIMIT_OFNAME, LIMIT_OFNAME, "regulator-name", 95*2e192b24SSimon Glass "Parent"); 96*2e192b24SSimon Glass 97*2e192b24SSimon Glass for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev; 98*2e192b24SSimon Glass ret = uclass_find_next_device(&dev)) { 99*2e192b24SSimon Glass if (ret) 100*2e192b24SSimon Glass continue; 101*2e192b24SSimon Glass 102*2e192b24SSimon Glass uc_pdata = dev_get_uclass_platdata(dev); 103*2e192b24SSimon Glass printf("| %-*.*s| %-*.*s| %s\n", 104*2e192b24SSimon Glass LIMIT_DEVNAME, LIMIT_DEVNAME, dev->name, 105*2e192b24SSimon Glass LIMIT_OFNAME, LIMIT_OFNAME, uc_pdata->name, 106*2e192b24SSimon Glass dev->parent->name); 107*2e192b24SSimon Glass } 108*2e192b24SSimon Glass 109*2e192b24SSimon Glass return ret; 110*2e192b24SSimon Glass } 111*2e192b24SSimon Glass 112*2e192b24SSimon Glass static int constraint(const char *name, int val, const char *val_name) 113*2e192b24SSimon Glass { 114*2e192b24SSimon Glass printf("%-*s", LIMIT_INFO, name); 115*2e192b24SSimon Glass if (val < 0) { 116*2e192b24SSimon Glass printf(" %s (err: %d)\n", errno_str(val), val); 117*2e192b24SSimon Glass return val; 118*2e192b24SSimon Glass } 119*2e192b24SSimon Glass 120*2e192b24SSimon Glass if (val_name) 121*2e192b24SSimon Glass printf(" %d (%s)\n", val, val_name); 122*2e192b24SSimon Glass else 123*2e192b24SSimon Glass printf(" %d\n", val); 124*2e192b24SSimon Glass 125*2e192b24SSimon Glass return 0; 126*2e192b24SSimon Glass } 127*2e192b24SSimon Glass 128*2e192b24SSimon Glass static const char *get_mode_name(struct dm_regulator_mode *mode, 129*2e192b24SSimon Glass int mode_count, 130*2e192b24SSimon Glass int mode_id) 131*2e192b24SSimon Glass { 132*2e192b24SSimon Glass while (mode_count--) { 133*2e192b24SSimon Glass if (mode->id == mode_id) 134*2e192b24SSimon Glass return mode->name; 135*2e192b24SSimon Glass mode++; 136*2e192b24SSimon Glass } 137*2e192b24SSimon Glass 138*2e192b24SSimon Glass return NULL; 139*2e192b24SSimon Glass } 140*2e192b24SSimon Glass 141*2e192b24SSimon Glass static int do_info(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 142*2e192b24SSimon Glass { 143*2e192b24SSimon Glass struct udevice *dev; 144*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 145*2e192b24SSimon Glass struct dm_regulator_mode *modes; 146*2e192b24SSimon Glass const char *parent_uc; 147*2e192b24SSimon Glass int mode_count; 148*2e192b24SSimon Glass int ret; 149*2e192b24SSimon Glass int i; 150*2e192b24SSimon Glass 151*2e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, true); 152*2e192b24SSimon Glass if (ret) 153*2e192b24SSimon Glass return ret; 154*2e192b24SSimon Glass 155*2e192b24SSimon Glass parent_uc = dev_get_uclass_name(dev->parent); 156*2e192b24SSimon Glass 157*2e192b24SSimon Glass printf("%s\n%-*s %s\n%-*s %s\n%-*s %s\n%-*s %s\n%-*s\n", 158*2e192b24SSimon Glass "Regulator info:", 159*2e192b24SSimon Glass LIMIT_INFO, "* regulator-name:", uc_pdata->name, 160*2e192b24SSimon Glass LIMIT_INFO, "* device name:", dev->name, 161*2e192b24SSimon Glass LIMIT_INFO, "* parent name:", dev->parent->name, 162*2e192b24SSimon Glass LIMIT_INFO, "* parent uclass:", parent_uc, 163*2e192b24SSimon Glass LIMIT_INFO, "* constraints:"); 164*2e192b24SSimon Glass 165*2e192b24SSimon Glass constraint(" - min uV:", uc_pdata->min_uV, NULL); 166*2e192b24SSimon Glass constraint(" - max uV:", uc_pdata->max_uV, NULL); 167*2e192b24SSimon Glass constraint(" - min uA:", uc_pdata->min_uA, NULL); 168*2e192b24SSimon Glass constraint(" - max uA:", uc_pdata->max_uA, NULL); 169*2e192b24SSimon Glass constraint(" - always on:", uc_pdata->always_on, 170*2e192b24SSimon Glass uc_pdata->always_on ? "true" : "false"); 171*2e192b24SSimon Glass constraint(" - boot on:", uc_pdata->boot_on, 172*2e192b24SSimon Glass uc_pdata->boot_on ? "true" : "false"); 173*2e192b24SSimon Glass 174*2e192b24SSimon Glass mode_count = regulator_mode(dev, &modes); 175*2e192b24SSimon Glass constraint("* op modes:", mode_count, NULL); 176*2e192b24SSimon Glass 177*2e192b24SSimon Glass for (i = 0; i < mode_count; i++, modes++) 178*2e192b24SSimon Glass constraint(" - mode id:", modes->id, modes->name); 179*2e192b24SSimon Glass 180*2e192b24SSimon Glass return CMD_RET_SUCCESS; 181*2e192b24SSimon Glass } 182*2e192b24SSimon Glass 183*2e192b24SSimon Glass static void do_status_detail(struct udevice *dev, 184*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata) 185*2e192b24SSimon Glass { 186*2e192b24SSimon Glass int current, value, mode; 187*2e192b24SSimon Glass const char *mode_name; 188*2e192b24SSimon Glass bool enabled; 189*2e192b24SSimon Glass 190*2e192b24SSimon Glass printf("Regulator %s status:\n", uc_pdata->name); 191*2e192b24SSimon Glass 192*2e192b24SSimon Glass enabled = regulator_get_enable(dev); 193*2e192b24SSimon Glass constraint(" * enable:", enabled, enabled ? "true" : "false"); 194*2e192b24SSimon Glass 195*2e192b24SSimon Glass value = regulator_get_value(dev); 196*2e192b24SSimon Glass constraint(" * value uV:", value, NULL); 197*2e192b24SSimon Glass 198*2e192b24SSimon Glass current = regulator_get_current(dev); 199*2e192b24SSimon Glass constraint(" * current uA:", current, NULL); 200*2e192b24SSimon Glass 201*2e192b24SSimon Glass mode = regulator_get_mode(dev); 202*2e192b24SSimon Glass mode_name = get_mode_name(uc_pdata->mode, uc_pdata->mode_count, mode); 203*2e192b24SSimon Glass constraint(" * mode id:", mode, mode_name); 204*2e192b24SSimon Glass } 205*2e192b24SSimon Glass 206*2e192b24SSimon Glass static void do_status_line(struct udevice *dev) 207*2e192b24SSimon Glass { 208*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *pdata; 209*2e192b24SSimon Glass int current, value, mode; 210*2e192b24SSimon Glass const char *mode_name; 211*2e192b24SSimon Glass bool enabled; 212*2e192b24SSimon Glass 213*2e192b24SSimon Glass pdata = dev_get_uclass_platdata(dev); 214*2e192b24SSimon Glass enabled = regulator_get_enable(dev); 215*2e192b24SSimon Glass value = regulator_get_value(dev); 216*2e192b24SSimon Glass current = regulator_get_current(dev); 217*2e192b24SSimon Glass mode = regulator_get_mode(dev); 218*2e192b24SSimon Glass mode_name = get_mode_name(pdata->mode, pdata->mode_count, mode); 219*2e192b24SSimon Glass printf("%-20s %-10s ", pdata->name, enabled ? "enabled" : "disabled"); 220*2e192b24SSimon Glass if (value >= 0) 221*2e192b24SSimon Glass printf("%10d ", value); 222*2e192b24SSimon Glass else 223*2e192b24SSimon Glass printf("%10s ", "-"); 224*2e192b24SSimon Glass if (current >= 0) 225*2e192b24SSimon Glass printf("%10d ", current); 226*2e192b24SSimon Glass else 227*2e192b24SSimon Glass printf("%10s ", "-"); 228*2e192b24SSimon Glass if (mode >= 0) 229*2e192b24SSimon Glass printf("%-10s", mode_name); 230*2e192b24SSimon Glass else 231*2e192b24SSimon Glass printf("%-10s", "-"); 232*2e192b24SSimon Glass printf("\n"); 233*2e192b24SSimon Glass } 234*2e192b24SSimon Glass 235*2e192b24SSimon Glass static int do_status(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 236*2e192b24SSimon Glass { 237*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 238*2e192b24SSimon Glass struct udevice *dev; 239*2e192b24SSimon Glass int ret; 240*2e192b24SSimon Glass 241*2e192b24SSimon Glass if (currdev && (argc < 2 || strcmp(argv[1], "-a"))) { 242*2e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, true); 243*2e192b24SSimon Glass if (ret) 244*2e192b24SSimon Glass return CMD_RET_FAILURE; 245*2e192b24SSimon Glass do_status_detail(dev, uc_pdata); 246*2e192b24SSimon Glass return 0; 247*2e192b24SSimon Glass } 248*2e192b24SSimon Glass 249*2e192b24SSimon Glass /* Show all of them in a list, probing them as needed */ 250*2e192b24SSimon Glass printf("%-20s %-10s %10s %10s %-10s\n", "Name", "Enabled", "uV", "mA", 251*2e192b24SSimon Glass "Mode"); 252*2e192b24SSimon Glass for (ret = uclass_first_device(UCLASS_REGULATOR, &dev); dev; 253*2e192b24SSimon Glass ret = uclass_next_device(&dev)) 254*2e192b24SSimon Glass do_status_line(dev); 255*2e192b24SSimon Glass 256*2e192b24SSimon Glass return CMD_RET_SUCCESS; 257*2e192b24SSimon Glass } 258*2e192b24SSimon Glass 259*2e192b24SSimon Glass static int do_value(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 260*2e192b24SSimon Glass { 261*2e192b24SSimon Glass struct udevice *dev; 262*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 263*2e192b24SSimon Glass int value; 264*2e192b24SSimon Glass int force; 265*2e192b24SSimon Glass int ret; 266*2e192b24SSimon Glass 267*2e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, argc == 1); 268*2e192b24SSimon Glass if (ret) 269*2e192b24SSimon Glass return ret; 270*2e192b24SSimon Glass 271*2e192b24SSimon Glass if (argc == 1) { 272*2e192b24SSimon Glass ret = regulator_get_value(dev); 273*2e192b24SSimon Glass if (ret < 0) { 274*2e192b24SSimon Glass printf("Regulator: %s - can't get the Voltage!\n", 275*2e192b24SSimon Glass uc_pdata->name); 276*2e192b24SSimon Glass return failure(ret); 277*2e192b24SSimon Glass } 278*2e192b24SSimon Glass 279*2e192b24SSimon Glass printf("%d uV\n", ret); 280*2e192b24SSimon Glass return CMD_RET_SUCCESS; 281*2e192b24SSimon Glass } 282*2e192b24SSimon Glass 283*2e192b24SSimon Glass if (argc == 3) 284*2e192b24SSimon Glass force = !strcmp("-f", argv[2]); 285*2e192b24SSimon Glass else 286*2e192b24SSimon Glass force = 0; 287*2e192b24SSimon Glass 288*2e192b24SSimon Glass value = simple_strtoul(argv[1], NULL, 0); 289*2e192b24SSimon Glass if ((value < uc_pdata->min_uV || value > uc_pdata->max_uV) && !force) { 290*2e192b24SSimon Glass printf("Value exceeds regulator constraint limits %d..%d uV\n", 291*2e192b24SSimon Glass uc_pdata->min_uV, uc_pdata->max_uV); 292*2e192b24SSimon Glass return CMD_RET_FAILURE; 293*2e192b24SSimon Glass } 294*2e192b24SSimon Glass 295*2e192b24SSimon Glass ret = regulator_set_value(dev, value); 296*2e192b24SSimon Glass if (ret) { 297*2e192b24SSimon Glass printf("Regulator: %s - can't set the Voltage!\n", 298*2e192b24SSimon Glass uc_pdata->name); 299*2e192b24SSimon Glass return failure(ret); 300*2e192b24SSimon Glass } 301*2e192b24SSimon Glass 302*2e192b24SSimon Glass return CMD_RET_SUCCESS; 303*2e192b24SSimon Glass } 304*2e192b24SSimon Glass 305*2e192b24SSimon Glass static int do_current(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 306*2e192b24SSimon Glass { 307*2e192b24SSimon Glass struct udevice *dev; 308*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 309*2e192b24SSimon Glass int current; 310*2e192b24SSimon Glass int ret; 311*2e192b24SSimon Glass 312*2e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, argc == 1); 313*2e192b24SSimon Glass if (ret) 314*2e192b24SSimon Glass return ret; 315*2e192b24SSimon Glass 316*2e192b24SSimon Glass if (argc == 1) { 317*2e192b24SSimon Glass ret = regulator_get_current(dev); 318*2e192b24SSimon Glass if (ret < 0) { 319*2e192b24SSimon Glass printf("Regulator: %s - can't get the Current!\n", 320*2e192b24SSimon Glass uc_pdata->name); 321*2e192b24SSimon Glass return failure(ret); 322*2e192b24SSimon Glass } 323*2e192b24SSimon Glass 324*2e192b24SSimon Glass printf("%d uA\n", ret); 325*2e192b24SSimon Glass return CMD_RET_SUCCESS; 326*2e192b24SSimon Glass } 327*2e192b24SSimon Glass 328*2e192b24SSimon Glass current = simple_strtoul(argv[1], NULL, 0); 329*2e192b24SSimon Glass if (current < uc_pdata->min_uA || current > uc_pdata->max_uA) { 330*2e192b24SSimon Glass printf("Current exceeds regulator constraint limits\n"); 331*2e192b24SSimon Glass return CMD_RET_FAILURE; 332*2e192b24SSimon Glass } 333*2e192b24SSimon Glass 334*2e192b24SSimon Glass ret = regulator_set_current(dev, current); 335*2e192b24SSimon Glass if (ret) { 336*2e192b24SSimon Glass printf("Regulator: %s - can't set the Current!\n", 337*2e192b24SSimon Glass uc_pdata->name); 338*2e192b24SSimon Glass return failure(ret); 339*2e192b24SSimon Glass } 340*2e192b24SSimon Glass 341*2e192b24SSimon Glass return CMD_RET_SUCCESS; 342*2e192b24SSimon Glass } 343*2e192b24SSimon Glass 344*2e192b24SSimon Glass static int do_mode(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 345*2e192b24SSimon Glass { 346*2e192b24SSimon Glass struct udevice *dev; 347*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 348*2e192b24SSimon Glass int mode; 349*2e192b24SSimon Glass int ret; 350*2e192b24SSimon Glass 351*2e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, false); 352*2e192b24SSimon Glass if (ret) 353*2e192b24SSimon Glass return ret; 354*2e192b24SSimon Glass 355*2e192b24SSimon Glass if (argc == 1) { 356*2e192b24SSimon Glass ret = regulator_get_mode(dev); 357*2e192b24SSimon Glass if (ret < 0) { 358*2e192b24SSimon Glass printf("Regulator: %s - can't get the operation mode!\n", 359*2e192b24SSimon Glass uc_pdata->name); 360*2e192b24SSimon Glass return failure(ret); 361*2e192b24SSimon Glass } 362*2e192b24SSimon Glass 363*2e192b24SSimon Glass printf("mode id: %d\n", ret); 364*2e192b24SSimon Glass return CMD_RET_SUCCESS; 365*2e192b24SSimon Glass } 366*2e192b24SSimon Glass 367*2e192b24SSimon Glass mode = simple_strtoul(argv[1], NULL, 0); 368*2e192b24SSimon Glass 369*2e192b24SSimon Glass ret = regulator_set_mode(dev, mode); 370*2e192b24SSimon Glass if (ret) { 371*2e192b24SSimon Glass printf("Regulator: %s - can't set the operation mode!\n", 372*2e192b24SSimon Glass uc_pdata->name); 373*2e192b24SSimon Glass return failure(ret); 374*2e192b24SSimon Glass } 375*2e192b24SSimon Glass 376*2e192b24SSimon Glass return CMD_RET_SUCCESS; 377*2e192b24SSimon Glass } 378*2e192b24SSimon Glass 379*2e192b24SSimon Glass static int do_enable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 380*2e192b24SSimon Glass { 381*2e192b24SSimon Glass struct udevice *dev; 382*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 383*2e192b24SSimon Glass int ret; 384*2e192b24SSimon Glass 385*2e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, true); 386*2e192b24SSimon Glass if (ret) 387*2e192b24SSimon Glass return ret; 388*2e192b24SSimon Glass 389*2e192b24SSimon Glass ret = regulator_set_enable(dev, true); 390*2e192b24SSimon Glass if (ret) { 391*2e192b24SSimon Glass printf("Regulator: %s - can't enable!\n", uc_pdata->name); 392*2e192b24SSimon Glass return failure(ret); 393*2e192b24SSimon Glass } 394*2e192b24SSimon Glass 395*2e192b24SSimon Glass return CMD_RET_SUCCESS; 396*2e192b24SSimon Glass } 397*2e192b24SSimon Glass 398*2e192b24SSimon Glass static int do_disable(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 399*2e192b24SSimon Glass { 400*2e192b24SSimon Glass struct udevice *dev; 401*2e192b24SSimon Glass struct dm_regulator_uclass_platdata *uc_pdata; 402*2e192b24SSimon Glass int ret; 403*2e192b24SSimon Glass 404*2e192b24SSimon Glass ret = curr_dev_and_platdata(&dev, &uc_pdata, true); 405*2e192b24SSimon Glass if (ret) 406*2e192b24SSimon Glass return ret; 407*2e192b24SSimon Glass 408*2e192b24SSimon Glass ret = regulator_set_enable(dev, false); 409*2e192b24SSimon Glass if (ret) { 410*2e192b24SSimon Glass printf("Regulator: %s - can't disable!\n", uc_pdata->name); 411*2e192b24SSimon Glass return failure(ret); 412*2e192b24SSimon Glass } 413*2e192b24SSimon Glass 414*2e192b24SSimon Glass return CMD_RET_SUCCESS; 415*2e192b24SSimon Glass } 416*2e192b24SSimon Glass 417*2e192b24SSimon Glass static cmd_tbl_t subcmd[] = { 418*2e192b24SSimon Glass U_BOOT_CMD_MKENT(dev, 2, 1, do_dev, "", ""), 419*2e192b24SSimon Glass U_BOOT_CMD_MKENT(list, 1, 1, do_list, "", ""), 420*2e192b24SSimon Glass U_BOOT_CMD_MKENT(info, 2, 1, do_info, "", ""), 421*2e192b24SSimon Glass U_BOOT_CMD_MKENT(status, 2, 1, do_status, "", ""), 422*2e192b24SSimon Glass U_BOOT_CMD_MKENT(value, 3, 1, do_value, "", ""), 423*2e192b24SSimon Glass U_BOOT_CMD_MKENT(current, 3, 1, do_current, "", ""), 424*2e192b24SSimon Glass U_BOOT_CMD_MKENT(mode, 2, 1, do_mode, "", ""), 425*2e192b24SSimon Glass U_BOOT_CMD_MKENT(enable, 1, 1, do_enable, "", ""), 426*2e192b24SSimon Glass U_BOOT_CMD_MKENT(disable, 1, 1, do_disable, "", ""), 427*2e192b24SSimon Glass }; 428*2e192b24SSimon Glass 429*2e192b24SSimon Glass static int do_regulator(cmd_tbl_t *cmdtp, int flag, int argc, 430*2e192b24SSimon Glass char * const argv[]) 431*2e192b24SSimon Glass { 432*2e192b24SSimon Glass cmd_tbl_t *cmd; 433*2e192b24SSimon Glass 434*2e192b24SSimon Glass argc--; 435*2e192b24SSimon Glass argv++; 436*2e192b24SSimon Glass 437*2e192b24SSimon Glass cmd = find_cmd_tbl(argv[0], subcmd, ARRAY_SIZE(subcmd)); 438*2e192b24SSimon Glass if (cmd == NULL || argc > cmd->maxargs) 439*2e192b24SSimon Glass return CMD_RET_USAGE; 440*2e192b24SSimon Glass 441*2e192b24SSimon Glass return cmd->cmd(cmdtp, flag, argc, argv); 442*2e192b24SSimon Glass } 443*2e192b24SSimon Glass 444*2e192b24SSimon Glass U_BOOT_CMD(regulator, CONFIG_SYS_MAXARGS, 1, do_regulator, 445*2e192b24SSimon Glass "uclass operations", 446*2e192b24SSimon Glass "list - list UCLASS regulator devices\n" 447*2e192b24SSimon Glass "regulator dev [regulator-name] - show/[set] operating regulator device\n" 448*2e192b24SSimon Glass "regulator info - print constraints info\n" 449*2e192b24SSimon Glass "regulator status [-a] - print operating status [for all]\n" 450*2e192b24SSimon Glass "regulator value [val] [-f] - print/[set] voltage value [uV] (force)\n" 451*2e192b24SSimon Glass "regulator current [val] - print/[set] current value [uA]\n" 452*2e192b24SSimon Glass "regulator mode [id] - print/[set] operating mode id\n" 453*2e192b24SSimon Glass "regulator enable - enable the regulator output\n" 454*2e192b24SSimon Glass "regulator disable - disable the regulator output\n" 455*2e192b24SSimon Glass ); 456