xref: /rk3399_rockchip-uboot/cmd/regulator.c (revision 2e192b245ed36a63bab0ef576999a95e23f60ecd)
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