2 * Copyright (C) 2014-2015 Samsung Electronics
3 * Przemyslaw Marczak <p.marczak@samsung.com>
5 * SPDX-License-Identifier: GPL-2.0+
11 #include <dm/uclass-internal.h>
12 #include <power/pmic.h>
13 #include <power/regulator.h>
15 DECLARE_GLOBAL_DATA_PTR
;
17 int regulator_mode(struct udevice
*dev
, struct dm_regulator_mode
**modep
)
19 struct dm_regulator_uclass_platdata
*uc_pdata
;
23 uc_pdata
= dev_get_uclass_platdata(dev
);
27 *modep
= uc_pdata
->mode
;
28 return uc_pdata
->mode_count
;
31 int regulator_get_value(struct udevice
*dev
)
33 const struct dm_regulator_ops
*ops
= dev_get_driver_ops(dev
);
35 if (!ops
|| !ops
->get_value
)
38 return ops
->get_value(dev
);
41 int regulator_set_value(struct udevice
*dev
, int uV
)
43 const struct dm_regulator_ops
*ops
= dev_get_driver_ops(dev
);
44 struct dm_regulator_uclass_platdata
*uc_pdata
;
46 uc_pdata
= dev_get_uclass_platdata(dev
);
47 if (uc_pdata
->min_uV
!= -ENODATA
&& uV
< uc_pdata
->min_uV
)
49 if (uc_pdata
->max_uV
!= -ENODATA
&& uV
> uc_pdata
->max_uV
)
52 if (!ops
|| !ops
->set_value
)
55 return ops
->set_value(dev
, uV
);
59 * To be called with at most caution as there is no check
60 * before setting the actual voltage value.
62 int regulator_set_value_force(struct udevice
*dev
, int uV
)
64 const struct dm_regulator_ops
*ops
= dev_get_driver_ops(dev
);
66 if (!ops
|| !ops
->set_value
)
69 return ops
->set_value(dev
, uV
);
72 int regulator_get_current(struct udevice
*dev
)
74 const struct dm_regulator_ops
*ops
= dev_get_driver_ops(dev
);
76 if (!ops
|| !ops
->get_current
)
79 return ops
->get_current(dev
);
82 int regulator_set_current(struct udevice
*dev
, int uA
)
84 const struct dm_regulator_ops
*ops
= dev_get_driver_ops(dev
);
85 struct dm_regulator_uclass_platdata
*uc_pdata
;
87 uc_pdata
= dev_get_uclass_platdata(dev
);
88 if (uc_pdata
->min_uA
!= -ENODATA
&& uA
< uc_pdata
->min_uA
)
90 if (uc_pdata
->max_uA
!= -ENODATA
&& uA
> uc_pdata
->max_uA
)
93 if (!ops
|| !ops
->set_current
)
96 return ops
->set_current(dev
, uA
);
99 bool regulator_get_enable(struct udevice
*dev
)
101 const struct dm_regulator_ops
*ops
= dev_get_driver_ops(dev
);
103 if (!ops
|| !ops
->get_enable
)
106 return ops
->get_enable(dev
);
109 int regulator_set_enable(struct udevice
*dev
, bool enable
)
111 const struct dm_regulator_ops
*ops
= dev_get_driver_ops(dev
);
113 if (!ops
|| !ops
->set_enable
)
116 return ops
->set_enable(dev
, enable
);
119 int regulator_get_mode(struct udevice
*dev
)
121 const struct dm_regulator_ops
*ops
= dev_get_driver_ops(dev
);
123 if (!ops
|| !ops
->get_mode
)
126 return ops
->get_mode(dev
);
129 int regulator_set_mode(struct udevice
*dev
, int mode
)
131 const struct dm_regulator_ops
*ops
= dev_get_driver_ops(dev
);
133 if (!ops
|| !ops
->set_mode
)
136 return ops
->set_mode(dev
, mode
);
139 int regulator_get_by_platname(const char *plat_name
, struct udevice
**devp
)
141 struct dm_regulator_uclass_platdata
*uc_pdata
;
147 for (ret
= uclass_find_first_device(UCLASS_REGULATOR
, &dev
); dev
;
148 ret
= uclass_find_next_device(&dev
)) {
152 uc_pdata
= dev_get_uclass_platdata(dev
);
153 if (!uc_pdata
|| strcmp(plat_name
, uc_pdata
->name
))
156 return uclass_get_device_tail(dev
, 0, devp
);
159 debug("%s: can't find: %s\n", __func__
, plat_name
);
164 int regulator_get_by_devname(const char *devname
, struct udevice
**devp
)
166 return uclass_get_device_by_name(UCLASS_REGULATOR
, devname
, devp
);
169 int device_get_supply_regulator(struct udevice
*dev
, const char *supply_name
,
170 struct udevice
**devp
)
172 return uclass_get_device_by_phandle(UCLASS_REGULATOR
, dev
,
176 int regulator_autoset(struct udevice
*dev
)
178 struct dm_regulator_uclass_platdata
*uc_pdata
;
181 uc_pdata
= dev_get_uclass_platdata(dev
);
182 if (!uc_pdata
->always_on
&& !uc_pdata
->boot_on
)
185 if (uc_pdata
->flags
& REGULATOR_FLAG_AUTOSET_UV
)
186 ret
= regulator_set_value(dev
, uc_pdata
->min_uV
);
187 if (!ret
&& (uc_pdata
->flags
& REGULATOR_FLAG_AUTOSET_UA
))
188 ret
= regulator_set_current(dev
, uc_pdata
->min_uA
);
191 ret
= regulator_set_enable(dev
, true);
196 static void regulator_show(struct udevice
*dev
, int ret
)
198 struct dm_regulator_uclass_platdata
*uc_pdata
;
200 uc_pdata
= dev_get_uclass_platdata(dev
);
202 printf("%s@%s: ", dev
->name
, uc_pdata
->name
);
203 if (uc_pdata
->flags
& REGULATOR_FLAG_AUTOSET_UV
)
204 printf("set %d uV", uc_pdata
->min_uV
);
205 if (uc_pdata
->flags
& REGULATOR_FLAG_AUTOSET_UA
)
206 printf("; set %d uA", uc_pdata
->min_uA
);
207 printf("; enabling");
209 printf(" (ret: %d)", ret
);
213 int regulator_autoset_by_name(const char *platname
, struct udevice
**devp
)
218 ret
= regulator_get_by_platname(platname
, &dev
);
222 debug("Can get the regulator: %s!", platname
);
226 return regulator_autoset(dev
);
229 int regulator_list_autoset(const char *list_platname
[],
230 struct udevice
*list_devp
[],
234 int error
= 0, i
= 0, ret
;
236 while (list_platname
[i
]) {
237 ret
= regulator_autoset_by_name(list_platname
[i
], &dev
);
238 if (ret
!= -EMEDIUMTYPE
&& verbose
)
239 regulator_show(dev
, ret
);
252 static bool regulator_name_is_unique(struct udevice
*check_dev
,
253 const char *check_name
)
255 struct dm_regulator_uclass_platdata
*uc_pdata
;
257 int check_len
= strlen(check_name
);
261 for (ret
= uclass_find_first_device(UCLASS_REGULATOR
, &dev
); dev
;
262 ret
= uclass_find_next_device(&dev
)) {
263 if (ret
|| dev
== check_dev
)
266 uc_pdata
= dev_get_uclass_platdata(dev
);
267 len
= strlen(uc_pdata
->name
);
268 if (len
!= check_len
)
271 if (!strcmp(uc_pdata
->name
, check_name
))
278 static int regulator_post_bind(struct udevice
*dev
)
280 struct dm_regulator_uclass_platdata
*uc_pdata
;
281 int offset
= dev_of_offset(dev
);
282 const void *blob
= gd
->fdt_blob
;
283 const char *property
= "regulator-name";
285 uc_pdata
= dev_get_uclass_platdata(dev
);
289 /* Regulator's mandatory constraint */
290 uc_pdata
->name
= fdt_getprop(blob
, offset
, property
, NULL
);
291 if (!uc_pdata
->name
) {
292 debug("%s: dev: %s has no property 'regulator-name'\n",
293 __func__
, dev
->name
);
294 uc_pdata
->name
= fdt_get_name(blob
, offset
, NULL
);
299 if (regulator_name_is_unique(dev
, uc_pdata
->name
))
302 debug("\"%s\" of dev: \"%s\", has nonunique value: \"%s\"",
303 property
, dev
->name
, uc_pdata
->name
);
308 static int regulator_pre_probe(struct udevice
*dev
)
310 struct dm_regulator_uclass_platdata
*uc_pdata
;
311 int offset
= dev_of_offset(dev
);
313 uc_pdata
= dev_get_uclass_platdata(dev
);
317 /* Regulator's optional constraints */
318 uc_pdata
->min_uV
= fdtdec_get_int(gd
->fdt_blob
, offset
,
319 "regulator-min-microvolt", -ENODATA
);
320 uc_pdata
->max_uV
= fdtdec_get_int(gd
->fdt_blob
, offset
,
321 "regulator-max-microvolt", -ENODATA
);
322 uc_pdata
->min_uA
= fdtdec_get_int(gd
->fdt_blob
, offset
,
323 "regulator-min-microamp", -ENODATA
);
324 uc_pdata
->max_uA
= fdtdec_get_int(gd
->fdt_blob
, offset
,
325 "regulator-max-microamp", -ENODATA
);
326 uc_pdata
->always_on
= fdtdec_get_bool(gd
->fdt_blob
, offset
,
327 "regulator-always-on");
328 uc_pdata
->boot_on
= fdtdec_get_bool(gd
->fdt_blob
, offset
,
329 "regulator-boot-on");
331 /* Those values are optional (-ENODATA if unset) */
332 if ((uc_pdata
->min_uV
!= -ENODATA
) &&
333 (uc_pdata
->max_uV
!= -ENODATA
) &&
334 (uc_pdata
->min_uV
== uc_pdata
->max_uV
))
335 uc_pdata
->flags
|= REGULATOR_FLAG_AUTOSET_UV
;
337 /* Those values are optional (-ENODATA if unset) */
338 if ((uc_pdata
->min_uA
!= -ENODATA
) &&
339 (uc_pdata
->max_uA
!= -ENODATA
) &&
340 (uc_pdata
->min_uA
== uc_pdata
->max_uA
))
341 uc_pdata
->flags
|= REGULATOR_FLAG_AUTOSET_UA
;
346 int regulators_enable_boot_on(bool verbose
)
352 ret
= uclass_get(UCLASS_REGULATOR
, &uc
);
355 for (uclass_first_device(UCLASS_REGULATOR
, &dev
);
357 uclass_next_device(&dev
)) {
358 ret
= regulator_autoset(dev
);
359 if (ret
== -EMEDIUMTYPE
) {
364 regulator_show(dev
, ret
);
372 UCLASS_DRIVER(regulator
) = {
373 .id
= UCLASS_REGULATOR
,
375 .post_bind
= regulator_post_bind
,
376 .pre_probe
= regulator_pre_probe
,
377 .per_device_platdata_auto_alloc_size
=
378 sizeof(struct dm_regulator_uclass_platdata
),