1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (C) 2014-2015 Samsung Electronics
4 * Przemyslaw Marczak <p.marczak@samsung.com>
5 */
6
7#define LOG_CATEGORY UCLASS_REGULATOR
8
9#include <common.h>
10#include <errno.h>
11#include <dm.h>
12#include <log.h>
13#include <dm/uclass-internal.h>
14#include <linux/delay.h>
15#include <power/pmic.h>
16#include <power/regulator.h>
17
18int regulator_mode(struct udevice *dev, struct dm_regulator_mode **modep)
19{
20	struct dm_regulator_uclass_plat *uc_pdata;
21
22	*modep = NULL;
23
24	uc_pdata = dev_get_uclass_plat(dev);
25	if (!uc_pdata)
26		return -ENXIO;
27
28	*modep = uc_pdata->mode;
29	return uc_pdata->mode_count;
30}
31
32int regulator_get_value(struct udevice *dev)
33{
34	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
35
36	if (!ops || !ops->get_value)
37		return -ENOSYS;
38
39	return ops->get_value(dev);
40}
41
42static void regulator_set_value_ramp_delay(struct udevice *dev, int old_uV,
43					   int new_uV, unsigned int ramp_delay)
44{
45	int delay = DIV_ROUND_UP(abs(new_uV - old_uV), ramp_delay);
46
47	debug("regulator %s: delay %u us (%d uV -> %d uV)\n", dev->name, delay,
48	      old_uV, new_uV);
49
50	udelay(delay);
51}
52
53int regulator_set_value(struct udevice *dev, int uV)
54{
55	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
56	struct dm_regulator_uclass_plat *uc_pdata;
57	int ret, old_uV = uV, is_enabled = 0;
58
59	uc_pdata = dev_get_uclass_plat(dev);
60	if (uc_pdata->min_uV != -ENODATA && uV < uc_pdata->min_uV)
61		return -EINVAL;
62	if (uc_pdata->max_uV != -ENODATA && uV > uc_pdata->max_uV)
63		return -EINVAL;
64
65	if (!ops || !ops->set_value)
66		return -ENOSYS;
67
68	if (uc_pdata->ramp_delay) {
69		is_enabled = regulator_get_enable(dev);
70		old_uV = regulator_get_value(dev);
71	}
72
73	ret = ops->set_value(dev, uV);
74
75	if (!ret) {
76		if (uc_pdata->ramp_delay && old_uV > 0 && is_enabled)
77			regulator_set_value_ramp_delay(dev, old_uV, uV,
78						       uc_pdata->ramp_delay);
79	}
80
81	return ret;
82}
83
84int regulator_set_suspend_value(struct udevice *dev, int uV)
85{
86	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
87	struct dm_regulator_uclass_plat *uc_pdata;
88
89	uc_pdata = dev_get_uclass_plat(dev);
90	if (uc_pdata->min_uV != -ENODATA && uV < uc_pdata->min_uV)
91		return -EINVAL;
92	if (uc_pdata->max_uV != -ENODATA && uV > uc_pdata->max_uV)
93		return -EINVAL;
94
95	if (!ops->set_suspend_value)
96		return -ENOSYS;
97
98	return ops->set_suspend_value(dev, uV);
99}
100
101int regulator_get_suspend_value(struct udevice *dev)
102{
103	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
104
105	if (!ops->get_suspend_value)
106		return -ENOSYS;
107
108	return ops->get_suspend_value(dev);
109}
110
111/*
112 * To be called with at most caution as there is no check
113 * before setting the actual voltage value.
114 */
115int regulator_set_value_force(struct udevice *dev, int uV)
116{
117	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
118
119	if (!ops || !ops->set_value)
120		return -ENOSYS;
121
122	return ops->set_value(dev, uV);
123}
124
125int regulator_get_current(struct udevice *dev)
126{
127	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
128
129	if (!ops || !ops->get_current)
130		return -ENOSYS;
131
132	return ops->get_current(dev);
133}
134
135int regulator_set_current(struct udevice *dev, int uA)
136{
137	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
138	struct dm_regulator_uclass_plat *uc_pdata;
139
140	uc_pdata = dev_get_uclass_plat(dev);
141	if (uc_pdata->min_uA != -ENODATA && uA < uc_pdata->min_uA)
142		return -EINVAL;
143	if (uc_pdata->max_uA != -ENODATA && uA > uc_pdata->max_uA)
144		return -EINVAL;
145
146	if (!ops || !ops->set_current)
147		return -ENOSYS;
148
149	return ops->set_current(dev, uA);
150}
151
152int regulator_get_enable(struct udevice *dev)
153{
154	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
155
156	if (!ops || !ops->get_enable)
157		return -ENOSYS;
158
159	return ops->get_enable(dev);
160}
161
162int regulator_set_enable(struct udevice *dev, bool enable)
163{
164	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
165	struct dm_regulator_uclass_plat *uc_pdata;
166	int ret, old_enable = 0;
167
168	if (!ops || !ops->set_enable)
169		return -ENOSYS;
170
171	uc_pdata = dev_get_uclass_plat(dev);
172	if (!enable && uc_pdata->always_on)
173		return -EACCES;
174
175	if (uc_pdata->ramp_delay)
176		old_enable = regulator_get_enable(dev);
177
178	ret = ops->set_enable(dev, enable);
179	if (!ret) {
180		if (uc_pdata->ramp_delay && !old_enable && enable) {
181			int uV = regulator_get_value(dev);
182
183			if (uV > 0) {
184				regulator_set_value_ramp_delay(dev, 0, uV,
185							       uc_pdata->ramp_delay);
186			}
187		}
188	}
189
190	return ret;
191}
192
193int regulator_set_enable_if_allowed(struct udevice *dev, bool enable)
194{
195	int ret;
196
197	ret = regulator_set_enable(dev, enable);
198	if (ret == -ENOSYS || ret == -EACCES)
199		return 0;
200	/* if we want to disable but it's in use by someone else */
201	if (!enable && ret == -EBUSY)
202		return 0;
203	/* if it's already enabled/disabled */
204	if (ret == -EALREADY)
205		return 0;
206
207	return ret;
208}
209
210int regulator_set_suspend_enable(struct udevice *dev, bool enable)
211{
212	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
213
214	if (!ops->set_suspend_enable)
215		return -ENOSYS;
216
217	return ops->set_suspend_enable(dev, enable);
218}
219
220int regulator_get_suspend_enable(struct udevice *dev)
221{
222	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
223
224	if (!ops->get_suspend_enable)
225		return -ENOSYS;
226
227	return ops->get_suspend_enable(dev);
228}
229
230int regulator_get_mode(struct udevice *dev)
231{
232	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
233
234	if (!ops || !ops->get_mode)
235		return -ENOSYS;
236
237	return ops->get_mode(dev);
238}
239
240int regulator_set_mode(struct udevice *dev, int mode)
241{
242	const struct dm_regulator_ops *ops = dev_get_driver_ops(dev);
243
244	if (!ops || !ops->set_mode)
245		return -ENOSYS;
246
247	return ops->set_mode(dev, mode);
248}
249
250int regulator_get_by_platname(const char *plat_name, struct udevice **devp)
251{
252	struct dm_regulator_uclass_plat *uc_pdata;
253	struct udevice *dev;
254	int ret;
255
256	*devp = NULL;
257
258	for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev;
259	     ret = uclass_find_next_device(&dev)) {
260		if (ret) {
261			debug("regulator %s, ret=%d\n", dev->name, ret);
262			continue;
263		}
264
265		uc_pdata = dev_get_uclass_plat(dev);
266		if (!uc_pdata || strcmp(plat_name, uc_pdata->name))
267			continue;
268
269		return uclass_get_device_tail(dev, 0, devp);
270	}
271
272	debug("%s: can't find: %s, ret=%d\n", __func__, plat_name, ret);
273
274	return -ENODEV;
275}
276
277int regulator_get_by_devname(const char *devname, struct udevice **devp)
278{
279	return uclass_get_device_by_name(UCLASS_REGULATOR, devname, devp);
280}
281
282int device_get_supply_regulator(struct udevice *dev, const char *supply_name,
283				struct udevice **devp)
284{
285	return uclass_get_device_by_phandle(UCLASS_REGULATOR, dev,
286					    supply_name, devp);
287}
288
289int regulator_autoset(struct udevice *dev)
290{
291	struct dm_regulator_uclass_plat *uc_pdata;
292	int ret = 0;
293
294	uc_pdata = dev_get_uclass_plat(dev);
295
296	if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_DONE)
297		return -EALREADY;
298
299	ret = regulator_set_suspend_enable(dev, uc_pdata->suspend_on);
300	if (ret == -ENOSYS)
301		ret = 0;
302
303	if (!ret && uc_pdata->suspend_on) {
304		ret = regulator_set_suspend_value(dev, uc_pdata->suspend_uV);
305		if (ret == -ENOSYS)
306			ret = 0;
307
308		if (ret)
309			return ret;
310	}
311
312	if (!uc_pdata->always_on && !uc_pdata->boot_on) {
313		ret = -EMEDIUMTYPE;
314		goto out;
315	}
316
317	if (uc_pdata->type == REGULATOR_TYPE_FIXED) {
318		ret = regulator_set_enable(dev, true);
319		goto out;
320	}
321
322	if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UV)
323		ret = regulator_set_value(dev, uc_pdata->min_uV);
324	if (uc_pdata->init_uV > 0)
325		ret = regulator_set_value(dev, uc_pdata->init_uV);
326	if (!ret && (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UA))
327		ret = regulator_set_current(dev, uc_pdata->min_uA);
328
329	if (!ret)
330		ret = regulator_set_enable(dev, true);
331
332out:
333	uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_DONE;
334
335	return ret;
336}
337
338int regulator_unset(struct udevice *dev)
339{
340	struct dm_regulator_uclass_plat *uc_pdata;
341
342	uc_pdata = dev_get_uclass_plat(dev);
343	if (uc_pdata && uc_pdata->force_off)
344		return regulator_set_enable(dev, false);
345
346	return -EMEDIUMTYPE;
347}
348
349static void regulator_show(struct udevice *dev, int ret)
350{
351	struct dm_regulator_uclass_plat *uc_pdata;
352
353	uc_pdata = dev_get_uclass_plat(dev);
354
355	printf("%s@%s: ", dev->name, uc_pdata->name);
356	if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UV)
357		printf("set %d uV", uc_pdata->min_uV);
358	if (uc_pdata->flags & REGULATOR_FLAG_AUTOSET_UA)
359		printf("; set %d uA", uc_pdata->min_uA);
360	printf("; enabling");
361	if (ret)
362		printf(" (ret: %d)", ret);
363	printf("\n");
364}
365
366int regulator_autoset_by_name(const char *platname, struct udevice **devp)
367{
368	struct udevice *dev;
369	int ret;
370
371	ret = regulator_get_by_platname(platname, &dev);
372	if (devp)
373		*devp = dev;
374	if (ret) {
375		debug("Can get the regulator: %s (err=%d)\n", platname, ret);
376		return ret;
377	}
378
379	return regulator_autoset(dev);
380}
381
382int regulator_list_autoset(const char *list_platname[],
383			   struct udevice *list_devp[],
384			   bool verbose)
385{
386	struct udevice *dev;
387	int error = 0, i = 0, ret;
388
389	while (list_platname[i]) {
390		ret = regulator_autoset_by_name(list_platname[i], &dev);
391		if (ret != -EMEDIUMTYPE && verbose)
392			regulator_show(dev, ret);
393		if (ret & !error)
394			error = ret;
395
396		if (list_devp)
397			list_devp[i] = dev;
398
399		i++;
400	}
401
402	return error;
403}
404
405static bool regulator_name_is_unique(struct udevice *check_dev,
406				     const char *check_name)
407{
408	struct dm_regulator_uclass_plat *uc_pdata;
409	struct udevice *dev;
410	int check_len = strlen(check_name);
411	int ret;
412	int len;
413
414	for (ret = uclass_find_first_device(UCLASS_REGULATOR, &dev); dev;
415	     ret = uclass_find_next_device(&dev)) {
416		if (ret || dev == check_dev)
417			continue;
418
419		uc_pdata = dev_get_uclass_plat(dev);
420		len = strlen(uc_pdata->name);
421		if (len != check_len)
422			continue;
423
424		if (!strcmp(uc_pdata->name, check_name))
425			return false;
426	}
427
428	return true;
429}
430
431static int regulator_post_bind(struct udevice *dev)
432{
433	struct dm_regulator_uclass_plat *uc_pdata;
434	const char *property = "regulator-name";
435
436	uc_pdata = dev_get_uclass_plat(dev);
437
438	/* Regulator's mandatory constraint */
439	uc_pdata->name = dev_read_string(dev, property);
440	if (!uc_pdata->name) {
441		debug("%s: dev '%s' has no property '%s'\n",
442		      __func__, dev->name, property);
443		uc_pdata->name = dev_read_name(dev);
444		if (!uc_pdata->name)
445			return -EINVAL;
446	}
447
448	if (regulator_name_is_unique(dev, uc_pdata->name))
449		return 0;
450
451	debug("'%s' of dev: '%s', has nonunique value: '%s\n",
452	      property, dev->name, uc_pdata->name);
453
454	return -EINVAL;
455}
456
457static int regulator_pre_probe(struct udevice *dev)
458{
459	struct dm_regulator_uclass_plat *uc_pdata;
460	ofnode node;
461
462	uc_pdata = dev_get_uclass_plat(dev);
463	if (!uc_pdata)
464		return -ENXIO;
465
466	/* Regulator's optional constraints */
467	uc_pdata->min_uV = dev_read_u32_default(dev, "regulator-min-microvolt",
468						-ENODATA);
469	uc_pdata->max_uV = dev_read_u32_default(dev, "regulator-max-microvolt",
470						-ENODATA);
471	uc_pdata->init_uV = dev_read_u32_default(dev, "regulator-init-microvolt",
472						 -ENODATA);
473	uc_pdata->min_uA = dev_read_u32_default(dev, "regulator-min-microamp",
474						-ENODATA);
475	uc_pdata->max_uA = dev_read_u32_default(dev, "regulator-max-microamp",
476						-ENODATA);
477	uc_pdata->always_on = dev_read_bool(dev, "regulator-always-on");
478	uc_pdata->boot_on = dev_read_bool(dev, "regulator-boot-on");
479	uc_pdata->ramp_delay = dev_read_u32_default(dev, "regulator-ramp-delay",
480						    0);
481	uc_pdata->force_off = dev_read_bool(dev, "regulator-force-boot-off");
482
483	node = dev_read_subnode(dev, "regulator-state-mem");
484	if (ofnode_valid(node)) {
485		uc_pdata->suspend_on = !ofnode_read_bool(node, "regulator-off-in-suspend");
486		if (ofnode_read_u32(node, "regulator-suspend-microvolt", &uc_pdata->suspend_uV))
487			uc_pdata->suspend_uV = uc_pdata->max_uV;
488	} else {
489		uc_pdata->suspend_on = true;
490		uc_pdata->suspend_uV = uc_pdata->max_uV;
491	}
492
493	/* Those values are optional (-ENODATA if unset) */
494	if ((uc_pdata->min_uV != -ENODATA) &&
495	    (uc_pdata->max_uV != -ENODATA) &&
496	    (uc_pdata->min_uV == uc_pdata->max_uV))
497		uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_UV;
498
499	/* Those values are optional (-ENODATA if unset) */
500	if ((uc_pdata->min_uA != -ENODATA) &&
501	    (uc_pdata->max_uA != -ENODATA) &&
502	    (uc_pdata->min_uA == uc_pdata->max_uA))
503		uc_pdata->flags |= REGULATOR_FLAG_AUTOSET_UA;
504
505	return 0;
506}
507
508int regulators_enable_boot_on(bool verbose)
509{
510	struct udevice *dev;
511	struct uclass *uc;
512	int ret;
513
514	ret = uclass_get(UCLASS_REGULATOR, &uc);
515	if (ret)
516		return ret;
517	for (uclass_first_device(UCLASS_REGULATOR, &dev);
518	     dev;
519	     uclass_next_device(&dev)) {
520		ret = regulator_autoset(dev);
521		if (ret == -EMEDIUMTYPE) {
522			ret = 0;
523			continue;
524		}
525		if (verbose)
526			regulator_show(dev, ret);
527		if (ret == -ENOSYS)
528			ret = 0;
529	}
530
531	return ret;
532}
533
534int regulators_enable_boot_off(bool verbose)
535{
536	struct udevice *dev;
537	struct uclass *uc;
538	int ret;
539
540	ret = uclass_get(UCLASS_REGULATOR, &uc);
541	if (ret)
542		return ret;
543	for (uclass_first_device(UCLASS_REGULATOR, &dev);
544	     dev;
545	     uclass_next_device(&dev)) {
546		ret = regulator_unset(dev);
547		if (ret == -EMEDIUMTYPE) {
548			ret = 0;
549			continue;
550		}
551		if (verbose)
552			regulator_show(dev, ret);
553		if (ret == -ENOSYS)
554			ret = 0;
555	}
556
557	return ret;
558}
559
560UCLASS_DRIVER(regulator) = {
561	.id		= UCLASS_REGULATOR,
562	.name		= "regulator",
563	.post_bind	= regulator_post_bind,
564	.pre_probe	= regulator_pre_probe,
565	.per_device_plat_auto	= sizeof(struct dm_regulator_uclass_plat),
566};
567