xref: /arm-trusted-firmware/plat/st/stm32mp1/stm32mp1_syscfg.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2019-2022, STMicroelectronics - All Rights Reserved
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <assert.h>
8*91f16700Schasinglulu #include <errno.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <common/debug.h>
11*91f16700Schasinglulu #include <drivers/clk.h>
12*91f16700Schasinglulu #include <drivers/delay_timer.h>
13*91f16700Schasinglulu #include <drivers/st/stpmic1.h>
14*91f16700Schasinglulu #include <lib/mmio.h>
15*91f16700Schasinglulu #include <lib/utils_def.h>
16*91f16700Schasinglulu #include <libfdt.h>
17*91f16700Schasinglulu 
18*91f16700Schasinglulu #include <platform_def.h>
19*91f16700Schasinglulu #include <stm32mp_common.h>
20*91f16700Schasinglulu #include <stm32mp_dt.h>
21*91f16700Schasinglulu #include <stm32mp1_private.h>
22*91f16700Schasinglulu 
23*91f16700Schasinglulu /*
24*91f16700Schasinglulu  * SYSCFG REGISTER OFFSET (base relative)
25*91f16700Schasinglulu  */
26*91f16700Schasinglulu #define SYSCFG_BOOTR				0x00U
27*91f16700Schasinglulu #define SYSCFG_BOOTCR				0x0CU
28*91f16700Schasinglulu #if STM32MP15
29*91f16700Schasinglulu #define SYSCFG_IOCTRLSETR			0x18U
30*91f16700Schasinglulu #define SYSCFG_ICNR				0x1CU
31*91f16700Schasinglulu #endif
32*91f16700Schasinglulu #define SYSCFG_CMPCR				0x20U
33*91f16700Schasinglulu #define SYSCFG_CMPENSETR			0x24U
34*91f16700Schasinglulu #define SYSCFG_CMPENCLRR			0x28U
35*91f16700Schasinglulu #if STM32MP13
36*91f16700Schasinglulu #define SYSCFG_CMPSD1CR				0x30U
37*91f16700Schasinglulu #define SYSCFG_CMPSD1ENSETR			0x34U
38*91f16700Schasinglulu #define SYSCFG_CMPSD1ENCLRR			0x38U
39*91f16700Schasinglulu #define SYSCFG_CMPSD2CR				0x40U
40*91f16700Schasinglulu #define SYSCFG_CMPSD2ENSETR			0x44U
41*91f16700Schasinglulu #define SYSCFG_CMPSD2ENCLRR			0x48U
42*91f16700Schasinglulu #define SYSCFG_HSLVEN0R				0x50U
43*91f16700Schasinglulu #endif
44*91f16700Schasinglulu #define SYSCFG_IDC				0x380U
45*91f16700Schasinglulu 
46*91f16700Schasinglulu #define CMPCR_CMPENSETR_OFFSET			0x4U
47*91f16700Schasinglulu #define CMPCR_CMPENCLRR_OFFSET			0x8U
48*91f16700Schasinglulu 
49*91f16700Schasinglulu /*
50*91f16700Schasinglulu  * SYSCFG_BOOTR Register
51*91f16700Schasinglulu  */
52*91f16700Schasinglulu #define SYSCFG_BOOTR_BOOT_MASK			GENMASK(2, 0)
53*91f16700Schasinglulu #if STM32MP15
54*91f16700Schasinglulu #define SYSCFG_BOOTR_BOOTPD_MASK		GENMASK(6, 4)
55*91f16700Schasinglulu #define SYSCFG_BOOTR_BOOTPD_SHIFT		4
56*91f16700Schasinglulu #endif
57*91f16700Schasinglulu 
58*91f16700Schasinglulu /*
59*91f16700Schasinglulu  * SYSCFG_BOOTCR Register
60*91f16700Schasinglulu  */
61*91f16700Schasinglulu #define SYSCFG_BOOTCR_BMEN			BIT(0)
62*91f16700Schasinglulu 
63*91f16700Schasinglulu /*
64*91f16700Schasinglulu  * SYSCFG_IOCTRLSETR Register
65*91f16700Schasinglulu  */
66*91f16700Schasinglulu #define SYSCFG_IOCTRLSETR_HSLVEN_TRACE		BIT(0)
67*91f16700Schasinglulu #define SYSCFG_IOCTRLSETR_HSLVEN_QUADSPI	BIT(1)
68*91f16700Schasinglulu #define SYSCFG_IOCTRLSETR_HSLVEN_ETH		BIT(2)
69*91f16700Schasinglulu #define SYSCFG_IOCTRLSETR_HSLVEN_SDMMC		BIT(3)
70*91f16700Schasinglulu #define SYSCFG_IOCTRLSETR_HSLVEN_SPI		BIT(4)
71*91f16700Schasinglulu 
72*91f16700Schasinglulu /*
73*91f16700Schasinglulu  * SYSCFG_ICNR Register
74*91f16700Schasinglulu  */
75*91f16700Schasinglulu #define SYSCFG_ICNR_AXI_M9			BIT(9)
76*91f16700Schasinglulu 
77*91f16700Schasinglulu /*
78*91f16700Schasinglulu  * SYSCFG_CMPCR Register
79*91f16700Schasinglulu  */
80*91f16700Schasinglulu #define SYSCFG_CMPCR_SW_CTRL			BIT(1)
81*91f16700Schasinglulu #define SYSCFG_CMPCR_READY			BIT(8)
82*91f16700Schasinglulu #define SYSCFG_CMPCR_RANSRC			GENMASK(19, 16)
83*91f16700Schasinglulu #define SYSCFG_CMPCR_RANSRC_SHIFT		16
84*91f16700Schasinglulu #define SYSCFG_CMPCR_RAPSRC			GENMASK(23, 20)
85*91f16700Schasinglulu #define SYSCFG_CMPCR_ANSRC_SHIFT		24
86*91f16700Schasinglulu 
87*91f16700Schasinglulu #define SYSCFG_CMPCR_READY_TIMEOUT_US		10000U
88*91f16700Schasinglulu 
89*91f16700Schasinglulu /*
90*91f16700Schasinglulu  * SYSCFG_CMPENSETR Register
91*91f16700Schasinglulu  */
92*91f16700Schasinglulu #define SYSCFG_CMPENSETR_MPU_EN			BIT(0)
93*91f16700Schasinglulu 
94*91f16700Schasinglulu /*
95*91f16700Schasinglulu  * HSLV definitions
96*91f16700Schasinglulu  */
97*91f16700Schasinglulu #define HSLV_IDX_TPIU				0U
98*91f16700Schasinglulu #define HSLV_IDX_QSPI				1U
99*91f16700Schasinglulu #define HSLV_IDX_ETH1				2U
100*91f16700Schasinglulu #define HSLV_IDX_ETH2				3U
101*91f16700Schasinglulu #define HSLV_IDX_SDMMC1				4U
102*91f16700Schasinglulu #define HSLV_IDX_SDMMC2				5U
103*91f16700Schasinglulu #define HSLV_IDX_SPI1				6U
104*91f16700Schasinglulu #define HSLV_IDX_SPI2				7U
105*91f16700Schasinglulu #define HSLV_IDX_SPI3				8U
106*91f16700Schasinglulu #define HSLV_IDX_SPI4				9U
107*91f16700Schasinglulu #define HSLV_IDX_SPI5				10U
108*91f16700Schasinglulu #define HSLV_IDX_LTDC				11U
109*91f16700Schasinglulu #define HSLV_NB_IDX				12U
110*91f16700Schasinglulu 
111*91f16700Schasinglulu #define HSLV_KEY				0x1018U
112*91f16700Schasinglulu 
113*91f16700Schasinglulu /*
114*91f16700Schasinglulu  * SYSCFG_IDC Register
115*91f16700Schasinglulu  */
116*91f16700Schasinglulu #define SYSCFG_IDC_DEV_ID_MASK			GENMASK(11, 0)
117*91f16700Schasinglulu #define SYSCFG_IDC_REV_ID_MASK			GENMASK(31, 16)
118*91f16700Schasinglulu #define SYSCFG_IDC_REV_ID_SHIFT			16
119*91f16700Schasinglulu 
120*91f16700Schasinglulu static void enable_io_comp_cell_finish(uintptr_t cmpcr_off)
121*91f16700Schasinglulu {
122*91f16700Schasinglulu 	uint64_t start;
123*91f16700Schasinglulu 
124*91f16700Schasinglulu 	start = timeout_init_us(SYSCFG_CMPCR_READY_TIMEOUT_US);
125*91f16700Schasinglulu 
126*91f16700Schasinglulu 	while ((mmio_read_32(SYSCFG_BASE + cmpcr_off) & SYSCFG_CMPCR_READY) == 0U) {
127*91f16700Schasinglulu 		if (timeout_elapsed(start)) {
128*91f16700Schasinglulu 			/* Failure on IO compensation enable is not a issue: warn only. */
129*91f16700Schasinglulu 			WARN("IO compensation cell not ready\n");
130*91f16700Schasinglulu 			break;
131*91f16700Schasinglulu 		}
132*91f16700Schasinglulu 	}
133*91f16700Schasinglulu 
134*91f16700Schasinglulu 	mmio_clrbits_32(SYSCFG_BASE + cmpcr_off, SYSCFG_CMPCR_SW_CTRL);
135*91f16700Schasinglulu }
136*91f16700Schasinglulu 
137*91f16700Schasinglulu static void disable_io_comp_cell(uintptr_t cmpcr_off)
138*91f16700Schasinglulu {
139*91f16700Schasinglulu 	uint32_t value;
140*91f16700Schasinglulu 
141*91f16700Schasinglulu 	if (((mmio_read_32(SYSCFG_BASE + cmpcr_off) & SYSCFG_CMPCR_READY) == 0U) ||
142*91f16700Schasinglulu 	    ((mmio_read_32(SYSCFG_BASE + cmpcr_off + CMPCR_CMPENSETR_OFFSET) &
143*91f16700Schasinglulu 	     SYSCFG_CMPENSETR_MPU_EN) == 0U)) {
144*91f16700Schasinglulu 		return;
145*91f16700Schasinglulu 	}
146*91f16700Schasinglulu 
147*91f16700Schasinglulu 	value = mmio_read_32(SYSCFG_BASE + cmpcr_off) >> SYSCFG_CMPCR_ANSRC_SHIFT;
148*91f16700Schasinglulu 
149*91f16700Schasinglulu 	mmio_clrbits_32(SYSCFG_BASE + cmpcr_off, SYSCFG_CMPCR_RANSRC | SYSCFG_CMPCR_RAPSRC);
150*91f16700Schasinglulu 
151*91f16700Schasinglulu 	value <<= SYSCFG_CMPCR_RANSRC_SHIFT;
152*91f16700Schasinglulu 	value |= mmio_read_32(SYSCFG_BASE + cmpcr_off);
153*91f16700Schasinglulu 
154*91f16700Schasinglulu 	mmio_write_32(SYSCFG_BASE + cmpcr_off, value | SYSCFG_CMPCR_SW_CTRL);
155*91f16700Schasinglulu 
156*91f16700Schasinglulu 	mmio_setbits_32(SYSCFG_BASE + cmpcr_off + CMPCR_CMPENCLRR_OFFSET, SYSCFG_CMPENSETR_MPU_EN);
157*91f16700Schasinglulu }
158*91f16700Schasinglulu 
159*91f16700Schasinglulu #if STM32MP13
160*91f16700Schasinglulu static int get_regu_max_voltage(void *fdt, int sdmmc_node,
161*91f16700Schasinglulu 				const char *regu_name, uint32_t *regu_val)
162*91f16700Schasinglulu {
163*91f16700Schasinglulu 	int node;
164*91f16700Schasinglulu 	const fdt32_t *cuint;
165*91f16700Schasinglulu 
166*91f16700Schasinglulu 	cuint = fdt_getprop(fdt, sdmmc_node, regu_name, NULL);
167*91f16700Schasinglulu 	if (cuint == NULL) {
168*91f16700Schasinglulu 		return -ENODEV;
169*91f16700Schasinglulu 	}
170*91f16700Schasinglulu 
171*91f16700Schasinglulu 	node = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*cuint));
172*91f16700Schasinglulu 	if (node < 0) {
173*91f16700Schasinglulu 		return -ENODEV;
174*91f16700Schasinglulu 	}
175*91f16700Schasinglulu 
176*91f16700Schasinglulu 	cuint = fdt_getprop(fdt, node, "regulator-max-microvolt", NULL);
177*91f16700Schasinglulu 	if (cuint == NULL) {
178*91f16700Schasinglulu 		return -ENODEV;
179*91f16700Schasinglulu 	}
180*91f16700Schasinglulu 
181*91f16700Schasinglulu 	*regu_val = fdt32_to_cpu(*cuint);
182*91f16700Schasinglulu 
183*91f16700Schasinglulu 	return 0;
184*91f16700Schasinglulu }
185*91f16700Schasinglulu 
186*91f16700Schasinglulu static bool sdmmc_is_low_voltage(uintptr_t sdmmc_base)
187*91f16700Schasinglulu {
188*91f16700Schasinglulu 	int ret;
189*91f16700Schasinglulu 	int node;
190*91f16700Schasinglulu 	void *fdt = NULL;
191*91f16700Schasinglulu 	uint32_t regu_max_val;
192*91f16700Schasinglulu 
193*91f16700Schasinglulu 	if (fdt_get_address(&fdt) == 0) {
194*91f16700Schasinglulu 		return false;
195*91f16700Schasinglulu 	}
196*91f16700Schasinglulu 
197*91f16700Schasinglulu 	if (fdt == NULL) {
198*91f16700Schasinglulu 		return false;
199*91f16700Schasinglulu 	}
200*91f16700Schasinglulu 
201*91f16700Schasinglulu 	node = dt_match_instance_by_compatible(DT_SDMMC2_COMPAT, sdmmc_base);
202*91f16700Schasinglulu 	if (node < 0) {
203*91f16700Schasinglulu 		/* No SD or eMMC device on this instance, enable HSLV */
204*91f16700Schasinglulu 		return true;
205*91f16700Schasinglulu 	}
206*91f16700Schasinglulu 
207*91f16700Schasinglulu 	ret = get_regu_max_voltage(fdt, node, "vqmmc-supply", &regu_max_val);
208*91f16700Schasinglulu 	if ((ret < 0) || (regu_max_val > 1800000U)) {
209*91f16700Schasinglulu 		/*
210*91f16700Schasinglulu 		 * The vqmmc-supply property should always be present for eMMC.
211*91f16700Schasinglulu 		 * For SD-card, if it is not, then the card only supports 3.3V.
212*91f16700Schasinglulu 		 */
213*91f16700Schasinglulu 		return false;
214*91f16700Schasinglulu 	}
215*91f16700Schasinglulu 
216*91f16700Schasinglulu 	return true;
217*91f16700Schasinglulu }
218*91f16700Schasinglulu 
219*91f16700Schasinglulu static void enable_hslv_by_index(uint32_t index)
220*91f16700Schasinglulu {
221*91f16700Schasinglulu 	bool apply_hslv;
222*91f16700Schasinglulu 
223*91f16700Schasinglulu 	assert(index < HSLV_NB_IDX);
224*91f16700Schasinglulu 
225*91f16700Schasinglulu 	switch (index) {
226*91f16700Schasinglulu 	case HSLV_IDX_SDMMC1:
227*91f16700Schasinglulu 		apply_hslv = sdmmc_is_low_voltage(STM32MP_SDMMC1_BASE);
228*91f16700Schasinglulu 		break;
229*91f16700Schasinglulu 	case HSLV_IDX_SDMMC2:
230*91f16700Schasinglulu 		apply_hslv = sdmmc_is_low_voltage(STM32MP_SDMMC2_BASE);
231*91f16700Schasinglulu 		break;
232*91f16700Schasinglulu 	default:
233*91f16700Schasinglulu 		apply_hslv = true;
234*91f16700Schasinglulu 		break;
235*91f16700Schasinglulu 	}
236*91f16700Schasinglulu 
237*91f16700Schasinglulu 	if (apply_hslv) {
238*91f16700Schasinglulu 		uint32_t reg_offset = index * sizeof(uint32_t);
239*91f16700Schasinglulu 
240*91f16700Schasinglulu 		mmio_write_32(SYSCFG_BASE + SYSCFG_HSLVEN0R + reg_offset, HSLV_KEY);
241*91f16700Schasinglulu 	}
242*91f16700Schasinglulu }
243*91f16700Schasinglulu #endif
244*91f16700Schasinglulu 
245*91f16700Schasinglulu static void enable_high_speed_mode_low_voltage(void)
246*91f16700Schasinglulu {
247*91f16700Schasinglulu #if STM32MP13
248*91f16700Schasinglulu 	uint32_t idx;
249*91f16700Schasinglulu 
250*91f16700Schasinglulu 	for (idx = 0U; idx < HSLV_NB_IDX; idx++) {
251*91f16700Schasinglulu 		enable_hslv_by_index(idx);
252*91f16700Schasinglulu 	}
253*91f16700Schasinglulu #endif
254*91f16700Schasinglulu #if STM32MP15
255*91f16700Schasinglulu 	mmio_write_32(SYSCFG_BASE + SYSCFG_IOCTRLSETR,
256*91f16700Schasinglulu 		      SYSCFG_IOCTRLSETR_HSLVEN_TRACE |
257*91f16700Schasinglulu 		      SYSCFG_IOCTRLSETR_HSLVEN_QUADSPI |
258*91f16700Schasinglulu 		      SYSCFG_IOCTRLSETR_HSLVEN_ETH |
259*91f16700Schasinglulu 		      SYSCFG_IOCTRLSETR_HSLVEN_SDMMC |
260*91f16700Schasinglulu 		      SYSCFG_IOCTRLSETR_HSLVEN_SPI);
261*91f16700Schasinglulu #endif
262*91f16700Schasinglulu }
263*91f16700Schasinglulu 
264*91f16700Schasinglulu static void stm32mp1_syscfg_set_hslv(void)
265*91f16700Schasinglulu {
266*91f16700Schasinglulu 	uint32_t otp_value;
267*91f16700Schasinglulu 	uint32_t vdd_voltage;
268*91f16700Schasinglulu 	bool product_below_2v5;
269*91f16700Schasinglulu 
270*91f16700Schasinglulu 	/*
271*91f16700Schasinglulu 	 * High Speed Low Voltage Pad mode Enable for SPI, SDMMC, ETH, QSPI
272*91f16700Schasinglulu 	 * and TRACE. Needed above ~50MHz and conditioned by AFMUX selection.
273*91f16700Schasinglulu 	 * It could be disabled for low frequencies or if AFMUX is selected
274*91f16700Schasinglulu 	 * but the function is not used, typically for TRACE.
275*91f16700Schasinglulu 	 * If high speed low voltage pad mode is node enable, platform will
276*91f16700Schasinglulu 	 * over consume.
277*91f16700Schasinglulu 	 *
278*91f16700Schasinglulu 	 * WARNING:
279*91f16700Schasinglulu 	 *   Enabling High Speed mode while VDD > 2.7V
280*91f16700Schasinglulu 	 *   with the OTP product_below_2v5 (OTP 18, BIT 13)
281*91f16700Schasinglulu 	 *   erroneously set to 1 can damage the SoC!
282*91f16700Schasinglulu 	 *   => TF-A enables the low power mode only if VDD < 2.7V (in DT)
283*91f16700Schasinglulu 	 *      but this value needs to be consistent with board design.
284*91f16700Schasinglulu 	 */
285*91f16700Schasinglulu 	if (stm32_get_otp_value(HW2_OTP, &otp_value) != 0) {
286*91f16700Schasinglulu 		panic();
287*91f16700Schasinglulu 	}
288*91f16700Schasinglulu 
289*91f16700Schasinglulu 	product_below_2v5 = (otp_value & HW2_OTP_PRODUCT_BELOW_2V5) != 0U;
290*91f16700Schasinglulu 
291*91f16700Schasinglulu 	/* Get VDD supply */
292*91f16700Schasinglulu 	vdd_voltage = dt_get_pwr_vdd_voltage();
293*91f16700Schasinglulu 
294*91f16700Schasinglulu 	/* Check if VDD is Low Voltage */
295*91f16700Schasinglulu 	if (vdd_voltage == 0U) {
296*91f16700Schasinglulu 		WARN("VDD unknown\n");
297*91f16700Schasinglulu 	} else if (vdd_voltage < 2700000U) {
298*91f16700Schasinglulu 		enable_high_speed_mode_low_voltage();
299*91f16700Schasinglulu 
300*91f16700Schasinglulu 		if (!product_below_2v5) {
301*91f16700Schasinglulu 			INFO("Product_below_2v5=0: HSLVEN protected by HW\n");
302*91f16700Schasinglulu 		}
303*91f16700Schasinglulu 	} else {
304*91f16700Schasinglulu 		if (product_below_2v5) {
305*91f16700Schasinglulu 			ERROR("Product_below_2v5=1:\n");
306*91f16700Schasinglulu 			ERROR("\tHSLVEN update is destructive,\n");
307*91f16700Schasinglulu 			ERROR("\tno update as VDD > 2.7V\n");
308*91f16700Schasinglulu 			panic();
309*91f16700Schasinglulu 		}
310*91f16700Schasinglulu 	}
311*91f16700Schasinglulu }
312*91f16700Schasinglulu 
313*91f16700Schasinglulu void stm32mp1_syscfg_init(void)
314*91f16700Schasinglulu {
315*91f16700Schasinglulu #if STM32MP15
316*91f16700Schasinglulu 	uint32_t bootr;
317*91f16700Schasinglulu 
318*91f16700Schasinglulu 	/*
319*91f16700Schasinglulu 	 * Interconnect update : select master using the port 1.
320*91f16700Schasinglulu 	 * LTDC = AXI_M9.
321*91f16700Schasinglulu 	 */
322*91f16700Schasinglulu 	mmio_write_32(SYSCFG_BASE + SYSCFG_ICNR, SYSCFG_ICNR_AXI_M9);
323*91f16700Schasinglulu 
324*91f16700Schasinglulu 	/* Disable Pull-Down for boot pin connected to VDD */
325*91f16700Schasinglulu 	bootr = mmio_read_32(SYSCFG_BASE + SYSCFG_BOOTR) &
326*91f16700Schasinglulu 		SYSCFG_BOOTR_BOOT_MASK;
327*91f16700Schasinglulu 	mmio_clrsetbits_32(SYSCFG_BASE + SYSCFG_BOOTR, SYSCFG_BOOTR_BOOTPD_MASK,
328*91f16700Schasinglulu 			   bootr << SYSCFG_BOOTR_BOOTPD_SHIFT);
329*91f16700Schasinglulu #endif
330*91f16700Schasinglulu 
331*91f16700Schasinglulu 	stm32mp1_syscfg_set_hslv();
332*91f16700Schasinglulu 
333*91f16700Schasinglulu 	stm32mp1_syscfg_enable_io_compensation_start();
334*91f16700Schasinglulu }
335*91f16700Schasinglulu 
336*91f16700Schasinglulu void stm32mp1_syscfg_enable_io_compensation_start(void)
337*91f16700Schasinglulu {
338*91f16700Schasinglulu 	/*
339*91f16700Schasinglulu 	 * Activate automatic I/O compensation.
340*91f16700Schasinglulu 	 * Warning: need to ensure CSI enabled and ready in clock driver.
341*91f16700Schasinglulu 	 * Enable non-secure clock, we assume non-secure is suspended.
342*91f16700Schasinglulu 	 */
343*91f16700Schasinglulu 	clk_enable(SYSCFG);
344*91f16700Schasinglulu 
345*91f16700Schasinglulu 	mmio_setbits_32(SYSCFG_BASE + CMPCR_CMPENSETR_OFFSET + SYSCFG_CMPCR,
346*91f16700Schasinglulu 			SYSCFG_CMPENSETR_MPU_EN);
347*91f16700Schasinglulu #if STM32MP13
348*91f16700Schasinglulu 	mmio_setbits_32(SYSCFG_BASE + CMPCR_CMPENSETR_OFFSET + SYSCFG_CMPSD1CR,
349*91f16700Schasinglulu 			SYSCFG_CMPENSETR_MPU_EN);
350*91f16700Schasinglulu 	mmio_setbits_32(SYSCFG_BASE + CMPCR_CMPENSETR_OFFSET + SYSCFG_CMPSD2CR,
351*91f16700Schasinglulu 			SYSCFG_CMPENSETR_MPU_EN);
352*91f16700Schasinglulu 
353*91f16700Schasinglulu #endif
354*91f16700Schasinglulu }
355*91f16700Schasinglulu 
356*91f16700Schasinglulu void stm32mp1_syscfg_enable_io_compensation_finish(void)
357*91f16700Schasinglulu {
358*91f16700Schasinglulu 	enable_io_comp_cell_finish(SYSCFG_CMPCR);
359*91f16700Schasinglulu #if STM32MP13
360*91f16700Schasinglulu 	enable_io_comp_cell_finish(SYSCFG_CMPSD1CR);
361*91f16700Schasinglulu 	enable_io_comp_cell_finish(SYSCFG_CMPSD2CR);
362*91f16700Schasinglulu #endif
363*91f16700Schasinglulu }
364*91f16700Schasinglulu 
365*91f16700Schasinglulu void stm32mp1_syscfg_disable_io_compensation(void)
366*91f16700Schasinglulu {
367*91f16700Schasinglulu 	clk_enable(SYSCFG);
368*91f16700Schasinglulu 
369*91f16700Schasinglulu 	/*
370*91f16700Schasinglulu 	 * Deactivate automatic I/O compensation.
371*91f16700Schasinglulu 	 * Warning: CSI is disabled automatically in STOP if not
372*91f16700Schasinglulu 	 * requested for other usages and always OFF in STANDBY.
373*91f16700Schasinglulu 	 * Disable non-secure SYSCFG clock, we assume non-secure is suspended.
374*91f16700Schasinglulu 	 */
375*91f16700Schasinglulu 	disable_io_comp_cell(SYSCFG_CMPCR);
376*91f16700Schasinglulu #if STM32MP13
377*91f16700Schasinglulu 	disable_io_comp_cell(SYSCFG_CMPSD1CR);
378*91f16700Schasinglulu 	disable_io_comp_cell(SYSCFG_CMPSD2CR);
379*91f16700Schasinglulu #endif
380*91f16700Schasinglulu 
381*91f16700Schasinglulu 	clk_disable(SYSCFG);
382*91f16700Schasinglulu }
383*91f16700Schasinglulu 
384*91f16700Schasinglulu /*
385*91f16700Schasinglulu  * @brief  Get silicon revision from SYSCFG registers.
386*91f16700Schasinglulu  * @retval chip version (REV_ID).
387*91f16700Schasinglulu  */
388*91f16700Schasinglulu uint32_t stm32mp1_syscfg_get_chip_version(void)
389*91f16700Schasinglulu {
390*91f16700Schasinglulu 	return (mmio_read_32(SYSCFG_BASE + SYSCFG_IDC) &
391*91f16700Schasinglulu 		SYSCFG_IDC_REV_ID_MASK) >> SYSCFG_IDC_REV_ID_SHIFT;
392*91f16700Schasinglulu }
393*91f16700Schasinglulu 
394*91f16700Schasinglulu /*
395*91f16700Schasinglulu  * @brief  Get device ID from SYSCFG registers.
396*91f16700Schasinglulu  * @retval device ID (DEV_ID).
397*91f16700Schasinglulu  */
398*91f16700Schasinglulu uint32_t stm32mp1_syscfg_get_chip_dev_id(void)
399*91f16700Schasinglulu {
400*91f16700Schasinglulu 	return mmio_read_32(SYSCFG_BASE + SYSCFG_IDC) & SYSCFG_IDC_DEV_ID_MASK;
401*91f16700Schasinglulu }
402*91f16700Schasinglulu 
403*91f16700Schasinglulu #if STM32MP13
404*91f16700Schasinglulu void stm32mp1_syscfg_boot_mode_enable(void)
405*91f16700Schasinglulu {
406*91f16700Schasinglulu 	mmio_setbits_32(SYSCFG_BASE + SYSCFG_BOOTCR, SYSCFG_BOOTCR_BMEN);
407*91f16700Schasinglulu }
408*91f16700Schasinglulu 
409*91f16700Schasinglulu void stm32mp1_syscfg_boot_mode_disable(void)
410*91f16700Schasinglulu {
411*91f16700Schasinglulu 	mmio_clrbits_32(SYSCFG_BASE + SYSCFG_BOOTCR, SYSCFG_BOOTCR_BMEN);
412*91f16700Schasinglulu }
413*91f16700Schasinglulu #endif
414