blob: 33caebdc5e132d2989ac739a5c2c00e10761a1c8 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001/*
2 * Copyright (C) 2014 Marvell International Ltd.
3 * Hongyan Song <hysong@marvell.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8#include <common.h>
9#include <i2c.h>
10#include <power/pmic.h>
11#include <power/marvell88pm_pmic.h>
12#include <power/88pm801.h>
13#include <power/pm802.h>
14#include <errno.h>
15#include <asm/arch/cpu.h>
16
17#define MARVELL_PMIC_BASE "88pm801_base"
18#define MARVELL_PMIC_POWER "88pm801_power"
19#define MARVELL_PMIC_GPADC "88pm801_gpadc"
20#define MARVELL_PMIC_TEST "88pm801_test"
21
22#define PM803_DUMMY_REG0 (0x15)
23#define PM803_REBOOT_FLAG (0x50)
24
25enum {
26 PM800_ID_LDO1 = 0x08,
27 PM800_ID_LDO2 = 0x0b,
28 PM800_ID_LDO3,
29 PM800_ID_LDO4,
30 PM800_ID_LDO5,
31 PM800_ID_LDO6,
32 PM800_ID_LDO7,
33 PM800_ID_LDO8,
34 PM800_ID_LDO9,
35 PM800_ID_LDO10,
36 PM800_ID_LDO11,
37 PM800_ID_LDO12,
38 PM800_ID_LDO13,
39 PM800_ID_LDO14,
40 PM800_ID_LDO15,
41 PM800_ID_LDO16,
42 PM800_ID_LDO17,
43 PM800_ID_LDO18,
44 PM800_ID_LDO19 = 0x1c,
45
46 PM800_ID_BUCK1 = 0x3c,
47 PM800_ID_BUCK2 = 0x40,
48 PM800_ID_BUCK3 = 0x41,
49 PM800_ID_BUCK4 = 0x42,
50 PM800_ID_BUCK5 = 0x43,
51
52 PM800_BUCK_EN1 = 0x50,
53 PM800_LDO1_8_EN1 = 0x51,
54 PM800_LDO9_16_EN1 = 0x52,
55 PM800_LDO17_19_EN1 = 0x53,
56
57};
58
59static struct pmic_chip_desc *g_chip;
60
61static const unsigned int ldo1_voltage_table[] = {
62 600000, 650000, 700000, 750000, 800000, 850000, 900000, 950000,
63 1000000, 1050000, 1100000, 1150000, 1200000, 1300000, 1400000, 1500000,
64};
65
66static const unsigned int ldo2_voltage_table[] = {
67 1700000, 1800000, 1900000, 2000000, 2100000, 2500000, 2700000, 2800000,
68};
69static const unsigned int ldo3_to_17_voltage_table[] = {
70 1200000, 1250000, 1700000, 1800000, 1850000, 1900000, 2500000, 2600000,
71 2700000, 2750000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000,
72};
73static const unsigned int ldo18_19_voltage_table[] = {
74 1700000, 1800000, 1900000, 2500000, 2800000, 2900000, 3100000, 3300000,
75};
76static const unsigned int pm803_ldo1_5_voltage_table[] = {
77 1600000, 1700000, 1800000, 1900000, 2000000, 2700000, 2800000, 2900000,
78};
79static const unsigned int pm803_ldo_1v2_3v3_voltage_table[] = {
80 1200000, 1250000, 1600000, 1700000, 1800000, 1900000, 2000000, 2500000,
81 2600000, 2700000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000,
82};
83static const unsigned int pm802s_ldo_volt_table[] = {
84 1200000, 1250000, 1600000, 1650000, 1700000, 1750000, 1800000, 1850000,
85 1900000, 2750000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000,
86};
87
88static u8 pm801_slp_cnt;
89static u8 asrpmic_gpadc_otp = 0;
90static int pmic_sample_offset = 0;
91static int pmic_vref_offset = 0;
92struct pmic *g_p_base;
93
94static int vref_offset_table[] = {
95 (-1 * 2) - 1,
96 (-4 * 2) - 1,
97 (-7 * 2) - 1,
98 (-10* 2) - 1,
99 (1 * 2) + 1,
100 (4 * 2) + 1,
101 (7 * 2) + 1,
102 (10 * 2) + 1,
103};
104
105static int pm813s_vref_offset_table[] = {
106 (-1 * 2),
107 (-3 * 2),
108 (-5 * 2),
109 (-7 * 2),
110 (-9 * 2),
111 (-11* 2),
112 (-13* 2),
113 (-15* 2),
114 ( 1 * 2),
115 ( 3 * 2),
116 ( 5 * 2),
117 ( 7 * 2),
118 ( 9 * 2),
119 ( 11* 2),
120 ( 13* 2),
121 ( 15* 2),
122};
123
124void pmic_clear_pdown_log(void)
125{
126 /* clear power down log */
127 pmic_reg_write(g_p_base, POWER_DOWN_LOG1, 0xff);
128 pmic_reg_write(g_p_base, POWER_DOWN_LOG2, 0xff);
129
130 if (pmic_is_pm803()) {
131 pmic_reg_write(g_p_base, PM803_BASE_BLANK_REG7, 0x0);
132 pmic_reg_write(g_p_base, PM803_BASE_BLANK_REG8, 0x0);
133 } else if (pmic_is_pm802s()) {
134 pmic_reg_write(g_p_base, PM802S_BASE_BLANK_REGE, 0x0);
135 pmic_reg_write(g_p_base, PM802S_BASE_BLANK_REGF, 0x0);
136 } else if (pmic_is_pm813s()) {
137 pmic_reg_write(g_p_base, PM813S_BASE_BLANK_REGE, 0x0);
138 pmic_reg_write(g_p_base, PM813S_BASE_BLANK_REGF, 0x0);
139 } else {
140 printf("!!!warning: powerup log not in bankup\n");
141 }
142}
143
144void pmic_prepare_for_soc_reboot(void)
145{
146 pmic_clear_pdown_log();
147 if (pmic_is_pm803()) {
148 pmic_reg_write(g_p_base, PM803_DUMMY_REG0, PM803_REBOOT_FLAG);
149 }
150 printf("pmic prepare for soc reset\n");
151}
152
153int marvell88pm801_reg_update(struct pmic *p, int reg, unsigned int regval)
154{
155 u32 val;
156 int ret = 0;
157
158 ret = pmic_reg_read(p, reg, &val);
159 if (ret) {
160 debug("%s: PMIC %d register read failed\n", __func__, reg);
161 return -1;
162 }
163 val |= regval;
164 ret = pmic_reg_write(p, reg, val);
165 if (ret) {
166 debug("%s: PMIC %d register write failed\n", __func__, reg);
167 return -1;
168 }
169 return 0;
170}
171
172static int pm801_buck_volt2hex(unsigned int buck, unsigned int uV)
173{
174 unsigned int hex = 0;
175
176 switch (buck) {
177 case 1:
178 if (uV > 1800000) {
179 debug("%d is wrong voltage for BUCK%d\n", uV, buck);
180 return 0;
181 }
182 break;
183 case 2:
184 case 3:
185 case 4:
186 case 5:
187 if (uV > 3300000) {
188 debug("%d is wrong voltage for BUCK%d\n", uV, buck);
189 return 0;
190 }
191 break;
192 default:
193 debug("%d is wrong voltage for BUCK%d\n", uV, buck);
194 return -EINVAL;
195 }
196
197 if (uV <= 1600000)
198 hex = (uV - 600000) / 12500;
199 else
200 hex = 0x50 + (uV - 1600000) / 50000;
201
202 debug("%s: buck=%d, uV=%d, hex= %d\n", __func__, buck, uV, hex);
203
204 return hex;
205}
206
207int marvell88pm801_set_buck_vol(struct pmic *p,
208 unsigned int buck, unsigned int uV, int level)
209{
210 unsigned int val, ret, adr = 0;
211 int hex = 0;
212
213 if (buck < 1 || buck > 5) {
214 printf("%s: wrong buck%d\n\n", __func__, buck);
215 return -1;
216 }
217
218 if (level < 0)
219 level = 0;
220 if (level > 3)
221 level = 3;
222
223 if (buck == 1 && uV > (1300 * 1000)) {
224 uV = 1300 * 1000;
225 printf("buck1 shouldn't > 1300mV\n");
226 }
227
228 switch (buck) {
229 case 1:
230 adr = PM801_ID_BUCK1;
231 adr += level;
232 break;
233 case 2:
234 adr = PM801_ID_BUCK2;
235 break;
236 case 3:
237 adr = PM801_ID_BUCK3;
238 break;
239 case 4:
240 adr = PM801_ID_BUCK4;
241 adr += level;
242 break;
243 case 5:
244 adr = PM801_ID_BUCK5;
245 break;
246 default:
247 printf("%s: wrong buck%d\n\n", __func__, buck);
248 return -EINVAL;
249 }
250
251 hex = pm801_buck_volt2hex(buck, uV);
252
253 if (hex < 0)
254 return -1;
255
256 ret = pmic_reg_read(p, adr, &val);
257 if (ret)
258 return ret;
259
260 val &= ~MARVELL88PM_BUCK_VOLT_MASK;
261 val |= hex;
262 ret = pmic_reg_write(p, adr, val);
263
264 return ret;
265}
266
267
268int pm802_set_buck_vol(struct pmic *p,
269 unsigned int buck, unsigned int uV, int level)
270{
271 unsigned int val, ret, adr = 0;
272 int hex = 0;
273
274 if (buck < 1 || buck > 5 || (pmic_is_pm803() && buck > 1)
275 || (pmic_is_pm813() && buck > 3)) {
276 printf("%s: wrong buck%d\n", __func__, buck);
277 return -1;
278 }
279
280 if (level < 0)
281 level = 0;
282 if (level > 3)
283 level = 3;
284#ifdef CONFIG_ASR1802S
285 if (buck == 1 && uV > (1100 * 1000)) {
286 uV = 1100 * 1000;
287 printf("buck1 shouldn't > 1100mV\n");
288 }
289#endif
290
291#ifdef CONFIG_PXA182X
292 if (buck == 1 && uV > (1300 * 1000)) {
293 uV = 1300 * 1000;
294 printf("buck1 should not be set bigger than 1300mV\n");
295 }
296#endif
297
298 switch (buck) {
299 case 1:
300 adr = PM802_ID_BUCK1;
301 if (pmic_is_pm803() || pmic_is_pm802s())
302 adr = PM803_ID_BUCK1;
303 else if (pmic_is_pm813())
304 adr = PM813_ID_BUCK1;
305 adr += level;
306 break;
307 case 2:
308 adr = PM802_ID_BUCK2;
309 break;
310 case 3:
311 adr = PM802_ID_BUCK3;
312 break;
313 case 4:
314 adr = PM802_ID_BUCK4;
315 adr += level;
316 break;
317 case 5:
318 adr = PM802_ID_BUCK5;
319 break;
320 default:
321 printf("%s: wrong buck%d\n", __func__, buck);
322 return -EINVAL;
323 }
324
325 hex = pm801_buck_volt2hex(buck, uV);
326
327 if (hex < 0)
328 return -1;
329
330 ret = pmic_reg_read(p, adr, &val);
331 if (ret)
332 return ret;
333
334 val &= ~MARVELL88PM_BUCK_VOLT_MASK;
335 val |= hex;
336 ret = pmic_reg_write(p, adr, val);
337
338 return ret;
339}
340
341static int pm801_buck_hex2volt(unsigned int buck, unsigned int hex)
342{
343 unsigned int uV = 0;
344
345 if (hex <= 0x50)
346 uV = hex * 12500 + 600000;
347 else
348 uV = 1600000 + (hex - 0x50) * 50000;
349
350 debug("%s: buck=%d, uV=%d, hex= %d\n", __func__, buck, uV, hex);
351
352 return uV;
353}
354
355int marvell88pm801_get_buck_vol(struct pmic *p, unsigned int buck, int level)
356{
357 unsigned int val, ret, adr = 0;
358 int uV;
359
360 if (buck < 1 || buck > 5) {
361 printf("%s: wrong buck%d\n", __func__, buck);
362 return -1;
363 }
364
365 if (level < 0)
366 level = 0;
367 if (level > 3)
368 level = 3;
369
370 switch (buck) {
371 case 1:
372 adr = PM801_ID_BUCK1;
373 adr += level;
374 break;
375 case 2:
376 adr = PM801_ID_BUCK2;
377 break;
378 case 3:
379 adr = PM801_ID_BUCK3;
380 break;
381 case 4:
382 adr = PM801_ID_BUCK4;
383 adr += level;
384 break;
385 case 5:
386 adr = PM801_ID_BUCK5;
387 break;
388 default:
389 printf("%s: wrong buck%d\n", __func__, buck);
390 return -EINVAL;
391 }
392
393 ret = pmic_reg_read(p, adr, &val);
394 if (ret)
395 return ret;
396
397 uV = pm801_buck_hex2volt(buck, val);
398 if (uV < 0)
399 return -1;
400
401 return uV;
402}
403
404int pm802_get_buck_vol(struct pmic *p, unsigned int buck, int level)
405{
406 unsigned int val, ret, adr = 0;
407 int uV;
408
409 if (buck < 1 || buck > 5) {
410 printf("%s: wrong buck%d\n", __func__, buck);
411 return -1;
412 }
413
414 if (level < 0)
415 level = 0;
416 if (level > 3)
417 level = 3;
418
419 switch (buck) {
420 case 1:
421 adr = PM802_ID_BUCK1;
422 if (pmic_is_pm803() || pmic_is_pm802s())
423 adr = PM803_ID_BUCK1;
424 else if (pmic_is_pm813())
425 adr = PM813_ID_BUCK1;
426 adr += level;
427 break;
428 case 2:
429 adr = PM802_ID_BUCK2;
430 break;
431 case 3:
432 adr = PM802_ID_BUCK3;
433 break;
434 case 4:
435 adr = PM802_ID_BUCK4;
436 adr += level;
437 break;
438 case 5:
439 adr = PM802_ID_BUCK5;
440 break;
441 default:
442 printf("%s: wrong buck%d\n", __func__, buck);
443 return -EINVAL;
444 }
445
446 ret = pmic_reg_read(p, adr, &val);
447 if (ret)
448 return ret;
449
450 val &= 0x7f;
451 uV = pm801_buck_hex2volt(buck, val);
452 if (uV < 0)
453 return -1;
454
455 return uV;
456}
457
458static int pm800_ldo_volt2hex(unsigned int ldo, unsigned int uV)
459{
460 unsigned int table_size = 0, hex = 0;
461 const unsigned int *voltage_table = NULL;
462 /*choose ldo voltage table*/
463 switch (ldo) {
464 case 1:
465 voltage_table = ldo1_voltage_table;
466 table_size = ARRAY_SIZE(ldo1_voltage_table);
467 break;
468 case 2:
469 voltage_table = ldo2_voltage_table;
470 table_size = ARRAY_SIZE(ldo2_voltage_table);
471 break;
472 case 3:
473 case 4:
474 case 5:
475 case 6:
476 case 7:
477 case 8:
478 case 9:
479 case 10:
480 case 11:
481 case 12:
482 case 13:
483 case 14:
484 case 15:
485 case 16:
486 case 17:
487 voltage_table = ldo3_to_17_voltage_table;
488 table_size = ARRAY_SIZE(ldo3_to_17_voltage_table);
489 break;
490 case 18:
491 case 19:
492 voltage_table = ldo18_19_voltage_table;
493 table_size = ARRAY_SIZE(ldo18_19_voltage_table);
494 break;
495
496 default:
497 debug("%s: wrong ldo%d\n", __func__, ldo);
498 return -EINVAL;
499 }
500
501 for (hex = 0; hex < table_size; hex++) {
502 if (uV <= voltage_table[hex]) {
503 debug("ldo %d, voltage %d, reg value 0x%x\n", ldo, uV, hex);
504 return hex;
505 }
506 }
507
508 return table_size - 1;
509}
510
511static int pm801_pm802_ldo_volt2hex(unsigned int ldo, unsigned int uV)
512{
513 unsigned int table_size = 0, hex = 0;
514 const unsigned int *voltage_table = NULL;
515
516 if (pmic_is_pm803()) {
517 /*choose ldo voltage table*/
518 switch (ldo) {
519 case 1:
520 case 5:
521 voltage_table = pm803_ldo1_5_voltage_table;
522 table_size = ARRAY_SIZE(pm803_ldo1_5_voltage_table);
523 break;
524 case 2:
525 case 3:
526 case 4:
527 case 6:
528 case 7:
529 case 8:
530 voltage_table = pm803_ldo_1v2_3v3_voltage_table;
531 table_size = ARRAY_SIZE(pm803_ldo_1v2_3v3_voltage_table);
532 break;
533 default:
534 debug("%s: %d is wrong LDO number\n", __func__, ldo);
535 return -EINVAL;
536 }
537 } else if (pmic_is_pm813()) {
538 /*choose ldo voltage table*/
539 switch (ldo) {
540 case 5:
541 case 13:
542 voltage_table = ldo18_19_voltage_table;
543 table_size = ARRAY_SIZE(ldo18_19_voltage_table);
544 break;
545 case 1 ... 4:
546 case 6 ... 12:
547 voltage_table = ldo3_to_17_voltage_table;
548 table_size = ARRAY_SIZE(ldo3_to_17_voltage_table);
549 break;
550 default:
551 debug("%s: %d is wrong LDO number\n", __func__, ldo);
552 return -EINVAL;
553 }
554 } else if (pmic_is_pm802s()) {
555 /*choose ldo voltage table*/
556 switch (ldo) {
557 case 1 ... 6:
558 voltage_table = pm802s_ldo_volt_table;
559 table_size = ARRAY_SIZE(pm802s_ldo_volt_table);
560 break;
561 default:
562 debug("%s: %d is wrong LDO number\n", __func__, ldo);
563 return -EINVAL;
564 }
565 } else {
566 /*choose ldo voltage table*/
567 switch (ldo) {
568 case 1:
569 case 2:
570 case 3:
571 case 4:
572 voltage_table = ldo3_to_17_voltage_table;
573 table_size = ARRAY_SIZE(ldo3_to_17_voltage_table);
574 break;
575 case 5:
576 case 6:
577 voltage_table = ldo18_19_voltage_table;
578 table_size = ARRAY_SIZE(ldo18_19_voltage_table);
579 break;
580 default:
581 debug("%s: %d is wrong LDO number\n", __func__, ldo);
582 return -EINVAL;
583 }
584 }
585 for (hex = 0; hex < table_size; hex++) {
586 if (uV <= voltage_table[hex]) {
587 debug("ldo %d, voltage %d, reg value 0x%x\n", ldo, uV, hex);
588 return hex;
589 }
590 }
591
592 return table_size - 1;
593}
594
595int marvell88pm801_set_ldo_vol(struct pmic *p, unsigned int ldo, unsigned int uV)
596{
597 unsigned int val, ret, adr, ldo_en_mask;
598 int hex = 0;
599
600 if (ldo < 1 || ldo > 6) {
601 printf("%s: wrong ldo%d\n", __func__, ldo);
602 return -1;
603 }
604
605 hex = pm801_pm802_ldo_volt2hex(ldo, uV);
606
607 if (hex < 0)
608 return -1;
609
610 switch (ldo) {
611 case 1:
612 adr = PM801_ID_LDO1;
613 break;
614 case 2:
615 adr = PM801_ID_LDO2;
616 break;
617 case 3:
618 adr = PM801_ID_LDO3;
619 break;
620 case 4:
621 adr = PM801_ID_LDO4;
622 break;
623 case 5:
624 adr = PM801_ID_LDO5;
625 break;
626 case 6:
627 adr = PM801_ID_LDO6;
628 break;
629 default:
630 break;
631 }
632
633 ret = pmic_reg_read(p, adr, &val);
634 if (ret)
635 return ret;
636
637 val &= ~MARVELL88PM_LDO_VOLT_MASK;
638 val |= hex;
639 ret = pmic_reg_write(p, adr, val);
640
641
642 switch (ldo) {
643 case 1:
644 adr = PM801_LDO1_2_EN1;
645 ldo_en_mask = 2;
646 break;
647 case 2:
648 adr = PM801_LDO1_2_EN1;
649 ldo_en_mask = 4;
650 break;
651 case 3:
652 adr = PM801_LDO3_4_EN1;
653 ldo_en_mask = 8;
654 break;
655 case 4:
656 adr = PM801_LDO3_4_EN1;
657 ldo_en_mask = 3;
658 break;
659 case 5:
660 adr = PM801_LDO5_6_EN1;
661 ldo_en_mask = 1;
662 break;
663 case 6:
664 adr = PM801_LDO5_6_EN1;
665 ldo_en_mask = 2;
666 break;
667 default:
668 break;
669 }
670
671 ret = pmic_reg_read(p, adr, &val);
672 if (ret)
673 return ret;
674
675 val |= (1 << ldo_en_mask);
676 ret = pmic_reg_write(p, adr, val);
677
678 return ret;
679}
680
681int pm802_set_ldo_vol(struct pmic *p, unsigned int ldo, unsigned int uV)
682{
683 unsigned int val, ret, adr, ldo_en_mask;
684 int hex = 0;
685
686 if (ldo < 1 || (pmic_is_pm802() && ldo > 6) || (pmic_is_pm803() && ldo > 8)
687 || (pmic_is_pm813() && ldo > 13)) {
688 printf("%s: wrong ldo%d\n", __func__, ldo);
689 return -1;
690 }
691
692 hex = pm801_pm802_ldo_volt2hex(ldo, uV);
693
694 if (hex < 0)
695 return -1;
696
697 if (pmic_is_pm802())
698 adr = PM802_ID_LDO1 + (ldo - 1) * 3;
699 else
700 adr = PM803_ID_LDO1 + (ldo - 1) * 3;
701
702 ret = pmic_reg_read(p, adr, &val);
703 if (ret)
704 return ret;
705
706 if ((pmic_is_pm802() && (!pmic_is_pm802s())) || pmic_is_pm813()) {
707 val &= ~(0xf << 2);
708 val |= (hex << 2);
709 ret = pmic_reg_write(p, adr, val);
710 ldo_en_mask = (0x1 << 6);
711 } else {
712 val &= ~(0xf << 0);
713 val |= (hex << 0);
714 ret = pmic_reg_write(p, adr, val);
715 ldo_en_mask = (0x1 << 7);
716 }
717
718 ret = pmic_reg_read(p, adr, &val);
719 if (ret)
720 return ret;
721 val |= ldo_en_mask;
722 ret = pmic_reg_write(p, adr, val);
723
724 return ret;
725}
726
727int marvell88pm800_set_ldo_vol(struct pmic *p, unsigned int ldo, unsigned int uV)
728{
729 unsigned int val, ret, adr, ldo_en_mask;
730 int hex = 0;
731
732 if (ldo < 1 || ldo > 19) {
733 printf("%s: %d wrong ldo\n", __func__, ldo);
734 return -1;
735 }
736
737 if (ldo == 1)
738 adr = PM800_ID_LDO1;
739 else if (ldo == 2)
740 adr = PM800_ID_LDO2;
741 else
742 adr = PM800_ID_LDO2 + ldo - 2;
743
744 hex = pm800_ldo_volt2hex(ldo, uV);
745
746 if (hex < 0)
747 return -1;
748
749 ret = pmic_reg_read(p, adr, &val);
750 if (ret)
751 return ret;
752
753 val &= ~MARVELL88PM_LDO_VOLT_MASK;
754 val |= hex;
755 ret = pmic_reg_write(p, adr, val);
756
757 /* check whether the LDO is enabled, if not enable it.*/
758 adr = PM800_LDO1_8_EN1 + (ldo - 1)/8;
759 ldo_en_mask = (ldo - 1)%8;
760
761 ret = pmic_reg_read(p, adr, &val);
762 if (ret)
763 return ret;
764
765 val |= (1 << ldo_en_mask);
766 ret = pmic_reg_write(p, adr, val);
767
768 return ret;
769}
770
771void marvell88pm_power_off(void)
772{
773 int ret;
774 unsigned int val;
775 struct pmic *p_base;
776
777 p_base = pmic_get(MARVELL_PMIC_BASE);
778 if (!p_base) {
779 printf("can't get base pmic\n");
780 return;
781 }
782
783 ret = pmic_reg_read(p_base, 0xe7, &val);
784 if (ret) {
785 printf("88pm801 read 0xe7 failed\n");
786 return;
787 }
788 if (!(pmic_is_pm802() || pmic_is_pm803() || pmic_is_pm813())) {
789 val |= 0x1;
790 pmic_reg_write(p_base, 0xe7, val);
791 } else {
792 pmic_reg_read(p_base, 0xe2, &val);
793 val &= ~(0xf << 0);
794 if (pmic_is_pm813s() || pmic_is_pm802s())
795 val |= (0x3 << 0);
796 else
797 val |= (0x1 << 0);
798 pmic_reg_write(p_base, 0xe2, val);
799
800 pmic_reg_read(p_base, 0xe4, &val);
801 val &= ~(0x1 << 1);
802 pmic_reg_write(p_base, 0xe4, val);
803 }
804 ret = pmic_reg_read(p_base, 0x0d, &val);
805 if (ret) {
806 printf("88pm801 read 0x0d failed\n");
807 return;
808 }
809 val |= 0x20;
810 pmic_reg_write(p_base, 0x0d, val);
811 while(1);
812}
813
814int pmic_get_slp_cnt(void)
815{
816 int ret = pm801_slp_cnt << 3;
817 return ret;
818}
819
820int marvell88pm_get_onkey(void)
821{
822 int ret;
823 unsigned int val;
824 struct pmic *p_base;
825
826 p_base = pmic_get(MARVELL_PMIC_BASE);
827 if (!p_base) {
828 printf("can't get base pmic\n");
829 return -1;
830 }
831 /* Status1: ON_KEY=b0 */
832 ret = pmic_reg_read(p_base, 0x01, &val);
833 if (ret) {
834 printf("88pm801 read 0x1 failed\n");
835 return ret;
836 }
837
838 return val & 0x1;
839}
840
841int pmic_88pm801_alloc(unsigned char bus, struct pmic_chip_desc *chip)
842{
843 struct pmic *p_base = pmic_alloc();
844 struct pmic *p_power = pmic_alloc();
845 struct pmic *p_gpadc = pmic_alloc();
846 struct pmic *p_test = pmic_alloc();
847 unsigned char addr = pmic_get_slave_addr();
848
849 if (!p_base || !p_power || !p_gpadc || !p_test) {
850 printf("%s: pmic alloc error!\n", __func__);
851 return -ENOMEM;
852 }
853
854 if (!chip) {
855 printf("%s: chip desc empty!\n", __func__);
856 return -EINVAL;
857 }
858
859 /* sanity check for pmic slave address */
860 if (MARVELL88PM_I2C_ADDR != addr && ASR88PM_I2C_ADDR != addr) {
861 printf("%s: i2c addr %02x wrong!\n", __func__, addr);
862 return -EINVAL;
863 }
864 if ((ASR88PM_I2C_ADDR == addr) && (0x10 != (chip->chip_id & 0xf0))) {
865 printf("%s: i2c addr %02x not match pmic\n", __func__, addr);
866 return -EINVAL;
867 }
868
869 chip->base_name = MARVELL_PMIC_BASE;
870 chip->power_name = MARVELL_PMIC_POWER;
871 chip->gpadc_name = MARVELL_PMIC_GPADC;
872 chip->test_name = MARVELL_PMIC_TEST;
873 chip->charger_name = NULL;
874 chip->fuelgauge_name = NULL;
875 chip->battery_name = NULL;
876
877 p_base->bus = bus;
878 p_base->hw.i2c.addr = addr;
879 p_base->name = MARVELL_PMIC_BASE;
880 p_base->interface = PMIC_I2C;
881 p_base->number_of_regs = PMIC_NUM_OF_REGS;
882 p_base->hw.i2c.tx_num = 1;
883
884 p_power->bus = bus;
885 p_power->hw.i2c.addr = addr + 1;
886 p_power->name = MARVELL_PMIC_POWER;
887 p_power->interface = PMIC_I2C;
888 p_power->number_of_regs = PMIC_NUM_OF_REGS;
889 p_power->hw.i2c.tx_num = 1;
890
891 p_gpadc->bus = bus;
892 p_gpadc->hw.i2c.addr = addr + 2;
893 p_gpadc->name = MARVELL_PMIC_GPADC;
894 p_gpadc->interface = PMIC_I2C;
895 p_gpadc->number_of_regs = PMIC_NUM_OF_REGS;
896 p_gpadc->hw.i2c.tx_num = 1;
897
898 p_test->bus = bus;
899 p_test->hw.i2c.addr = addr + 7;
900 p_test->name = MARVELL_PMIC_TEST;
901 p_test->interface = PMIC_I2C;
902 p_test->number_of_regs = PMIC_NUM_OF_REGS;
903 p_test->hw.i2c.tx_num = 1;
904
905 if (pmic_is_pm802() || pmic_is_pm803() || pmic_is_pm813()) {
906 /* get functions */
907 chip->set_buck_vol = pm802_set_buck_vol;
908 chip->set_ldo_vol = pm802_set_ldo_vol;
909 chip->get_buck_vol = pm802_get_buck_vol;
910 } else if(chip->chip_id == 0x64) { /* PM812 */
911 /* get functions */
912 chip->set_buck_vol = marvell88pm801_set_buck_vol;
913 chip->set_ldo_vol = marvell88pm800_set_ldo_vol;
914 chip->get_buck_vol = marvell88pm801_get_buck_vol;
915 } else { /* PM801 */
916 /* get functions */
917 chip->set_buck_vol = marvell88pm801_set_buck_vol;
918 chip->set_ldo_vol = marvell88pm801_set_ldo_vol;
919 chip->get_buck_vol = marvell88pm801_get_buck_vol;
920 }
921
922 chip->reg_update = marvell88pm801_reg_update;
923
924 puts("PMIC init\n");
925
926 g_chip = chip;
927
928 return 0;
929}
930
931void pmic_88pm801_base_init(struct pmic *p_base, struct pmic *p_test)
932{
933 u32 val;
934
935 /* set internal cap sel to 22pf */
936 val = 0x70;
937 pmic_reg_write(p_base, 0xE8, val);
938
939 pmic_reg_read(p_base, 0xe9, &val);
940 pm801_slp_cnt = val & 0xff;
941 printf("pm801_slp_cnt: 0x%x\n", pm801_slp_cnt);
942
943#if 0 /* disable smpl workaround */
944 /* open test page */
945 pmic_reg_write(p_base, 0x1f, 0x01);
946
947 if (pmic_probe(p_test))
948 return;
949 pmic_reg_read(p_test, 0x74, &val);
950 printf("bat_wu_mask: 0x%x\n", val >> 7);
951
952 if (pmic_probe(p_base))
953 return;
954 /* bat_wu_debounce:16ms */
955 pmic_reg_read(p_base, 0xe4, &val);
956 val |= 0x0c;
957 pmic_reg_write(p_base, 0xe4, val);
958
959 if (pmic_probe(p_test))
960 return;
961 pmic_reg_write(p_test, 0x50, 0xe7);
962 pmic_reg_write(p_test, 0x51, 0x01);
963 pmic_reg_write(p_test, 0x58, 0x00);
964
965 if (pmic_probe(p_base))
966 return;
967 /* close test page */
968 pmic_reg_write(p_base, 0x1f, 0x00);
969#endif
970
971 /* 0xe2 and 0xd0 registers need to set at the same time to
972 * make 32k clock work. there are two options:
973 * 1) 0xd0 = 0, 0xe2 = 0x05 or 0x06
974 * 2) 0xd0 bit 7 is 1 , 0xe2 = 0x2a (the formal one we use)
975 */
976 /*base page:reg 0xd0.7 = 1 32kHZ generated from XO */
977 pmic_reg_read(p_base, 0xd0, &val);
978 val |= (1 << 7);
979 pmic_reg_write(p_base, 0xd0, val);
980
981 /* enable DVC function */
982 pmic_reg_read(p_base, 0x0d, &val);
983 val |= (1 << 7);
984 pmic_reg_write(p_base, 0x0d, val);
985
986 /* Disable PMIC watchdog */
987 val = 0x01;
988 pmic_reg_write(p_base, 0x1d, val);
989
990 /* Enable external 32KHZ clock in pmic */
991 pmic_reg_read(p_base, 0xe2, &val);
992 val = (val & (~0x3f)) | 0x2a;
993 pmic_reg_write(p_base, 0xe2, val);
994
995 /* set oscillator running locked to 32kHZ*/
996 pmic_reg_read(p_base, 0x50, &val);
997 val &= ~(1 << 1);
998 pmic_reg_write(p_base, 0x50, val);
999
1000 /* Enable 32Khz-out-2 low jitter XO_LJ = 1 */
1001 val = 0x20;
1002 pmic_reg_write(p_base, 0x21, val);
1003
1004 pmic_reg_read(p_base, 0x55, &val);
1005 val &= ~(1 << 1);
1006 pmic_reg_write(p_base, 0x55, val);
1007
1008 /*
1009 * print out power up/down log
1010 * save it in EMMD
1011 */
1012 get_powerup_down_log(g_chip);
1013}
1014
1015void pmic_pm802_base_init(struct pmic *p_base, struct pmic *p_test)
1016{
1017 u32 val, id;
1018
1019 pmic_reg_read(p_base, 0x0, &id);
1020 pmic_reg_read(p_base, 0x5, &val);
1021
1022 if (pmic_is_pm802s()) {
1023 /* disable i2c timeout */
1024 pmic_reg_read(p_base, 0x1d, &val);
1025 val |= (1 << 3);
1026 pmic_reg_write(p_base, 0x1d, val);
1027 }
1028 /* 0xe2 and 0xd0 registers need to set at the same time to
1029 * make 32k clock work. there are two options:
1030 * 1) 0xd0 = 0, 0xe2 = 0x05 or 0x06
1031 * 2) 0xd0 bit 7 is 1 , 0xe2 = 0x2a (the formal one we use)
1032 */
1033 /*base page:reg 0xd0.7 = 1 32kHZ generated from XO */
1034#ifndef CONFIG_ASR1802S
1035 pmic_reg_read(p_base, 0xd0, &val);
1036 val |= (1 << 7);
1037 pmic_reg_write(p_base, 0xd0, val);
1038#else
1039 pmic_reg_read(p_base, 0xd0, &val);
1040 /* clear use_x for scs mode */
1041 if ((cpu_is_asr1803() || cpu_is_asr1806() || cpu_is_asr1903()) && board_is_scs_mode()) {
1042 printf("scs mode\n");
1043 val &= ~(1 << 7);
1044 } else {
1045 val |= (1 << 7);
1046 }
1047 pmic_reg_write(p_base, 0xd0, val);
1048#endif
1049 /* enable DVC function */
1050 pmic_reg_read(p_base, 0x0d, &val);
1051 val |= (1 << 7);
1052 pmic_reg_write(p_base, 0x0d, val);
1053
1054 /* config xo cap for b0+ */
1055 if (0x10 != id && 0x11 != id) {
1056 pmic_reg_read(p_base, 0xF0, &val);
1057 val &= ~(0x7 << 5);
1058 val |= (0x3 << 5);
1059 pmic_reg_write(p_base, 0xF0, val);
1060 }
1061
1062#ifndef CONFIG_ASR1802S
1063 /* enable use_xo for none-A0 chips */
1064 pmic_reg_read(p_base, 0xF1, &val);
1065 val |= (0x1 << 2);
1066 pmic_reg_write(p_base, 0xF1, val);
1067
1068
1069 /* Enable external 32KHZ clock in pmic */
1070 pmic_reg_read(p_base, 0xe4, &val);
1071 val = (val & (~(0x3 << 2))) | (0x1 << 2);
1072 pmic_reg_write(p_base, 0xe4, val);
1073#else
1074 /* enable use_xo for none-A0 chips */
1075 pmic_reg_read(p_base, 0xF1, &val);
1076 /* clear use_x for scs mode */
1077 if ((cpu_is_asr1803() || cpu_is_asr1806() || cpu_is_asr1903()) && board_is_scs_mode())
1078 val &= ~(1 << 2);
1079 else
1080 val |= (1 << 2);
1081 pmic_reg_write(p_base, 0xF1, val);
1082
1083 /* Enable external 32KHZ clock in pmic */
1084 pmic_reg_read(p_base, 0xe4, &val);
1085 if ((cpu_is_asr1803() || cpu_is_asr1806() || cpu_is_asr1903()) && board_is_scs_mode())
1086 val = (val & (~(0x3 << 2)));
1087 else
1088 val = (val & (~(0x3 << 2))) | (0x1 << 2);
1089 pmic_reg_write(p_base, 0xe4, val);
1090#endif
1091
1092 /* clear fault wakeup */
1093 pmic_reg_read(p_base, 0xe7, &val);
1094 val &= ~(0x3 << 2);
1095 pmic_reg_write(p_base, 0xe7, val);
1096
1097 /* exton1 db time 16ms */
1098 pmic_reg_read(p_base, 0xe3, &val);
1099 val |= 0xf;
1100 pmic_reg_write(p_base, 0xe3, val);
1101
1102 /* set default discharge time */
1103 pmic_reg_read(p_base, 0xe2, &val);
1104 val &= ~(0xf << 0);
1105 if (pmic_is_pm813s() || pmic_is_pm802s())
1106 val |= (0x3 << 0);
1107 else
1108 val |= (0x1 << 0);
1109 pmic_reg_write(p_base, 0xe2, val);
1110
1111 /* disable rtc rtp reload */
1112 if (pmic_is_pm802s()) {
1113 pmic_reg_read(p_base, 0xe1, &val);
1114 val |= (0x1 << 2);
1115 pmic_reg_write(p_base, 0xe1, val);
1116 }
1117 /*
1118 * print out power up/down log
1119 * save it in EMMD
1120 */
1121 get_powerup_down_log(g_chip);
1122
1123
1124 /* open test page */
1125 pmic_reg_write(p_base, 0x1f, 0x01);
1126 if (pmic_probe(p_test)) {
1127 printf("open testpage failed\n");
1128 return;
1129 }
1130
1131 asrpmic_gpadc_otp = 0;
1132 if (pmic_is_pm802s()) {
1133 pmic_reg_read(p_test, 0x6d, &val);
1134 printf("otp6d:0x%02x\n", val);
1135 asrpmic_gpadc_otp |= ((val >> 5) & 0x7);
1136
1137 pmic_reg_read(p_test, 0x68, &val);
1138 printf("otp68:0x%02x\n", val);
1139 asrpmic_gpadc_otp |= ((val >> (6-3)) & (0x3 << 3));
1140
1141 pmic_reg_read(p_test, 0x67, &val);
1142 printf("otp67:0x%02x\n", val);
1143 asrpmic_gpadc_otp |= ((val >> (7-5)) & (0x1 << 5));
1144
1145 printf("vref:0x%02x\n", asrpmic_gpadc_otp);
1146 } else {
1147 pmic_reg_read(p_test, 0x6d, &val);
1148 printf("otp6d:0x%02x\n", val);
1149 asrpmic_gpadc_otp |= ((val >> 4) & 0x1);
1150 pmic_reg_read(p_test, 0x6e, &val);
1151 printf("otp6e:0x%02x\n", val);
1152 asrpmic_gpadc_otp |= ((val << 1) & (0x3 << 1));
1153 printf("vref:0x%02x\n", asrpmic_gpadc_otp);
1154 }
1155 /* close test page */
1156 pmic_reg_write(p_base, 0x1f, 0x00);
1157}
1158
1159void pmic_pm813_base_init(struct pmic *p_base, struct pmic *p_test)
1160{
1161 u32 val;
1162
1163 pmic_reg_read(p_base, 0x6, &val);
1164
1165 /* 0xe2 and 0xd0 registers need to set at the same time to
1166 * make 32k clock work. there are two options:
1167 * 1) 0xd0 = 0, 0xe2 = 0x05 or 0x06
1168 * 2) 0xd0 bit 7 is 1 , 0xe2 = 0x2a (the formal one we use)
1169 */
1170 /*base page:reg 0xd0.7 = 1 32kHZ generated from XO */
1171#ifndef CONFIG_ASR1802S
1172 pmic_reg_read(p_base, 0xd0, &val);
1173 val |= (1 << 7);
1174 pmic_reg_write(p_base, 0xd0, val);
1175#else
1176 pmic_reg_read(p_base, 0xd0, &val);
1177 /* clear use_x for scs mode */
1178 if ((cpu_is_asr1803() || cpu_is_asr1806() || cpu_is_asr1903()) && board_is_scs_mode())
1179 val &= ~(1 << 7);
1180 else
1181 val |= (1 << 7);
1182 pmic_reg_write(p_base, 0xd0, val);
1183#endif
1184 /* enable DVC function */
1185 pmic_reg_read(p_base, 0x0d, &val);
1186 val |= (1 << 7);
1187 pmic_reg_write(p_base, 0x0d, val);
1188
1189 /* config xo cap, obm config it to 10pf */
1190 pmic_reg_read(p_base, 0xF0, &val);
1191 val &= ~(0x7 << 5);
1192 val |= (0x3 << 5);
1193 pmic_reg_write(p_base, 0xF0, val);
1194
1195#ifndef CONFIG_ASR1802S
1196 /* enable use_xo for none-A0 chips */
1197 pmic_reg_read(p_base, 0xF1, &val);
1198 val |= (0x1 << 2);
1199 pmic_reg_write(p_base, 0xF1, val);
1200
1201 /* Enable external 32KHZ clock in pmic */
1202 pmic_reg_read(p_base, 0xe4, &val);
1203 val = (val & (~(0x3 << 2))) | (0x1 << 2);
1204 pmic_reg_write(p_base, 0xe4, val);
1205#else
1206 /* enable use_xo for none-A0 chips */
1207 pmic_reg_read(p_base, 0xF1, &val);
1208 /* clear use_x for scs mode */
1209 if ((cpu_is_asr1803() || cpu_is_asr1806() || cpu_is_asr1903()) && board_is_scs_mode())
1210 val &= ~(1 << 2);
1211 else
1212 val |= (1 << 2);
1213 pmic_reg_write(p_base, 0xF1, val);
1214
1215 /* Enable external 32KHZ clock in pmic */
1216 pmic_reg_read(p_base, 0xe4, &val);
1217 if ((cpu_is_asr1803() || cpu_is_asr1806() || cpu_is_asr1903()) && board_is_scs_mode())
1218 val = (val & (~(0x3 << 2)));
1219 else
1220 val = (val & (~(0x3 << 2))) | (0x1 << 2);
1221 pmic_reg_write(p_base, 0xe4, val);
1222#endif
1223 /* clear fault wakeup */
1224 pmic_reg_read(p_base, 0xe7, &val);
1225 val &= ~(0xf << 0);
1226 pmic_reg_write(p_base, 0xe7, val);
1227
1228 /* exton1 db time 16ms */
1229 pmic_reg_read(p_base, 0xe3, &val);
1230 val |= 0x7;
1231 pmic_reg_write(p_base, 0xe3, val);
1232
1233 /* disable RTC rtp reload */
1234 if (pmic_is_pm813s()) {
1235 pmic_reg_read(p_base, 0xf7, &val);
1236 val |= (0x1 << 5);
1237 pmic_reg_write(p_base, 0xf7, val);
1238 } else {
1239 pmic_reg_read(p_base, 0xd0, &val);
1240 val |= (0x1 << 6);
1241 pmic_reg_write(p_base, 0xd0, val);
1242 }
1243 /*
1244 * print out power up/down log
1245 * save it in EMMD
1246 */
1247 get_powerup_down_log(g_chip);
1248
1249 /* open test page */
1250 pmic_reg_write(p_base, 0x1f, 0x01);
1251 if (pmic_probe(p_test)) {
1252 printf("open testpage failed\n");
1253 return;
1254 }
1255
1256 asrpmic_gpadc_otp = 0;
1257 if (pmic_is_pm813s()) {
1258 pmic_reg_read(p_test, 0x6a, &val);
1259 printf("otp6a:0x%02x\n", val);
1260 asrpmic_gpadc_otp |= ((val >> 7) & 0x1);
1261
1262 pmic_reg_read(p_test, 0x6b, &val);
1263 printf("otp6b:0x%02x\n", val);
1264 asrpmic_gpadc_otp |= ((val >> (6)) & (0x2));
1265
1266 pmic_reg_read(p_test, 0x6c, &val);
1267 printf("otp6c:0x%02x\n", val);
1268 asrpmic_gpadc_otp |= ((val >> (5)) & (0x4));
1269
1270 pmic_reg_read(p_test, 0x6f, &val);
1271 printf("otp6f:0x%02x\n", val);
1272 asrpmic_gpadc_otp |= ((val >> (4)) & (0x8));
1273
1274 printf("vref:0x%02x\n", asrpmic_gpadc_otp);
1275 }
1276 /* close test page */
1277 pmic_reg_write(p_base, 0x1f, 0x00);
1278}
1279
1280
1281void pmic_pm803_base_init(struct pmic *p_base, struct pmic *p_test)
1282{
1283 u32 val, id;
1284
1285 pmic_reg_read(p_base, 0x0, &id);
1286 pmic_reg_read(p_base, 0x5, &val);
1287
1288 /*
1289 * print out power up/down log
1290 * save it in EMMD
1291 */
1292 get_powerup_down_log(g_chip);
1293
1294 /* disable ALARM PULL DOWN DISABLE
1295 * and disable rtc_otp_reload
1296 */
1297 pmic_reg_read(p_base, 0xd0, &val);
1298 val |= ((1 << 7) | (0x1 << 6));
1299 pmic_reg_write(p_base, 0xd0, val);
1300
1301 /* enable DVC function */
1302 pmic_reg_read(p_base, 0x0d, &val);
1303 val |= (1 << 7);
1304 pmic_reg_write(p_base, 0x0d, val);
1305
1306 /* clear fault wakeup */
1307 pmic_reg_read(p_base, 0xe7, &val);
1308 val &= ~(0x3 << 0);
1309 pmic_reg_write(p_base, 0xe7, val);
1310
1311 /* exton1 db time 16ms */
1312 pmic_reg_read(p_base, 0xe3, &val);
1313 val |= 0xf;
1314 pmic_reg_write(p_base, 0xe3, val);
1315
1316 pmic_reg_read(p_base, 0xe2, &val);
1317 val &= ~(0xf << 0);
1318 val |= (0x1 << 0);
1319 pmic_reg_write(p_base, 0xe2, val);
1320}
1321
1322void pmic_88pm801_gpadc_init(struct pmic *p_gpadc)
1323{
1324 /* TODO: enable battery detection: board specific */
1325 u32 val;
1326
1327 /* enable GPADC MEAS_EN_SLP mode, 2x meas_off slot */
1328 pmic_reg_write(p_gpadc, 0x06, 0x33);
1329 pmic_reg_write(p_gpadc, 0x01, 0x0e);
1330 pmic_reg_read(p_gpadc, 0x02, &val);
1331 val |= 0x0c;
1332 pmic_reg_write(p_gpadc, 0x02, val);
1333
1334 /* disable bias by default */
1335 pmic_reg_write(p_gpadc, 0x14, 0x00);
1336
1337
1338}
1339
1340static pmic_pm802_gpadc_calbration(struct pmic *p_gpadc)
1341{
1342 int i, val, sum = 0;
1343 int buf[2];
1344 char data;
1345
1346 /* select cleanvref 1p2 */
1347 /* pmic_reg_write(g_p_base, 0x0d, 0x88); */
1348
1349 /* set avg to 0*/
1350 if (pmic_is_pm813s())
1351 pmic_reg_write(p_gpadc, 0x38, 0x0);
1352
1353 /* sample adc */
1354 if (pmic_is_pm813()) {
1355 pmic_reg_write(p_gpadc, 0x3a, 0x80);
1356 pmic_reg_write(p_gpadc, 0x39, 0x8f);
1357 pmic_reg_write(p_gpadc, 0x3b, 0x0b);
1358 } else {
1359 pmic_reg_write(p_gpadc, 0x3a, 0xf8);
1360 pmic_reg_write(p_gpadc, 0x39, 0x81);
1361 pmic_reg_write(p_gpadc, 0x3b, 0x18);
1362 }
1363
1364 for (i = 0; i < 10; i++) {
1365 if (pmic_is_pm802()) {
1366 pmic_reg_write(p_gpadc, 0x3b, 0x1c);
1367 udelay(1000);
1368 pmic_reg_read(p_gpadc, 0x4c, &buf[0]);
1369 pmic_reg_read(p_gpadc, 0x4d, &buf[1]);
1370 val = ((buf[1] & 0x0f) << 8) | (buf[0] & 0xff);
1371 } else if (pmic_is_pm813()) {
1372 pmic_reg_write(p_gpadc, 0x3b, 0x0f);
1373 udelay(1000);
1374 pmic_reg_read(p_gpadc, 0x54, &buf[0]);
1375 pmic_reg_read(p_gpadc, 0x55, &buf[1]);
1376 val = ((buf[0] & 0xff) << 4) | (buf[1] & 0xf);
1377 } else {
1378 pmic_reg_write(p_gpadc, 0x3b, 0x1c);
1379 udelay(1000);
1380 pmic_reg_read(p_gpadc, 0x4c, &buf[0]);
1381 pmic_reg_read(p_gpadc, 0x4d, &buf[1]);
1382 val = ((buf[0] & 0xff) << 4) | (buf[1] & 0xf);
1383 }
1384
1385 if (pmic_is_pm813()) {
1386 if (pmic_is_pm813s())
1387 sum += (val - 1024);
1388 else
1389 sum += (val - 1032);
1390 pmic_reg_write(p_gpadc, 0x3b, 0x0b);
1391 } else {
1392 sum += (val - 1032);
1393 pmic_reg_write(p_gpadc, 0x3b, 0x18);
1394 }
1395 }
1396
1397 pmic_sample_offset = sum / 10;
1398
1399 if (pmic_is_pm802s()) {
1400 if (asrpmic_gpadc_otp & (0x1 << 5)) {
1401 data = (asrpmic_gpadc_otp & 0x3f) | (0x3 << 6);
1402 pmic_vref_offset = 0xffffff00 | data;
1403 } else {
1404 pmic_vref_offset = data = asrpmic_gpadc_otp;
1405 }
1406 } else if (pmic_is_pm802()) {
1407 pmic_vref_offset = vref_offset_table[asrpmic_gpadc_otp];
1408 } else if (pmic_is_pm813s()) {
1409 pmic_vref_offset = pm813s_vref_offset_table[asrpmic_gpadc_otp];
1410 } else {
1411 pmic_vref_offset = 0;
1412 }
1413
1414 if (pmic_vref_offset > 127 || pmic_vref_offset < -128) {
1415 printf("!!!pmic_vref_offset: %d\n", pmic_vref_offset);
1416 pmic_vref_offset = 0;
1417 }
1418
1419 if (pmic_sample_offset > 127 || pmic_sample_offset < -128) {
1420 printf("!!!pmic sp offset: %d\n", pmic_sample_offset);
1421 pmic_sample_offset = 0;
1422 }
1423 printf("vrefotp: 0x%02x,offset: %d\n", asrpmic_gpadc_otp, pmic_vref_offset);
1424 printf("sample offset: %d\n", pmic_sample_offset);
1425 val = pmic_vref_offset & 0xff;
1426 pmic_reg_write(p_gpadc, 0x13, (u32)val);
1427 val = pmic_sample_offset & 0xff;
1428 pmic_reg_write(p_gpadc, 0x14, (u32)val);
1429}
1430
1431void pmic_get_calibration_data(int *vref_offset, int *sample_offset)
1432{
1433 *vref_offset = (pmic_vref_offset * 5);
1434 *sample_offset = pmic_sample_offset;
1435}
1436
1437void pmic_pm802_gpadc_init(struct pmic *p_gpadc)
1438{
1439 u32 val;
1440
1441 /* TODO: enable battery detection: board specific */
1442
1443 /* disable gpadc normal mode by default */
1444 pmic_reg_write(p_gpadc, 0x06, 0x00);
1445
1446 /* begin for default state */
1447 /* clear gpadc_soc and gpadc_en */
1448 pmic_reg_read(p_gpadc, 0x3B, &val);
1449 val &= ~(0x3 << 2);
1450 pmic_reg_write(p_gpadc, 0x3B, val);
1451 pmic_reg_write(p_gpadc, 0x0A, 0x00);
1452
1453 /* enable use_100k, enable testmode */
1454 pmic_reg_write(p_gpadc, 0x0A, 0x03);
1455
1456 /* disable bias by default */
1457 pmic_reg_write(p_gpadc, 0x0D, 0x00);
1458
1459 /* update vinldo meas config */
1460 if (!(pmic_is_pm802s() || pmic_is_pm813()))
1461 pmic_reg_write(p_gpadc, 0x10, 0x40);
1462
1463 /* gpadc calibration */
1464 pmic_pm802_gpadc_calbration(p_gpadc);
1465
1466 pmic_reg_write(p_gpadc, 0x39, 0x0);
1467
1468 /* 16 cycles of GPADC SAMPLE time, single conv mode */
1469 pmic_reg_read(p_gpadc, 0x3A, &val);
1470 val &= ~0x1;
1471 val |= 0x18;
1472 pmic_reg_write(p_gpadc, 0x3A, val);
1473
1474 /* set gpadc_soc and gpadc_en */
1475 pmic_reg_read(p_gpadc, 0x3B, &val);
1476 val &= ~(0x3 << 2);
1477 val |= (0x3 << 2);
1478 pmic_reg_write(p_gpadc, 0x3B, val);
1479}
1480
1481void pmic_88pm801_power_init(struct pmic *p_power)
1482{
1483 u32 val, id;
1484
1485 pmic_reg_read(p_power, 0x0, &id);
1486
1487#ifdef CONFIG_ASR1802S
1488 /* set vbuck1 sleep vol to 0.65v for 1802s,
1489 * 0.6v for 1803 and 1828, and 1806
1490 */
1491 pmic_reg_write(p_power, 0x30, 0x4);
1492#endif
1493
1494#ifdef CONFIG_PXA182X
1495 /* set vbuck1 sleep vol to 0.7v */
1496 pmic_reg_write(p_power, 0x30, 0x8);
1497#endif
1498
1499 /* change drive selection from half to full */
1500 val = 0xff;
1501 pmic_reg_write(p_power, 0x3a, val);
1502
1503 /* store the slp_cnt */
1504 pmic_reg_read(p_power, 0x71, &val);
1505 val &= 0x0F;
1506 val |= ((pm801_slp_cnt & 0x0f) << 4);
1507 pmic_reg_write(p_power, 0x71, val);
1508
1509 pmic_reg_read(p_power, 0x9A, &val);
1510 val &= 0x0F;
1511 val |= (pm801_slp_cnt & 0xF0);
1512 pmic_reg_write(p_power, 0x9A, val);
1513}
1514
1515void pmic_pm802_power_init(struct pmic *p_power)
1516{
1517 u32 val;
1518
1519#ifdef CONFIG_ASR1802S
1520 if (cpu_is_asr1903_a0() || cpu_is_asr1903_b0()) {
1521 /* set vbuck1 sleep vol to 0.60v for:
1522 * asr1903a0,asr1903b0
1523 */
1524 pmic_reg_write(p_power, 0x21, 0x0);
1525 } else {
1526 /* set vbuck1 sleep vol to 0.65v for 1802s,
1527 * 1803 and 1828, and 1806
1528 */
1529 pmic_reg_write(p_power, 0x21, 0x4);
1530 }
1531#endif
1532
1533#ifdef CONFIG_PXA182X
1534 /* set vbuck1 sleep vol to 0.7v */
1535 pmic_reg_write(p_power, 0x21, 0x8);
1536#endif
1537
1538#ifdef CONFIG_ASR1901
1539 /* set vbuck1 sleep vol to 1.1v */
1540 pmic_reg_write(p_power, 0x21, 0x28);
1541
1542 /* disable dvc for asr1901 */
1543 pmic_reg_read(p_power, 0x21, &val);
1544 val &= ~(0x1 << 7);
1545 pmic_reg_write(p_power, 0x21, val);
1546#else
1547 pmic_reg_read(p_power, 0x21, &val);
1548 val |= (0x1 << 7);
1549 pmic_reg_write(p_power, 0x21, val);
1550#endif
1551 /* other misc config for pm802s */
1552 if (pmic_is_pm802s()) {
1553 pmic_reg_read(p_power, 0x22, &val);
1554 val |= (0x1 << 7);
1555 pmic_reg_write(p_power, 0x22, val);
1556
1557 pmic_reg_read(p_power, 0x24, &val);
1558 val |= ((0x1 << 0) | (0x3 << 3));
1559 pmic_reg_write(p_power, 0x24, val);
1560
1561 pmic_reg_read(p_power, 0x29, &val);
1562 val |= 0x38;
1563 pmic_reg_write(p_power, 0x29, val);
1564
1565 pmic_reg_read(p_power, 0x32, &val);
1566 val |= (0x1 << 7);
1567 pmic_reg_write(p_power, 0x32, val);
1568
1569 pmic_reg_read(p_power, 0x34, &val);
1570 val |= (0x1 << 0);
1571 pmic_reg_write(p_power, 0x34, val);
1572
1573 pmic_reg_read(p_power, 0x39, &val);
1574 val |= 0x28;
1575 pmic_reg_write(p_power, 0x39, val);
1576
1577 pmic_reg_read(p_power, 0x44, &val);
1578 val |= 0x19;
1579 pmic_reg_write(p_power, 0x44, val);
1580
1581 pmic_reg_read(p_power, 0x49, &val);
1582 val |= 0x30;
1583 pmic_reg_write(p_power, 0x49, val);
1584 }
1585
1586 /* enable pmic skip mode */
1587 pmic_reg_read(p_power, 0x24, &val);
1588 val |= (0x1 << 7);
1589 if (!pmic_is_pm802s())
1590 val &= ~(0x1 << 3);
1591 pmic_reg_write(p_power, 0x24, val);
1592
1593 pmic_reg_read(p_power, 0x27, &val);
1594 val &= (~(0x7 << 5));
1595 if (pmic_is_pm802s())
1596 val |= (0x2 << 5);
1597 else
1598 val |= (0x3 << 5);
1599 pmic_reg_write(p_power, 0x27, val);
1600
1601 /* clear fpwm */
1602 pmic_reg_read(p_power, 0x25, &val);
1603 val &= (~(0x1 << 3));
1604 val |= (0x1 << 2);
1605 pmic_reg_write(p_power, 0x25, val);
1606
1607 pmic_reg_read(p_power, 0x22, &val);
1608 val &= (~0x7);
1609 if (pmic_is_pm802s())
1610 val |= (0x1 << 5);
1611 else
1612 val |= (0x1 << 5 | (0x5 << 0));
1613 pmic_reg_write(p_power, 0x22, val);
1614
1615 /* buck2 low ripple config for auto mode */
1616 if (!pmic_is_pm802s()) {
1617 pmic_reg_read(p_power, 0x37, &val);
1618 val &= (~(0x7 << 5));
1619 val |= (0x3 << 5);
1620 pmic_reg_write(p_power, 0x37, val);
1621
1622 pmic_reg_read(p_power, 0x34, &val);
1623 val &= ~(0x1 << 3);
1624 pmic_reg_write(p_power, 0x34, val);
1625
1626 pmic_reg_read(p_power, 0x32, &val);
1627 val &= (~0x7);
1628 val |= (0x5 << 0);
1629 pmic_reg_write(p_power, 0x32, val);
1630 } else {
1631 pmic_reg_read(p_power, 0x37, &val);
1632 val |= (0x1 << 6);
1633 pmic_reg_write(p_power, 0x37, val);
1634 }
1635 /* disable BUCK2 skip mode and use automode */
1636#if 0
1637 pmic_reg_read(p_power, 0x34, &val);
1638 val |= (0x1 << 7);
1639 pmic_reg_write(p_power, 0x34, val);
1640
1641 pmic_reg_read(p_power, 0x37, &val);
1642 val &= (~(0x7 << 5));
1643 val |= (0x3 << 5);
1644 pmic_reg_write(p_power, 0x37, val);
1645
1646 pmic_reg_read(p_power, 0x35, &val);
1647 val &= (~(0x1 << 3));
1648 val |= (0x1 << 2);
1649 pmic_reg_write(p_power, 0x35, val);
1650
1651 pmic_reg_read(p_power, 0x32, &val);
1652 val &= (~0x7);
1653 val |= (0x1 << 5 | (0x5 << 0));
1654 pmic_reg_write(p_power, 0x32, val);
1655#endif
1656}
1657
1658void pmic_pm803_power_init(struct pmic *p_power)
1659{
1660 u32 val;
1661
1662#ifdef CONFIG_ASR1802S
1663 if (cpu_is_asr1903_a0() || cpu_is_asr1903_b0()) {
1664 /* set vbuck1 sleep vol to 0.60v for:
1665 * asr1903a0,asr1903b0
1666 */
1667 pmic_reg_write(p_power, 0x21, 0x4);
1668 } else {
1669 /* set vbuck1 sleep vol to 0.65v for 1802s,
1670 * 1803 and 1828, and 1806
1671 */
1672 pmic_reg_write(p_power, 0x21, 0x4);
1673 }
1674#endif
1675
1676#ifdef CONFIG_PXA182X
1677 /* set vbuck1 sleep vol to 0.7v */
1678 pmic_reg_write(p_power, 0x21, 0x8);
1679#endif
1680
1681 pmic_reg_read(p_power, 0x21, &val);
1682 val |= (0x1 << 7);
1683 pmic_reg_write(p_power, 0x21, val);
1684
1685#if 0 /* keep it for easy restore of fpwm mode if needed */
1686 pmic_reg_read(p_power, 0x24, &val);
1687 val &= ~(0x1 << 7);
1688 pmic_reg_write(p_power, 0x24, val);
1689#else
1690 /* enable pmic skip mode */
1691 pmic_reg_read(p_power, 0x24, &val);
1692 val |= (0x1 << 7);
1693 pmic_reg_write(p_power, 0x24, val);
1694
1695 pmic_reg_read(p_power, 0x27, &val);
1696 val &= (~(0x7 << 5));
1697 val |= (0x0 << 5);
1698 pmic_reg_write(p_power, 0x27, val);
1699
1700 /* clear fpwm */
1701 pmic_reg_read(p_power, 0x25, &val);
1702 val &= (~(0x1 << 3));
1703 val |= (0x1 << 2);
1704 pmic_reg_write(p_power, 0x25, val);
1705
1706 pmic_reg_read(p_power, 0x22, &val);
1707 val &= (~0x7);
1708 val |= (0x1 << 5 | (0x0 << 0));
1709 pmic_reg_write(p_power, 0x22, val);
1710#endif
1711}
1712
1713void pmic_88pm801_power_preinit(struct pmic *p_power)
1714{
1715 /*
1716 * set buck4 dvl01/10/11 as 1.8v before DVC is enabled
1717 * don't set dvl00 as its default value is 1.8v
1718 * buck4 need to be stable to supply RF
1719 */
1720 pmic_reg_write(p_power, 0x43, 0x54);
1721 pmic_reg_write(p_power, 0x44, 0x54);
1722 pmic_reg_write(p_power, 0x45, 0x54);
1723}
1724
1725void pmic_pm802_power_preinit(struct pmic *p_power) {}
1726void pmic_pm803_power_preinit(struct pmic *p_power) {}
1727
1728int pmic_88pm801_init(struct pmic_chip_desc *chip)
1729{
1730
1731 struct pmic *p_base, *p_power, *p_gpadc, *p_test;
1732 if (!chip) {
1733 printf("---%s: chip is empty.\n", __func__);
1734 return -EINVAL;
1735 }
1736
1737 /*------------power page pre-setting -----------*/
1738 p_power = pmic_get(chip->power_name);
1739 if (!p_power)
1740 return -1;
1741 if (pmic_probe(p_power))
1742 return -1;
1743 if (pmic_is_pm802() || pmic_is_pm813())
1744 pmic_pm802_power_preinit(p_power);
1745 else if (pmic_is_pm803())
1746 pmic_pm803_power_preinit(p_power);
1747 else
1748 pmic_88pm801_power_preinit(p_power);
1749
1750 /*------------base page setting-----------*/
1751 p_base = pmic_get(chip->base_name);
1752 if (!p_base)
1753 return -1;
1754 p_test = pmic_get(chip->test_name);
1755 if (!p_test)
1756 return -1;
1757
1758 if (pmic_probe(p_base))
1759 return -1;
1760 g_p_base = p_base;
1761
1762 if (pmic_is_pm802())
1763 pmic_pm802_base_init(p_base, p_test);
1764 else if (pmic_is_pm803())
1765 pmic_pm803_base_init(p_base, p_test);
1766 else if (pmic_is_pm813())
1767 pmic_pm813_base_init(p_base, p_test);
1768 else
1769 pmic_88pm801_base_init(p_base, p_test);
1770 board_pmic_base_fixup(p_base);
1771
1772 /*------------gpadc page setting -----------*/
1773 p_gpadc = pmic_get(chip->gpadc_name);
1774 if (!p_gpadc)
1775 return -1;
1776 if (pmic_probe(p_gpadc))
1777 return -1;
1778 if (pmic_is_pm802() || pmic_is_pm813())
1779 pmic_pm802_gpadc_init(p_gpadc);
1780 else if (!pmic_is_pm803())
1781 pmic_88pm801_gpadc_init(p_gpadc);
1782
1783 if (!pmic_is_pm803())
1784 board_pmic_gpadc_fixup(p_gpadc);
1785
1786 /*------------power page setting -----------*/
1787 p_power = pmic_get(chip->power_name);
1788 if (!p_power)
1789 return -1;
1790 if (pmic_probe(p_power))
1791 return -1;
1792 if (pmic_is_pm802() || pmic_is_pm813())
1793 pmic_pm802_power_init(p_power);
1794 else if (pmic_is_pm803())
1795 pmic_pm803_power_init(p_power);
1796 else
1797 pmic_88pm801_power_init(p_power);
1798 board_pmic_power_fixup(p_power);
1799
1800 return 0;
1801}
1802
1803void pmic_pm802_powerdown(struct pmic *p_base)
1804{
1805 u32 val;
1806
1807 printf("pm802 power down\n");
1808
1809 pmic_clear_pdown_log();
1810
1811 pmic_reg_read(p_base, 0xe2, &val);
1812 val &= ~(0xf << 0);
1813 if (pmic_is_pm813s() || pmic_is_pm802s())
1814 val |= (0x3 << 0);
1815 else
1816 val |= (0x1 << 0);
1817 pmic_reg_write(p_base, 0xe2, val);
1818
1819 pmic_reg_read(p_base, 0xe4, &val);
1820 val &= ~(0x1 << 1);
1821 pmic_reg_write(p_base, 0xe4, val);
1822
1823 pmic_reg_read(p_base, 0x0d, &val);
1824 val |= (0x1 << 5);
1825 pmic_reg_write(p_base, 0x0d, val);
1826
1827 while(1);
1828}
1829
1830
1831