SPDX: Convert all of our single license tags to Linux Kernel style
[oweals/u-boot.git] / drivers / power / regulator / s2mps11_regulator.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *  Copyright (C) 2018 Samsung Electronics
4  *  Jaehoon Chung <jh80.chung@samsung.com>
5  */
6
7 #include <common.h>
8 #include <fdtdec.h>
9 #include <errno.h>
10 #include <dm.h>
11 #include <i2c.h>
12 #include <power/pmic.h>
13 #include <power/regulator.h>
14 #include <power/s2mps11.h>
15
16 #define MODE(_id, _val, _name) { \
17         .id = _id, \
18         .register_value = _val, \
19         .name = _name, \
20 }
21
22 /* BUCK : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 */
23 static struct dm_regulator_mode s2mps11_buck_modes[] = {
24         MODE(OP_OFF, S2MPS11_BUCK_MODE_OFF, "OFF"),
25         MODE(OP_STANDBY, S2MPS11_BUCK_MODE_STANDBY, "ON/OFF"),
26         MODE(OP_ON, S2MPS11_BUCK_MODE_STANDBY, "ON"),
27 };
28
29 static struct dm_regulator_mode s2mps11_ldo_modes[] = {
30         MODE(OP_OFF, S2MPS11_LDO_MODE_OFF, "OFF"),
31         MODE(OP_STANDBY, S2MPS11_LDO_MODE_STANDBY, "ON/OFF"),
32         MODE(OP_STANDBY_LPM, S2MPS11_LDO_MODE_STANDBY_LPM, "ON/LPM"),
33         MODE(OP_ON, S2MPS11_LDO_MODE_ON, "ON"),
34 };
35
36 static const char s2mps11_buck_ctrl[] = {
37         0xff, 0x25, 0x27, 0x29, 0x2b, 0x2d, 0x33, 0x35, 0x37, 0x39, 0x3b
38 };
39
40 static const char s2mps11_buck_out[] = {
41         0xff, 0x26, 0x28, 0x2a, 0x2c, 0x2f, 0x34, 0x36, 0x38, 0x3a, 0x3c
42 };
43
44 static int s2mps11_buck_hex2volt(int buck, int hex)
45 {
46         unsigned int uV = 0;
47
48         if (hex < 0)
49                 goto bad;
50
51         switch (buck) {
52         case 7:
53         case 8:
54         case 10:
55                 if (hex > S2MPS11_BUCK7_8_10_VOLT_MAX_HEX)
56                         goto bad;
57
58                 uV = hex * S2MPS11_BUCK_HSTEP + S2MPS11_BUCK_UV_HMIN;
59                 break;
60         case 9:
61                 if (hex > S2MPS11_BUCK9_VOLT_MAX_HEX)
62                         goto bad;
63                 uV = hex * S2MPS11_BUCK9_STEP * 2 + S2MPS11_BUCK9_UV_MIN;
64                 break;
65         default:
66                 if (buck == 5 && hex > S2MPS11_BUCK5_VOLT_MAX_HEX)
67                         goto bad;
68                 else if (buck != 5 && hex > S2MPS11_BUCK_VOLT_MAX_HEX)
69                         goto bad;
70
71                 uV = hex * S2MPS11_BUCK_LSTEP + S2MPS11_BUCK_UV_MIN;
72                 break;
73         }
74
75         return uV;
76 bad:
77         pr_err("Value: %#x is wrong for BUCK%d", hex, buck);
78         return -EINVAL;
79 }
80
81 static int s2mps11_buck_volt2hex(int buck, int uV)
82 {
83         int hex;
84
85         switch (buck) {
86         case 7:
87         case 8:
88         case 10:
89                 hex = (uV - S2MPS11_BUCK_UV_HMIN) / S2MPS11_BUCK_HSTEP;
90                 if (hex > S2MPS11_BUCK7_8_10_VOLT_MAX_HEX)
91                         goto bad;
92
93                 break;
94         case 9:
95                 hex = (uV - S2MPS11_BUCK9_UV_MIN) / S2MPS11_BUCK9_STEP;
96                 if (hex > S2MPS11_BUCK9_VOLT_MAX_HEX)
97                         goto bad;
98                 break;
99         default:
100                 hex = (uV - S2MPS11_BUCK_UV_MIN) / S2MPS11_BUCK_LSTEP;
101                 if (buck == 5 && hex > S2MPS11_BUCK5_VOLT_MAX_HEX)
102                         goto bad;
103                 else if (buck != 5 && hex > S2MPS11_BUCK_VOLT_MAX_HEX)
104                         goto bad;
105                 break;
106         };
107
108         if (hex >= 0)
109                 return hex;
110
111 bad:
112         pr_err("Value: %d uV is wrong for BUCK%d", uV, buck);
113         return -EINVAL;
114 }
115
116 static int s2mps11_buck_val(struct udevice *dev, int op, int *uV)
117 {
118         int hex, buck, ret;
119         u32 mask, addr;
120         u8 val;
121
122         buck = dev->driver_data;
123         if (buck < 1 || buck > S2MPS11_BUCK_NUM) {
124                 pr_err("Wrong buck number: %d\n", buck);
125                 return -EINVAL;
126         }
127
128         if (op == PMIC_OP_GET)
129                 *uV = 0;
130
131         addr = s2mps11_buck_out[buck];
132
133         switch (buck) {
134         case 9:
135                 mask = S2MPS11_BUCK9_VOLT_MASK;
136                 break;
137         default:
138                 mask = S2MPS11_BUCK_VOLT_MASK;
139                 break;
140         }
141
142         ret = pmic_read(dev->parent, addr, &val, 1);
143         if (ret)
144                 return ret;
145
146         if (op == PMIC_OP_GET) {
147                 val &= mask;
148                 ret = s2mps11_buck_hex2volt(buck, val);
149                 if (ret < 0)
150                         return ret;
151                 *uV = ret;
152                 return 0;
153         }
154
155         hex = s2mps11_buck_volt2hex(buck, *uV);
156         if (hex < 0)
157                 return hex;
158
159         val &= ~mask;
160         val |= hex;
161         ret = pmic_write(dev->parent, addr, &val, 1);
162
163         return ret;
164 }
165
166 static int s2mps11_buck_mode(struct udevice *dev, int op, int *opmode)
167 {
168         unsigned int addr, mode;
169         unsigned char val;
170         int buck, ret;
171
172         buck = dev->driver_data;
173         if (buck < 1 || buck > S2MPS11_BUCK_NUM) {
174                 pr_err("Wrong buck number: %d\n", buck);
175                 return -EINVAL;
176         }
177
178         addr = s2mps11_buck_ctrl[buck];
179
180         ret = pmic_read(dev->parent, addr, &val, 1);
181         if (ret)
182                 return ret;
183
184         if (op == PMIC_OP_GET) {
185                 val &= (S2MPS11_BUCK_MODE_MASK << S2MPS11_BUCK_MODE_SHIFT);
186                 switch (val) {
187                 case S2MPS11_BUCK_MODE_OFF:
188                         *opmode = OP_OFF;
189                         break;
190                 case S2MPS11_BUCK_MODE_STANDBY:
191                         *opmode = OP_STANDBY;
192                         break;
193                 case S2MPS11_BUCK_MODE_ON:
194                         *opmode = OP_ON;
195                         break;
196                 default:
197                         return -EINVAL;
198                 }
199                 return 0;
200         }
201
202         switch (*opmode) {
203         case OP_OFF:
204                 mode = S2MPS11_BUCK_MODE_OFF;
205                 break;
206         case OP_STANDBY:
207                 mode = S2MPS11_BUCK_MODE_STANDBY;
208                 break;
209         case OP_ON:
210                 mode = S2MPS11_BUCK_MODE_ON;
211                 break;
212         default:
213                 pr_err("Wrong mode: %d for buck: %d\n", *opmode, buck);
214                 return -EINVAL;
215         }
216
217         val &= ~(S2MPS11_BUCK_MODE_MASK << S2MPS11_BUCK_MODE_SHIFT);
218         val |= mode;
219         ret = pmic_write(dev->parent, addr, &val, 1);
220
221         return ret;
222 }
223
224 static int s2mps11_buck_enable(struct udevice *dev, int op, bool *enable)
225 {
226         int ret, on_off;
227
228         if (op == PMIC_OP_GET) {
229                 ret = s2mps11_buck_mode(dev, op, &on_off);
230                 if (ret)
231                         return ret;
232                 switch (on_off) {
233                 case OP_OFF:
234                         *enable = false;
235                         break;
236                 case OP_ON:
237                         *enable = true;
238                         break;
239                 default:
240                         return -EINVAL;
241                 }
242         } else if (op == PMIC_OP_SET) {
243                 if (*enable)
244                         on_off = OP_ON;
245                 else
246                         on_off = OP_OFF;
247
248                 ret = s2mps11_buck_mode(dev, op, &on_off);
249                 if (ret)
250                         return ret;
251         }
252
253         return 0;
254 }
255
256 static int buck_get_value(struct udevice *dev)
257 {
258         int uV;
259         int ret;
260
261         ret = s2mps11_buck_val(dev, PMIC_OP_GET, &uV);
262         if (ret)
263                 return ret;
264         return uV;
265 }
266
267 static int buck_set_value(struct udevice *dev, int uV)
268 {
269         return s2mps11_buck_val(dev, PMIC_OP_SET, &uV);
270 }
271
272 static int buck_get_enable(struct udevice *dev)
273 {
274         bool enable = false;
275         int ret;
276
277         ret = s2mps11_buck_enable(dev, PMIC_OP_GET, &enable);
278         if (ret)
279                 return ret;
280         return enable;
281 }
282
283 static int buck_set_enable(struct udevice *dev, bool enable)
284 {
285         return s2mps11_buck_enable(dev, PMIC_OP_SET, &enable);
286 }
287
288 static int buck_get_mode(struct udevice *dev)
289 {
290         int mode;
291         int ret;
292
293         ret = s2mps11_buck_mode(dev, PMIC_OP_GET, &mode);
294         if (ret)
295                 return ret;
296
297         return mode;
298 }
299
300 static int buck_set_mode(struct udevice *dev, int mode)
301 {
302         return s2mps11_buck_mode(dev, PMIC_OP_SET, &mode);
303 }
304
305 static int s2mps11_buck_probe(struct udevice *dev)
306 {
307         struct dm_regulator_uclass_platdata *uc_pdata;
308
309         uc_pdata = dev_get_uclass_platdata(dev);
310
311         uc_pdata->type = REGULATOR_TYPE_BUCK;
312         uc_pdata->mode = s2mps11_buck_modes;
313         uc_pdata->mode_count = ARRAY_SIZE(s2mps11_buck_modes);
314
315         return 0;
316 }
317
318 static const struct dm_regulator_ops s2mps11_buck_ops = {
319         .get_value      = buck_get_value,
320         .set_value      = buck_set_value,
321         .get_enable     = buck_get_enable,
322         .set_enable     = buck_set_enable,
323         .get_mode       = buck_get_mode,
324         .set_mode       = buck_set_mode,
325 };
326
327 U_BOOT_DRIVER(s2mps11_buck) = {
328         .name = S2MPS11_BUCK_DRIVER,
329         .id = UCLASS_REGULATOR,
330         .ops = &s2mps11_buck_ops,
331         .probe = s2mps11_buck_probe,
332 };
333
334 static int s2mps11_ldo_hex2volt(int ldo, int hex)
335 {
336         unsigned int uV = 0;
337
338         if (hex > S2MPS11_LDO_VOLT_MAX_HEX) {
339                 pr_err("Value: %#x is wrong for LDO%d", hex, ldo);
340                 return -EINVAL;
341         }
342
343         switch (ldo) {
344         case 1:
345         case 6:
346         case 11:
347         case 22:
348         case 23:
349                 uV = hex * S2MPS11_LDO_STEP + S2MPS11_LDO_UV_MIN;
350                 break;
351         default:
352                 uV = hex * S2MPS11_LDO_STEP * 2 + S2MPS11_LDO_UV_MIN;
353                 break;
354         }
355
356         return uV;
357 }
358
359 static int s2mps11_ldo_volt2hex(int ldo, int uV)
360 {
361         int hex = 0;
362
363         switch (ldo) {
364         case 1:
365         case 6:
366         case 11:
367         case 22:
368         case 23:
369                 hex = (uV - S2MPS11_LDO_UV_MIN) / S2MPS11_LDO_STEP;
370                 break;
371         default:
372                 hex = (uV - S2MPS11_LDO_UV_MIN) / (S2MPS11_LDO_STEP * 2);
373                 break;
374         }
375
376         if (hex >= 0 && hex <= S2MPS11_LDO_VOLT_MAX_HEX)
377                 return hex;
378
379         pr_err("Value: %d uV is wrong for LDO%d", uV, ldo);
380         return -EINVAL;
381
382         return 0;
383 }
384
385 static int s2mps11_ldo_val(struct udevice *dev, int op, int *uV)
386 {
387         unsigned int addr;
388         unsigned char val;
389         int hex, ldo, ret;
390
391         ldo = dev->driver_data;
392         if (ldo < 1 || ldo > S2MPS11_LDO_NUM) {
393                 pr_err("Wrong ldo number: %d\n", ldo);
394                 return -EINVAL;
395         }
396
397         addr = S2MPS11_REG_L1CTRL + ldo - 1;
398
399         ret = pmic_read(dev->parent, addr, &val, 1);
400         if (ret)
401                 return ret;
402
403         if (op == PMIC_OP_GET) {
404                 *uV = 0;
405                 val &= S2MPS11_LDO_VOLT_MASK;
406                 ret = s2mps11_ldo_hex2volt(ldo, val);
407                 if (ret < 0)
408                         return ret;
409
410                 *uV = ret;
411                 return 0;
412         }
413
414         hex = s2mps11_ldo_volt2hex(ldo, *uV);
415         if (hex < 0)
416                 return hex;
417
418         val &= ~S2MPS11_LDO_VOLT_MASK;
419         val |= hex;
420         ret = pmic_write(dev->parent, addr, &val, 1);
421
422         return ret;
423 }
424
425 static int s2mps11_ldo_mode(struct udevice *dev, int op, int *opmode)
426 {
427         unsigned int addr, mode;
428         unsigned char val;
429         int ldo, ret;
430
431         ldo = dev->driver_data;
432         if (ldo < 1 || ldo > S2MPS11_LDO_NUM) {
433                 pr_err("Wrong ldo number: %d\n", ldo);
434                 return -EINVAL;
435         }
436         addr = S2MPS11_REG_L1CTRL + ldo - 1;
437
438         ret = pmic_read(dev->parent, addr, &val, 1);
439         if (ret)
440                 return ret;
441
442         if (op == PMIC_OP_GET) {
443                 val &= (S2MPS11_LDO_MODE_MASK << S2MPS11_LDO_MODE_SHIFT);
444                 switch (val) {
445                 case S2MPS11_LDO_MODE_OFF:
446                         *opmode = OP_OFF;
447                         break;
448                 case S2MPS11_LDO_MODE_STANDBY:
449                         *opmode = OP_STANDBY;
450                         break;
451                 case S2MPS11_LDO_MODE_STANDBY_LPM:
452                         *opmode = OP_STANDBY_LPM;
453                         break;
454                 case S2MPS11_LDO_MODE_ON:
455                         *opmode = OP_ON;
456                         break;
457                 default:
458                         return -EINVAL;
459                 }
460                 return 0;
461         }
462
463         switch (*opmode) {
464         case OP_OFF:
465                 mode = S2MPS11_LDO_MODE_OFF;
466                 break;
467         case OP_STANDBY:
468                 mode = S2MPS11_LDO_MODE_STANDBY;
469                 break;
470         case OP_STANDBY_LPM:
471                 mode = S2MPS11_LDO_MODE_STANDBY_LPM;
472                 break;
473         case OP_ON:
474                 mode = S2MPS11_LDO_MODE_ON;
475                 break;
476         default:
477                 pr_err("Wrong mode: %d for ldo: %d\n", *opmode, ldo);
478                 return -EINVAL;
479         }
480
481         val &= ~(S2MPS11_LDO_MODE_MASK << S2MPS11_LDO_MODE_SHIFT);
482         val |= mode;
483         ret = pmic_write(dev->parent, addr, &val, 1);
484
485         return ret;
486 }
487
488 static int s2mps11_ldo_enable(struct udevice *dev, int op, bool *enable)
489 {
490         int ret, on_off;
491
492         if (op == PMIC_OP_GET) {
493                 ret = s2mps11_ldo_mode(dev, op, &on_off);
494                 if (ret)
495                         return ret;
496                 switch (on_off) {
497                 case OP_OFF:
498                         *enable = false;
499                         break;
500                 case OP_ON:
501                         *enable = true;
502                         break;
503                 default:
504                         return -EINVAL;
505                 }
506         } else if (op == PMIC_OP_SET) {
507                 if (*enable)
508                         on_off = OP_ON;
509                 else
510                         on_off = OP_OFF;
511
512                 ret = s2mps11_ldo_mode(dev, op, &on_off);
513                 if (ret)
514                         return ret;
515         }
516
517         return 0;
518 }
519
520 static int ldo_get_value(struct udevice *dev)
521 {
522         int uV;
523         int ret;
524
525         ret = s2mps11_ldo_val(dev, PMIC_OP_GET, &uV);
526         if (ret)
527                 return ret;
528
529         return uV;
530 }
531
532 static int ldo_set_value(struct udevice *dev, int uV)
533 {
534         return s2mps11_ldo_val(dev, PMIC_OP_SET, &uV);
535 }
536
537 static int ldo_get_enable(struct udevice *dev)
538 {
539         bool enable = false;
540         int ret;
541
542         ret = s2mps11_ldo_enable(dev, PMIC_OP_GET, &enable);
543         if (ret)
544                 return ret;
545         return enable;
546 }
547
548 static int ldo_set_enable(struct udevice *dev, bool enable)
549 {
550         return s2mps11_ldo_enable(dev, PMIC_OP_SET, &enable);
551 }
552
553 static int ldo_get_mode(struct udevice *dev)
554 {
555         int mode, ret;
556
557         ret = s2mps11_ldo_mode(dev, PMIC_OP_GET, &mode);
558         if (ret)
559                 return ret;
560         return mode;
561 }
562
563 static int ldo_set_mode(struct udevice *dev, int mode)
564 {
565         return s2mps11_ldo_mode(dev, PMIC_OP_SET, &mode);
566 }
567
568 static int s2mps11_ldo_probe(struct udevice *dev)
569 {
570         struct dm_regulator_uclass_platdata *uc_pdata;
571
572         uc_pdata = dev_get_uclass_platdata(dev);
573         uc_pdata->type = REGULATOR_TYPE_LDO;
574         uc_pdata->mode = s2mps11_ldo_modes;
575         uc_pdata->mode_count = ARRAY_SIZE(s2mps11_ldo_modes);
576
577         return 0;
578 }
579
580 static const struct dm_regulator_ops s2mps11_ldo_ops = {
581         .get_value      = ldo_get_value,
582         .set_value      = ldo_set_value,
583         .get_enable     = ldo_get_enable,
584         .set_enable     = ldo_set_enable,
585         .get_mode       = ldo_get_mode,
586         .set_mode       = ldo_set_mode,
587 };
588
589 U_BOOT_DRIVER(s2mps11_ldo) = {
590         .name = S2MPS11_LDO_DRIVER,
591         .id = UCLASS_REGULATOR,
592         .ops = &s2mps11_ldo_ops,
593         .probe = s2mps11_ldo_probe,
594 };