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 int 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
)) {
150 debug("regulator %s, ret=%d\n", dev
->name
, ret
);
154 uc_pdata
= dev_get_uclass_platdata(dev
);
155 if (!uc_pdata
|| strcmp(plat_name
, uc_pdata
->name
))
158 return uclass_get_device_tail(dev
, 0, devp
);
161 debug("%s: can't find: %s, ret=%d\n", __func__
, plat_name
, ret
);
166 int regulator_get_by_devname(const char *devname
, struct udevice
**devp
)
168 return uclass_get_device_by_name(UCLASS_REGULATOR
, devname
, devp
);
171 int device_get_supply_regulator(struct udevice
*dev
, const char *supply_name
,
172 struct udevice
**devp
)
174 return uclass_get_device_by_phandle(UCLASS_REGULATOR
, dev
,
178 int regulator_autoset(struct udevice
*dev
)
180 struct dm_regulator_uclass_platdata
*uc_pdata
;
183 uc_pdata
= dev_get_uclass_platdata(dev
);
184 if (!uc_pdata
->always_on
&& !uc_pdata
->boot_on
)
187 if (uc_pdata
->flags
& REGULATOR_FLAG_AUTOSET_UV
)
188 ret
= regulator_set_value(dev
, uc_pdata
->min_uV
);
189 if (!ret
&& (uc_pdata
->flags
& REGULATOR_FLAG_AUTOSET_UA
))
190 ret
= regulator_set_current(dev
, uc_pdata
->min_uA
);
193 ret
= regulator_set_enable(dev
, true);
198 static void regulator_show(struct udevice
*dev
, int ret
)
200 struct dm_regulator_uclass_platdata
*uc_pdata
;
202 uc_pdata
= dev_get_uclass_platdata(dev
);
204 printf("%s@%s: ", dev
->name
, uc_pdata
->name
);
205 if (uc_pdata
->flags
& REGULATOR_FLAG_AUTOSET_UV
)
206 printf("set %d uV", uc_pdata
->min_uV
);
207 if (uc_pdata
->flags
& REGULATOR_FLAG_AUTOSET_UA
)
208 printf("; set %d uA", uc_pdata
->min_uA
);
209 printf("; enabling");
211 printf(" (ret: %d)", ret
);
215 int regulator_autoset_by_name(const char *platname
, struct udevice
**devp
)
220 ret
= regulator_get_by_platname(platname
, &dev
);
224 debug("Can get the regulator: %s (err=%d)\n", platname
, ret
);
228 return regulator_autoset(dev
);
231 int regulator_list_autoset(const char *list_platname
[],
232 struct udevice
*list_devp
[],
236 int error
= 0, i
= 0, ret
;
238 while (list_platname
[i
]) {
239 ret
= regulator_autoset_by_name(list_platname
[i
], &dev
);
240 if (ret
!= -EMEDIUMTYPE
&& verbose
)
241 regulator_show(dev
, ret
);
254 static bool regulator_name_is_unique(struct udevice
*check_dev
,
255 const char *check_name
)
257 struct dm_regulator_uclass_platdata
*uc_pdata
;
259 int check_len
= strlen(check_name
);
263 for (ret
= uclass_find_first_device(UCLASS_REGULATOR
, &dev
); dev
;
264 ret
= uclass_find_next_device(&dev
)) {
265 if (ret
|| dev
== check_dev
)
268 uc_pdata
= dev_get_uclass_platdata(dev
);
269 len
= strlen(uc_pdata
->name
);
270 if (len
!= check_len
)
273 if (!strcmp(uc_pdata
->name
, check_name
))
280 static int regulator_post_bind(struct udevice
*dev
)
282 struct dm_regulator_uclass_platdata
*uc_pdata
;
283 const char *property
= "regulator-name";
285 uc_pdata
= dev_get_uclass_platdata(dev
);
287 /* Regulator's mandatory constraint */
288 uc_pdata
->name
= dev_read_string(dev
, property
);
289 if (!uc_pdata
->name
) {
290 debug("%s: dev '%s' has no property '%s'\n",
291 __func__
, dev
->name
, property
);
292 uc_pdata
->name
= dev_read_name(dev
);
297 if (regulator_name_is_unique(dev
, uc_pdata
->name
))
300 debug("'%s' of dev: '%s', has nonunique value: '%s\n",
301 property
, dev
->name
, uc_pdata
->name
);
306 static int regulator_pre_probe(struct udevice
*dev
)
308 struct dm_regulator_uclass_platdata
*uc_pdata
;
310 uc_pdata
= dev_get_uclass_platdata(dev
);
314 /* Regulator's optional constraints */
315 uc_pdata
->min_uV
= dev_read_u32_default(dev
, "regulator-min-microvolt",
317 uc_pdata
->max_uV
= dev_read_u32_default(dev
, "regulator-max-microvolt",
319 uc_pdata
->min_uA
= dev_read_u32_default(dev
, "regulator-min-microamp",
321 uc_pdata
->max_uA
= dev_read_u32_default(dev
, "regulator-max-microamp",
323 uc_pdata
->always_on
= dev_read_bool(dev
, "regulator-always-on");
324 uc_pdata
->boot_on
= dev_read_bool(dev
, "regulator-boot-on");
326 /* Those values are optional (-ENODATA if unset) */
327 if ((uc_pdata
->min_uV
!= -ENODATA
) &&
328 (uc_pdata
->max_uV
!= -ENODATA
) &&
329 (uc_pdata
->min_uV
== uc_pdata
->max_uV
))
330 uc_pdata
->flags
|= REGULATOR_FLAG_AUTOSET_UV
;
332 /* Those values are optional (-ENODATA if unset) */
333 if ((uc_pdata
->min_uA
!= -ENODATA
) &&
334 (uc_pdata
->max_uA
!= -ENODATA
) &&
335 (uc_pdata
->min_uA
== uc_pdata
->max_uA
))
336 uc_pdata
->flags
|= REGULATOR_FLAG_AUTOSET_UA
;
341 int regulators_enable_boot_on(bool verbose
)
347 ret
= uclass_get(UCLASS_REGULATOR
, &uc
);
350 for (uclass_first_device(UCLASS_REGULATOR
, &dev
);
352 uclass_next_device(&dev
)) {
353 ret
= regulator_autoset(dev
);
354 if (ret
== -EMEDIUMTYPE
) {
359 regulator_show(dev
, ret
);
367 UCLASS_DRIVER(regulator
) = {
368 .id
= UCLASS_REGULATOR
,
370 .post_bind
= regulator_post_bind
,
371 .pre_probe
= regulator_pre_probe
,
372 .per_device_platdata_auto_alloc_size
=
373 sizeof(struct dm_regulator_uclass_platdata
),