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