1 /*
2  *  Copyright (C) 2012-2015 Samsung Electronics
3  *
4  *  Rajeshwari Shinde <rajeshwari.s@samsung.com>
5  *  Przemyslaw Marczak <p.marczak@samsung.com>
6  *
7  * SPDX-License-Identifier:	GPL-2.0+
8  */
9 
10 #include <common.h>
11 #include <fdtdec.h>
12 #include <errno.h>
13 #include <dm.h>
14 #include <i2c.h>
15 #include <power/pmic.h>
16 #include <power/regulator.h>
17 #include <power/max77686_pmic.h>
18 
19 DECLARE_GLOBAL_DATA_PTR;
20 
21 #define MODE(_id, _val, _name) { \
22 	.id = _id, \
23 	.register_value = _val, \
24 	.name = _name, \
25 }
26 
27 /* LDO: 1,3,4,5,9,17,18,19,20,21,22,23,24,26,26,27 */
28 static struct dm_regulator_mode max77686_ldo_mode_standby1[] = {
29 	MODE(OPMODE_OFF, MAX77686_LDO_MODE_OFF, "OFF"),
30 	MODE(OPMODE_LPM, MAX77686_LDO_MODE_LPM, "LPM"),
31 	MODE(OPMODE_STANDBY_LPM, MAX77686_LDO_MODE_STANDBY_LPM, "ON/LPM"),
32 	MODE(OPMODE_ON, MAX77686_LDO_MODE_ON, "ON"),
33 };
34 
35 /* LDO: 2,6,7,8,10,11,12,14,15,16 */
36 static struct dm_regulator_mode max77686_ldo_mode_standby2[] = {
37 	MODE(OPMODE_OFF, MAX77686_LDO_MODE_OFF, "OFF"),
38 	MODE(OPMODE_STANDBY, MAX77686_LDO_MODE_STANDBY, "ON/OFF"),
39 	MODE(OPMODE_STANDBY_LPM, MAX77686_LDO_MODE_STANDBY_LPM, "ON/LPM"),
40 	MODE(OPMODE_ON, MAX77686_LDO_MODE_ON, "ON"),
41 };
42 
43 /* Buck: 1 */
44 static struct dm_regulator_mode max77686_buck_mode_standby[] = {
45 	MODE(OPMODE_OFF, MAX77686_BUCK_MODE_OFF, "OFF"),
46 	MODE(OPMODE_STANDBY, MAX77686_BUCK_MODE_STANDBY, "ON/OFF"),
47 	MODE(OPMODE_ON, MAX77686_BUCK_MODE_ON, "ON"),
48 };
49 
50 /* Buck: 2,3,4 */
51 static struct dm_regulator_mode max77686_buck_mode_lpm[] = {
52 	MODE(OPMODE_OFF, MAX77686_BUCK_MODE_OFF, "OFF"),
53 	MODE(OPMODE_STANDBY, MAX77686_BUCK_MODE_STANDBY, "ON/OFF"),
54 	MODE(OPMODE_LPM, MAX77686_BUCK_MODE_LPM, "LPM"),
55 	MODE(OPMODE_ON, MAX77686_BUCK_MODE_ON, "ON"),
56 };
57 
58 /* Buck: 5,6,7,8,9 */
59 static struct dm_regulator_mode max77686_buck_mode_onoff[] = {
60 	MODE(OPMODE_OFF, MAX77686_BUCK_MODE_OFF, "OFF"),
61 	MODE(OPMODE_ON, MAX77686_BUCK_MODE_ON, "ON"),
62 };
63 
64 static const char max77686_buck_addr[] = {
65 	0xff, 0x10, 0x12, 0x1c, 0x26, 0x30, 0x32, 0x34, 0x36, 0x38
66 };
67 
68 static int max77686_buck_volt2hex(int buck, int uV)
69 {
70 	unsigned int hex = 0;
71 	unsigned int hex_max = 0;
72 
73 	switch (buck) {
74 	case 2:
75 	case 3:
76 	case 4:
77 		/* hex = (uV - 600000) / 12500; */
78 		hex = (uV - MAX77686_BUCK_UV_LMIN) / MAX77686_BUCK_UV_LSTEP;
79 		hex_max = MAX77686_BUCK234_VOLT_MAX_HEX;
80 		/**
81 		 * Those use voltage scaller - temporary not implemented
82 		 * so return just 0
83 		 */
84 		return -ENOSYS;
85 	default:
86 		/* hex = (uV - 750000) / 50000; */
87 		hex = (uV - MAX77686_BUCK_UV_HMIN) / MAX77686_BUCK_UV_HSTEP;
88 		hex_max = MAX77686_BUCK_VOLT_MAX_HEX;
89 		break;
90 	}
91 
92 	if (hex >= 0 && hex <= hex_max)
93 		return hex;
94 
95 	error("Value: %d uV is wrong for BUCK%d", uV, buck);
96 	return -EINVAL;
97 }
98 
99 static int max77686_buck_hex2volt(int buck, int hex)
100 {
101 	unsigned uV = 0;
102 	unsigned int hex_max = 0;
103 
104 	if (hex < 0)
105 		goto bad_hex;
106 
107 	switch (buck) {
108 	case 2:
109 	case 3:
110 	case 4:
111 		hex_max = MAX77686_BUCK234_VOLT_MAX_HEX;
112 		if (hex > hex_max)
113 			goto bad_hex;
114 
115 		/* uV = hex * 12500 + 600000; */
116 		uV = hex * MAX77686_BUCK_UV_LSTEP + MAX77686_BUCK_UV_LMIN;
117 		break;
118 	default:
119 		hex_max = MAX77686_BUCK_VOLT_MAX_HEX;
120 		if (hex > hex_max)
121 			goto bad_hex;
122 
123 		/* uV = hex * 50000 + 750000; */
124 		uV = hex * MAX77686_BUCK_UV_HSTEP + MAX77686_BUCK_UV_HMIN;
125 		break;
126 	}
127 
128 	return uV;
129 
130 bad_hex:
131 	error("Value: %#x is wrong for BUCK%d", hex, buck);
132 	return -EINVAL;
133 }
134 
135 static int max77686_ldo_volt2hex(int ldo, int uV)
136 {
137 	unsigned int hex = 0;
138 
139 	switch (ldo) {
140 	case 1:
141 	case 2:
142 	case 6:
143 	case 7:
144 	case 8:
145 	case 15:
146 		hex = (uV - MAX77686_LDO_UV_MIN) / MAX77686_LDO_UV_LSTEP;
147 		/* hex = (uV - 800000) / 25000; */
148 		break;
149 	default:
150 		hex = (uV - MAX77686_LDO_UV_MIN) / MAX77686_LDO_UV_HSTEP;
151 		/* hex = (uV - 800000) / 50000; */
152 	}
153 
154 	if (hex >= 0 && hex <= MAX77686_LDO_VOLT_MAX_HEX)
155 		return hex;
156 
157 	error("Value: %d uV is wrong for LDO%d", uV, ldo);
158 	return -EINVAL;
159 }
160 
161 static int max77686_ldo_hex2volt(int ldo, int hex)
162 {
163 	unsigned int uV = 0;
164 
165 	if (hex > MAX77686_LDO_VOLT_MAX_HEX)
166 		goto bad_hex;
167 
168 	switch (ldo) {
169 	case 1:
170 	case 2:
171 	case 6:
172 	case 7:
173 	case 8:
174 	case 15:
175 		/* uV = hex * 25000 + 800000; */
176 		uV = hex * MAX77686_LDO_UV_LSTEP + MAX77686_LDO_UV_MIN;
177 		break;
178 	default:
179 		/* uV = hex * 50000 + 800000; */
180 		uV = hex * MAX77686_LDO_UV_HSTEP + MAX77686_LDO_UV_MIN;
181 	}
182 
183 	return uV;
184 
185 bad_hex:
186 	error("Value: %#x is wrong for ldo%d", hex, ldo);
187 	return -EINVAL;
188 }
189 
190 static int max77686_ldo_hex2mode(int ldo, int hex)
191 {
192 	if (hex > MAX77686_LDO_MODE_MASK)
193 		return -EINVAL;
194 
195 	switch (hex) {
196 	case MAX77686_LDO_MODE_OFF:
197 		return OPMODE_OFF;
198 	case MAX77686_LDO_MODE_LPM: /* == MAX77686_LDO_MODE_STANDBY: */
199 		/* The same mode values but different meaning for each ldo */
200 		switch (ldo) {
201 		case 2:
202 		case 6:
203 		case 7:
204 		case 8:
205 		case 10:
206 		case 11:
207 		case 12:
208 		case 14:
209 		case 15:
210 		case 16:
211 			return OPMODE_STANDBY;
212 		default:
213 			return OPMODE_LPM;
214 		}
215 	case MAX77686_LDO_MODE_STANDBY_LPM:
216 		return OPMODE_STANDBY_LPM;
217 	case MAX77686_LDO_MODE_ON:
218 		return OPMODE_ON;
219 	default:
220 		return -EINVAL;
221 	}
222 }
223 
224 static int max77686_buck_hex2mode(int buck, int hex)
225 {
226 	if (hex > MAX77686_BUCK_MODE_MASK)
227 		return -EINVAL;
228 
229 	switch (hex) {
230 	case MAX77686_BUCK_MODE_OFF:
231 		return OPMODE_OFF;
232 	case MAX77686_BUCK_MODE_ON:
233 		return OPMODE_ON;
234 	case MAX77686_BUCK_MODE_STANDBY:
235 		switch (buck) {
236 		case 1:
237 		case 2:
238 		case 3:
239 		case 4:
240 			return OPMODE_STANDBY;
241 		default:
242 			return -EINVAL;
243 		}
244 	case MAX77686_BUCK_MODE_LPM:
245 		switch (buck) {
246 		case 2:
247 		case 3:
248 		case 4:
249 			return OPMODE_LPM;
250 		default:
251 			return -EINVAL;
252 		}
253 	default:
254 		return -EINVAL;
255 	}
256 }
257 
258 static int max77686_buck_modes(int buck, struct dm_regulator_mode **modesp)
259 {
260 	int ret = -EINVAL;
261 
262 	if (buck < 1 || buck > MAX77686_BUCK_NUM)
263 		return ret;
264 
265 	switch (buck) {
266 	case 1:
267 		*modesp = max77686_buck_mode_standby;
268 		ret = ARRAY_SIZE(max77686_buck_mode_standby);
269 		break;
270 	case 2:
271 	case 3:
272 	case 4:
273 		*modesp = max77686_buck_mode_lpm;
274 		ret = ARRAY_SIZE(max77686_buck_mode_lpm);
275 		break;
276 	default:
277 		*modesp = max77686_buck_mode_onoff;
278 		ret = ARRAY_SIZE(max77686_buck_mode_onoff);
279 	}
280 
281 	return ret;
282 }
283 
284 static int max77686_ldo_modes(int ldo, struct dm_regulator_mode **modesp,
285 				struct udevice *dev)
286 {
287 	int ret = -EINVAL;
288 
289 	if (ldo < 1 || ldo > MAX77686_LDO_NUM)
290 		return ret;
291 
292 	switch (ldo) {
293 	case 2:
294 	case 6:
295 	case 7:
296 	case 8:
297 	case 10:
298 	case 11:
299 	case 12:
300 	case 14:
301 	case 15:
302 	case 16:
303 		*modesp = max77686_ldo_mode_standby2;
304 		ret = ARRAY_SIZE(max77686_ldo_mode_standby2);
305 		break;
306 	default:
307 		*modesp = max77686_ldo_mode_standby1;
308 		ret = ARRAY_SIZE(max77686_ldo_mode_standby1);
309 	}
310 
311 	return ret;
312 }
313 
314 static int max77686_ldo_val(struct udevice *dev, int op, int *uV)
315 {
316 	unsigned int ret, hex, adr;
317 	unsigned char val;
318 	int ldo;
319 
320 	if (op == PMIC_OP_GET)
321 		*uV = 0;
322 
323 	ldo = dev->driver_data;
324 	if (ldo < 1 || ldo > MAX77686_LDO_NUM) {
325 		error("Wrong ldo number: %d", ldo);
326 		return -EINVAL;
327 	}
328 
329 	adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
330 
331 	ret = pmic_read(dev->parent, adr, &val, 1);
332 	if (ret)
333 		return ret;
334 
335 	if (op == PMIC_OP_GET) {
336 		val &= MAX77686_LDO_VOLT_MASK;
337 		ret = max77686_ldo_hex2volt(ldo, val);
338 		if (ret < 0)
339 			return ret;
340 		*uV = ret;
341 		return 0;
342 	}
343 
344 	hex = max77686_ldo_volt2hex(ldo, *uV);
345 	if (hex < 0)
346 		return hex;
347 
348 	val &= ~MAX77686_LDO_VOLT_MASK;
349 	val |= hex;
350 	ret = pmic_write(dev->parent, adr, &val, 1);
351 
352 	return ret;
353 }
354 
355 static int max77686_buck_val(struct udevice *dev, int op, int *uV)
356 {
357 	unsigned int hex, ret, mask, adr;
358 	unsigned char val;
359 	int buck;
360 
361 	buck = dev->driver_data;
362 	if (buck < 1 || buck > MAX77686_BUCK_NUM) {
363 		error("Wrong buck number: %d", buck);
364 		return -EINVAL;
365 	}
366 
367 	if (op == PMIC_OP_GET)
368 		*uV = 0;
369 
370 	/* &buck_out = ctrl + 1 */
371 	adr = max77686_buck_addr[buck] + 1;
372 
373 	/* mask */
374 	switch (buck) {
375 	case 2:
376 	case 3:
377 	case 4:
378 		/* Those use voltage scallers - will support in the future */
379 		mask = MAX77686_BUCK234_VOLT_MASK;
380 		return -ENOSYS;
381 	default:
382 		mask = MAX77686_BUCK_VOLT_MASK;
383 	}
384 
385 	ret = pmic_read(dev->parent, adr, &val, 1);
386 	if (ret)
387 		return ret;
388 
389 	if (op == PMIC_OP_GET) {
390 		val &= mask;
391 		ret = max77686_buck_hex2volt(buck, val);
392 		if (ret < 0)
393 			return ret;
394 		*uV = ret;
395 		return 0;
396 	}
397 
398 	hex = max77686_buck_volt2hex(buck, *uV);
399 	if (hex < 0)
400 		return hex;
401 
402 	val &= ~mask;
403 	val |= hex;
404 	ret = pmic_write(dev->parent, adr, &val, 1);
405 
406 	return ret;
407 }
408 
409 static int max77686_ldo_mode(struct udevice *dev, int op, int *opmode)
410 {
411 	unsigned int ret, adr, mode;
412 	unsigned char val;
413 	int ldo;
414 
415 	if (op == PMIC_OP_GET)
416 		*opmode = -EINVAL;
417 
418 	ldo = dev->driver_data;
419 	if (ldo < 1 || ldo > MAX77686_LDO_NUM) {
420 		error("Wrong ldo number: %d", ldo);
421 		return -EINVAL;
422 	}
423 
424 	adr = MAX77686_REG_PMIC_LDO1CTRL1 + ldo - 1;
425 
426 	ret = pmic_read(dev->parent, adr, &val, 1);
427 	if (ret)
428 		return ret;
429 
430 	if (op == PMIC_OP_GET) {
431 		val &= MAX77686_LDO_MODE_MASK;
432 		ret = max77686_ldo_hex2mode(ldo, val);
433 		if (ret < 0)
434 			return ret;
435 		*opmode = ret;
436 		return 0;
437 	}
438 
439 	/* mode */
440 	switch (*opmode) {
441 	case OPMODE_OFF:
442 		mode = MAX77686_LDO_MODE_OFF;
443 		break;
444 	case OPMODE_LPM:
445 		switch (ldo) {
446 		case 2:
447 		case 6:
448 		case 7:
449 		case 8:
450 		case 10:
451 		case 11:
452 		case 12:
453 		case 14:
454 		case 15:
455 		case 16:
456 			return -EINVAL;
457 		default:
458 			mode = MAX77686_LDO_MODE_LPM;
459 		}
460 		break;
461 	case OPMODE_STANDBY:
462 		switch (ldo) {
463 		case 2:
464 		case 6:
465 		case 7:
466 		case 8:
467 		case 10:
468 		case 11:
469 		case 12:
470 		case 14:
471 		case 15:
472 		case 16:
473 			mode = MAX77686_LDO_MODE_STANDBY;
474 			break;
475 		default:
476 			return -EINVAL;
477 		}
478 		break;
479 	case OPMODE_STANDBY_LPM:
480 		mode = MAX77686_LDO_MODE_STANDBY_LPM;
481 		break;
482 	case OPMODE_ON:
483 		mode = MAX77686_LDO_MODE_ON;
484 		break;
485 	default:
486 		mode = 0xff;
487 	}
488 
489 	if (mode == 0xff) {
490 		error("Wrong mode: %d for ldo%d", *opmode, ldo);
491 		return -EINVAL;
492 	}
493 
494 	val &= ~MAX77686_LDO_MODE_MASK;
495 	val |= mode;
496 	ret = pmic_write(dev->parent, adr, &val, 1);
497 
498 	return ret;
499 }
500 
501 static int max77686_ldo_enable(struct udevice *dev, int op, bool *enable)
502 {
503 	int ret, on_off;
504 
505 	if (op == PMIC_OP_GET) {
506 		ret = max77686_ldo_mode(dev, op, &on_off);
507 		if (ret)
508 			return ret;
509 
510 		switch (on_off) {
511 		case OPMODE_OFF:
512 			*enable = 0;
513 			break;
514 		case OPMODE_ON:
515 			*enable = 1;
516 			break;
517 		default:
518 			return -EINVAL;
519 		}
520 	} else if (op == PMIC_OP_SET) {
521 		switch (*enable) {
522 		case 0:
523 			on_off = OPMODE_OFF;
524 			break;
525 		case 1:
526 			on_off = OPMODE_ON;
527 			break;
528 		default:
529 			return -EINVAL;
530 		}
531 
532 		ret = max77686_ldo_mode(dev, op, &on_off);
533 		if (ret)
534 			return ret;
535 	}
536 
537 	return 0;
538 }
539 
540 static int max77686_buck_mode(struct udevice *dev, int op, int *opmode)
541 {
542 	unsigned int ret, mask, adr, mode, mode_shift;
543 	unsigned char val;
544 	int buck;
545 
546 	buck = dev->driver_data;
547 	if (buck < 1 || buck > MAX77686_BUCK_NUM) {
548 		error("Wrong buck number: %d", buck);
549 		return -EINVAL;
550 	}
551 
552 	adr = max77686_buck_addr[buck];
553 
554 	/* mask */
555 	switch (buck) {
556 	case 2:
557 	case 3:
558 	case 4:
559 		mode_shift = MAX77686_BUCK_MODE_SHIFT_2;
560 		break;
561 	default:
562 		mode_shift = MAX77686_BUCK_MODE_SHIFT_1;
563 	}
564 
565 	mask = MAX77686_BUCK_MODE_MASK << mode_shift;
566 
567 	ret = pmic_read(dev->parent, adr, &val, 1);
568 	if (ret)
569 		return ret;
570 
571 	if (op == PMIC_OP_GET) {
572 		val &= mask;
573 		val >>= mode_shift;
574 		ret = max77686_buck_hex2mode(buck, val);
575 		if (ret < 0)
576 			return ret;
577 		*opmode = ret;
578 		return 0;
579 	}
580 
581 	/* mode */
582 	switch (*opmode) {
583 	case OPMODE_OFF:
584 		mode = MAX77686_BUCK_MODE_OFF;
585 		break;
586 	case OPMODE_STANDBY:
587 		switch (buck) {
588 		case 1:
589 		case 2:
590 		case 3:
591 		case 4:
592 			mode = MAX77686_BUCK_MODE_STANDBY << mode_shift;
593 			break;
594 		default:
595 			mode = 0xff;
596 		}
597 		break;
598 	case OPMODE_LPM:
599 		switch (buck) {
600 		case 2:
601 		case 3:
602 		case 4:
603 			mode = MAX77686_BUCK_MODE_LPM << mode_shift;
604 			break;
605 		default:
606 			mode = 0xff;
607 		}
608 		break;
609 	case OPMODE_ON:
610 		mode = MAX77686_BUCK_MODE_ON << mode_shift;
611 		break;
612 	default:
613 		mode = 0xff;
614 	}
615 
616 	if (mode == 0xff) {
617 		error("Wrong mode: %d for buck: %d\n", *opmode, buck);
618 		return -EINVAL;
619 	}
620 
621 	val &= ~mask;
622 	val |= mode;
623 	ret = pmic_write(dev->parent, adr, &val, 1);
624 
625 	return ret;
626 }
627 
628 static int max77686_buck_enable(struct udevice *dev, int op, bool *enable)
629 {
630 	int ret, on_off;
631 
632 	if (op == PMIC_OP_GET) {
633 		ret = max77686_buck_mode(dev, op, &on_off);
634 		if (ret)
635 			return ret;
636 
637 		switch (on_off) {
638 		case OPMODE_OFF:
639 			*enable = false;
640 			break;
641 		case OPMODE_ON:
642 			*enable = true;
643 			break;
644 		default:
645 			return -EINVAL;
646 		}
647 	} else if (op == PMIC_OP_SET) {
648 		switch (*enable) {
649 		case 0:
650 			on_off = OPMODE_OFF;
651 			break;
652 		case 1:
653 			on_off = OPMODE_ON;
654 			break;
655 		default:
656 			return -EINVAL;
657 		}
658 
659 		ret = max77686_buck_mode(dev, op, &on_off);
660 		if (ret)
661 			return ret;
662 	}
663 
664 	return 0;
665 }
666 
667 static int max77686_ldo_probe(struct udevice *dev)
668 {
669 	struct dm_regulator_uclass_platdata *uc_pdata;
670 
671 	uc_pdata = dev_get_uclass_platdata(dev);
672 
673 	uc_pdata->type = REGULATOR_TYPE_LDO;
674 	uc_pdata->mode_count = max77686_ldo_modes(dev->driver_data,
675 						  &uc_pdata->mode, dev);
676 
677 	return 0;
678 }
679 
680 static int ldo_get_value(struct udevice *dev)
681 {
682 	int uV;
683 	int ret;
684 
685 	ret = max77686_ldo_val(dev, PMIC_OP_GET, &uV);
686 	if (ret)
687 		return ret;
688 
689 	return uV;
690 }
691 
692 static int ldo_set_value(struct udevice *dev, int uV)
693 {
694 	return max77686_ldo_val(dev, PMIC_OP_SET, &uV);
695 }
696 
697 static bool ldo_get_enable(struct udevice *dev)
698 {
699 	bool enable = false;
700 	int ret;
701 
702 	ret = max77686_ldo_enable(dev, PMIC_OP_GET, &enable);
703 	if (ret)
704 		return ret;
705 
706 	return enable;
707 }
708 
709 static int ldo_set_enable(struct udevice *dev, bool enable)
710 {
711 	return max77686_ldo_enable(dev, PMIC_OP_SET, &enable);
712 }
713 
714 static int ldo_get_mode(struct udevice *dev)
715 {
716 	int mode;
717 	int ret;
718 
719 	ret = max77686_ldo_mode(dev, PMIC_OP_GET, &mode);
720 	if (ret)
721 		return ret;
722 
723 	return mode;
724 }
725 
726 static int ldo_set_mode(struct udevice *dev, int mode)
727 {
728 	return max77686_ldo_mode(dev, PMIC_OP_SET, &mode);
729 }
730 
731 static int max77686_buck_probe(struct udevice *dev)
732 {
733 	struct dm_regulator_uclass_platdata *uc_pdata;
734 
735 	uc_pdata = dev_get_uclass_platdata(dev);
736 
737 	uc_pdata->type = REGULATOR_TYPE_BUCK;
738 	uc_pdata->mode_count = max77686_buck_modes(dev->driver_data,
739 						   &uc_pdata->mode);
740 
741 	return 0;
742 }
743 
744 static int buck_get_value(struct udevice *dev)
745 {
746 	int uV;
747 	int ret;
748 
749 	ret = max77686_buck_val(dev, PMIC_OP_GET, &uV);
750 	if (ret)
751 		return ret;
752 
753 	return uV;
754 }
755 
756 static int buck_set_value(struct udevice *dev, int uV)
757 {
758 	return max77686_buck_val(dev, PMIC_OP_SET, &uV);
759 }
760 
761 static bool buck_get_enable(struct udevice *dev)
762 {
763 	bool enable = false;
764 	int ret;
765 
766 	ret = max77686_buck_enable(dev, PMIC_OP_GET, &enable);
767 	if (ret)
768 		return ret;
769 
770 	return enable;
771 }
772 
773 static int buck_set_enable(struct udevice *dev, bool enable)
774 {
775 	return max77686_buck_enable(dev, PMIC_OP_SET, &enable);
776 }
777 
778 static int buck_get_mode(struct udevice *dev)
779 {
780 	int mode;
781 	int ret;
782 
783 	ret = max77686_buck_mode(dev, PMIC_OP_GET, &mode);
784 	if (ret)
785 		return ret;
786 
787 	return mode;
788 }
789 
790 static int buck_set_mode(struct udevice *dev, int mode)
791 {
792 	return max77686_buck_mode(dev, PMIC_OP_SET, &mode);
793 }
794 
795 static const struct dm_regulator_ops max77686_ldo_ops = {
796 	.get_value  = ldo_get_value,
797 	.set_value  = ldo_set_value,
798 	.get_enable = ldo_get_enable,
799 	.set_enable = ldo_set_enable,
800 	.get_mode   = ldo_get_mode,
801 	.set_mode   = ldo_set_mode,
802 };
803 
804 U_BOOT_DRIVER(max77686_ldo) = {
805 	.name = MAX77686_LDO_DRIVER,
806 	.id = UCLASS_REGULATOR,
807 	.ops = &max77686_ldo_ops,
808 	.probe = max77686_ldo_probe,
809 };
810 
811 static const struct dm_regulator_ops max77686_buck_ops = {
812 	.get_value  = buck_get_value,
813 	.set_value  = buck_set_value,
814 	.get_enable = buck_get_enable,
815 	.set_enable = buck_set_enable,
816 	.get_mode   = buck_get_mode,
817 	.set_mode   = buck_set_mode,
818 };
819 
820 U_BOOT_DRIVER(max77686_buck) = {
821 	.name = MAX77686_BUCK_DRIVER,
822 	.id = UCLASS_REGULATOR,
823 	.ops = &max77686_buck_ops,
824 	.probe = max77686_buck_probe,
825 };
826