xref: /rk3399_rockchip-uboot/drivers/power/regulator/regulator-uclass.c (revision 7837ceab1ef8d4a88fb218bfa6b042b0b865b15f)
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 
51af41e8dbSPrzemyslaw Marczak int regulator_get_current(struct udevice *dev)
52af41e8dbSPrzemyslaw Marczak {
53af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
54af41e8dbSPrzemyslaw Marczak 
55af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->get_current)
56af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
57af41e8dbSPrzemyslaw Marczak 
58af41e8dbSPrzemyslaw Marczak 	return ops->get_current(dev);
59af41e8dbSPrzemyslaw Marczak }
60af41e8dbSPrzemyslaw Marczak 
61af41e8dbSPrzemyslaw Marczak int regulator_set_current(struct udevice *dev, int uA)
62af41e8dbSPrzemyslaw Marczak {
63af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
64af41e8dbSPrzemyslaw Marczak 
65af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->set_current)
66af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
67af41e8dbSPrzemyslaw Marczak 
68af41e8dbSPrzemyslaw Marczak 	return ops->set_current(dev, uA);
69af41e8dbSPrzemyslaw Marczak }
70af41e8dbSPrzemyslaw Marczak 
71af41e8dbSPrzemyslaw Marczak bool regulator_get_enable(struct udevice *dev)
72af41e8dbSPrzemyslaw Marczak {
73af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
74af41e8dbSPrzemyslaw Marczak 
75af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->get_enable)
76af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
77af41e8dbSPrzemyslaw Marczak 
78af41e8dbSPrzemyslaw Marczak 	return ops->get_enable(dev);
79af41e8dbSPrzemyslaw Marczak }
80af41e8dbSPrzemyslaw Marczak 
81af41e8dbSPrzemyslaw Marczak int regulator_set_enable(struct udevice *dev, bool enable)
82af41e8dbSPrzemyslaw Marczak {
83af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
84af41e8dbSPrzemyslaw Marczak 
85af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->set_enable)
86af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
87af41e8dbSPrzemyslaw Marczak 
88af41e8dbSPrzemyslaw Marczak 	return ops->set_enable(dev, enable);
89af41e8dbSPrzemyslaw Marczak }
90af41e8dbSPrzemyslaw Marczak 
91af41e8dbSPrzemyslaw Marczak int regulator_get_mode(struct udevice *dev)
92af41e8dbSPrzemyslaw Marczak {
93af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
94af41e8dbSPrzemyslaw Marczak 
95af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->get_mode)
96af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
97af41e8dbSPrzemyslaw Marczak 
98af41e8dbSPrzemyslaw Marczak 	return ops->get_mode(dev);
99af41e8dbSPrzemyslaw Marczak }
100af41e8dbSPrzemyslaw Marczak 
101af41e8dbSPrzemyslaw Marczak int regulator_set_mode(struct udevice *dev, int mode)
102af41e8dbSPrzemyslaw Marczak {
103af41e8dbSPrzemyslaw Marczak 	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
104af41e8dbSPrzemyslaw Marczak 
105af41e8dbSPrzemyslaw Marczak 	if (!ops || !ops->set_mode)
106af41e8dbSPrzemyslaw Marczak 		return -ENOSYS;
107af41e8dbSPrzemyslaw Marczak 
108af41e8dbSPrzemyslaw Marczak 	return ops->set_mode(dev, mode);
109af41e8dbSPrzemyslaw Marczak }
110af41e8dbSPrzemyslaw Marczak 
1113b880757SPrzemyslaw Marczak int regulator_get_by_platname(const char *plat_name, struct udevice **devp)
112af41e8dbSPrzemyslaw Marczak {
113af41e8dbSPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
114af41e8dbSPrzemyslaw Marczak 	struct udevice *dev;
1153b880757SPrzemyslaw Marczak 	int ret;
116af41e8dbSPrzemyslaw Marczak 
117af41e8dbSPrzemyslaw Marczak 	*devp = NULL;
118af41e8dbSPrzemyslaw Marczak 
1193b880757SPrzemyslaw Marczak 	for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev;
1203b880757SPrzemyslaw Marczak 	     ret = uclass_find_next_device(&dev)) {
1213b880757SPrzemyslaw Marczak 		if (ret)
1223b880757SPrzemyslaw Marczak 			continue;
1233b880757SPrzemyslaw Marczak 
124af41e8dbSPrzemyslaw Marczak 		uc_pdata = dev_get_uclass_platdata(dev);
125af41e8dbSPrzemyslaw Marczak 		if (!uc_pdata || strcmp(plat_name, uc_pdata->name))
126af41e8dbSPrzemyslaw Marczak 			continue;
127af41e8dbSPrzemyslaw Marczak 
128af41e8dbSPrzemyslaw Marczak 		return uclass_get_device_tail(dev, 0, devp);
129af41e8dbSPrzemyslaw Marczak 	}
130af41e8dbSPrzemyslaw Marczak 
131af41e8dbSPrzemyslaw Marczak 	debug("%s: can't find: %s\n", __func__, plat_name);
132af41e8dbSPrzemyslaw Marczak 
133af41e8dbSPrzemyslaw Marczak 	return -ENODEV;
134af41e8dbSPrzemyslaw Marczak }
135af41e8dbSPrzemyslaw Marczak 
1363b880757SPrzemyslaw Marczak int regulator_get_by_devname(const char *devname, struct udevice **devp)
137af41e8dbSPrzemyslaw Marczak {
138af41e8dbSPrzemyslaw Marczak 	return uclass_get_device_by_name(UCLASS_REGULATOR, devname, devp);
139af41e8dbSPrzemyslaw Marczak }
140af41e8dbSPrzemyslaw Marczak 
1413b880757SPrzemyslaw Marczak static int failed(int ret, bool verbose, const char *fmt, ...)
142af41e8dbSPrzemyslaw Marczak {
143af41e8dbSPrzemyslaw Marczak 	va_list args;
144af41e8dbSPrzemyslaw Marczak 	char buf[64];
145af41e8dbSPrzemyslaw Marczak 
146af41e8dbSPrzemyslaw Marczak 	if (verbose == false)
147af41e8dbSPrzemyslaw Marczak 		return ret;
148af41e8dbSPrzemyslaw Marczak 
149af41e8dbSPrzemyslaw Marczak 	va_start(args, fmt);
150af41e8dbSPrzemyslaw Marczak 	vscnprintf(buf, sizeof(buf), fmt, args);
151af41e8dbSPrzemyslaw Marczak 	va_end(args);
152af41e8dbSPrzemyslaw Marczak 
153af41e8dbSPrzemyslaw Marczak 	printf(buf);
154af41e8dbSPrzemyslaw Marczak 
155af41e8dbSPrzemyslaw Marczak 	if (!ret)
156af41e8dbSPrzemyslaw Marczak 		return 0;
157af41e8dbSPrzemyslaw Marczak 
158af41e8dbSPrzemyslaw Marczak 	printf(" (ret: %d)", ret);
159af41e8dbSPrzemyslaw Marczak 
160af41e8dbSPrzemyslaw Marczak 	return ret;
161af41e8dbSPrzemyslaw Marczak }
162af41e8dbSPrzemyslaw Marczak 
1633b880757SPrzemyslaw Marczak int regulator_autoset(const char *platname,
164af41e8dbSPrzemyslaw Marczak 		      struct udevice **devp,
165af41e8dbSPrzemyslaw Marczak 		      bool verbose)
166af41e8dbSPrzemyslaw Marczak {
167af41e8dbSPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
168af41e8dbSPrzemyslaw Marczak 	struct udevice *dev;
169af41e8dbSPrzemyslaw Marczak 	int ret;
170af41e8dbSPrzemyslaw Marczak 
171af41e8dbSPrzemyslaw Marczak 	if (devp)
172af41e8dbSPrzemyslaw Marczak 		*devp = NULL;
173af41e8dbSPrzemyslaw Marczak 
1743b880757SPrzemyslaw Marczak 	ret = regulator_get_by_platname(platname, &dev);
175af41e8dbSPrzemyslaw Marczak 	if (ret) {
176af41e8dbSPrzemyslaw Marczak 		error("Can get the regulator: %s!", platname);
177af41e8dbSPrzemyslaw Marczak 		return ret;
178af41e8dbSPrzemyslaw Marczak 	}
179af41e8dbSPrzemyslaw Marczak 
180af41e8dbSPrzemyslaw Marczak 	uc_pdata = dev_get_uclass_platdata(dev);
181af41e8dbSPrzemyslaw Marczak 	if (!uc_pdata) {
182af41e8dbSPrzemyslaw Marczak 		error("Can get the regulator %s uclass platdata!", platname);
183af41e8dbSPrzemyslaw Marczak 		return -ENXIO;
184af41e8dbSPrzemyslaw Marczak 	}
185af41e8dbSPrzemyslaw Marczak 
1863b880757SPrzemyslaw Marczak 	if (!uc_pdata->always_on && !uc_pdata->boot_on)
1873b880757SPrzemyslaw Marczak 		goto retdev;
1883b880757SPrzemyslaw Marczak 
1893b880757SPrzemyslaw Marczak 	if (verbose)
190af41e8dbSPrzemyslaw Marczak 		printf("%s@%s: ", dev->name, uc_pdata->name);
191af41e8dbSPrzemyslaw Marczak 
192af41e8dbSPrzemyslaw Marczak 	/* Those values are optional (-ENODATA if unset) */
193af41e8dbSPrzemyslaw Marczak 	if ((uc_pdata->min_uV != -ENODATA) &&
194af41e8dbSPrzemyslaw Marczak 	    (uc_pdata->max_uV != -ENODATA) &&
195af41e8dbSPrzemyslaw Marczak 	    (uc_pdata->min_uV == uc_pdata->max_uV)) {
196af41e8dbSPrzemyslaw Marczak 		ret = regulator_set_value(dev, uc_pdata->min_uV);
1973b880757SPrzemyslaw Marczak 		if (failed(ret, verbose, "set %d uV", uc_pdata->min_uV))
198af41e8dbSPrzemyslaw Marczak 			goto exit;
199af41e8dbSPrzemyslaw Marczak 	}
200af41e8dbSPrzemyslaw Marczak 
201af41e8dbSPrzemyslaw Marczak 	/* Those values are optional (-ENODATA if unset) */
202af41e8dbSPrzemyslaw Marczak 	if ((uc_pdata->min_uA != -ENODATA) &&
203af41e8dbSPrzemyslaw Marczak 	    (uc_pdata->max_uA != -ENODATA) &&
204af41e8dbSPrzemyslaw Marczak 	    (uc_pdata->min_uA == uc_pdata->max_uA)) {
205af41e8dbSPrzemyslaw Marczak 		ret = regulator_set_current(dev, uc_pdata->min_uA);
2063b880757SPrzemyslaw Marczak 		if (failed(ret, verbose, "; set %d uA", uc_pdata->min_uA))
207af41e8dbSPrzemyslaw Marczak 			goto exit;
208af41e8dbSPrzemyslaw Marczak 	}
209af41e8dbSPrzemyslaw Marczak 
210af41e8dbSPrzemyslaw Marczak 	ret = regulator_set_enable(dev, true);
2113b880757SPrzemyslaw Marczak 	if (failed(ret, verbose, "; enabling", uc_pdata->min_uA))
212af41e8dbSPrzemyslaw Marczak 		goto exit;
213af41e8dbSPrzemyslaw Marczak 
214af41e8dbSPrzemyslaw Marczak retdev:
215af41e8dbSPrzemyslaw Marczak 	if (devp)
216af41e8dbSPrzemyslaw Marczak 		*devp = dev;
217af41e8dbSPrzemyslaw Marczak exit:
2183b880757SPrzemyslaw Marczak 	if (verbose)
219af41e8dbSPrzemyslaw Marczak 		printf("\n");
2203b880757SPrzemyslaw Marczak 
221af41e8dbSPrzemyslaw Marczak 	return ret;
222af41e8dbSPrzemyslaw Marczak }
223af41e8dbSPrzemyslaw Marczak 
2243b880757SPrzemyslaw Marczak int regulator_list_autoset(const char *list_platname[],
225af41e8dbSPrzemyslaw Marczak 			   struct udevice *list_devp[],
226af41e8dbSPrzemyslaw Marczak 			   bool verbose)
227af41e8dbSPrzemyslaw Marczak {
228af41e8dbSPrzemyslaw Marczak 	struct udevice *dev;
2293b880757SPrzemyslaw Marczak 	int error = 0, i = 0, ret;
230af41e8dbSPrzemyslaw Marczak 
2313b880757SPrzemyslaw Marczak 	while (list_platname[i]) {
232af41e8dbSPrzemyslaw Marczak 		ret = regulator_autoset(list_platname[i], &dev, verbose);
2333b880757SPrzemyslaw Marczak 		if (ret & !error)
2343b880757SPrzemyslaw Marczak 			error = ret;
235af41e8dbSPrzemyslaw Marczak 
2363b880757SPrzemyslaw Marczak 		if (list_devp)
237af41e8dbSPrzemyslaw Marczak 			list_devp[i] = dev;
2383b880757SPrzemyslaw Marczak 
2393b880757SPrzemyslaw Marczak 		i++;
240af41e8dbSPrzemyslaw Marczak 	}
241af41e8dbSPrzemyslaw Marczak 
2423b880757SPrzemyslaw Marczak 	return error;
2433b880757SPrzemyslaw Marczak }
2443b880757SPrzemyslaw Marczak 
2453b880757SPrzemyslaw Marczak static bool regulator_name_is_unique(struct udevice *check_dev,
2463b880757SPrzemyslaw Marczak 				     const char *check_name)
2473b880757SPrzemyslaw Marczak {
2483b880757SPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
2493b880757SPrzemyslaw Marczak 	struct udevice *dev;
2503b880757SPrzemyslaw Marczak 	int check_len = strlen(check_name);
2513b880757SPrzemyslaw Marczak 	int ret;
2523b880757SPrzemyslaw Marczak 	int len;
2533b880757SPrzemyslaw Marczak 
2543b880757SPrzemyslaw Marczak 	for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev;
2553b880757SPrzemyslaw Marczak 	     ret = uclass_find_next_device(&dev)) {
2563b880757SPrzemyslaw Marczak 		if (ret || dev == check_dev)
2573b880757SPrzemyslaw Marczak 			continue;
2583b880757SPrzemyslaw Marczak 
2593b880757SPrzemyslaw Marczak 		uc_pdata = dev_get_uclass_platdata(dev);
2603b880757SPrzemyslaw Marczak 		len = strlen(uc_pdata->name);
2613b880757SPrzemyslaw Marczak 		if (len != check_len)
2623b880757SPrzemyslaw Marczak 			continue;
2633b880757SPrzemyslaw Marczak 
2643b880757SPrzemyslaw Marczak 		if (!strcmp(uc_pdata->name, check_name))
2653b880757SPrzemyslaw Marczak 			return false;
2663b880757SPrzemyslaw Marczak 	}
2673b880757SPrzemyslaw Marczak 
2683b880757SPrzemyslaw Marczak 	return true;
269af41e8dbSPrzemyslaw Marczak }
270af41e8dbSPrzemyslaw Marczak 
271af41e8dbSPrzemyslaw Marczak static int regulator_post_bind(struct udevice *dev)
272af41e8dbSPrzemyslaw Marczak {
273af41e8dbSPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
274af41e8dbSPrzemyslaw Marczak 	int offset = dev->of_offset;
275af41e8dbSPrzemyslaw Marczak 	const void *blob = gd->fdt_blob;
2763b880757SPrzemyslaw Marczak 	const char *property = "regulator-name";
277af41e8dbSPrzemyslaw Marczak 
278af41e8dbSPrzemyslaw Marczak 	uc_pdata = dev_get_uclass_platdata(dev);
279af41e8dbSPrzemyslaw Marczak 	if (!uc_pdata)
280af41e8dbSPrzemyslaw Marczak 		return -ENXIO;
281af41e8dbSPrzemyslaw Marczak 
282af41e8dbSPrzemyslaw Marczak 	/* Regulator's mandatory constraint */
2833b880757SPrzemyslaw Marczak 	uc_pdata->name = fdt_getprop(blob, offset, property, NULL);
284af41e8dbSPrzemyslaw Marczak 	if (!uc_pdata->name) {
285af41e8dbSPrzemyslaw Marczak 		debug("%s: dev: %s has no property 'regulator-name'\n",
286af41e8dbSPrzemyslaw Marczak 		      __func__, dev->name);
2873b880757SPrzemyslaw Marczak 		return -EINVAL;
288af41e8dbSPrzemyslaw Marczak 	}
289af41e8dbSPrzemyslaw Marczak 
2903b880757SPrzemyslaw Marczak 	if (regulator_name_is_unique(dev, uc_pdata->name))
291af41e8dbSPrzemyslaw Marczak 		return 0;
2923b880757SPrzemyslaw Marczak 
2933b880757SPrzemyslaw Marczak 	error("\"%s\" of dev: \"%s\", has nonunique value: \"%s\"",
2943b880757SPrzemyslaw Marczak 	      property, dev->name, uc_pdata->name);
2953b880757SPrzemyslaw Marczak 
2963b880757SPrzemyslaw Marczak 	return -EINVAL;
297af41e8dbSPrzemyslaw Marczak }
298af41e8dbSPrzemyslaw Marczak 
299af41e8dbSPrzemyslaw Marczak static int regulator_pre_probe(struct udevice *dev)
300af41e8dbSPrzemyslaw Marczak {
301af41e8dbSPrzemyslaw Marczak 	struct dm_regulator_uclass_platdata *uc_pdata;
302af41e8dbSPrzemyslaw Marczak 	int offset = dev->of_offset;
303af41e8dbSPrzemyslaw Marczak 
304af41e8dbSPrzemyslaw Marczak 	uc_pdata = dev_get_uclass_platdata(dev);
305af41e8dbSPrzemyslaw Marczak 	if (!uc_pdata)
306af41e8dbSPrzemyslaw Marczak 		return -ENXIO;
307af41e8dbSPrzemyslaw Marczak 
308af41e8dbSPrzemyslaw Marczak 	/* Regulator's optional constraints */
309af41e8dbSPrzemyslaw Marczak 	uc_pdata->min_uV = fdtdec_get_int(gd->fdt_blob, offset,
310af41e8dbSPrzemyslaw Marczak 					  "regulator-min-microvolt", -ENODATA);
311af41e8dbSPrzemyslaw Marczak 	uc_pdata->max_uV = fdtdec_get_int(gd->fdt_blob, offset,
312af41e8dbSPrzemyslaw Marczak 					  "regulator-max-microvolt", -ENODATA);
313af41e8dbSPrzemyslaw Marczak 	uc_pdata->min_uA = fdtdec_get_int(gd->fdt_blob, offset,
314af41e8dbSPrzemyslaw Marczak 					  "regulator-min-microamp", -ENODATA);
315af41e8dbSPrzemyslaw Marczak 	uc_pdata->max_uA = fdtdec_get_int(gd->fdt_blob, offset,
316af41e8dbSPrzemyslaw Marczak 					  "regulator-max-microamp", -ENODATA);
317af41e8dbSPrzemyslaw Marczak 	uc_pdata->always_on = fdtdec_get_bool(gd->fdt_blob, offset,
318af41e8dbSPrzemyslaw Marczak 					      "regulator-always-on");
319af41e8dbSPrzemyslaw Marczak 	uc_pdata->boot_on = fdtdec_get_bool(gd->fdt_blob, offset,
320af41e8dbSPrzemyslaw Marczak 					    "regulator-boot-on");
321af41e8dbSPrzemyslaw Marczak 
322*7837ceabSSimon Glass 	/* Those values are optional (-ENODATA if unset) */
323*7837ceabSSimon Glass 	if ((uc_pdata->min_uV != -ENODATA) &&
324*7837ceabSSimon Glass 	    (uc_pdata->max_uV != -ENODATA) &&
325*7837ceabSSimon Glass 	    (uc_pdata->min_uV == uc_pdata->max_uV))
326*7837ceabSSimon Glass 		uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_UV;
327*7837ceabSSimon Glass 
328*7837ceabSSimon Glass 	/* Those values are optional (-ENODATA if unset) */
329*7837ceabSSimon Glass 	if ((uc_pdata->min_uA != -ENODATA) &&
330*7837ceabSSimon Glass 	    (uc_pdata->max_uA != -ENODATA) &&
331*7837ceabSSimon Glass 	    (uc_pdata->min_uA == uc_pdata->max_uA))
332*7837ceabSSimon Glass 		uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_UA;
333*7837ceabSSimon Glass 
334af41e8dbSPrzemyslaw Marczak 	return 0;
335af41e8dbSPrzemyslaw Marczak }
336af41e8dbSPrzemyslaw Marczak 
337af41e8dbSPrzemyslaw Marczak UCLASS_DRIVER(regulator) = {
338af41e8dbSPrzemyslaw Marczak 	.id		= UCLASS_REGULATOR,
339af41e8dbSPrzemyslaw Marczak 	.name		= "regulator",
340af41e8dbSPrzemyslaw Marczak 	.post_bind	= regulator_post_bind,
341af41e8dbSPrzemyslaw Marczak 	.pre_probe	= regulator_pre_probe,
342af41e8dbSPrzemyslaw Marczak 	.per_device_platdata_auto_alloc_size =
343af41e8dbSPrzemyslaw Marczak 				sizeof(struct dm_regulator_uclass_platdata),
344af41e8dbSPrzemyslaw Marczak };
345