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