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