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