1*f018e05dSRabio-Wang /* 2*f018e05dSRabio-Wang * Copyright (c) 2022, MediaTek Inc. All rights reserved. 3*f018e05dSRabio-Wang * 4*f018e05dSRabio-Wang * SPDX-License-Identifier: BSD-3-Clause 5*f018e05dSRabio-Wang */ 6*f018e05dSRabio-Wang 7*f018e05dSRabio-Wang #include <lib/mmio.h> 8*f018e05dSRabio-Wang #include <lib/utils_def.h> 9*f018e05dSRabio-Wang #include <mtk_dcm_utils.h> 10*f018e05dSRabio-Wang 11*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_ADB_DCM_REG0_MASK BIT(17) 12*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_ADB_DCM_REG1_MASK (BIT(15) | BIT(16) | BIT(17) | \ 13*f018e05dSRabio-Wang BIT(18) | BIT(21)) 14*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_ADB_DCM_REG2_MASK (BIT(15) | BIT(16) | BIT(17) | BIT(18)) 15*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_ADB_DCM_REG0_ON BIT(17) 16*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_ADB_DCM_REG1_ON (BIT(15) | BIT(16) | BIT(17) | \ 17*f018e05dSRabio-Wang BIT(18) | BIT(21)) 18*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_ADB_DCM_REG2_ON (BIT(15) | BIT(16) | BIT(17) | BIT(18)) 19*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_ADB_DCM_REG0_OFF (0x0 << 17) 20*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_ADB_DCM_REG1_OFF ((0x0 << 15) | (0x0 << 16) | \ 21*f018e05dSRabio-Wang (0x0 << 17) | (0x0 << 18) | \ 22*f018e05dSRabio-Wang (0x0 << 21)) 23*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_ADB_DCM_REG2_OFF ((0x0 << 15) | (0x0 << 16) | \ 24*f018e05dSRabio-Wang (0x0 << 17) | (0x0 << 18)) 25*f018e05dSRabio-Wang 26*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_adb_dcm_is_on(void) 27*f018e05dSRabio-Wang { 28*f018e05dSRabio-Wang bool ret = true; 29*f018e05dSRabio-Wang 30*f018e05dSRabio-Wang ret &= dcm_check_state(MP_CPUSYS_TOP_MP_ADB_DCM_CFG0, 31*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG0_MASK, 32*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG0_ON); 33*f018e05dSRabio-Wang ret &= dcm_check_state(MP_CPUSYS_TOP_MP_ADB_DCM_CFG4, 34*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG1_MASK, 35*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG1_ON); 36*f018e05dSRabio-Wang ret &= dcm_check_state(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0, 37*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG2_MASK, 38*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG2_ON); 39*f018e05dSRabio-Wang 40*f018e05dSRabio-Wang return ret; 41*f018e05dSRabio-Wang } 42*f018e05dSRabio-Wang 43*f018e05dSRabio-Wang void dcm_mp_cpusys_top_adb_dcm(bool on) 44*f018e05dSRabio-Wang { 45*f018e05dSRabio-Wang if (on) { 46*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_adb_dcm'" */ 47*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_ADB_DCM_CFG0, 48*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG0_MASK, 49*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG0_ON); 50*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_ADB_DCM_CFG4, 51*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG1_MASK, 52*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG1_ON); 53*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0, 54*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG2_MASK, 55*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG2_ON); 56*f018e05dSRabio-Wang } else { 57*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_adb_dcm'" */ 58*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_ADB_DCM_CFG0, 59*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG0_MASK, 60*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG0_OFF); 61*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_ADB_DCM_CFG4, 62*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG1_MASK, 63*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG1_OFF); 64*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0, 65*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG2_MASK, 66*f018e05dSRabio-Wang MP_CPUSYS_TOP_ADB_DCM_REG2_OFF); 67*f018e05dSRabio-Wang } 68*f018e05dSRabio-Wang } 69*f018e05dSRabio-Wang 70*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_APB_DCM_REG0_MASK BIT(5) 71*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_APB_DCM_REG1_MASK BIT(8) 72*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_APB_DCM_REG2_MASK BIT(16) 73*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_APB_DCM_REG0_ON BIT(5) 74*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_APB_DCM_REG1_ON BIT(8) 75*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_APB_DCM_REG2_ON BIT(16) 76*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_APB_DCM_REG0_OFF (0x0 << 5) 77*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_APB_DCM_REG1_OFF (0x0 << 8) 78*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_APB_DCM_REG2_OFF (0x0 << 16) 79*f018e05dSRabio-Wang 80*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_apb_dcm_is_on(void) 81*f018e05dSRabio-Wang { 82*f018e05dSRabio-Wang bool ret = true; 83*f018e05dSRabio-Wang 84*f018e05dSRabio-Wang ret &= dcm_check_state(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0, 85*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG0_MASK, 86*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG0_ON); 87*f018e05dSRabio-Wang ret &= dcm_check_state(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0, 88*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG1_MASK, 89*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG1_ON); 90*f018e05dSRabio-Wang ret &= dcm_check_state(MP_CPUSYS_TOP_MP0_DCM_CFG0, 91*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG2_MASK, 92*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG2_ON); 93*f018e05dSRabio-Wang 94*f018e05dSRabio-Wang return ret; 95*f018e05dSRabio-Wang } 96*f018e05dSRabio-Wang 97*f018e05dSRabio-Wang void dcm_mp_cpusys_top_apb_dcm(bool on) 98*f018e05dSRabio-Wang { 99*f018e05dSRabio-Wang if (on) { 100*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_apb_dcm'" */ 101*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0, 102*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG0_MASK, 103*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG0_ON); 104*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0, 105*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG1_MASK, 106*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG1_ON); 107*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG0, 108*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG2_MASK, 109*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG2_ON); 110*f018e05dSRabio-Wang } else { 111*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_apb_dcm'" */ 112*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0, 113*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG0_MASK, 114*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG0_OFF); 115*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MCUSYS_DCM_CFG0, 116*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG1_MASK, 117*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG1_OFF); 118*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG0, 119*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG2_MASK, 120*f018e05dSRabio-Wang MP_CPUSYS_TOP_APB_DCM_REG2_OFF); 121*f018e05dSRabio-Wang } 122*f018e05dSRabio-Wang } 123*f018e05dSRabio-Wang 124*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK (BIT(11) | BIT(24) | BIT(25)) 125*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON (BIT(11) | BIT(24) | BIT(25)) 126*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_OFF ((0x0 << 11) | \ 127*f018e05dSRabio-Wang (0x0 << 24) | \ 128*f018e05dSRabio-Wang (0x0 << 25)) 129*f018e05dSRabio-Wang 130*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_bus_pll_div_dcm_is_on(void) 131*f018e05dSRabio-Wang { 132*f018e05dSRabio-Wang return dcm_check_state(MP_CPUSYS_TOP_BUS_PLLDIV_CFG, 133*f018e05dSRabio-Wang MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK, 134*f018e05dSRabio-Wang MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON); 135*f018e05dSRabio-Wang } 136*f018e05dSRabio-Wang 137*f018e05dSRabio-Wang void dcm_mp_cpusys_top_bus_pll_div_dcm(bool on) 138*f018e05dSRabio-Wang { 139*f018e05dSRabio-Wang if (on) { 140*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_bus_pll_div_dcm'" */ 141*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG, 142*f018e05dSRabio-Wang MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK, 143*f018e05dSRabio-Wang MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_ON); 144*f018e05dSRabio-Wang } else { 145*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_bus_pll_div_dcm'" */ 146*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG, 147*f018e05dSRabio-Wang MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_MASK, 148*f018e05dSRabio-Wang MP_CPUSYS_TOP_BUS_PLL_DIV_DCM_REG0_OFF); 149*f018e05dSRabio-Wang } 150*f018e05dSRabio-Wang } 151*f018e05dSRabio-Wang 152*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK BIT(0) 153*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON BIT(0) 154*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_OFF (0x0 << 0) 155*f018e05dSRabio-Wang 156*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_core_stall_dcm_is_on(void) 157*f018e05dSRabio-Wang { 158*f018e05dSRabio-Wang return dcm_check_state(MP_CPUSYS_TOP_MP0_DCM_CFG7, 159*f018e05dSRabio-Wang MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK, 160*f018e05dSRabio-Wang MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON); 161*f018e05dSRabio-Wang } 162*f018e05dSRabio-Wang 163*f018e05dSRabio-Wang void dcm_mp_cpusys_top_core_stall_dcm(bool on) 164*f018e05dSRabio-Wang { 165*f018e05dSRabio-Wang if (on) { 166*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_core_stall_dcm'" */ 167*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7, 168*f018e05dSRabio-Wang MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK, 169*f018e05dSRabio-Wang MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_ON); 170*f018e05dSRabio-Wang } else { 171*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_core_stall_dcm'" */ 172*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7, 173*f018e05dSRabio-Wang MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_MASK, 174*f018e05dSRabio-Wang MP_CPUSYS_TOP_CORE_STALL_DCM_REG0_OFF); 175*f018e05dSRabio-Wang } 176*f018e05dSRabio-Wang } 177*f018e05dSRabio-Wang 178*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK (0xffff << 0) 179*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON (0xffff << 0) 180*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CPUBIU_DCM_REG0_OFF (0x0 << 0) 181*f018e05dSRabio-Wang 182*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_cpubiu_dcm_is_on(void) 183*f018e05dSRabio-Wang { 184*f018e05dSRabio-Wang return dcm_check_state(MP_CPUSYS_TOP_MCSIC_DCM0, 185*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK, 186*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON); 187*f018e05dSRabio-Wang } 188*f018e05dSRabio-Wang 189*f018e05dSRabio-Wang void dcm_mp_cpusys_top_cpubiu_dcm(bool on) 190*f018e05dSRabio-Wang { 191*f018e05dSRabio-Wang if (on) { 192*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_cpubiu_dcm'" */ 193*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MCSIC_DCM0, 194*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK, 195*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPUBIU_DCM_REG0_ON); 196*f018e05dSRabio-Wang } else { 197*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpubiu_dcm'" */ 198*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MCSIC_DCM0, 199*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPUBIU_DCM_REG0_MASK, 200*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPUBIU_DCM_REG0_OFF); 201*f018e05dSRabio-Wang } 202*f018e05dSRabio-Wang } 203*f018e05dSRabio-Wang 204*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK (BIT(24) | BIT(25)) 205*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON (BIT(24) | BIT(25)) 206*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_OFF ((0x0 << 24) | (0x0 << 25)) 207*f018e05dSRabio-Wang 208*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_cpu_pll_div_0_dcm_is_on(void) 209*f018e05dSRabio-Wang { 210*f018e05dSRabio-Wang return dcm_check_state(MP_CPUSYS_TOP_CPU_PLLDIV_CFG0, 211*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK, 212*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON); 213*f018e05dSRabio-Wang } 214*f018e05dSRabio-Wang 215*f018e05dSRabio-Wang void dcm_mp_cpusys_top_cpu_pll_div_0_dcm(bool on) 216*f018e05dSRabio-Wang { 217*f018e05dSRabio-Wang if (on) { 218*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_0_dcm'" */ 219*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG0, 220*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK, 221*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_ON); 222*f018e05dSRabio-Wang } else { 223*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_0_dcm'" */ 224*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG0, 225*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_MASK, 226*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_0_DCM_REG0_OFF); 227*f018e05dSRabio-Wang } 228*f018e05dSRabio-Wang } 229*f018e05dSRabio-Wang 230*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK (BIT(24) | BIT(25)) 231*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON (BIT(24) | BIT(25)) 232*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_OFF ((0x0 << 24) | (0x0 << 25)) 233*f018e05dSRabio-Wang 234*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_cpu_pll_div_1_dcm_is_on(void) 235*f018e05dSRabio-Wang { 236*f018e05dSRabio-Wang return dcm_check_state(MP_CPUSYS_TOP_CPU_PLLDIV_CFG1, 237*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK, 238*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON); 239*f018e05dSRabio-Wang } 240*f018e05dSRabio-Wang 241*f018e05dSRabio-Wang void dcm_mp_cpusys_top_cpu_pll_div_1_dcm(bool on) 242*f018e05dSRabio-Wang { 243*f018e05dSRabio-Wang if (on) { 244*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_cpu_pll_div_1_dcm'" */ 245*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG1, 246*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK, 247*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_ON); 248*f018e05dSRabio-Wang } else { 249*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_cpu_pll_div_1_dcm'" */ 250*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_CPU_PLLDIV_CFG1, 251*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_MASK, 252*f018e05dSRabio-Wang MP_CPUSYS_TOP_CPU_PLL_DIV_1_DCM_REG0_OFF); 253*f018e05dSRabio-Wang } 254*f018e05dSRabio-Wang } 255*f018e05dSRabio-Wang 256*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK BIT(4) 257*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON BIT(4) 258*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_OFF (0x0 << 4) 259*f018e05dSRabio-Wang 260*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_fcm_stall_dcm_is_on(void) 261*f018e05dSRabio-Wang { 262*f018e05dSRabio-Wang return dcm_check_state(MP_CPUSYS_TOP_MP0_DCM_CFG7, 263*f018e05dSRabio-Wang MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK, 264*f018e05dSRabio-Wang MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON); 265*f018e05dSRabio-Wang } 266*f018e05dSRabio-Wang 267*f018e05dSRabio-Wang void dcm_mp_cpusys_top_fcm_stall_dcm(bool on) 268*f018e05dSRabio-Wang { 269*f018e05dSRabio-Wang if (on) { 270*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_fcm_stall_dcm'" */ 271*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7, 272*f018e05dSRabio-Wang MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK, 273*f018e05dSRabio-Wang MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_ON); 274*f018e05dSRabio-Wang } else { 275*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_fcm_stall_dcm'" */ 276*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG7, 277*f018e05dSRabio-Wang MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_MASK, 278*f018e05dSRabio-Wang MP_CPUSYS_TOP_FCM_STALL_DCM_REG0_OFF); 279*f018e05dSRabio-Wang } 280*f018e05dSRabio-Wang } 281*f018e05dSRabio-Wang 282*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK BIT(31) 283*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON BIT(31) 284*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_OFF (0x0U << 31) 285*f018e05dSRabio-Wang 286*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_last_cor_idle_dcm_is_on(void) 287*f018e05dSRabio-Wang { 288*f018e05dSRabio-Wang return dcm_check_state(MP_CPUSYS_TOP_BUS_PLLDIV_CFG, 289*f018e05dSRabio-Wang MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK, 290*f018e05dSRabio-Wang MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON); 291*f018e05dSRabio-Wang } 292*f018e05dSRabio-Wang 293*f018e05dSRabio-Wang void dcm_mp_cpusys_top_last_cor_idle_dcm(bool on) 294*f018e05dSRabio-Wang { 295*f018e05dSRabio-Wang if (on) { 296*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_last_cor_idle_dcm'" */ 297*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG, 298*f018e05dSRabio-Wang MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK, 299*f018e05dSRabio-Wang MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_ON); 300*f018e05dSRabio-Wang } else { 301*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_last_cor_idle_dcm'" */ 302*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_BUS_PLLDIV_CFG, 303*f018e05dSRabio-Wang MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_MASK, 304*f018e05dSRabio-Wang MP_CPUSYS_TOP_LAST_COR_IDLE_DCM_REG0_OFF); 305*f018e05dSRabio-Wang } 306*f018e05dSRabio-Wang } 307*f018e05dSRabio-Wang 308*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_MISC_DCM_REG0_MASK (BIT(1) | BIT(4)) 309*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_MISC_DCM_REG0_ON (BIT(1) | BIT(4)) 310*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_MISC_DCM_REG0_OFF ((0x0 << 1) | (0x0 << 4)) 311*f018e05dSRabio-Wang 312*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_misc_dcm_is_on(void) 313*f018e05dSRabio-Wang { 314*f018e05dSRabio-Wang return dcm_check_state(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0, 315*f018e05dSRabio-Wang MP_CPUSYS_TOP_MISC_DCM_REG0_MASK, 316*f018e05dSRabio-Wang MP_CPUSYS_TOP_MISC_DCM_REG0_ON); 317*f018e05dSRabio-Wang } 318*f018e05dSRabio-Wang 319*f018e05dSRabio-Wang void dcm_mp_cpusys_top_misc_dcm(bool on) 320*f018e05dSRabio-Wang { 321*f018e05dSRabio-Wang if (on) { 322*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_misc_dcm'" */ 323*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0, 324*f018e05dSRabio-Wang MP_CPUSYS_TOP_MISC_DCM_REG0_MASK, 325*f018e05dSRabio-Wang MP_CPUSYS_TOP_MISC_DCM_REG0_ON); 326*f018e05dSRabio-Wang } else { 327*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_misc_dcm'" */ 328*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0, 329*f018e05dSRabio-Wang MP_CPUSYS_TOP_MISC_DCM_REG0_MASK, 330*f018e05dSRabio-Wang MP_CPUSYS_TOP_MISC_DCM_REG0_OFF); 331*f018e05dSRabio-Wang } 332*f018e05dSRabio-Wang } 333*f018e05dSRabio-Wang 334*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK BIT(3) 335*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK (BIT(0) | BIT(1) | BIT(2) | BIT(3)) 336*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_MP0_QDCM_REG0_ON BIT(3) 337*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_MP0_QDCM_REG1_ON (BIT(0) | BIT(1) | BIT(2) | BIT(3)) 338*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_MP0_QDCM_REG0_OFF ((0x0 << 3)) 339*f018e05dSRabio-Wang #define MP_CPUSYS_TOP_MP0_QDCM_REG1_OFF ((0x0 << 0) | (0x0 << 1) | \ 340*f018e05dSRabio-Wang (0x0 << 2) | (0x0 << 3)) 341*f018e05dSRabio-Wang 342*f018e05dSRabio-Wang bool dcm_mp_cpusys_top_mp0_qdcm_is_on(void) 343*f018e05dSRabio-Wang { 344*f018e05dSRabio-Wang bool ret = true; 345*f018e05dSRabio-Wang 346*f018e05dSRabio-Wang ret &= dcm_check_state(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0, 347*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK, 348*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG0_ON); 349*f018e05dSRabio-Wang ret &= dcm_check_state(MP_CPUSYS_TOP_MP0_DCM_CFG0, 350*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK, 351*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG1_ON); 352*f018e05dSRabio-Wang 353*f018e05dSRabio-Wang return ret; 354*f018e05dSRabio-Wang } 355*f018e05dSRabio-Wang 356*f018e05dSRabio-Wang void dcm_mp_cpusys_top_mp0_qdcm(bool on) 357*f018e05dSRabio-Wang { 358*f018e05dSRabio-Wang if (on) { 359*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'mp_cpusys_top_mp0_qdcm'" */ 360*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0, 361*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK, 362*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG0_ON); 363*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG0, 364*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK, 365*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG1_ON); 366*f018e05dSRabio-Wang } else { 367*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'mp_cpusys_top_mp0_qdcm'" */ 368*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP_MISC_DCM_CFG0, 369*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG0_MASK, 370*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG0_OFF); 371*f018e05dSRabio-Wang mmio_clrsetbits_32(MP_CPUSYS_TOP_MP0_DCM_CFG0, 372*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG1_MASK, 373*f018e05dSRabio-Wang MP_CPUSYS_TOP_MP0_QDCM_REG1_OFF); 374*f018e05dSRabio-Wang } 375*f018e05dSRabio-Wang } 376*f018e05dSRabio-Wang 377*f018e05dSRabio-Wang #define CPCCFG_REG_EMI_WFIFO_REG0_MASK (BIT(0) | BIT(1) | BIT(2) | BIT(3)) 378*f018e05dSRabio-Wang #define CPCCFG_REG_EMI_WFIFO_REG0_ON (BIT(0) | BIT(1) | BIT(2) | BIT(3)) 379*f018e05dSRabio-Wang #define CPCCFG_REG_EMI_WFIFO_REG0_OFF ((0x0 << 0) | (0x0 << 1) | \ 380*f018e05dSRabio-Wang (0x0 << 2) | (0x0 << 3)) 381*f018e05dSRabio-Wang 382*f018e05dSRabio-Wang bool dcm_cpccfg_reg_emi_wfifo_is_on(void) 383*f018e05dSRabio-Wang { 384*f018e05dSRabio-Wang return dcm_check_state(CPCCFG_REG_EMI_WFIFO, 385*f018e05dSRabio-Wang CPCCFG_REG_EMI_WFIFO_REG0_MASK, 386*f018e05dSRabio-Wang CPCCFG_REG_EMI_WFIFO_REG0_ON); 387*f018e05dSRabio-Wang } 388*f018e05dSRabio-Wang 389*f018e05dSRabio-Wang void dcm_cpccfg_reg_emi_wfifo(bool on) 390*f018e05dSRabio-Wang { 391*f018e05dSRabio-Wang if (on) { 392*f018e05dSRabio-Wang /* TINFO = "Turn ON DCM 'cpccfg_reg_emi_wfifo'" */ 393*f018e05dSRabio-Wang mmio_clrsetbits_32(CPCCFG_REG_EMI_WFIFO, 394*f018e05dSRabio-Wang CPCCFG_REG_EMI_WFIFO_REG0_MASK, 395*f018e05dSRabio-Wang CPCCFG_REG_EMI_WFIFO_REG0_ON); 396*f018e05dSRabio-Wang } else { 397*f018e05dSRabio-Wang /* TINFO = "Turn OFF DCM 'cpccfg_reg_emi_wfifo'" */ 398*f018e05dSRabio-Wang mmio_clrsetbits_32(CPCCFG_REG_EMI_WFIFO, 399*f018e05dSRabio-Wang CPCCFG_REG_EMI_WFIFO_REG0_MASK, 400*f018e05dSRabio-Wang CPCCFG_REG_EMI_WFIFO_REG0_OFF); 401*f018e05dSRabio-Wang } 402*f018e05dSRabio-Wang } 403