xref: /arm-trusted-firmware/plat/imx/imx8m/imx8m_csu.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright 2020-2022 NXP
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <lib/mmio.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <imx8m_csu.h>
10*91f16700Schasinglulu 
11*91f16700Schasinglulu void imx_csu_init(const struct imx_csu_cfg *csu_cfg)
12*91f16700Schasinglulu {
13*91f16700Schasinglulu 	const struct imx_csu_cfg *csu = csu_cfg;
14*91f16700Schasinglulu 	uint32_t val;
15*91f16700Schasinglulu 
16*91f16700Schasinglulu 	while (csu->type != CSU_INVALID) {
17*91f16700Schasinglulu 		switch (csu->type) {
18*91f16700Schasinglulu 		case CSU_CSL:
19*91f16700Schasinglulu 			val = mmio_read_32(CSLx_REG(csu->idx));
20*91f16700Schasinglulu 			if (val & CSLx_LOCK(csu->idx)) {
21*91f16700Schasinglulu 				break;
22*91f16700Schasinglulu 			}
23*91f16700Schasinglulu 			mmio_clrsetbits_32(CSLx_REG(csu->idx), CSLx_CFG(0xff, csu->idx),
24*91f16700Schasinglulu 				CSLx_CFG(csu->csl_level | (csu->lock << 8), csu->idx));
25*91f16700Schasinglulu 			break;
26*91f16700Schasinglulu 		case CSU_HP:
27*91f16700Schasinglulu 			val = mmio_read_32(CSU_HP_REG(csu->idx));
28*91f16700Schasinglulu 			if (val & CSU_HP_LOCK(csu->idx)) {
29*91f16700Schasinglulu 				break;
30*91f16700Schasinglulu 			}
31*91f16700Schasinglulu 			mmio_clrsetbits_32(CSU_HP_REG(csu->idx), CSU_HP_CFG(0x1, csu->idx),
32*91f16700Schasinglulu 				CSU_HP_CFG(csu->hp | (csu->lock << 0x1), csu->idx));
33*91f16700Schasinglulu 			break;
34*91f16700Schasinglulu 		case CSU_SA:
35*91f16700Schasinglulu 			val = mmio_read_32(CSU_SA_REG(csu->idx));
36*91f16700Schasinglulu 			if (val & CSU_SA_LOCK(csu->idx)) {
37*91f16700Schasinglulu 				break;
38*91f16700Schasinglulu 			}
39*91f16700Schasinglulu 			mmio_clrsetbits_32(CSU_SA_REG(csu->idx), CSU_SA_CFG(0x1, csu->idx),
40*91f16700Schasinglulu 				CSU_SA_CFG(csu->sa | (csu->lock << 0x1), csu->idx));
41*91f16700Schasinglulu 			break;
42*91f16700Schasinglulu 		case CSU_HPCONTROL:
43*91f16700Schasinglulu 			val = mmio_read_32(CSU_HPCONTROL_REG(csu->idx));
44*91f16700Schasinglulu 			if (val & CSU_HPCONTROL_LOCK(csu->idx)) {
45*91f16700Schasinglulu 				break;
46*91f16700Schasinglulu 			}
47*91f16700Schasinglulu 			mmio_clrsetbits_32(CSU_HPCONTROL_REG(csu->idx), CSU_HPCONTROL_CFG(0x1, csu->idx),
48*91f16700Schasinglulu 				CSU_HPCONTROL_CFG(csu->hpctrl | (csu->lock << 0x1), csu->idx));
49*91f16700Schasinglulu 			break;
50*91f16700Schasinglulu 		default:
51*91f16700Schasinglulu 			break;
52*91f16700Schasinglulu 		}
53*91f16700Schasinglulu 
54*91f16700Schasinglulu 		csu++;
55*91f16700Schasinglulu 	}
56*91f16700Schasinglulu }
57