1 /* SPDX-License-Identifier: GPL-2.0-only */
2
3 #include <console/console.h>
4 #include <delay.h>
5 #include <soc/mt6315.h>
6 #include <soc/pmif.h>
7 #include <soc/pmif_spmi.h>
8
9 static struct pmif *pmif_arb = NULL;
10
mt6315_read(u32 slvid,u32 reg,u32 * data)11 static void mt6315_read(u32 slvid, u32 reg, u32 *data)
12 {
13 pmif_arb->read(pmif_arb, slvid, reg, data);
14 }
15
mt6315_write(u32 slvid,u32 reg,u32 data)16 static void mt6315_write(u32 slvid, u32 reg, u32 data)
17 {
18 pmif_arb->write(pmif_arb, slvid, reg, data);
19 }
20
mt6315_write_field(u32 slvid,u32 reg,u32 val,u32 mask,u32 shift)21 void mt6315_write_field(u32 slvid, u32 reg, u32 val, u32 mask, u32 shift)
22 {
23 pmif_arb->write_field(pmif_arb, slvid, reg, val, mask, shift);
24 }
25
mt6315_wdt_enable(u32 slvid)26 static void mt6315_wdt_enable(u32 slvid)
27 {
28 mt6315_write(slvid, 0x3A9, 0x63);
29 mt6315_write(slvid, 0x3A8, 0x15);
30 mt6315_write(slvid, 0x127, 0x2);
31 mt6315_write(slvid, 0x127, 0x1);
32 mt6315_write(slvid, 0x127, 0x8);
33 udelay(50);
34 mt6315_write(slvid, 0x128, 0x8);
35 mt6315_write(slvid, 0x3A8, 0);
36 mt6315_write(slvid, 0x3A9, 0);
37 }
38
mt6315_buck_set_voltage(u32 slvid,u32 buck_id,u32 buck_uv)39 void mt6315_buck_set_voltage(u32 slvid, u32 buck_id, u32 buck_uv)
40 {
41 unsigned int vol_reg, vol_val;
42
43 if (!pmif_arb)
44 die("ERROR: pmif_arb not initialized");
45
46 switch (buck_id) {
47 case MT6315_BUCK_1:
48 vol_reg = MT6315_BUCK_TOP_ELR0;
49 break;
50 case MT6315_BUCK_3:
51 vol_reg = MT6315_BUCK_TOP_ELR3;
52 break;
53 default:
54 die("ERROR: Unknown buck_id %u", buck_id);
55 return;
56 };
57
58 vol_val = buck_uv / 6250;
59 mt6315_write(slvid, vol_reg, vol_val);
60 }
61
mt6315_buck_get_voltage(u32 slvid,u32 buck_id)62 u32 mt6315_buck_get_voltage(u32 slvid, u32 buck_id)
63 {
64 u32 vol_reg, vol;
65
66 if (!pmif_arb)
67 die("ERROR: pmif_arb not initialized");
68
69 switch (buck_id) {
70 case MT6315_BUCK_1:
71 vol_reg = MT6315_BUCK_VBUCK1_DBG0;
72 break;
73 case MT6315_BUCK_3:
74 vol_reg = MT6315_BUCK_VBUCK1_DBG3;
75 break;
76 default:
77 die("ERROR: Unknown buck_id %u", buck_id);
78 return 0;
79 };
80
81 mt6315_read(slvid, vol_reg, &vol);
82 return vol * 6250;
83 }
84
init_pmif_arb(void)85 static void init_pmif_arb(void)
86 {
87 if (!pmif_arb) {
88 pmif_arb = get_pmif_controller(PMIF_SPMI, 0);
89 if (!pmif_arb)
90 die("ERROR: No spmi device");
91 }
92
93 if (pmif_arb->is_pmif_init_done(pmif_arb))
94 die("ERROR - Failed to initialize pmif spmi");
95 }
96
mt6315_init(void)97 void mt6315_init(void)
98 {
99 size_t i;
100
101 init_pmif_arb();
102
103 for (i = 0; i < spmi_dev_cnt; i++)
104 mt6315_wdt_enable(spmi_dev[i].slvid);
105
106 mt6315_init_setting();
107 }
108