xref: /rk3399_ARM-atf/plat/mediatek/drivers/spm/mt8189/mt_spm_hwreq.c (revision c0047dec92fb161a60074938793d59491987f476)
165db67b8SKun Lu /*
265db67b8SKun Lu  * Copyright (c) 2025, Mediatek Inc. All rights reserved.
365db67b8SKun Lu  *
465db67b8SKun Lu  * SPDX-License-Identifier: BSD-3-Clause
565db67b8SKun Lu  */
665db67b8SKun Lu 
765db67b8SKun Lu #include <common/debug.h>
865db67b8SKun Lu #include <lib/mmio.h>
965db67b8SKun Lu 
1065db67b8SKun Lu #include <mt_spm_hwreq.h>
1165db67b8SKun Lu #include <mt_spm_reg.h>
1265db67b8SKun Lu #include <platform_def.h>
1365db67b8SKun Lu 
spm_hwcg_index2res(uint32_t idx)1465db67b8SKun Lu static uint32_t spm_hwcg_index2res(uint32_t idx)
1565db67b8SKun Lu {
1665db67b8SKun Lu 	uint32_t res;
1765db67b8SKun Lu 
1865db67b8SKun Lu 	if (idx >= HWCG_MAX)
1965db67b8SKun Lu 		return 0;
2065db67b8SKun Lu 
2165db67b8SKun Lu 	switch (idx) {
2265db67b8SKun Lu 	case HWCG_DDREN:
2365db67b8SKun Lu 		res = (MT_SPM_DRAM_S0 | MT_SPM_DRAM_S1 | MT_SPM_EMI);
2465db67b8SKun Lu 		break;
2565db67b8SKun Lu 	case HWCG_VRF18:
2665db67b8SKun Lu 		res = MT_SPM_SYSPLL;
2765db67b8SKun Lu 		break;
2865db67b8SKun Lu 	case HWCG_INFRA:
2965db67b8SKun Lu 		res = MT_SPM_INFRA;
3065db67b8SKun Lu 		break;
3165db67b8SKun Lu 	case HWCG_PMIC:
3265db67b8SKun Lu 		res = MT_SPM_PMIC;
3365db67b8SKun Lu 		break;
3465db67b8SKun Lu 	case HWCG_F26M:
3565db67b8SKun Lu 		res = MT_SPM_26M;
3665db67b8SKun Lu 		break;
3765db67b8SKun Lu 	case HWCG_VCORE:
3865db67b8SKun Lu 		res = MT_SPM_VCORE;
3965db67b8SKun Lu 		break;
4065db67b8SKun Lu 	default:
4165db67b8SKun Lu 		res = 0;
4265db67b8SKun Lu 	}
4365db67b8SKun Lu 	return res;
4465db67b8SKun Lu }
4565db67b8SKun Lu 
spm_hwcg_ctrl_get(struct spm_hwcg_info * info,enum spm_hwcg_setting type)4665db67b8SKun Lu static uint32_t spm_hwcg_ctrl_get(struct spm_hwcg_info *info,
4765db67b8SKun Lu 				  enum spm_hwcg_setting type)
4865db67b8SKun Lu {
4965db67b8SKun Lu 	uint32_t reg = 0;
5065db67b8SKun Lu 
5165db67b8SKun Lu 	if (!info)
5265db67b8SKun Lu 		return 0;
5365db67b8SKun Lu 
5465db67b8SKun Lu 	switch (type) {
5565db67b8SKun Lu 	case HWCG_PWR:
5665db67b8SKun Lu 		reg = info->pwr;
5765db67b8SKun Lu 		break;
5865db67b8SKun Lu 	case HWCG_PWR_MSB:
5965db67b8SKun Lu 		reg = info->pwr_msb;
6065db67b8SKun Lu 		break;
6165db67b8SKun Lu 	default:
6265db67b8SKun Lu 		reg = info->module_busy;
6365db67b8SKun Lu 		break;
6465db67b8SKun Lu 	}
6565db67b8SKun Lu 	return reg;
6665db67b8SKun Lu }
6765db67b8SKun Lu 
__spm_hwcg_ctrl(struct spm_hwcg_info * info,enum spm_hwcg_setting type,uint32_t is_set,uint32_t val)6865db67b8SKun Lu static void __spm_hwcg_ctrl(struct spm_hwcg_info *info,
6965db67b8SKun Lu 			    enum spm_hwcg_setting type, uint32_t is_set,
7065db67b8SKun Lu 			    uint32_t val)
7165db67b8SKun Lu {
7265db67b8SKun Lu 	uint32_t reg;
7365db67b8SKun Lu 
7465db67b8SKun Lu 	reg = spm_hwcg_ctrl_get(info, type);
7565db67b8SKun Lu 
7665db67b8SKun Lu 	if (!reg)
7765db67b8SKun Lu 		return;
7865db67b8SKun Lu 
7965db67b8SKun Lu 	if (is_set)
8065db67b8SKun Lu 		mmio_setbits_32(reg, val);
8165db67b8SKun Lu 	else
8265db67b8SKun Lu 		mmio_clrbits_32(reg, val);
8365db67b8SKun Lu }
8465db67b8SKun Lu 
spm_hwcg_ctrl(uint32_t res,enum spm_hwcg_setting type,uint32_t is_set,uint32_t val)8565db67b8SKun Lu void spm_hwcg_ctrl(uint32_t res, enum spm_hwcg_setting type, uint32_t is_set,
8665db67b8SKun Lu 		   uint32_t val)
8765db67b8SKun Lu {
8865db67b8SKun Lu 	struct spm_hwcg_info info;
8965db67b8SKun Lu 
9065db67b8SKun Lu 	if (res & (MT_SPM_DRAM_S0 | MT_SPM_DRAM_S1 | MT_SPM_EMI))
9165db67b8SKun Lu 		DECLARE_HWCG_REG(DDREN, info);
9265db67b8SKun Lu 	else if (res & MT_SPM_SYSPLL)
9365db67b8SKun Lu 		DECLARE_HWCG_REG(VRF18, info);
9465db67b8SKun Lu 	else if (res & MT_SPM_INFRA)
9565db67b8SKun Lu 		DECLARE_HWCG_REG(INFRA, info);
9665db67b8SKun Lu 	else if (res & MT_SPM_PMIC)
9765db67b8SKun Lu 		DECLARE_HWCG_REG(PMIC, info);
9865db67b8SKun Lu 	else if (res & MT_SPM_26M)
9965db67b8SKun Lu 		DECLARE_HWCG_REG(F26M, info);
10065db67b8SKun Lu 	else if (res & MT_SPM_VCORE)
10165db67b8SKun Lu 		DECLARE_HWCG_REG(VCORE, info);
10265db67b8SKun Lu 	else
10365db67b8SKun Lu 		HWCG_INFO_INIT(info);
10465db67b8SKun Lu 
10565db67b8SKun Lu 	if (info.pwr)
10665db67b8SKun Lu 		__spm_hwcg_ctrl(&info, type, is_set, val);
10765db67b8SKun Lu }
10865db67b8SKun Lu 
spm_hwcg_ctrl_by_index(uint32_t idx,enum spm_hwcg_setting type,uint32_t is_set,uint32_t val)10965db67b8SKun Lu void spm_hwcg_ctrl_by_index(uint32_t idx, enum spm_hwcg_setting type,
11065db67b8SKun Lu 			    uint32_t is_set, uint32_t val)
11165db67b8SKun Lu {
11265db67b8SKun Lu 	uint32_t res = spm_hwcg_index2res(idx);
11365db67b8SKun Lu 
11465db67b8SKun Lu 	if (res)
11565db67b8SKun Lu 		spm_hwcg_ctrl(res, type, is_set, val);
11665db67b8SKun Lu }
11765db67b8SKun Lu 
spm_hwcg_mask_get(uint32_t res,enum spm_hwcg_setting type)11865db67b8SKun Lu static uint32_t spm_hwcg_mask_get(uint32_t res, enum spm_hwcg_setting type)
11965db67b8SKun Lu {
12065db67b8SKun Lu 	struct spm_hwcg_info info;
12165db67b8SKun Lu 	uint32_t raw_val = 0, reg = 0;
12265db67b8SKun Lu 
12365db67b8SKun Lu 	if (res & (MT_SPM_DRAM_S0 | MT_SPM_DRAM_S1 | MT_SPM_EMI))
12465db67b8SKun Lu 		DECLARE_HWCG_REG(DDREN, info);
12565db67b8SKun Lu 	else if (res & MT_SPM_SYSPLL)
12665db67b8SKun Lu 		DECLARE_HWCG_REG(VRF18, info);
12765db67b8SKun Lu 	else if (res & MT_SPM_INFRA)
12865db67b8SKun Lu 		DECLARE_HWCG_REG(INFRA, info);
12965db67b8SKun Lu 	else if (res & MT_SPM_PMIC)
13065db67b8SKun Lu 		DECLARE_HWCG_REG(PMIC, info);
13165db67b8SKun Lu 	else if (res & MT_SPM_26M)
13265db67b8SKun Lu 		DECLARE_HWCG_REG(F26M, info);
13365db67b8SKun Lu 	else if (res & MT_SPM_VCORE)
13465db67b8SKun Lu 		DECLARE_HWCG_REG(VCORE, info);
13565db67b8SKun Lu 	else
13665db67b8SKun Lu 		HWCG_INFO_INIT(info);
13765db67b8SKun Lu 
13865db67b8SKun Lu 	if (!info.pwr)
13965db67b8SKun Lu 		return 0;
14065db67b8SKun Lu 
14165db67b8SKun Lu 	reg = spm_hwcg_ctrl_get(&info, type);
14265db67b8SKun Lu 
14365db67b8SKun Lu 	if (!reg)
14465db67b8SKun Lu 		return 0;
14565db67b8SKun Lu 
14665db67b8SKun Lu 	raw_val = ~mmio_read_32(reg);
14765db67b8SKun Lu 
14865db67b8SKun Lu 	return raw_val;
14965db67b8SKun Lu }
15065db67b8SKun Lu 
spm_hwcg_get_default(uint32_t res,enum spm_hwcg_setting type)15165db67b8SKun Lu static uint32_t spm_hwcg_get_default(uint32_t res, enum spm_hwcg_setting type)
15265db67b8SKun Lu {
15365db67b8SKun Lu 	struct spm_hwcg_info info;
15465db67b8SKun Lu 
15565db67b8SKun Lu 	if (res & (MT_SPM_DRAM_S0 | MT_SPM_DRAM_S1 | MT_SPM_EMI))
15665db67b8SKun Lu 		DECLARE_HWCG_DEFAULT(DDREN, info);
15765db67b8SKun Lu 	else if (res & MT_SPM_SYSPLL)
15865db67b8SKun Lu 		DECLARE_HWCG_DEFAULT(VRF18, info);
15965db67b8SKun Lu 	else if (res & MT_SPM_INFRA)
16065db67b8SKun Lu 		DECLARE_HWCG_DEFAULT(INFRA, info);
16165db67b8SKun Lu 	else if (res & MT_SPM_PMIC)
16265db67b8SKun Lu 		DECLARE_HWCG_DEFAULT(PMIC, info);
16365db67b8SKun Lu 	else if (res & MT_SPM_26M)
16465db67b8SKun Lu 		DECLARE_HWCG_DEFAULT(F26M, info);
16565db67b8SKun Lu 	else if (res & MT_SPM_VCORE)
16665db67b8SKun Lu 		DECLARE_HWCG_DEFAULT(VCORE, info);
16765db67b8SKun Lu 	else
16865db67b8SKun Lu 		HWCG_INFO_INIT(info);
16965db67b8SKun Lu 
17065db67b8SKun Lu 	if (!info.pwr)
17165db67b8SKun Lu 		return 0;
17265db67b8SKun Lu 
17365db67b8SKun Lu 	return spm_hwcg_ctrl_get(&info, type);
17465db67b8SKun Lu }
17565db67b8SKun Lu 
17665db67b8SKun Lu #define _APMIXEDSYS(ofs) (APMIXEDSYS + ofs)
17765db67b8SKun Lu #define PLL_UNIV _APMIXEDSYS(0x314)
17865db67b8SKun Lu #define PLL_MM _APMIXEDSYS(0x324)
17965db67b8SKun Lu #define PLL_MSDC _APMIXEDSYS(0x35C)
18065db67b8SKun Lu #define PLL_UFS _APMIXEDSYS(0x36C)
18165db67b8SKun Lu #define PLLEN_ALL _APMIXEDSYS(0x070)
18265db67b8SKun Lu #define PLL_UNIV_MERG BIT(5)
18365db67b8SKun Lu #define PLL_MM_MERG BIT(3)
18465db67b8SKun Lu #define PLL_MSDC_MERG BIT(4)
18565db67b8SKun Lu #define PLL_UFS_MERG BIT(2)
18665db67b8SKun Lu 
spm_hwcg_get_status(uint32_t idx,enum spm_hwcg_setting type)18765db67b8SKun Lu uint32_t spm_hwcg_get_status(uint32_t idx, enum spm_hwcg_setting type)
18865db67b8SKun Lu {
18965db67b8SKun Lu 	uint32_t val = 0;
19065db67b8SKun Lu 	uint32_t pllen_all = 0;
19165db67b8SKun Lu 
19265db67b8SKun Lu 	switch (type) {
19365db67b8SKun Lu 	case HWCG_PWR:
19465db67b8SKun Lu 		val = mmio_read_32(PWR_STATUS);
19565db67b8SKun Lu 		break;
19665db67b8SKun Lu 	case HWCG_PWR_MSB:
19765db67b8SKun Lu 		val = mmio_read_32(PWR_STATUS_MSB);
19865db67b8SKun Lu 		break;
19965db67b8SKun Lu 	default:
20065db67b8SKun Lu 		pllen_all = mmio_read_32(PLLEN_ALL);
20165db67b8SKun Lu 
20265db67b8SKun Lu 		if ((mmio_read_32(PLL_UNIV) & 0x1) ||
20365db67b8SKun Lu 		    (pllen_all & PLL_UNIV_MERG))
20465db67b8SKun Lu 			val |= BIT(HWCG_MODULE_UNIVPLL);
20565db67b8SKun Lu 		if ((mmio_read_32(PLL_MSDC) & 0x1) ||
20665db67b8SKun Lu 		    (pllen_all & PLL_MSDC_MERG))
20765db67b8SKun Lu 			val |= BIT(HWCG_MODULE_MSDCPLL);
20865db67b8SKun Lu 		if ((mmio_read_32(PLL_UFS) & 0x1) || (pllen_all & PLL_UFS_MERG))
20965db67b8SKun Lu 			val |= BIT(HWCG_MODULE_UFSPLL);
21065db67b8SKun Lu 		if ((mmio_read_32(PLL_MM) & 0x1) || (pllen_all & PLL_MM_MERG))
21165db67b8SKun Lu 			val |= BIT(HWCG_MODULE_MMPLL);
21265db67b8SKun Lu 		break;
21365db67b8SKun Lu 	}
21465db67b8SKun Lu 	return val;
21565db67b8SKun Lu }
21665db67b8SKun Lu 
spm_hwcg_get_setting(uint32_t res,enum spm_hwcg_sta_type sta_type,enum spm_hwcg_setting type,struct spm_hwcg_sta * sta)21765db67b8SKun Lu int spm_hwcg_get_setting(uint32_t res, enum spm_hwcg_sta_type sta_type,
21865db67b8SKun Lu 			 enum spm_hwcg_setting type, struct spm_hwcg_sta *sta)
21965db67b8SKun Lu {
22065db67b8SKun Lu 	int ret = 0;
22165db67b8SKun Lu 
22265db67b8SKun Lu 	if (!sta)
22365db67b8SKun Lu 		return -1;
22465db67b8SKun Lu 
22565db67b8SKun Lu 	switch (sta_type) {
22665db67b8SKun Lu 	case HWCG_STA_DEFAULT_MASK:
22765db67b8SKun Lu 		sta->sta = spm_hwcg_get_default(res, type);
22865db67b8SKun Lu 		break;
22965db67b8SKun Lu 	case HWCG_STA_MASK:
23065db67b8SKun Lu 		sta->sta = spm_hwcg_mask_get(res, type);
23165db67b8SKun Lu 		break;
23265db67b8SKun Lu 	default:
23365db67b8SKun Lu 		ret = -1;
23465db67b8SKun Lu 		MT_SPM_HW_CG_STA_INIT(sta);
23565db67b8SKun Lu 		break;
23665db67b8SKun Lu 	}
23765db67b8SKun Lu 	return ret;
23865db67b8SKun Lu }
23965db67b8SKun Lu 
spm_hwcg_get_setting_by_index(uint32_t idx,enum spm_hwcg_sta_type sta_type,enum spm_hwcg_setting type,struct spm_hwcg_sta * sta)24065db67b8SKun Lu int spm_hwcg_get_setting_by_index(uint32_t idx, enum spm_hwcg_sta_type sta_type,
24165db67b8SKun Lu 				  enum spm_hwcg_setting type,
24265db67b8SKun Lu 				  struct spm_hwcg_sta *sta)
24365db67b8SKun Lu {
24465db67b8SKun Lu 	uint32_t res = spm_hwcg_index2res(idx);
24565db67b8SKun Lu 
24665db67b8SKun Lu 	return spm_hwcg_get_setting(res, sta_type, type, sta);
24765db67b8SKun Lu }
24865db67b8SKun Lu 
spm_infra_swcg_init(void)24965db67b8SKun Lu static void spm_infra_swcg_init(void)
25065db67b8SKun Lu {
25165db67b8SKun Lu 	mmio_write_32(INFRA_SW_CG_0_MASK, ~INFRA_SW_CG_MB);
25265db67b8SKun Lu 	mmio_write_32(INFRA_SW_CG_1_MASK, ~INFRA_SW_CG_MB);
25365db67b8SKun Lu 	mmio_write_32(INFRA_SW_CG_2_MASK, ~INFRA_SW_CG_MB);
25465db67b8SKun Lu 	mmio_write_32(INFRA_SW_CG_3_MASK, ~INFRA_SW_CG_MB);
25565db67b8SKun Lu 	mmio_write_32(INFRA_SW_CG_4_MASK, ~INFRA_SW_CG_MB);
25665db67b8SKun Lu }
25765db67b8SKun Lu 
spm_hwcg_init(void)25865db67b8SKun Lu static void spm_hwcg_init(void)
25965db67b8SKun Lu {
26065db67b8SKun Lu 	/* HW CG for ddren, apsrc, emi resource req */
26165db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_DDREN_REQ_MASK,
26265db67b8SKun Lu 		      ~SPM_HWCG_DDREN_PWR_MB);
26365db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_MSB_DDREN_REQ_MASK,
26465db67b8SKun Lu 		      ~SPM_HWCG_DDREN_PWR_MSB_MB);
26565db67b8SKun Lu 	mmio_write_32(REG_MODULE_BUSY_DDREN_REQ_MASK,
26665db67b8SKun Lu 		      ~SPM_HWCG_DDREN_MODULE_BUSY_MB);
26765db67b8SKun Lu 
26865db67b8SKun Lu 	/* HW CG for vrf18 resource req */
26965db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_VRF18_REQ_MASK,
27065db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_VRF18_PWR_MB));
27165db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_MSB_VRF18_REQ_MASK,
27265db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_VRF18_PWR_MSB_MB));
27365db67b8SKun Lu 	mmio_write_32(REG_MODULE_BUSY_VRF18_REQ_MASK,
27465db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_VRF18_MODULE_BUSY_MB));
27565db67b8SKun Lu 
27665db67b8SKun Lu 	/* HW CG for infra resource req */
27765db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_INFRA_REQ_MASK,
27865db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_INFRA_PWR_MB));
27965db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_MSB_INFRA_REQ_MASK,
28065db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_INFRA_PWR_MSB_MB));
28165db67b8SKun Lu 	mmio_write_32(REG_MODULE_BUSY_INFRA_REQ_MASK,
28265db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_INFRA_MODULE_BUSY_MB));
28365db67b8SKun Lu 
28465db67b8SKun Lu 	/* HW CG for pmic resource req */
28565db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_PMIC_REQ_MASK,
28665db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_PMIC_PWR_MB));
28765db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_MSB_PMIC_REQ_MASK,
28865db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_PMIC_PWR_MSB_MB));
28965db67b8SKun Lu 	mmio_write_32(REG_MODULE_BUSY_PMIC_REQ_MASK,
29065db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_PMIC_MODULE_BUSY_MB));
29165db67b8SKun Lu 
29265db67b8SKun Lu 	/* HW CG for f26m resource req */
29365db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_F26M_REQ_MASK,
29465db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_F26M_PWR_MB));
29565db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_MSB_F26M_REQ_MASK,
29665db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_F26M_PWR_MSB_MB));
29765db67b8SKun Lu 	mmio_write_32(REG_MODULE_BUSY_F26M_REQ_MASK,
29865db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_F26M_MODULE_BUSY_MB));
29965db67b8SKun Lu 
30065db67b8SKun Lu 	/* HW CG for vcore resource req */
30165db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_VCORE_REQ_MASK,
30265db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_VCORE_PWR_MB));
30365db67b8SKun Lu 	mmio_write_32(REG_PWR_STATUS_MSB_VCORE_REQ_MASK,
30465db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_VCORE_PWR_MSB_MB));
30565db67b8SKun Lu 	mmio_write_32(REG_MODULE_BUSY_VCORE_REQ_MASK,
30665db67b8SKun Lu 		      (uint32_t)(~SPM_HWCG_VCORE_MODULE_BUSY_MB));
30765db67b8SKun Lu }
30865db67b8SKun Lu 
30965db67b8SKun Lu #define PERI_CG(ofs) (PERICFG_AO_BASE + 0x10 + (0x4 * ofs))
31065db67b8SKun Lu #define PERI_REQ_DDREN_MB	(BIT(PERI_REQ_EN_DMA)	|\
31165db67b8SKun Lu 				BIT(PERI_REQ_EN_UART1)	|\
31265db67b8SKun Lu 				BIT(PERI_REQ_EN_UART2)	|\
31365db67b8SKun Lu 				BIT(PERI_REQ_EN_UART3)	|\
31465db67b8SKun Lu 				BIT(PERI_REQ_EN_PWM)	|\
31565db67b8SKun Lu 				BIT(PERI_REQ_EN_SPI0)	|\
31665db67b8SKun Lu 				BIT(PERI_REQ_EN_SPI1)	|\
31765db67b8SKun Lu 				BIT(PERI_REQ_EN_SPI2)	|\
31865db67b8SKun Lu 				BIT(PERI_REQ_EN_SPI3)	|\
31965db67b8SKun Lu 				BIT(PERI_REQ_EN_SPI4)	|\
32065db67b8SKun Lu 				BIT(PERI_REQ_EN_SPI5)	|\
32165db67b8SKun Lu 				BIT(PERI_REQ_EN_I2C)	|\
32265db67b8SKun Lu 				BIT(PERI_REQ_EN_MSDC0)	|\
32365db67b8SKun Lu 				BIT(PERI_REQ_EN_MSDC1)	|\
32465db67b8SKun Lu 				BIT(PERI_REQ_EN_MSDC2)	|\
32565db67b8SKun Lu 				BIT(PERI_REQ_EN_SSUSB0)	|\
32665db67b8SKun Lu 				BIT(PERI_REQ_EN_SSUSB1)	|\
32765db67b8SKun Lu 				BIT(PERI_REQ_EN_SSUSB2)	|\
32865db67b8SKun Lu 				BIT(PERI_REQ_EN_SSUSB3)	|\
32965db67b8SKun Lu 				BIT(PERI_REQ_EN_SSUSB4)	|\
33065db67b8SKun Lu 				BIT(PERI_REQ_EN_PEXTP)	|\
33165db67b8SKun Lu 				BIT(PERI_REQ_EN_AFE))
33265db67b8SKun Lu 
333*32896781SKun Lu #define PERI_REQ_26M_MB		(BIT(PERI_REQ_EN_DMA)	|\
334*32896781SKun Lu 				BIT(PERI_REQ_EN_UART1)	|\
335*32896781SKun Lu 				BIT(PERI_REQ_EN_UART2)	|\
336*32896781SKun Lu 				BIT(PERI_REQ_EN_UART3)	|\
337*32896781SKun Lu 				BIT(PERI_REQ_EN_PWM)	|\
338*32896781SKun Lu 				BIT(PERI_REQ_EN_SPI0)	|\
339*32896781SKun Lu 				BIT(PERI_REQ_EN_SPI1)	|\
340*32896781SKun Lu 				BIT(PERI_REQ_EN_SPI2)	|\
341*32896781SKun Lu 				BIT(PERI_REQ_EN_SPI3)	|\
342*32896781SKun Lu 				BIT(PERI_REQ_EN_SPI4)	|\
343*32896781SKun Lu 				BIT(PERI_REQ_EN_SPI5)	|\
344*32896781SKun Lu 				BIT(PERI_REQ_EN_I2C)	|\
345*32896781SKun Lu 				BIT(PERI_REQ_EN_MSDC0)	|\
346*32896781SKun Lu 				BIT(PERI_REQ_EN_MSDC1)	|\
347*32896781SKun Lu 				BIT(PERI_REQ_EN_MSDC2)	|\
348*32896781SKun Lu 				BIT(PERI_REQ_EN_SSUSB0)	|\
349*32896781SKun Lu 				BIT(PERI_REQ_EN_SSUSB1)	|\
350*32896781SKun Lu 				BIT(PERI_REQ_EN_SSUSB2)	|\
351*32896781SKun Lu 				BIT(PERI_REQ_EN_SSUSB4)	|\
352*32896781SKun Lu 				BIT(PERI_REQ_EN_PEXTP)	|\
353*32896781SKun Lu 				BIT(PERI_REQ_EN_AFE))
354*32896781SKun Lu 
35565db67b8SKun Lu #define PERI_REQ_APSRC_MB (PERI_REQ_DDREN_MB)
35665db67b8SKun Lu #define PERI_REQ_EMI_MB (PERI_REQ_DDREN_MB)
35765db67b8SKun Lu #define PERI_REQ_INFRA_MB (PERI_REQ_DDREN_MB)
35865db67b8SKun Lu #define PERI_REQ_SYSPLL_MB (PERI_REQ_DDREN_MB)
35965db67b8SKun Lu #define PERI_REQ_PMIC_MB (PERI_REQ_DDREN_MB)
360*32896781SKun Lu #define PERI_REQ_F26M_MB (PERI_REQ_26M_MB)
36165db67b8SKun Lu 
spm_peri_req_get_status(uint32_t idx,enum spm_peri_req_status type)36265db67b8SKun Lu uint32_t spm_peri_req_get_status(uint32_t idx, enum spm_peri_req_status type)
36365db67b8SKun Lu {
36465db67b8SKun Lu 	uint32_t val = 0, reg = 0;
36565db67b8SKun Lu 	struct spm_peri_req_info info;
36665db67b8SKun Lu 
36765db67b8SKun Lu 	switch (type) {
36865db67b8SKun Lu 	case PERI_RES_REQ_EN:
36965db67b8SKun Lu 
37065db67b8SKun Lu 		switch (idx) {
37165db67b8SKun Lu 		case PERI_REQ_DDREN:
37265db67b8SKun Lu 			DECLARE_PERI_REQ_STA_REG(PERI_REQ_DDREN, info);
37365db67b8SKun Lu 
37465db67b8SKun Lu 			break;
37565db67b8SKun Lu 		case PERI_REQ_APSRC:
37665db67b8SKun Lu 			DECLARE_PERI_REQ_STA_REG(PERI_REQ_APSRC, info);
37765db67b8SKun Lu 
37865db67b8SKun Lu 			break;
37965db67b8SKun Lu 		case PERI_REQ_EMI:
38065db67b8SKun Lu 			DECLARE_PERI_REQ_STA_REG(PERI_REQ_EMI, info);
38165db67b8SKun Lu 
38265db67b8SKun Lu 			break;
38365db67b8SKun Lu 		case PERI_REQ_SYSPLL:
38465db67b8SKun Lu 			DECLARE_PERI_REQ_STA_REG(PERI_REQ_SYSPLL, info);
38565db67b8SKun Lu 
38665db67b8SKun Lu 			break;
38765db67b8SKun Lu 		case PERI_REQ_INFRA:
38865db67b8SKun Lu 			DECLARE_PERI_REQ_STA_REG(PERI_REQ_INFRA, info);
38965db67b8SKun Lu 
39065db67b8SKun Lu 			break;
39165db67b8SKun Lu 		case PERI_REQ_PMIC:
39265db67b8SKun Lu 			DECLARE_PERI_REQ_STA_REG(PERI_REQ_PMIC, info);
39365db67b8SKun Lu 
39465db67b8SKun Lu 			break;
39565db67b8SKun Lu 		case PERI_REQ_F26M:
39665db67b8SKun Lu 			DECLARE_PERI_REQ_STA_REG(PERI_REQ_F26M, info);
39765db67b8SKun Lu 
39865db67b8SKun Lu 			break;
39965db67b8SKun Lu 		default:
40065db67b8SKun Lu 			PERI_REQ_STA_INFO_INIT(info);
40165db67b8SKun Lu 			break;
40265db67b8SKun Lu 		}
40365db67b8SKun Lu 
40465db67b8SKun Lu 		if (!info.req_sta)
40565db67b8SKun Lu 			return 0;
40665db67b8SKun Lu 
40765db67b8SKun Lu 		reg = info.req_sta;
40865db67b8SKun Lu 		val = (mmio_read_32(reg) & PERI_REQ_EN_MASK);
40965db67b8SKun Lu 
41065db67b8SKun Lu 		break;
41165db67b8SKun Lu 	default:
41265db67b8SKun Lu 		break;
41365db67b8SKun Lu 	}
41465db67b8SKun Lu 	return val;
41565db67b8SKun Lu }
41665db67b8SKun Lu 
spm_peri_req_name(uint32_t idex,char * name,size_t sz)41765db67b8SKun Lu int spm_peri_req_name(uint32_t idex, char *name, size_t sz)
41865db67b8SKun Lu {
41965db67b8SKun Lu 	int ret = 0;
42065db67b8SKun Lu 
42165db67b8SKun Lu 	if (!name)
42265db67b8SKun Lu 		return -1;
42365db67b8SKun Lu 
42465db67b8SKun Lu 	switch (idex) {
42565db67b8SKun Lu 	case PERI_REQ_DDREN:
42665db67b8SKun Lu 		ret = snprintf(name, sz - 1, "ddren");
42765db67b8SKun Lu 		break;
42865db67b8SKun Lu 	case PERI_REQ_APSRC:
42965db67b8SKun Lu 		ret = snprintf(name, sz - 1, "apsrc");
43065db67b8SKun Lu 		break;
43165db67b8SKun Lu 	case PERI_REQ_EMI:
43265db67b8SKun Lu 		ret = snprintf(name, sz - 1, "emi");
43365db67b8SKun Lu 		break;
43465db67b8SKun Lu 	case PERI_REQ_SYSPLL:
43565db67b8SKun Lu 		ret = snprintf(name, sz - 1, "syspll");
43665db67b8SKun Lu 		break;
43765db67b8SKun Lu 	case PERI_REQ_INFRA:
43865db67b8SKun Lu 		ret = snprintf(name, sz - 1, "infra");
43965db67b8SKun Lu 		break;
44065db67b8SKun Lu 	case PERI_REQ_PMIC:
44165db67b8SKun Lu 		ret = snprintf(name, sz - 1, "pmic");
44265db67b8SKun Lu 		break;
44365db67b8SKun Lu 	case PERI_REQ_F26M:
44465db67b8SKun Lu 		ret = snprintf(name, sz - 1, "26m_vcore");
44565db67b8SKun Lu 		break;
44665db67b8SKun Lu 	default:
44765db67b8SKun Lu 		ret = -1;
44865db67b8SKun Lu 		break;
44965db67b8SKun Lu 	}
45065db67b8SKun Lu 
45165db67b8SKun Lu 	name[sz - 1] = '\0';
45265db67b8SKun Lu 
45365db67b8SKun Lu 	return ret;
45465db67b8SKun Lu }
45565db67b8SKun Lu 
spm_peri_req_get_status_raw(enum spm_peri_req_status_raw type,uint32_t idx,char * name,size_t sz)45665db67b8SKun Lu uint32_t spm_peri_req_get_status_raw(enum spm_peri_req_status_raw type,
45765db67b8SKun Lu 				     uint32_t idx, char *name, size_t sz)
45865db67b8SKun Lu {
45965db67b8SKun Lu 	return 0;
46065db67b8SKun Lu }
46165db67b8SKun Lu 
spm_peri_req_get_default(uint32_t res)46265db67b8SKun Lu static uint32_t spm_peri_req_get_default(uint32_t res)
46365db67b8SKun Lu {
46465db67b8SKun Lu 	struct spm_peri_req_info info;
46565db67b8SKun Lu 
46665db67b8SKun Lu 	if (res & MT_SPM_DRAM_S1)
46765db67b8SKun Lu 		DECLARE_PERI_REQ_DEFAULT(DDREN, info);
46865db67b8SKun Lu 	else if (res & MT_SPM_DRAM_S0)
46965db67b8SKun Lu 		DECLARE_PERI_REQ_DEFAULT(APSRC, info);
47065db67b8SKun Lu 	else if (res & MT_SPM_EMI)
47165db67b8SKun Lu 		DECLARE_PERI_REQ_DEFAULT(EMI, info);
47265db67b8SKun Lu 	else if (res & MT_SPM_SYSPLL)
47365db67b8SKun Lu 		DECLARE_PERI_REQ_DEFAULT(SYSPLL, info);
47465db67b8SKun Lu 	else if (res & MT_SPM_INFRA)
47565db67b8SKun Lu 		DECLARE_PERI_REQ_DEFAULT(INFRA, info);
47665db67b8SKun Lu 	else if (res & MT_SPM_PMIC)
47765db67b8SKun Lu 		DECLARE_PERI_REQ_DEFAULT(PMIC, info);
47865db67b8SKun Lu 	else if (res & (MT_SPM_26M | MT_SPM_VCORE))
47965db67b8SKun Lu 		DECLARE_PERI_REQ_DEFAULT(F26M, info);
48065db67b8SKun Lu 	else
48165db67b8SKun Lu 		PERI_REQ_EN_INFO_INIT(info);
48265db67b8SKun Lu 
48365db67b8SKun Lu 	return info.req_en;
48465db67b8SKun Lu }
48565db67b8SKun Lu 
spm_peri_req_mask_get(uint32_t res)48665db67b8SKun Lu static uint32_t spm_peri_req_mask_get(uint32_t res)
48765db67b8SKun Lu {
48865db67b8SKun Lu 	struct spm_peri_req_info info;
48965db67b8SKun Lu 	uint32_t raw_val = 0, reg = 0;
49065db67b8SKun Lu 
49165db67b8SKun Lu 	if (res & MT_SPM_DRAM_S1)
49265db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_DDREN, info);
49365db67b8SKun Lu 	else if (res & MT_SPM_DRAM_S0)
49465db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_APSRC, info);
49565db67b8SKun Lu 	else if (res & MT_SPM_EMI)
49665db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_EMI, info);
49765db67b8SKun Lu 	else if (res & MT_SPM_SYSPLL)
49865db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_SYSPLL, info);
49965db67b8SKun Lu 	else if (res & MT_SPM_INFRA)
50065db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_INFRA, info);
50165db67b8SKun Lu 	else if (res & MT_SPM_PMIC)
50265db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_PMIC, info);
50365db67b8SKun Lu 	else if (res & (MT_SPM_26M | MT_SPM_VCORE))
50465db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_F26M, info);
50565db67b8SKun Lu 	else
50665db67b8SKun Lu 		PERI_REQ_EN_INFO_INIT(info);
50765db67b8SKun Lu 
50865db67b8SKun Lu 	if (!info.req_en)
50965db67b8SKun Lu 		return 0;
51065db67b8SKun Lu 
51165db67b8SKun Lu 	reg = info.req_en;
51265db67b8SKun Lu 
51365db67b8SKun Lu 	raw_val = (mmio_read_32(reg) & PERI_REQ_EN_MASK);
51465db67b8SKun Lu 
51565db67b8SKun Lu 	return raw_val;
51665db67b8SKun Lu }
51765db67b8SKun Lu 
spm_peri_req_get_setting(uint32_t res,enum spm_peri_req_sta_type sta_type,struct spm_peri_req_sta * sta)51865db67b8SKun Lu int spm_peri_req_get_setting(uint32_t res, enum spm_peri_req_sta_type sta_type,
51965db67b8SKun Lu 			     struct spm_peri_req_sta *sta)
52065db67b8SKun Lu {
52165db67b8SKun Lu 	int ret = 0;
52265db67b8SKun Lu 
52365db67b8SKun Lu 	if (!sta)
52465db67b8SKun Lu 		return -1;
52565db67b8SKun Lu 
52665db67b8SKun Lu 	switch (sta_type) {
52765db67b8SKun Lu 	case PERI_REQ_STA_DEFAULT_MASK:
52865db67b8SKun Lu 		sta->sta = spm_peri_req_get_default(res);
52965db67b8SKun Lu 		break;
53065db67b8SKun Lu 	case PERI_REQ_STA_MASK:
53165db67b8SKun Lu 		sta->sta = spm_peri_req_mask_get(res);
53265db67b8SKun Lu 		break;
53365db67b8SKun Lu 	default:
53465db67b8SKun Lu 		ret = -1;
53565db67b8SKun Lu 		MT_SPM_HW_CG_STA_INIT(sta);
53665db67b8SKun Lu 		break;
53765db67b8SKun Lu 	}
53865db67b8SKun Lu 	return ret;
53965db67b8SKun Lu }
54065db67b8SKun Lu 
spm_peri_req_index2res(uint32_t idx)54165db67b8SKun Lu static uint32_t spm_peri_req_index2res(uint32_t idx)
54265db67b8SKun Lu {
54365db67b8SKun Lu 	uint32_t res;
54465db67b8SKun Lu 
54565db67b8SKun Lu 	if (idx >= PERI_REQ_MAX)
54665db67b8SKun Lu 		return 0;
54765db67b8SKun Lu 
54865db67b8SKun Lu 	switch (idx) {
54965db67b8SKun Lu 	case PERI_REQ_DDREN:
55065db67b8SKun Lu 		res = MT_SPM_DRAM_S1;
55165db67b8SKun Lu 		break;
55265db67b8SKun Lu 	case PERI_REQ_APSRC:
55365db67b8SKun Lu 		res = MT_SPM_DRAM_S0;
55465db67b8SKun Lu 		break;
55565db67b8SKun Lu 	case PERI_REQ_EMI:
55665db67b8SKun Lu 		res = MT_SPM_EMI;
55765db67b8SKun Lu 		break;
55865db67b8SKun Lu 	case PERI_REQ_SYSPLL:
55965db67b8SKun Lu 		res = MT_SPM_SYSPLL;
56065db67b8SKun Lu 		break;
56165db67b8SKun Lu 	case PERI_REQ_INFRA:
56265db67b8SKun Lu 		res = MT_SPM_INFRA;
56365db67b8SKun Lu 		break;
56465db67b8SKun Lu 	case PERI_REQ_PMIC:
56565db67b8SKun Lu 		res = (MT_SPM_PMIC);
56665db67b8SKun Lu 		break;
56765db67b8SKun Lu 	case PERI_REQ_F26M:
56865db67b8SKun Lu 		res = (MT_SPM_26M | MT_SPM_VCORE);
56965db67b8SKun Lu 		break;
57065db67b8SKun Lu 	default:
57165db67b8SKun Lu 		res = 0;
57265db67b8SKun Lu 	}
57365db67b8SKun Lu 	return res;
57465db67b8SKun Lu }
57565db67b8SKun Lu 
spm_peri_req_get_setting_by_index(uint32_t idx,enum spm_peri_req_sta_type sta_type,struct spm_peri_req_sta * sta)57665db67b8SKun Lu int spm_peri_req_get_setting_by_index(uint32_t idx,
57765db67b8SKun Lu 				      enum spm_peri_req_sta_type sta_type,
57865db67b8SKun Lu 				      struct spm_peri_req_sta *sta)
57965db67b8SKun Lu {
58065db67b8SKun Lu 	uint32_t res = spm_peri_req_index2res(idx);
58165db67b8SKun Lu 
58265db67b8SKun Lu 	return spm_peri_req_get_setting(res, sta_type, sta);
58365db67b8SKun Lu }
58465db67b8SKun Lu 
__spm_peri_req_ctrl(struct spm_peri_req_info * info,uint32_t is_set,uint32_t val)58565db67b8SKun Lu static void __spm_peri_req_ctrl(struct spm_peri_req_info *info, uint32_t is_set,
58665db67b8SKun Lu 				uint32_t val)
58765db67b8SKun Lu {
58865db67b8SKun Lu 	uint32_t reg;
58965db67b8SKun Lu 
59065db67b8SKun Lu 	if (!info)
59165db67b8SKun Lu 		return;
59265db67b8SKun Lu 
59365db67b8SKun Lu 	reg = info->req_en;
59465db67b8SKun Lu 
59565db67b8SKun Lu 	if (!reg)
59665db67b8SKun Lu 		return;
59765db67b8SKun Lu 
59865db67b8SKun Lu 	if (is_set)
59965db67b8SKun Lu 		mmio_setbits_32(reg, val);
60065db67b8SKun Lu 	else
60165db67b8SKun Lu 		mmio_clrbits_32(reg, val);
60265db67b8SKun Lu }
60365db67b8SKun Lu 
spm_peri_req_ctrl(uint32_t res,uint32_t is_set,uint32_t val)60465db67b8SKun Lu void spm_peri_req_ctrl(uint32_t res, uint32_t is_set, uint32_t val)
60565db67b8SKun Lu {
60665db67b8SKun Lu 	struct spm_peri_req_info info;
60765db67b8SKun Lu 
60865db67b8SKun Lu 	if (res & MT_SPM_DRAM_S1)
60965db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_DDREN, info);
61065db67b8SKun Lu 	else if (res & MT_SPM_DRAM_S0)
61165db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_APSRC, info);
61265db67b8SKun Lu 	else if (res & MT_SPM_EMI)
61365db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_EMI, info);
61465db67b8SKun Lu 	else if (res & MT_SPM_SYSPLL)
61565db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_SYSPLL, info);
61665db67b8SKun Lu 	else if (res & MT_SPM_INFRA)
61765db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_INFRA, info);
61865db67b8SKun Lu 	else if (res & MT_SPM_PMIC)
61965db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(MT_SPM_PMIC, info);
62065db67b8SKun Lu 	else if (res & (MT_SPM_26M | MT_SPM_VCORE))
62165db67b8SKun Lu 		DECLARE_PERI_REQ_EN_REG(PERI_REQ_F26M, info);
62265db67b8SKun Lu 	else
62365db67b8SKun Lu 		PERI_REQ_EN_INFO_INIT(info);
62465db67b8SKun Lu 
62565db67b8SKun Lu 	if (info.req_en)
62665db67b8SKun Lu 		__spm_peri_req_ctrl(&info, is_set, val);
62765db67b8SKun Lu }
62865db67b8SKun Lu 
spm_peri_req_ctrl_by_index(uint32_t idx,uint32_t is_set,uint32_t val)62965db67b8SKun Lu void spm_peri_req_ctrl_by_index(uint32_t idx, uint32_t is_set, uint32_t val)
63065db67b8SKun Lu {
63165db67b8SKun Lu 	uint32_t res = spm_peri_req_index2res(idx);
63265db67b8SKun Lu 
63365db67b8SKun Lu 	if (res)
63465db67b8SKun Lu 		spm_peri_req_ctrl(res, is_set, val);
63565db67b8SKun Lu }
63665db67b8SKun Lu 
spm_peri_req_init(void)63765db67b8SKun Lu static void spm_peri_req_init(void)
63865db67b8SKun Lu {
63965db67b8SKun Lu 	mmio_write_32(REG_PERI_REQ_EN(PERI_REQ_DDREN), PERI_REQ_DDREN_MB);
64065db67b8SKun Lu 
64165db67b8SKun Lu 	mmio_write_32(REG_PERI_REQ_EN(PERI_REQ_EMI), PERI_REQ_EMI_MB);
64265db67b8SKun Lu 
64365db67b8SKun Lu 	mmio_write_32(REG_PERI_REQ_EN(PERI_REQ_APSRC), PERI_REQ_APSRC_MB);
64465db67b8SKun Lu 
64565db67b8SKun Lu 	mmio_write_32(REG_PERI_REQ_EN(PERI_REQ_INFRA), PERI_REQ_INFRA_MB);
64665db67b8SKun Lu 
64765db67b8SKun Lu 	mmio_write_32(REG_PERI_REQ_EN(PERI_REQ_SYSPLL), PERI_REQ_SYSPLL_MB);
64865db67b8SKun Lu 
64965db67b8SKun Lu 	mmio_write_32(REG_PERI_REQ_EN(PERI_REQ_PMIC), PERI_REQ_PMIC_MB);
65065db67b8SKun Lu 
65165db67b8SKun Lu 	mmio_write_32(REG_PERI_REQ_EN(PERI_REQ_F26M), PERI_REQ_F26M_MB);
65265db67b8SKun Lu }
65365db67b8SKun Lu 
spm_hwreq_init(void)65465db67b8SKun Lu void spm_hwreq_init(void)
65565db67b8SKun Lu {
65665db67b8SKun Lu 	spm_infra_swcg_init();
65765db67b8SKun Lu 	spm_hwcg_init();
65865db67b8SKun Lu 	spm_peri_req_init();
65965db67b8SKun Lu }
660