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