xref: /rk3399_ARM-atf/drivers/st/pmic/stm32mp_pmic.c (revision 23684d0e819b497d2661759b315e43e267a3a74c)
1*23684d0eSYann Gautier /*
2*23684d0eSYann Gautier  * Copyright (c) 2017-2019, STMicroelectronics - All Rights Reserved
3*23684d0eSYann Gautier  *
4*23684d0eSYann Gautier  * SPDX-License-Identifier: BSD-3-Clause
5*23684d0eSYann Gautier  */
6*23684d0eSYann Gautier 
7*23684d0eSYann Gautier #include <errno.h>
8*23684d0eSYann Gautier #include <stdbool.h>
9*23684d0eSYann Gautier 
10*23684d0eSYann Gautier #include <libfdt.h>
11*23684d0eSYann Gautier 
12*23684d0eSYann Gautier #include <platform_def.h>
13*23684d0eSYann Gautier 
14*23684d0eSYann Gautier #include <common/debug.h>
15*23684d0eSYann Gautier #include <drivers/delay_timer.h>
16*23684d0eSYann Gautier #include <drivers/st/stm32mp_pmic.h>
17*23684d0eSYann Gautier #include <drivers/st/stm32_gpio.h>
18*23684d0eSYann Gautier #include <drivers/st/stm32mp1_clk.h>
19*23684d0eSYann Gautier #include <drivers/st/stpmic1.h>
20*23684d0eSYann Gautier #include <lib/mmio.h>
21*23684d0eSYann Gautier #include <lib/utils_def.h>
22*23684d0eSYann Gautier 
23*23684d0eSYann Gautier /* I2C Timing hard-coded value, for I2C clock source is HSI at 64MHz */
24*23684d0eSYann Gautier #define I2C_TIMING			0x10D07DB5
25*23684d0eSYann Gautier 
26*23684d0eSYann Gautier #define I2C_TIMEOUT			0xFFFFF
27*23684d0eSYann Gautier 
28*23684d0eSYann Gautier #define MASK_RESET_BUCK3		BIT(2)
29*23684d0eSYann Gautier 
30*23684d0eSYann Gautier #define STPMIC1_LDO12356_OUTPUT_MASK	(uint8_t)(GENMASK(6, 2))
31*23684d0eSYann Gautier #define STPMIC1_LDO12356_OUTPUT_SHIFT	2
32*23684d0eSYann Gautier #define STPMIC1_LDO3_MODE		(uint8_t)(BIT(7))
33*23684d0eSYann Gautier #define STPMIC1_LDO3_DDR_SEL		31U
34*23684d0eSYann Gautier #define STPMIC1_LDO3_1800000		(9U << STPMIC1_LDO12356_OUTPUT_SHIFT)
35*23684d0eSYann Gautier 
36*23684d0eSYann Gautier #define STPMIC1_BUCK_OUTPUT_SHIFT	2
37*23684d0eSYann Gautier #define STPMIC1_BUCK3_1V8		(39U << STPMIC1_BUCK_OUTPUT_SHIFT)
38*23684d0eSYann Gautier 
39*23684d0eSYann Gautier #define STPMIC1_DEFAULT_START_UP_DELAY_MS	1
40*23684d0eSYann Gautier 
41*23684d0eSYann Gautier static struct i2c_handle_s i2c_handle;
42*23684d0eSYann Gautier static uint32_t pmic_i2c_addr;
43*23684d0eSYann Gautier 
44*23684d0eSYann Gautier static int dt_get_pmic_node(void *fdt)
45*23684d0eSYann Gautier {
46*23684d0eSYann Gautier 	return fdt_node_offset_by_compatible(fdt, -1, "st,stpmic1");
47*23684d0eSYann Gautier }
48*23684d0eSYann Gautier 
49*23684d0eSYann Gautier bool dt_check_pmic(void)
50*23684d0eSYann Gautier {
51*23684d0eSYann Gautier 	int node;
52*23684d0eSYann Gautier 	void *fdt;
53*23684d0eSYann Gautier 
54*23684d0eSYann Gautier 	if (fdt_get_address(&fdt) == 0) {
55*23684d0eSYann Gautier 		return false;
56*23684d0eSYann Gautier 	}
57*23684d0eSYann Gautier 
58*23684d0eSYann Gautier 	node = dt_get_pmic_node(fdt);
59*23684d0eSYann Gautier 	if (node < 0) {
60*23684d0eSYann Gautier 		VERBOSE("%s: No PMIC node found in DT\n", __func__);
61*23684d0eSYann Gautier 		return false;
62*23684d0eSYann Gautier 	}
63*23684d0eSYann Gautier 
64*23684d0eSYann Gautier 	return fdt_check_status(node);
65*23684d0eSYann Gautier }
66*23684d0eSYann Gautier 
67*23684d0eSYann Gautier static int dt_pmic_i2c_config(struct dt_node_info *i2c_info)
68*23684d0eSYann Gautier {
69*23684d0eSYann Gautier 	int pmic_node, i2c_node;
70*23684d0eSYann Gautier 	void *fdt;
71*23684d0eSYann Gautier 	const fdt32_t *cuint;
72*23684d0eSYann Gautier 
73*23684d0eSYann Gautier 	if (fdt_get_address(&fdt) == 0) {
74*23684d0eSYann Gautier 		return -ENOENT;
75*23684d0eSYann Gautier 	}
76*23684d0eSYann Gautier 
77*23684d0eSYann Gautier 	pmic_node = dt_get_pmic_node(fdt);
78*23684d0eSYann Gautier 	if (pmic_node < 0) {
79*23684d0eSYann Gautier 		return -FDT_ERR_NOTFOUND;
80*23684d0eSYann Gautier 	}
81*23684d0eSYann Gautier 
82*23684d0eSYann Gautier 	cuint = fdt_getprop(fdt, pmic_node, "reg", NULL);
83*23684d0eSYann Gautier 	if (cuint == NULL) {
84*23684d0eSYann Gautier 		return -FDT_ERR_NOTFOUND;
85*23684d0eSYann Gautier 	}
86*23684d0eSYann Gautier 
87*23684d0eSYann Gautier 	pmic_i2c_addr = fdt32_to_cpu(*cuint) << 1;
88*23684d0eSYann Gautier 	if (pmic_i2c_addr > UINT16_MAX) {
89*23684d0eSYann Gautier 		return -EINVAL;
90*23684d0eSYann Gautier 	}
91*23684d0eSYann Gautier 
92*23684d0eSYann Gautier 	i2c_node = fdt_parent_offset(fdt, pmic_node);
93*23684d0eSYann Gautier 	if (i2c_node < 0) {
94*23684d0eSYann Gautier 		return -FDT_ERR_NOTFOUND;
95*23684d0eSYann Gautier 	}
96*23684d0eSYann Gautier 
97*23684d0eSYann Gautier 	dt_fill_device_info(i2c_info, i2c_node);
98*23684d0eSYann Gautier 	if (i2c_info->base == 0U) {
99*23684d0eSYann Gautier 		return -FDT_ERR_NOTFOUND;
100*23684d0eSYann Gautier 	}
101*23684d0eSYann Gautier 
102*23684d0eSYann Gautier 	return dt_set_pinctrl_config(i2c_node);
103*23684d0eSYann Gautier }
104*23684d0eSYann Gautier 
105*23684d0eSYann Gautier int dt_pmic_enable_boot_on_regulators(void)
106*23684d0eSYann Gautier {
107*23684d0eSYann Gautier 	int pmic_node, regulators_node, regulator_node;
108*23684d0eSYann Gautier 	void *fdt;
109*23684d0eSYann Gautier 
110*23684d0eSYann Gautier 	if (fdt_get_address(&fdt) == 0) {
111*23684d0eSYann Gautier 		return -ENOENT;
112*23684d0eSYann Gautier 	}
113*23684d0eSYann Gautier 
114*23684d0eSYann Gautier 	pmic_node = dt_get_pmic_node(fdt);
115*23684d0eSYann Gautier 	if (pmic_node < 0) {
116*23684d0eSYann Gautier 		return -FDT_ERR_NOTFOUND;
117*23684d0eSYann Gautier 	}
118*23684d0eSYann Gautier 
119*23684d0eSYann Gautier 	regulators_node = fdt_subnode_offset(fdt, pmic_node, "regulators");
120*23684d0eSYann Gautier 
121*23684d0eSYann Gautier 	fdt_for_each_subnode(regulator_node, fdt, regulators_node) {
122*23684d0eSYann Gautier 		const fdt32_t *cuint;
123*23684d0eSYann Gautier 		const char *node_name;
124*23684d0eSYann Gautier 		uint16_t voltage;
125*23684d0eSYann Gautier 
126*23684d0eSYann Gautier 		if (fdt_getprop(fdt, regulator_node, "regulator-boot-on",
127*23684d0eSYann Gautier 				NULL) == NULL) {
128*23684d0eSYann Gautier 			continue;
129*23684d0eSYann Gautier 		}
130*23684d0eSYann Gautier 
131*23684d0eSYann Gautier 		cuint = fdt_getprop(fdt, regulator_node,
132*23684d0eSYann Gautier 				    "regulator-min-microvolt", NULL);
133*23684d0eSYann Gautier 		if (cuint == NULL) {
134*23684d0eSYann Gautier 			continue;
135*23684d0eSYann Gautier 		}
136*23684d0eSYann Gautier 
137*23684d0eSYann Gautier 		/* DT uses microvolts, whereas driver awaits millivolts */
138*23684d0eSYann Gautier 		voltage = (uint16_t)(fdt32_to_cpu(*cuint) / 1000U);
139*23684d0eSYann Gautier 		node_name = fdt_get_name(fdt, regulator_node, NULL);
140*23684d0eSYann Gautier 
141*23684d0eSYann Gautier 		if (stpmic1_is_regulator_enabled(node_name) == 0U) {
142*23684d0eSYann Gautier 			int status;
143*23684d0eSYann Gautier 
144*23684d0eSYann Gautier 			status = stpmic1_regulator_voltage_set(node_name,
145*23684d0eSYann Gautier 							       voltage);
146*23684d0eSYann Gautier 			if (status != 0) {
147*23684d0eSYann Gautier 				return status;
148*23684d0eSYann Gautier 			}
149*23684d0eSYann Gautier 
150*23684d0eSYann Gautier 			status = stpmic1_regulator_enable(node_name);
151*23684d0eSYann Gautier 			if (status != 0) {
152*23684d0eSYann Gautier 				return status;
153*23684d0eSYann Gautier 			}
154*23684d0eSYann Gautier 		}
155*23684d0eSYann Gautier 	}
156*23684d0eSYann Gautier 
157*23684d0eSYann Gautier 	return 0;
158*23684d0eSYann Gautier }
159*23684d0eSYann Gautier 
160*23684d0eSYann Gautier void initialize_pmic_i2c(void)
161*23684d0eSYann Gautier {
162*23684d0eSYann Gautier 	int ret;
163*23684d0eSYann Gautier 	struct dt_node_info i2c_info;
164*23684d0eSYann Gautier 
165*23684d0eSYann Gautier 	if (dt_pmic_i2c_config(&i2c_info) != 0) {
166*23684d0eSYann Gautier 		ERROR("I2C configuration failed\n");
167*23684d0eSYann Gautier 		panic();
168*23684d0eSYann Gautier 	}
169*23684d0eSYann Gautier 
170*23684d0eSYann Gautier 	if (stm32mp1_clk_enable((uint32_t)i2c_info.clock) < 0) {
171*23684d0eSYann Gautier 		ERROR("I2C clock enable failed\n");
172*23684d0eSYann Gautier 		panic();
173*23684d0eSYann Gautier 	}
174*23684d0eSYann Gautier 
175*23684d0eSYann Gautier 	/* Initialize PMIC I2C */
176*23684d0eSYann Gautier 	i2c_handle.i2c_base_addr		= i2c_info.base;
177*23684d0eSYann Gautier 	i2c_handle.i2c_init.timing		= I2C_TIMING;
178*23684d0eSYann Gautier 	i2c_handle.i2c_init.own_address1	= pmic_i2c_addr;
179*23684d0eSYann Gautier 	i2c_handle.i2c_init.addressing_mode	= I2C_ADDRESSINGMODE_7BIT;
180*23684d0eSYann Gautier 	i2c_handle.i2c_init.dual_address_mode	= I2C_DUALADDRESS_DISABLE;
181*23684d0eSYann Gautier 	i2c_handle.i2c_init.own_address2	= 0;
182*23684d0eSYann Gautier 	i2c_handle.i2c_init.own_address2_masks	= I2C_OAR2_OA2NOMASK;
183*23684d0eSYann Gautier 	i2c_handle.i2c_init.general_call_mode	= I2C_GENERALCALL_DISABLE;
184*23684d0eSYann Gautier 	i2c_handle.i2c_init.no_stretch_mode	= I2C_NOSTRETCH_DISABLE;
185*23684d0eSYann Gautier 
186*23684d0eSYann Gautier 	ret = stm32_i2c_init(&i2c_handle);
187*23684d0eSYann Gautier 	if (ret != 0) {
188*23684d0eSYann Gautier 		ERROR("Cannot initialize I2C %x (%d)\n",
189*23684d0eSYann Gautier 		      i2c_handle.i2c_base_addr, ret);
190*23684d0eSYann Gautier 		panic();
191*23684d0eSYann Gautier 	}
192*23684d0eSYann Gautier 
193*23684d0eSYann Gautier 	ret = stm32_i2c_config_analog_filter(&i2c_handle,
194*23684d0eSYann Gautier 					     I2C_ANALOGFILTER_ENABLE);
195*23684d0eSYann Gautier 	if (ret != 0) {
196*23684d0eSYann Gautier 		ERROR("Cannot initialize I2C analog filter (%d)\n", ret);
197*23684d0eSYann Gautier 		panic();
198*23684d0eSYann Gautier 	}
199*23684d0eSYann Gautier 
200*23684d0eSYann Gautier 	ret = stm32_i2c_is_device_ready(&i2c_handle, (uint16_t)pmic_i2c_addr, 1,
201*23684d0eSYann Gautier 					I2C_TIMEOUT);
202*23684d0eSYann Gautier 	if (ret != 0) {
203*23684d0eSYann Gautier 		ERROR("I2C device not ready (%d)\n", ret);
204*23684d0eSYann Gautier 		panic();
205*23684d0eSYann Gautier 	}
206*23684d0eSYann Gautier 
207*23684d0eSYann Gautier 	stpmic1_bind_i2c(&i2c_handle, (uint16_t)pmic_i2c_addr);
208*23684d0eSYann Gautier }
209*23684d0eSYann Gautier 
210*23684d0eSYann Gautier void initialize_pmic(void)
211*23684d0eSYann Gautier {
212*23684d0eSYann Gautier 	int status;
213*23684d0eSYann Gautier 	uint8_t read_val;
214*23684d0eSYann Gautier 
215*23684d0eSYann Gautier 	initialize_pmic_i2c();
216*23684d0eSYann Gautier 
217*23684d0eSYann Gautier 	status = stpmic1_register_read(VERSION_STATUS_REG, &read_val);
218*23684d0eSYann Gautier 	if (status != 0) {
219*23684d0eSYann Gautier 		panic();
220*23684d0eSYann Gautier 	}
221*23684d0eSYann Gautier 
222*23684d0eSYann Gautier 	INFO("PMIC version = 0x%x\n", read_val);
223*23684d0eSYann Gautier 
224*23684d0eSYann Gautier 	/* Keep VDD on during the reset cycle */
225*23684d0eSYann Gautier 	status = stpmic1_register_update(MASK_RESET_BUCK_REG,
226*23684d0eSYann Gautier 					MASK_RESET_BUCK3,
227*23684d0eSYann Gautier 					MASK_RESET_BUCK3);
228*23684d0eSYann Gautier 	if (status != 0) {
229*23684d0eSYann Gautier 		panic();
230*23684d0eSYann Gautier 	}
231*23684d0eSYann Gautier }
232*23684d0eSYann Gautier 
233*23684d0eSYann Gautier int pmic_ddr_power_init(enum ddr_type ddr_type)
234*23684d0eSYann Gautier {
235*23684d0eSYann Gautier 	bool buck3_at_1v8 = false;
236*23684d0eSYann Gautier 	uint8_t read_val;
237*23684d0eSYann Gautier 	int status;
238*23684d0eSYann Gautier 
239*23684d0eSYann Gautier 	switch (ddr_type) {
240*23684d0eSYann Gautier 	case STM32MP_DDR3:
241*23684d0eSYann Gautier 		/* Set LDO3 to sync mode */
242*23684d0eSYann Gautier 		status = stpmic1_register_read(LDO3_CONTROL_REG, &read_val);
243*23684d0eSYann Gautier 		if (status != 0) {
244*23684d0eSYann Gautier 			return status;
245*23684d0eSYann Gautier 		}
246*23684d0eSYann Gautier 
247*23684d0eSYann Gautier 		read_val &= ~STPMIC1_LDO3_MODE;
248*23684d0eSYann Gautier 		read_val &= ~STPMIC1_LDO12356_OUTPUT_MASK;
249*23684d0eSYann Gautier 		read_val |= STPMIC1_LDO3_DDR_SEL <<
250*23684d0eSYann Gautier 			    STPMIC1_LDO12356_OUTPUT_SHIFT;
251*23684d0eSYann Gautier 
252*23684d0eSYann Gautier 		status = stpmic1_register_write(LDO3_CONTROL_REG, read_val);
253*23684d0eSYann Gautier 		if (status != 0) {
254*23684d0eSYann Gautier 			return status;
255*23684d0eSYann Gautier 		}
256*23684d0eSYann Gautier 
257*23684d0eSYann Gautier 		status = stpmic1_regulator_voltage_set("buck2", 1350);
258*23684d0eSYann Gautier 		if (status != 0) {
259*23684d0eSYann Gautier 			return status;
260*23684d0eSYann Gautier 		}
261*23684d0eSYann Gautier 
262*23684d0eSYann Gautier 		status = stpmic1_regulator_enable("buck2");
263*23684d0eSYann Gautier 		if (status != 0) {
264*23684d0eSYann Gautier 			return status;
265*23684d0eSYann Gautier 		}
266*23684d0eSYann Gautier 
267*23684d0eSYann Gautier 		mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);
268*23684d0eSYann Gautier 
269*23684d0eSYann Gautier 		status = stpmic1_regulator_enable("vref_ddr");
270*23684d0eSYann Gautier 		if (status != 0) {
271*23684d0eSYann Gautier 			return status;
272*23684d0eSYann Gautier 		}
273*23684d0eSYann Gautier 
274*23684d0eSYann Gautier 		mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);
275*23684d0eSYann Gautier 
276*23684d0eSYann Gautier 		status = stpmic1_regulator_enable("ldo3");
277*23684d0eSYann Gautier 		if (status != 0) {
278*23684d0eSYann Gautier 			return status;
279*23684d0eSYann Gautier 		}
280*23684d0eSYann Gautier 
281*23684d0eSYann Gautier 		mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);
282*23684d0eSYann Gautier 		break;
283*23684d0eSYann Gautier 
284*23684d0eSYann Gautier 	case STM32MP_LPDDR2:
285*23684d0eSYann Gautier 		/*
286*23684d0eSYann Gautier 		 * Set LDO3 to 1.8V
287*23684d0eSYann Gautier 		 * Set LDO3 to bypass mode if BUCK3 = 1.8V
288*23684d0eSYann Gautier 		 * Set LDO3 to normal mode if BUCK3 != 1.8V
289*23684d0eSYann Gautier 		 */
290*23684d0eSYann Gautier 		status = stpmic1_register_read(BUCK3_CONTROL_REG, &read_val);
291*23684d0eSYann Gautier 		if (status != 0) {
292*23684d0eSYann Gautier 			return status;
293*23684d0eSYann Gautier 		}
294*23684d0eSYann Gautier 
295*23684d0eSYann Gautier 		if ((read_val & STPMIC1_BUCK3_1V8) == STPMIC1_BUCK3_1V8) {
296*23684d0eSYann Gautier 			buck3_at_1v8 = true;
297*23684d0eSYann Gautier 		}
298*23684d0eSYann Gautier 
299*23684d0eSYann Gautier 		status = stpmic1_register_read(LDO3_CONTROL_REG, &read_val);
300*23684d0eSYann Gautier 		if (status != 0) {
301*23684d0eSYann Gautier 			return status;
302*23684d0eSYann Gautier 		}
303*23684d0eSYann Gautier 
304*23684d0eSYann Gautier 		read_val &= ~STPMIC1_LDO3_MODE;
305*23684d0eSYann Gautier 		read_val &= ~STPMIC1_LDO12356_OUTPUT_MASK;
306*23684d0eSYann Gautier 		read_val |= STPMIC1_LDO3_1800000;
307*23684d0eSYann Gautier 		if (buck3_at_1v8) {
308*23684d0eSYann Gautier 			read_val |= STPMIC1_LDO3_MODE;
309*23684d0eSYann Gautier 		}
310*23684d0eSYann Gautier 
311*23684d0eSYann Gautier 		status = stpmic1_register_write(LDO3_CONTROL_REG, read_val);
312*23684d0eSYann Gautier 		if (status != 0) {
313*23684d0eSYann Gautier 			return status;
314*23684d0eSYann Gautier 		}
315*23684d0eSYann Gautier 
316*23684d0eSYann Gautier 		status = stpmic1_regulator_voltage_set("buck2", 1200);
317*23684d0eSYann Gautier 		if (status != 0) {
318*23684d0eSYann Gautier 			return status;
319*23684d0eSYann Gautier 		}
320*23684d0eSYann Gautier 
321*23684d0eSYann Gautier 		status = stpmic1_regulator_enable("ldo3");
322*23684d0eSYann Gautier 		if (status != 0) {
323*23684d0eSYann Gautier 			return status;
324*23684d0eSYann Gautier 		}
325*23684d0eSYann Gautier 
326*23684d0eSYann Gautier 		mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);
327*23684d0eSYann Gautier 
328*23684d0eSYann Gautier 		status = stpmic1_regulator_enable("buck2");
329*23684d0eSYann Gautier 		if (status != 0) {
330*23684d0eSYann Gautier 			return status;
331*23684d0eSYann Gautier 		}
332*23684d0eSYann Gautier 
333*23684d0eSYann Gautier 		mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);
334*23684d0eSYann Gautier 
335*23684d0eSYann Gautier 		status = stpmic1_regulator_enable("vref_ddr");
336*23684d0eSYann Gautier 		if (status != 0) {
337*23684d0eSYann Gautier 			return status;
338*23684d0eSYann Gautier 		}
339*23684d0eSYann Gautier 
340*23684d0eSYann Gautier 		mdelay(STPMIC1_DEFAULT_START_UP_DELAY_MS);
341*23684d0eSYann Gautier 		break;
342*23684d0eSYann Gautier 
343*23684d0eSYann Gautier 	default:
344*23684d0eSYann Gautier 		break;
345*23684d0eSYann Gautier 	};
346*23684d0eSYann Gautier 
347*23684d0eSYann Gautier 	return 0;
348*23684d0eSYann Gautier }
349