xref: /rk3399_rockchip-uboot/drivers/power/regulator/regulator-uclass.c (revision 2f5d532f3b8a7697dc1b5700000b1e350323d50c)
1af41e8dbSPrzemyslaw Marczak /*
2af41e8dbSPrzemyslaw Marczak  * Copyright (C) 2014-2015 Samsung Electronics
3af41e8dbSPrzemyslaw Marczak  * Przemyslaw Marczak <p.marczak@samsung.com>
4af41e8dbSPrzemyslaw Marczak  *
5af41e8dbSPrzemyslaw Marczak  * SPDX-License-Identifier:	GPL-2.0+
6af41e8dbSPrzemyslaw Marczak  */
7af41e8dbSPrzemyslaw Marczak #include <common.h>
8af41e8dbSPrzemyslaw Marczak #include <fdtdec.h>
9af41e8dbSPrzemyslaw Marczak #include <errno.h>
10af41e8dbSPrzemyslaw Marczak #include <dm.h>
11af41e8dbSPrzemyslaw Marczak #include <dm/uclass-internal.h>
12af41e8dbSPrzemyslaw Marczak #include <power/pmic.h>
13af41e8dbSPrzemyslaw Marczak #include <power/regulator.h>
14af41e8dbSPrzemyslaw Marczak 
15af41e8dbSPrzemyslaw Marczak DECLARE_GLOBAL_DATA_PTR;
16af41e8dbSPrzemyslaw Marczak 
17af41e8dbSPrzemyslaw Marczak int regulator_mode(struct udevice *dev, struct dm_regulator_mode **modep)
18af41e8dbSPrzemyslaw Marczak {
19af41e8dbSPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
20af41e8dbSPrzemyslaw Marczak 
21af41e8dbSPrzemyslaw Marczak 	*modep = NULL;
22af41e8dbSPrzemyslaw Marczak 
23af41e8dbSPrzemyslaw Marczak 	uc_pdata = dev_get_uclass_platdata(dev);
24af41e8dbSPrzemyslaw Marczak 	if (!uc_pdata)
25af41e8dbSPrzemyslaw Marczak 		return -ENXIO;
26af41e8dbSPrzemyslaw Marczak 
27af41e8dbSPrzemyslaw Marczak 	*modep = uc_pdata->mode;
28af41e8dbSPrzemyslaw Marczak 	return uc_pdata->mode_count;
29af41e8dbSPrzemyslaw Marczak }
30af41e8dbSPrzemyslaw Marczak 
31af41e8dbSPrzemyslaw Marczak int regulator_get_value(struct udevice *dev)
32af41e8dbSPrzemyslaw Marczak {
33af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
34af41e8dbSPrzemyslaw Marczak 
35af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->get_value)
36af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
37af41e8dbSPrzemyslaw Marczak 
38af41e8dbSPrzemyslaw Marczak 	return ops->get_value(dev);
39af41e8dbSPrzemyslaw Marczak }
40af41e8dbSPrzemyslaw Marczak 
41af41e8dbSPrzemyslaw Marczak int regulator_set_value(struct udevice *dev, int uV)
42af41e8dbSPrzemyslaw Marczak {
43af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
44af41e8dbSPrzemyslaw Marczak 
45af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->set_value)
46af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
47af41e8dbSPrzemyslaw Marczak 
48af41e8dbSPrzemyslaw Marczak 	return ops->set_value(dev, uV);
49af41e8dbSPrzemyslaw Marczak }
50af41e8dbSPrzemyslaw Marczak 
51*2f5d532fSKeerthy /*
52*2f5d532fSKeerthy  * To be called with at most caution as there is no check
53*2f5d532fSKeerthy  * before setting the actual voltage value.
54*2f5d532fSKeerthy  */
55*2f5d532fSKeerthy int regulator_set_value_force(struct udevice *dev, int uV)
56*2f5d532fSKeerthy {
57*2f5d532fSKeerthy 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
58*2f5d532fSKeerthy 
59*2f5d532fSKeerthy 	if (!ops || !ops->set_value)
60*2f5d532fSKeerthy 		return -ENOSYS;
61*2f5d532fSKeerthy 
62*2f5d532fSKeerthy 	return ops->set_value(dev, uV);
63*2f5d532fSKeerthy }
64*2f5d532fSKeerthy 
65af41e8dbSPrzemyslaw Marczak int regulator_get_current(struct udevice *dev)
66af41e8dbSPrzemyslaw Marczak {
67af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
68af41e8dbSPrzemyslaw Marczak 
69af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->get_current)
70af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
71af41e8dbSPrzemyslaw Marczak 
72af41e8dbSPrzemyslaw Marczak 	return ops->get_current(dev);
73af41e8dbSPrzemyslaw Marczak }
74af41e8dbSPrzemyslaw Marczak 
75af41e8dbSPrzemyslaw Marczak int regulator_set_current(struct udevice *dev, int uA)
76af41e8dbSPrzemyslaw Marczak {
77af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
78af41e8dbSPrzemyslaw Marczak 
79af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->set_current)
80af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
81af41e8dbSPrzemyslaw Marczak 
82af41e8dbSPrzemyslaw Marczak 	return ops->set_current(dev, uA);
83af41e8dbSPrzemyslaw Marczak }
84af41e8dbSPrzemyslaw Marczak 
85af41e8dbSPrzemyslaw Marczak bool regulator_get_enable(struct udevice *dev)
86af41e8dbSPrzemyslaw Marczak {
87af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
88af41e8dbSPrzemyslaw Marczak 
89af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->get_enable)
90af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
91af41e8dbSPrzemyslaw Marczak 
92af41e8dbSPrzemyslaw Marczak 	return ops->get_enable(dev);
93af41e8dbSPrzemyslaw Marczak }
94af41e8dbSPrzemyslaw Marczak 
95af41e8dbSPrzemyslaw Marczak int regulator_set_enable(struct udevice *dev, bool enable)
96af41e8dbSPrzemyslaw Marczak {
97af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
98af41e8dbSPrzemyslaw Marczak 
99af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->set_enable)
100af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
101af41e8dbSPrzemyslaw Marczak 
102af41e8dbSPrzemyslaw Marczak 	return ops->set_enable(dev, enable);
103af41e8dbSPrzemyslaw Marczak }
104af41e8dbSPrzemyslaw Marczak 
105af41e8dbSPrzemyslaw Marczak int regulator_get_mode(struct udevice *dev)
106af41e8dbSPrzemyslaw Marczak {
107af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
108af41e8dbSPrzemyslaw Marczak 
109af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->get_mode)
110af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
111af41e8dbSPrzemyslaw Marczak 
112af41e8dbSPrzemyslaw Marczak 	return ops->get_mode(dev);
113af41e8dbSPrzemyslaw Marczak }
114af41e8dbSPrzemyslaw Marczak 
115af41e8dbSPrzemyslaw Marczak int regulator_set_mode(struct udevice *dev, int mode)
116af41e8dbSPrzemyslaw Marczak {
117af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
118af41e8dbSPrzemyslaw Marczak 
119af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->set_mode)
120af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
121af41e8dbSPrzemyslaw Marczak 
122af41e8dbSPrzemyslaw Marczak 	return ops->set_mode(dev, mode);
123af41e8dbSPrzemyslaw Marczak }
124af41e8dbSPrzemyslaw Marczak 
1253b880757SPrzemyslaw Marczak int regulator_get_by_platname(const char *plat_name, struct udevice **devp)
126af41e8dbSPrzemyslaw Marczak {
127af41e8dbSPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
128af41e8dbSPrzemyslaw Marczak 	struct udevice *dev;
1293b880757SPrzemyslaw Marczak 	int ret;
130af41e8dbSPrzemyslaw Marczak 
131af41e8dbSPrzemyslaw Marczak 	*devp = NULL;
132af41e8dbSPrzemyslaw Marczak 
1333b880757SPrzemyslaw Marczak 	for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev;
1343b880757SPrzemyslaw Marczak 	     ret = uclass_find_next_device(&dev)) {
1353b880757SPrzemyslaw Marczak 		if (ret)
1363b880757SPrzemyslaw Marczak 			continue;
1373b880757SPrzemyslaw Marczak 
138af41e8dbSPrzemyslaw Marczak 		uc_pdata = dev_get_uclass_platdata(dev);
139af41e8dbSPrzemyslaw Marczak 		if (!uc_pdata || strcmp(plat_name, uc_pdata->name))
140af41e8dbSPrzemyslaw Marczak 			continue;
141af41e8dbSPrzemyslaw Marczak 
142af41e8dbSPrzemyslaw Marczak 		return uclass_get_device_tail(dev, 0, devp);
143af41e8dbSPrzemyslaw Marczak 	}
144af41e8dbSPrzemyslaw Marczak 
145af41e8dbSPrzemyslaw Marczak 	debug("%s: can't find: %s\n", __func__, plat_name);
146af41e8dbSPrzemyslaw Marczak 
147af41e8dbSPrzemyslaw Marczak 	return -ENODEV;
148af41e8dbSPrzemyslaw Marczak }
149af41e8dbSPrzemyslaw Marczak 
1503b880757SPrzemyslaw Marczak int regulator_get_by_devname(const char *devname, struct udevice **devp)
151af41e8dbSPrzemyslaw Marczak {
152af41e8dbSPrzemyslaw Marczak 	return uclass_get_device_by_name(UCLASS_REGULATOR, devname, devp);
153af41e8dbSPrzemyslaw Marczak }
154af41e8dbSPrzemyslaw Marczak 
1557c816e24SPrzemyslaw Marczak int device_get_supply_regulator(struct udevice *dev, const char *supply_name,
1567c816e24SPrzemyslaw Marczak 				struct udevice **devp)
1577c816e24SPrzemyslaw Marczak {
1587c816e24SPrzemyslaw Marczak 	return uclass_get_device_by_phandle(UCLASS_REGULATOR, dev,
1597c816e24SPrzemyslaw Marczak 					    supply_name, devp);
1607c816e24SPrzemyslaw Marczak }
1617c816e24SPrzemyslaw Marczak 
1623b55d30fSSimon Glass int regulator_autoset(struct udevice *dev)
163af41e8dbSPrzemyslaw Marczak {
1643b55d30fSSimon Glass 	struct dm_regulator_uclass_platdata *uc_pdata;
1653b55d30fSSimon Glass 	int ret = 0;
166af41e8dbSPrzemyslaw Marczak 
1673b55d30fSSimon Glass 	uc_pdata = dev_get_uclass_platdata(dev);
1683b55d30fSSimon Glass 	if (!uc_pdata->always_on && !uc_pdata->boot_on)
1693b55d30fSSimon Glass 		return -EMEDIUMTYPE;
170af41e8dbSPrzemyslaw Marczak 
1713b55d30fSSimon Glass 	if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UV)
1723b55d30fSSimon Glass 		ret = regulator_set_value(dev, uc_pdata->min_uV);
1733b55d30fSSimon Glass 	if (!ret && (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UA))
1743b55d30fSSimon Glass 		ret = regulator_set_current(dev, uc_pdata->min_uA);
175af41e8dbSPrzemyslaw Marczak 
176af41e8dbSPrzemyslaw Marczak 	if (!ret)
1773b55d30fSSimon Glass 		ret = regulator_set_enable(dev, true);
178af41e8dbSPrzemyslaw Marczak 
179af41e8dbSPrzemyslaw Marczak 	return ret;
180af41e8dbSPrzemyslaw Marczak }
181af41e8dbSPrzemyslaw Marczak 
1823b55d30fSSimon Glass static void regulator_show(struct udevice *dev, int ret)
183af41e8dbSPrzemyslaw Marczak {
184af41e8dbSPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
1853b55d30fSSimon Glass 
1863b55d30fSSimon Glass 	uc_pdata = dev_get_uclass_platdata(dev);
1873b55d30fSSimon Glass 
1883b55d30fSSimon Glass 	printf("%s@%s: ", dev->name, uc_pdata->name);
1893b55d30fSSimon Glass 	if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UV)
1903b55d30fSSimon Glass 		printf("set %d uV", uc_pdata->min_uV);
1913b55d30fSSimon Glass 	if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UA)
1923b55d30fSSimon Glass 		printf("; set %d uA", uc_pdata->min_uA);
1933b55d30fSSimon Glass 	printf("; enabling");
1943b55d30fSSimon Glass 	if (ret)
1957d577999SSimon Glass 		printf(" (ret: %d)", ret);
1963b55d30fSSimon Glass 	printf("\n");
1973b55d30fSSimon Glass }
1983b55d30fSSimon Glass 
1993b55d30fSSimon Glass int regulator_autoset_by_name(const char *platname, struct udevice **devp)
2003b55d30fSSimon Glass {
201af41e8dbSPrzemyslaw Marczak 	struct udevice *dev;
202af41e8dbSPrzemyslaw Marczak 	int ret;
203af41e8dbSPrzemyslaw Marczak 
2043b880757SPrzemyslaw Marczak 	ret = regulator_get_by_platname(platname, &dev);
205af41e8dbSPrzemyslaw Marczak 	if (devp)
206af41e8dbSPrzemyslaw Marczak 		*devp = dev;
2073b55d30fSSimon Glass 	if (ret) {
2083b55d30fSSimon Glass 		debug("Can get the regulator: %s!", platname);
209af41e8dbSPrzemyslaw Marczak 		return ret;
210af41e8dbSPrzemyslaw Marczak 	}
211af41e8dbSPrzemyslaw Marczak 
2123b55d30fSSimon Glass 	return regulator_autoset(dev);
2133b55d30fSSimon Glass }
2143b55d30fSSimon Glass 
2153b880757SPrzemyslaw Marczak int regulator_list_autoset(const char *list_platname[],
216af41e8dbSPrzemyslaw Marczak 			   struct udevice *list_devp[],
217af41e8dbSPrzemyslaw Marczak 			   bool verbose)
218af41e8dbSPrzemyslaw Marczak {
219af41e8dbSPrzemyslaw Marczak 	struct udevice *dev;
2203b880757SPrzemyslaw Marczak 	int error = 0, i = 0, ret;
221af41e8dbSPrzemyslaw Marczak 
2223b880757SPrzemyslaw Marczak 	while (list_platname[i]) {
2233b55d30fSSimon Glass 		ret = regulator_autoset_by_name(list_platname[i], &dev);
2243b55d30fSSimon Glass 		if (ret != -EMEDIUMTYPE && verbose)
2253b55d30fSSimon Glass 			regulator_show(dev, ret);
2263b880757SPrzemyslaw Marczak 		if (ret & !error)
2273b880757SPrzemyslaw Marczak 			error = ret;
228af41e8dbSPrzemyslaw Marczak 
2293b880757SPrzemyslaw Marczak 		if (list_devp)
230af41e8dbSPrzemyslaw Marczak 			list_devp[i] = dev;
2313b880757SPrzemyslaw Marczak 
2323b880757SPrzemyslaw Marczak 		i++;
233af41e8dbSPrzemyslaw Marczak 	}
234af41e8dbSPrzemyslaw Marczak 
2353b880757SPrzemyslaw Marczak 	return error;
2363b880757SPrzemyslaw Marczak }
2373b880757SPrzemyslaw Marczak 
2383b880757SPrzemyslaw Marczak static bool regulator_name_is_unique(struct udevice *check_dev,
2393b880757SPrzemyslaw Marczak 				     const char *check_name)
2403b880757SPrzemyslaw Marczak {
2413b880757SPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
2423b880757SPrzemyslaw Marczak 	struct udevice *dev;
2433b880757SPrzemyslaw Marczak 	int check_len = strlen(check_name);
2443b880757SPrzemyslaw Marczak 	int ret;
2453b880757SPrzemyslaw Marczak 	int len;
2463b880757SPrzemyslaw Marczak 
2473b880757SPrzemyslaw Marczak 	for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev;
2483b880757SPrzemyslaw Marczak 	     ret = uclass_find_next_device(&dev)) {
2493b880757SPrzemyslaw Marczak 		if (ret || dev == check_dev)
2503b880757SPrzemyslaw Marczak 			continue;
2513b880757SPrzemyslaw Marczak 
2523b880757SPrzemyslaw Marczak 		uc_pdata = dev_get_uclass_platdata(dev);
2533b880757SPrzemyslaw Marczak 		len = strlen(uc_pdata->name);
2543b880757SPrzemyslaw Marczak 		if (len != check_len)
2553b880757SPrzemyslaw Marczak 			continue;
2563b880757SPrzemyslaw Marczak 
2573b880757SPrzemyslaw Marczak 		if (!strcmp(uc_pdata->name, check_name))
2583b880757SPrzemyslaw Marczak 			return false;
2593b880757SPrzemyslaw Marczak 	}
2603b880757SPrzemyslaw Marczak 
2613b880757SPrzemyslaw Marczak 	return true;
262af41e8dbSPrzemyslaw Marczak }
263af41e8dbSPrzemyslaw Marczak 
264af41e8dbSPrzemyslaw Marczak static int regulator_post_bind(struct udevice *dev)
265af41e8dbSPrzemyslaw Marczak {
266af41e8dbSPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
267af41e8dbSPrzemyslaw Marczak 	int offset = dev->of_offset;
268af41e8dbSPrzemyslaw Marczak 	const void *blob = gd->fdt_blob;
2693b880757SPrzemyslaw Marczak 	const char *property = "regulator-name";
270af41e8dbSPrzemyslaw Marczak 
271af41e8dbSPrzemyslaw Marczak 	uc_pdata = dev_get_uclass_platdata(dev);
272af41e8dbSPrzemyslaw Marczak 	if (!uc_pdata)
273af41e8dbSPrzemyslaw Marczak 		return -ENXIO;
274af41e8dbSPrzemyslaw Marczak 
275af41e8dbSPrzemyslaw Marczak 	/* Regulator's mandatory constraint */
2763b880757SPrzemyslaw Marczak 	uc_pdata->name = fdt_getprop(blob, offset, property, NULL);
277af41e8dbSPrzemyslaw Marczak 	if (!uc_pdata->name) {
278af41e8dbSPrzemyslaw Marczak 		debug("%s: dev: %s has no property 'regulator-name'\n",
279af41e8dbSPrzemyslaw Marczak 		      __func__, dev->name);
280cf260011SPeng Fan 		uc_pdata->name = fdt_get_name(blob, offset, NULL);
281cf260011SPeng Fan 		if (!uc_pdata->name)
2823b880757SPrzemyslaw Marczak 			return -EINVAL;
283af41e8dbSPrzemyslaw Marczak 	}
284af41e8dbSPrzemyslaw Marczak 
2853b880757SPrzemyslaw Marczak 	if (regulator_name_is_unique(dev, uc_pdata->name))
286af41e8dbSPrzemyslaw Marczak 		return 0;
2873b880757SPrzemyslaw Marczak 
28859c26a9cSSimon Glass 	debug("\"%s\" of dev: \"%s\", has nonunique value: \"%s\"",
2893b880757SPrzemyslaw Marczak 	      property, dev->name, uc_pdata->name);
2903b880757SPrzemyslaw Marczak 
2913b880757SPrzemyslaw Marczak 	return -EINVAL;
292af41e8dbSPrzemyslaw Marczak }
293af41e8dbSPrzemyslaw Marczak 
294af41e8dbSPrzemyslaw Marczak static int regulator_pre_probe(struct udevice *dev)
295af41e8dbSPrzemyslaw Marczak {
296af41e8dbSPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
297af41e8dbSPrzemyslaw Marczak 	int offset = dev->of_offset;
298af41e8dbSPrzemyslaw Marczak 
299af41e8dbSPrzemyslaw Marczak 	uc_pdata = dev_get_uclass_platdata(dev);
300af41e8dbSPrzemyslaw Marczak 	if (!uc_pdata)
301af41e8dbSPrzemyslaw Marczak 		return -ENXIO;
302af41e8dbSPrzemyslaw Marczak 
303af41e8dbSPrzemyslaw Marczak 	/* Regulator's optional constraints */
304af41e8dbSPrzemyslaw Marczak 	uc_pdata->min_uV = fdtdec_get_int(gd->fdt_blob, offset,
305af41e8dbSPrzemyslaw Marczak 					  "regulator-min-microvolt", -ENODATA);
306af41e8dbSPrzemyslaw Marczak 	uc_pdata->max_uV = fdtdec_get_int(gd->fdt_blob, offset,
307af41e8dbSPrzemyslaw Marczak 					  "regulator-max-microvolt", -ENODATA);
308af41e8dbSPrzemyslaw Marczak 	uc_pdata->min_uA = fdtdec_get_int(gd->fdt_blob, offset,
309af41e8dbSPrzemyslaw Marczak 					  "regulator-min-microamp", -ENODATA);
310af41e8dbSPrzemyslaw Marczak 	uc_pdata->max_uA = fdtdec_get_int(gd->fdt_blob, offset,
311af41e8dbSPrzemyslaw Marczak 					  "regulator-max-microamp", -ENODATA);
312af41e8dbSPrzemyslaw Marczak 	uc_pdata->always_on = fdtdec_get_bool(gd->fdt_blob, offset,
313af41e8dbSPrzemyslaw Marczak 					      "regulator-always-on");
314af41e8dbSPrzemyslaw Marczak 	uc_pdata->boot_on = fdtdec_get_bool(gd->fdt_blob, offset,
315af41e8dbSPrzemyslaw Marczak 					    "regulator-boot-on");
316af41e8dbSPrzemyslaw Marczak 
3177837ceabSSimon Glass 	/* Those values are optional (-ENODATA if unset) */
3187837ceabSSimon Glass 	if ((uc_pdata->min_uV != -ENODATA) &&
3197837ceabSSimon Glass 	    (uc_pdata->max_uV != -ENODATA) &&
3207837ceabSSimon Glass 	    (uc_pdata->min_uV == uc_pdata->max_uV))
3217837ceabSSimon Glass 		uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_UV;
3227837ceabSSimon Glass 
3237837ceabSSimon Glass 	/* Those values are optional (-ENODATA if unset) */
3247837ceabSSimon Glass 	if ((uc_pdata->min_uA != -ENODATA) &&
3257837ceabSSimon Glass 	    (uc_pdata->max_uA != -ENODATA) &&
3267837ceabSSimon Glass 	    (uc_pdata->min_uA == uc_pdata->max_uA))
3277837ceabSSimon Glass 		uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_UA;
3287837ceabSSimon Glass 
329af41e8dbSPrzemyslaw Marczak 	return 0;
330af41e8dbSPrzemyslaw Marczak }
331af41e8dbSPrzemyslaw Marczak 
332083fc83aSSimon Glass int regulators_enable_boot_on(bool verbose)
333083fc83aSSimon Glass {
334083fc83aSSimon Glass 	struct udevice *dev;
335083fc83aSSimon Glass 	struct uclass *uc;
336083fc83aSSimon Glass 	int ret;
337083fc83aSSimon Glass 
338083fc83aSSimon Glass 	ret = uclass_get(UCLASS_REGULATOR, &uc);
339083fc83aSSimon Glass 	if (ret)
340083fc83aSSimon Glass 		return ret;
341083fc83aSSimon Glass 	for (uclass_first_device(UCLASS_REGULATOR, &dev);
3423f603cbbSSimon Glass 	     dev;
343083fc83aSSimon Glass 	     uclass_next_device(&dev)) {
344083fc83aSSimon Glass 		ret = regulator_autoset(dev);
345d08504d1SSimon Glass 		if (ret == -EMEDIUMTYPE) {
346d08504d1SSimon Glass 			ret = 0;
347083fc83aSSimon Glass 			continue;
348d08504d1SSimon Glass 		}
349083fc83aSSimon Glass 		if (verbose)
350083fc83aSSimon Glass 			regulator_show(dev, ret);
351364809deSSimon Glass 		if (ret == -ENOSYS)
352364809deSSimon Glass 			ret = 0;
353083fc83aSSimon Glass 	}
354083fc83aSSimon Glass 
355083fc83aSSimon Glass 	return ret;
356083fc83aSSimon Glass }
357083fc83aSSimon Glass 
358af41e8dbSPrzemyslaw Marczak UCLASS_DRIVER(regulator) = {
359af41e8dbSPrzemyslaw Marczak 	.id		= UCLASS_REGULATOR,
360af41e8dbSPrzemyslaw Marczak 	.name		= "regulator",
361af41e8dbSPrzemyslaw Marczak 	.post_bind	= regulator_post_bind,
362af41e8dbSPrzemyslaw Marczak 	.pre_probe	= regulator_pre_probe,
363af41e8dbSPrzemyslaw Marczak 	.per_device_platdata_auto_alloc_size =
364af41e8dbSPrzemyslaw Marczak 				sizeof(struct dm_regulator_uclass_platdata),
365af41e8dbSPrzemyslaw Marczak };
366