soc/mediatek/mt8189: Add PLL and clock init support

Add PLL and clock drivers.

BUG=b:379008996
BRANCH=none
TEST=build pass and driver init ok.

Change-Id: I1fd6a09e80e5f681af3034b0f703a0d2bc7bb786
Signed-off-by: Irving-CH.lin <irving-ch.lin@mediatek.corp-partner.google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/87639
Reviewed-by: Yu-Ping Wu <yupingso@google.com>
Reviewed-by: Yidi Lin <yidilin@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Vince Liu 2024-09-04 15:19:26 +08:00 committed by Yidi Lin
commit c2b17a083d
5 changed files with 1306 additions and 6 deletions

View file

@ -12,6 +12,7 @@ all-y += ../common/uart.c
bootblock-y += bootblock.c
bootblock-y += ../common/mmu_operations.c
bootblock-y += ../common/mtcmos.c mtcmos.c
bootblock-y += ../common/pll.c pll.c
bootblock-y += ../common/wdt.c ../common/wdt_req.c wdt.c
romstage-y += ../common/cbmem.c
@ -20,6 +21,7 @@ romstage-y += ../common/dramc_param.c
romstage-y += ../common/emi.c
romstage-y += ../common/memory.c ../common/memory_test.c
romstage-y += ../common/mmu_operations.c ../common/mmu_cmops.c
romstage-y += ../common/pll.c pll.c
ramstage-$(CONFIG_ARM64_USE_ARM_TRUSTED_FIRMWARE) += ../common/bl31.c
ramstage-y += ../common/dramc_info.c

View file

@ -2,6 +2,7 @@
#include <bootblock_common.h>
#include <soc/mmu_operations.h>
#include <soc/pll.h>
#include <soc/spm_mtcmos.h>
#include <soc/wdt.h>
@ -9,5 +10,7 @@ void bootblock_soc_init(void)
{
mtk_mmu_init();
mtk_wdt_init();
mt_pll_init();
mtcmos_init();
mt_pll_post_init();
}

View file

@ -4,7 +4,15 @@
#define __SOC_MEDIATEK_MT8189_INCLUDE_SOC_ADDRESSMAP_H__
enum {
IO_PHYS = 0x10000000,
MCUCFG_BASE = 0x0C530000,
DBGAO_BASE = 0x0D01A000,
DEM_BASE = 0x0D0A0000,
IO_PHYS = 0x10000000,
};
enum {
CPU_PLLDIV_CTRL_BASE = MCUCFG_BASE + 0x0000A2A0,
BUS_PLLDIV_CTRL_BASE = MCUCFG_BASE + 0x0000A2E0,
};
enum {
@ -21,7 +29,7 @@ enum {
GPIO_BASE = IO_PHYS + 0x00005000,
APMIXED_BASE = IO_PHYS + 0x0000C000,
DEVAPC_INFRA_SECU_AO_BASE = IO_PHYS + 0x0001C000,
BCRM_INFRA_AO_BASE = IO_PHYS + 0x00022000,
INFRA_AO_BCRM_BASE = IO_PHYS + 0x00022000,
DEVAPC_INFRA_AO_BASE = IO_PHYS + 0x00030000,
DEVAPC_INFRA_AO1_BASE = IO_PHYS + 0x00034000,
EMI0_BASE = IO_PHYS + 0x00219000,
@ -37,10 +45,14 @@ enum {
DPM_CFG_BASE2 = IO_PHYS + 0x00A40000,
UART0_BASE = IO_PHYS + 0x01001000,
SFLASH_REG_BASE = IO_PHYS + 0x01018000,
PERI_AO_BCRM_BASE = IO_PHYS + 0x01035000,
PERICFG_AO_BASE = IO_PHYS + 0x01036000,
DEVAPC_PERI_PAR_AO_BASE = IO_PHYS + 0x0103C000,
AUDIO_BASE = IO_PHYS + 0x01050000,
SSUSB_IPPC_BASE = IO_PHYS + 0x01263E00,
UFSHCI_BASE = IO_PHYS + 0x012B0000,
UFS0_AO_CFG_BASE = IO_PHYS + 0x012B8000,
UFS0_PDN_CFG_BASE = IO_PHYS + 0x012BB000,
I2C0_DMA_BASE = IO_PHYS + 0x01300200,
I2C1_DMA_BASE = IO_PHYS + 0x01300300,
I2C2_DMA_BASE = IO_PHYS + 0x01300400,
@ -52,6 +64,7 @@ enum {
I2C8_DMA_BASE = IO_PHYS + 0x01300A00,
SSUSB_SIF_BASE = IO_PHYS + 0x01B00300,
I2C2_BASE = IO_PHYS + 0x01B20000,
IMP_IIC_WRAP_WS_BASE = IO_PHYS + 0x01B21000,
MIPITX0_BASE = IO_PHYS + 0x01B40000,
IOCFG_LM_BASE = IO_PHYS + 0x01B50000,
EDP_BASE = IO_PHYS + 0x01B70000,
@ -63,26 +76,49 @@ enum {
I2C6_BASE = IO_PHYS + 0x01D73000,
I2C7_BASE = IO_PHYS + 0x01F30000,
I2C8_BASE = IO_PHYS + 0x01F31000,
IMP_IIC_WRAP_E_BASE = IO_PHYS + 0x01C22000,
IOCFG_RB0_BASE = IO_PHYS + 0x01C50000,
IOCFG_RB1_BASE = IO_PHYS + 0x01C60000,
IOCFG_BM0_BASE = IO_PHYS + 0x01D20000,
IOCFG_BM1_BASE = IO_PHYS + 0x01D30000,
IOCFG_BM2_BASE = IO_PHYS + 0x01D40000,
IMP_IIC_WRAP_S_BASE = IO_PHYS + 0x01D74000,
IOCFG_LT0_BASE = IO_PHYS + 0x01E20000,
IOCFG_LT1_BASE = IO_PHYS + 0x01E30000,
IOCFG_RT_BASE = IO_PHYS + 0x01F20000,
IMP_IIC_WRAP_EN_BASE = IO_PHYS + 0x01F32000,
MFGCFG_BASE = IO_PHYS + 0x03FBF000,
MMSYS_CONFIG_BASE = IO_PHYS + 0x04000000,
DSI0_BASE = IO_PHYS + 0x04016000,
DISP_DVO0 = IO_PHYS + 0x04019000,
IMGSYS1_BASE = IO_PHYS + 0x05020000,
IMGSYS2_BASE = IO_PHYS + 0x05820000,
VDEC_CORE_BASE = IO_PHYS + 0x0602F000,
VENC_GCON_BASE = IO_PHYS + 0x07000000,
CAMSYS_MAIN_BASE = IO_PHYS + 0x0A000000,
CAMSYS_RAWA_BASE = IO_PHYS + 0x0A04F000,
CAMSYS_RAWB_BASE = IO_PHYS + 0x0A06F000,
IPE_BASE = IO_PHYS + 0x0B000000,
VLPCFG_AO_REG_BASE = IO_PHYS + 0x0C000000,
SPM_BASE = IO_PHYS + 0x0C001000,
RGU_BASE = IO_PHYS + 0x0C00A000,
VLPCFG_REG_BASE = IO_PHYS + 0x0C00C000,
DVFSRC_TOP_BASE = IO_PHYS + 0x0C00F000,
VLP_CK_BASE = IO_PHYS + 0x0C012000,
SPMI_MST_BASE = IO_PHYS + 0x0C013000,
DEVAPC_VLP_AO_BASE = IO_PHYS + 0x0C018000,
SCP_IIC_BASE = IO_PHYS + 0x0C80A000,
SCP_BASE = IO_PHYS + 0x0CB21000,
SPMI_MST_P_BASE = IO_PHYS + 0x0CC00000,
PMIF_SPMI_BASE = IO_PHYS + 0x0CC04000,
PMIF_SPMI_P_BASE = IO_PHYS + 0x0CC06000,
SYSTIMER_BASE = IO_PHYS + 0x0CC10000,
VAD_BASE = IO_PHYS + 0x0E010000,
DEVAPC_MM_AO_BASE = IO_PHYS + 0x0E820000,
MMINFRA_CONFIG_BASE = IO_PHYS + 0x0E800000,
GCE_BASE = IO_PHYS + 0x0E980000,
MDP_GCE_BASE = IO_PHYS + 0x0E990000,
MDPSYS_CONFIG_BASE = IO_PHYS + 0x0F000000,
};
#endif /* __SOC_MEDIATEK_MT8189_INCLUDE_SOC_ADDRESSMAP_H__ */

View file

@ -8,16 +8,548 @@
#ifndef __SOC_MEDIATEK_MT8189_INCLUDE_SOC_PLL_H__
#define __SOC_MEDIATEK_MT8189_INCLUDE_SOC_PLL_H__
#include <soc/addressmap.h>
#include <soc/pll_common.h>
/* top_div rate */
enum {
CLK26M_HZ = 26 * MHz,
static struct mtk_infra_ao_bcrm_regs *const
mtk_infra_ao_bcrm = (void *)INFRA_AO_BCRM_BASE;
static struct mtk_cpu_plldiv_cfg_regs *const
mtk_cpu_plldiv_cfg = (void *)CPU_PLLDIV_CTRL_BASE;
static struct mtk_bus_plldiv_cfg_regs *const
mtk_bus_plldiv_cfg = (void *)BUS_PLLDIV_CTRL_BASE;
static struct mtk_peri_ao_bcrm_regs *const
mtk_peri_ao_bcrm = (void *)PERI_AO_BCRM_BASE;
static struct mtk_vlp_regs *const
mtk_vlpsys = (void *)VLP_CK_BASE;
static struct mtk_pericfg_ao_regs *const
mtk_pericfg_ao = (void *)PERICFG_AO_BASE;
static struct mtk_afe_regs *const
mtk_afe = (void *)AUDIO_BASE;
static struct mtk_ufscfg_ao_regs *const
mtk_ufscfg_ao = (void *)UFS0_AO_CFG_BASE;
static struct mtk_ufscfg_pdn_regs *const
mtk_ufscfg_pdn = (void *)UFS0_PDN_CFG_BASE;
static struct mtk_imp_iic_wrap_ws_regs *const
mtk_imp_iic_wrap_ws = (void *)IMP_IIC_WRAP_WS_BASE;
static struct mtk_imp_iic_wrap_e_regs *const
mtk_imp_iic_wrap_e = (void *)IMP_IIC_WRAP_E_BASE;
static struct mtk_imp_iic_wrap_s_regs *const
mtk_imp_iic_wrap_s = (void *)IMP_IIC_WRAP_S_BASE;
static struct mtk_imp_iic_wrap_en_regs *const
mtk_imp_iic_wrap_en = (void *)IMP_IIC_WRAP_EN_BASE;
static struct mtk_mfg_regs *const
mtk_mfg = (void *)MFGCFG_BASE;
static struct mtk_mmsys_config_regs *const
mtk_mmsys_config = (void *)MMSYS_CONFIG_BASE;
static struct mtk_imgsys1_regs *const
mtk_imgsys1 = (void *)IMGSYS1_BASE;
static struct mtk_imgsys2_regs *const
mtk_imgsys2 = (void *)IMGSYS2_BASE;
static struct mtk_vdec_core_regs *const
mtk_vdec_core = (void *)VDEC_CORE_BASE;
static struct mtk_venc_gcon_regs *const
mtk_venc_gcon = (void *)VENC_GCON_BASE;
static struct mtk_scp_iic_regs *const
mtk_scp_iic = (void *)SCP_IIC_BASE;
static struct mtk_scp_regs *const
mtk_scp = (void *)SCP_BASE;
static struct mtk_vadsys_regs *const
mtk_vadsys = (void *)VAD_BASE;
static struct mtk_camsys_main_regs *const
mtk_camsys_main = (void *)CAMSYS_MAIN_BASE;
static struct mtk_camsys_rawa_regs *const
mtk_camsys_rawa = (void *)CAMSYS_RAWA_BASE;
static struct mtk_camsys_rawb_regs *const
mtk_camsys_rawb = (void *)CAMSYS_RAWB_BASE;
static struct mtk_ipesys_regs *const
mtk_ipesys = (void *)IPE_BASE;
static struct mtk_vlpcfg_ao_regs *const
mtk_vlpcfg_ao = (void *)VLPCFG_AO_REG_BASE;
static struct mtk_dvfsrc_top_regs *const
mtk_dvfsrc_top = (void *)DVFSRC_TOP_BASE;
static struct mtk_mminfra_config_regs *const
mtk_mminfra_config = (void *)MMINFRA_CONFIG_BASE;
static struct mtk_gce_d_regs *const
mtk_gce_d = (void *)GCE_BASE;
static struct mtk_gce_m_regs *const
mtk_gce_m = (void *)MDP_GCE_BASE;
static struct mtk_mdpsys_config_regs *const
mtk_mdpsys_config = (void *)MDPSYS_CONFIG_BASE;
static struct mtk_dbgao_regs *const
mtk_dbgao = (void *)DBGAO_BASE;
static struct mtk_dem_regs *const
mtk_dem = (void *)DEM_BASE;
struct mtk_infra_ao_bcrm_regs {
u32 reserved[14];
u32 vdnr_dcm_infra_par_bus_ctrl_0;
};
check_member(mtk_infra_ao_bcrm_regs, vdnr_dcm_infra_par_bus_ctrl_0, 0x0038);
struct mtk_cpu_plldiv_cfg_regs {
u32 cpu_plldiv_0_cfg0;
u32 cpu_plldiv_1_cfg0;
};
/* top_mux rate */
enum {
UART_HZ = CLK26M_HZ,
struct mtk_bus_plldiv_cfg_regs {
u32 bus_plldiv_cfg0;
};
struct mtk_peri_ao_bcrm_regs {
u32 reserved1[8];
u32 vdnr_dcm_peri_par_bus_ctrl_0;
u32 reserved2[8];
};
check_member(mtk_peri_ao_bcrm_regs, vdnr_dcm_peri_par_bus_ctrl_0, 0x0020);
struct mtk_clk_cfg {
u32 cfg;
u32 set;
u32 clr;
u32 reserved;
};
struct mtk_vlp_clk_cfg {
u32 cfg;
u32 set;
u32 clr;
};
struct mtk_vlp_regs {
u32 reserved1;
u32 vlp_clk_cfg_update;
struct mtk_vlp_clk_cfg vlp_clk_cfg[6];
u32 reserved2[104];
u32 vlp_clk_cfg_30;
u32 vlp_clk_cfg_30_set;
u32 vlp_clk_cfg_30_clr;
u32 reserved3[13];
u32 vlp_fqmtr_con[2];
};
check_member(mtk_vlp_regs, vlp_clk_cfg_update, 0x0004);
check_member(mtk_vlp_regs, vlp_clk_cfg[0].set, 0x000C);
check_member(mtk_vlp_regs, vlp_clk_cfg[0].clr, 0x0010);
check_member(mtk_vlp_regs, vlp_clk_cfg[5].set, 0x0048);
check_member(mtk_vlp_regs, vlp_clk_cfg[5].clr, 0x004C);
check_member(mtk_vlp_regs, vlp_clk_cfg_30, 0x01F0);
check_member(mtk_vlp_regs, vlp_fqmtr_con[0], 0x0230);
struct mtk_topckgen_regs {
u32 reserved1;
u32 clk_cfg_update[3];
struct mtk_clk_cfg clk_cfg[17];
u32 reserved2[8];
u32 clk_misc_cfg_0;
u32 reserved3[7];
u32 clk_mem_dfs_cfg;
u32 reserved4[6];
u32 clk_dbg_cfg;
struct mtk_clk_cfg clk_cfg_17;
struct mtk_clk_cfg clk_cfg_18;
u32 reserved5[24];
u32 clk_scp_cfg_0;
u32 reserved6[7];
u32 clk26cali[2];
u32 reserved7[6];
struct mtk_clk_cfg clk_cfg_19;
u32 reserved8[176];
struct mtk_clk_cfg clk_misc_cfg_3;
};
check_member(mtk_topckgen_regs, clk_cfg_update[0], 0x0004);
check_member(mtk_topckgen_regs, clk_cfg[0].set, 0x0014);
check_member(mtk_topckgen_regs, clk_cfg[0].clr, 0x0018);
check_member(mtk_topckgen_regs, clk_cfg[16].set, 0x0114);
check_member(mtk_topckgen_regs, clk_cfg[16].clr, 0x0118);
check_member(mtk_topckgen_regs, clk_misc_cfg_0, 0x0140);
check_member(mtk_topckgen_regs, clk_mem_dfs_cfg, 0x0160);
check_member(mtk_topckgen_regs, clk_dbg_cfg, 0x017C);
check_member(mtk_topckgen_regs, clk_cfg_17.set, 0x0184);
check_member(mtk_topckgen_regs, clk_cfg_17.clr, 0x0188);
check_member(mtk_topckgen_regs, clk_cfg_18.set, 0x0194);
check_member(mtk_topckgen_regs, clk_cfg_18.clr, 0x0198);
check_member(mtk_topckgen_regs, clk_scp_cfg_0, 0x0200);
check_member(mtk_topckgen_regs, clk26cali, 0x0220);
check_member(mtk_topckgen_regs, clk_cfg_19.set, 0x0244);
check_member(mtk_topckgen_regs, clk_cfg_19.clr, 0x0248);
check_member(mtk_topckgen_regs, clk_misc_cfg_3.cfg, 0x0510);
check_member(mtk_topckgen_regs, clk_misc_cfg_3.set, 0x0514);
check_member(mtk_topckgen_regs, clk_misc_cfg_3.clr, 0x0518);
struct mtk_apmixed_regs {
u32 reserved1[16];
u32 apll1_tuner_con0; /* 0x0040 */
u32 apll2_tuner_con0;
u32 reserved2[11];
u32 pllen_all_set; /* 0x0074 */
u32 pllen_all_clr;
u32 reserved3[2];
u32 pll_div_rstb_all_set; /* 0x0084 */
u32 reserved4[95];
u32 armpll_ll_con[2]; /* 0x0204 */
u32 reserved5[2];
u32 armpll_bl_con[2]; /* 0x0214 */
u32 reserved6[2];
u32 ccipll_con[2]; /* 0x0224 */
u32 reserved7[54];
u32 mainpll_con[2]; /* 0x0304 */
u32 reserved8[2];
u32 univpll_con[2]; /* 0x0314 */
u32 reserved9[2];
u32 mmpll_con[2]; /* 0x0324 */
u32 reserved10[2];
u32 emipll_con[2]; /* 0x0334 */
u32 reserved11[50];
u32 apll1_con[3]; /* 0x0404 */
u32 reserved12[2];
u32 apll2_con[3]; /* 0x0418 */
u32 reserved13[2];
u32 tvdpll1_con[2]; /* 0x042c */
u32 reserved14[2];
u32 tvdpll2_con[2]; /* 0x043c */
u32 reserved15[48];
u32 mfgpll_con[2]; /* 0x0504 */
u32 reserved16[2];
u32 ethpll_con[2]; /* 0x0514 */
u32 reserved17[2];
u32 msdcpll_con[2]; /* 0x0524 */
u32 reserved18[2];
u32 ufspll_con[2]; /* 0x0534 */
u32 reserved19[50];
u32 apupll_con[2]; /* 0x0604 */
u32 reserved20[2];
u32 apupll2_con[2]; /* 0x0614 */
u32 reserved21[57];
u32 ap_clksq_con0; /* 0x0700 */
};
check_member(mtk_apmixed_regs, apll1_tuner_con0, 0x0040);
check_member(mtk_apmixed_regs, pllen_all_set, 0x0074);
check_member(mtk_apmixed_regs, pll_div_rstb_all_set, 0x0084);
check_member(mtk_apmixed_regs, armpll_ll_con[0], 0x0204);
check_member(mtk_apmixed_regs, armpll_bl_con[0], 0x0214);
check_member(mtk_apmixed_regs, ccipll_con[0], 0x0224);
check_member(mtk_apmixed_regs, mainpll_con[0], 0x0304);
check_member(mtk_apmixed_regs, univpll_con[0], 0x0314);
check_member(mtk_apmixed_regs, mmpll_con[0], 0x0324);
check_member(mtk_apmixed_regs, emipll_con[0], 0x0334);
check_member(mtk_apmixed_regs, apll1_con[0], 0x0404);
check_member(mtk_apmixed_regs, apll2_con[0], 0x0418);
check_member(mtk_apmixed_regs, tvdpll1_con[0], 0x042C);
check_member(mtk_apmixed_regs, tvdpll2_con[0], 0x043C);
check_member(mtk_apmixed_regs, mfgpll_con[0], 0x0504);
check_member(mtk_apmixed_regs, ethpll_con[0], 0x0514);
check_member(mtk_apmixed_regs, msdcpll_con[0], 0x0524);
check_member(mtk_apmixed_regs, ufspll_con[0], 0x0534);
check_member(mtk_apmixed_regs, apupll_con[0], 0x0604);
check_member(mtk_apmixed_regs, apupll2_con[0], 0x0614);
check_member(mtk_apmixed_regs, ap_clksq_con0, 0x0700);
struct mtk_pericfg_ao_regs {
u32 reserved1[4];
u32 pericfg_ao_peri_cg_0;
u32 pericfg_ao_peri_cg_1;
u32 pericfg_ao_peri_cg_2;
u32 reserved2[2];
u32 pericfg_ao_peri_cg_0_set;
u32 pericfg_ao_peri_cg_0_clr;
u32 pericfg_ao_peri_cg_1_set;
u32 pericfg_ao_peri_cg_1_clr;
u32 pericfg_ao_peri_cg_2_set;
u32 pericfg_ao_peri_cg_2_clr;
};
check_member(mtk_pericfg_ao_regs, pericfg_ao_peri_cg_0, 0x0010);
check_member(mtk_pericfg_ao_regs, pericfg_ao_peri_cg_0_set, 0x0024);
struct mtk_afe_regs {
u32 audio_audio_top[5];
};
struct mtk_ufscfg_ao_regs {
u32 reserved1;
u32 ufscfg_ao_reg_ufs_ao_cg_0;
u32 ufscfg_ao_reg_ufs_ao_cg_0_set;
u32 ufscfg_ao_reg_ufs_ao_cg_0_clr;
};
struct mtk_ufscfg_pdn_regs {
u32 reserved1;
u32 ufscfg_pdn_reg_ufs_pdn_cg_0;
u32 ufscfg_pdn_reg_ufs_pdn_cg_0_set;
u32 ufscfg_pdn_reg_ufs_pdn_cg_0_clr;
};
struct mtk_imp_iic_wrap_ws_regs {
u32 reserved1[896];
u32 imp_iic_wrap_ws_ap_clock_cg;
u32 imp_iic_wrap_ws_ap_clock_cg_clr;
u32 imp_iic_wrap_ws_ap_clock_cg_set;
};
check_member(mtk_imp_iic_wrap_ws_regs, imp_iic_wrap_ws_ap_clock_cg, 0x0E00);
struct mtk_imp_iic_wrap_e_regs {
u32 reserved1[896];
u32 imp_iic_wrap_e_ap_clock_cg;
u32 imp_iic_wrap_e_ap_clock_cg_clr;
u32 imp_iic_wrap_e_ap_clock_cg_set;
};
check_member(mtk_imp_iic_wrap_e_regs, imp_iic_wrap_e_ap_clock_cg, 0x0E00);
struct mtk_imp_iic_wrap_s_regs {
u32 reserved1[896];
u32 imp_iic_wrap_s_ap_clock_cg;
u32 imp_iic_wrap_s_ap_clock_cg_clr;
u32 imp_iic_wrap_s_ap_clock_cg_set;
};
check_member(mtk_imp_iic_wrap_s_regs, imp_iic_wrap_s_ap_clock_cg, 0x0E00);
struct mtk_imp_iic_wrap_en_regs {
u32 reserved1[896];
u32 imp_iic_wrap_en_ap_clock_cg;
u32 imp_iic_wrap_en_ap_clock_cg_clr;
u32 imp_iic_wrap_en_ap_clock_cg_set;
};
check_member(mtk_imp_iic_wrap_en_regs, imp_iic_wrap_en_ap_clock_cg, 0x0E00);
struct mtk_mfg_regs {
u32 mfg_mfg_cg_con;
u32 mfg_mfg_cg_con_set;
u32 mfg_mfg_cg_con_clr;
};
struct mtk_mmsys_config_regs {
u32 reserved1[64];
u32 mmsys_config_mmsys_cg_0;
u32 mmsys_config_mmsys_cg_0_set;
u32 mmsys_config_mmsys_cg_0_clr;
u32 reserved2[1];
u32 mmsys_config_mmsys_cg_1;
u32 mmsys_config_mmsys_cg_1_set;
u32 mmsys_config_mmsys_cg_1_clr;
};
check_member(mtk_mmsys_config_regs, mmsys_config_mmsys_cg_0, 0x0100);
check_member(mtk_mmsys_config_regs, mmsys_config_mmsys_cg_1, 0x0110);
struct mtk_imgsys1_regs {
u32 imgsys1_img_cg;
u32 imgsys1_img_cg_set;
u32 imgsys1_img_cg_clr;
};
struct mtk_imgsys2_regs {
u32 imgsys2_img_cg;
u32 imgsys2_img_cg_set;
u32 imgsys2_img_cg_clr;
};
struct mtk_vdec_core_regs {
u32 vdec_core_vdec_cken;
u32 vdec_core_vdec_cken_clr;
u32 vdec_core_larb_cken_con;
u32 vdec_core_larb_cken_con_clr;
};
struct mtk_venc_gcon_regs {
u32 venc_gcon_vencsys_cg;
u32 venc_gcon_vencsys_cg_set;
u32 venc_gcon_vencsys_cg_clr;
};
struct mtk_scp_iic_regs {
u32 reserved[900];
u32 scp_iic_ccu_clock_cg;
u32 scp_iic_ccu_clock_cg_clr;
u32 scp_iic_ccu_clock_cg_set;
};
check_member(mtk_scp_iic_regs, scp_iic_ccu_clock_cg, 0x0E10);
struct mtk_scp_regs {
u32 reserved[85];
u32 scp_ap_spi_cg;
u32 scp_ap_spi_cg_clr;
};
check_member(mtk_scp_regs, scp_ap_spi_cg, 0x0154);
struct mtk_vadsys_regs {
u32 vad_vadsys_ck_en;
u32 reserved1[95];
u32 vad_vow_audiodsp_sw_cg;
};
check_member(mtk_vadsys_regs, vad_vow_audiodsp_sw_cg, 0x0180);
struct mtk_camsys_main_regs {
u32 camsys_main_camsys_cg;
u32 camsys_main_camsys_cg_set;
u32 camsys_main_camsys_cg_clr;
};
struct mtk_camsys_rawa_regs {
u32 camsys_rawa_camsys_cg;
u32 camsys_rawa_camsys_cg_set;
u32 camsys_rawa_camsys_cg_clr;
};
struct mtk_camsys_rawb_regs {
u32 camsys_rawb_camsys_cg;
u32 camsys_rawb_camsys_cg_set;
u32 camsys_rawb_camsys_cg_clr;
};
struct mtk_ipesys_regs {
u32 ipe_img_cg;
u32 ipe_img_cg_set;
u32 ipe_img_cg_clr;
};
struct mtk_vlpcfg_ao_regs {
u32 reserved[512];
u32 vlpcfg_ao_reg_debugtop_vlpao_ctrl;
};
check_member(mtk_vlpcfg_ao_regs, vlpcfg_ao_reg_debugtop_vlpao_ctrl, 0x0800);
struct mtk_dvfsrc_top_regs {
u32 dvfsrc_top_dvfsrc_basic_control;
};
struct mtk_mminfra_config_regs {
u32 reserved1[64];
u32 mminfra_config_mminfra_cg_0;
u32 mminfra_config_mminfra_cg_0_set;
u32 mminfra_config_mminfra_cg_0_clr;
u32 reserved2[1];
u32 mminfra_config_mminfra_cg_1;
u32 mminfra_config_mminfra_cg_1_set;
u32 mminfra_config_mminfra_cg_1_clr;
};
check_member(mtk_mminfra_config_regs, mminfra_config_mminfra_cg_0, 0x0100);
check_member(mtk_mminfra_config_regs, mminfra_config_mminfra_cg_1, 0x0110);
struct mtk_gce_d_regs {
u32 reserved[60];
u32 gce_gce_ctl_int0;
};
check_member(mtk_gce_d_regs, gce_gce_ctl_int0, 0x00F0);
struct mtk_gce_m_regs {
u32 reserved[60];
u32 mdp_gce_gce_ctl_int0;
};
check_member(mtk_gce_m_regs, mdp_gce_gce_ctl_int0, 0x00F0);
struct mtk_mdpsys_config_regs {
u32 reserved1[64];
u32 mdpsys_config_mdpsys_cg_0;
u32 mdpsys_config_mdpsys_cg_0_set;
u32 mdpsys_config_mdpsys_cg_0_clr;
u32 reserved2[1];
u32 mdpsys_config_mdpsys_cg_1;
u32 mdpsys_config_mdpsys_cg_1_set;
u32 mdpsys_config_mdpsys_cg_1_clr;
};
check_member(mtk_mdpsys_config_regs, mdpsys_config_mdpsys_cg_0, 0x0100);
check_member(mtk_mdpsys_config_regs, mdpsys_config_mdpsys_cg_1, 0x0110);
struct mtk_dbgao_regs {
u32 reserved[28];
u32 dbgao_atb;
};
check_member(mtk_dbgao_regs, dbgao_atb, 0x0070);
struct mtk_dem_regs {
u32 reserved1[11];
u32 dem_dbgbusclk_en;
u32 dem_dbgsysclk_en;
u32 reserved2[15];
u32 dem_atb;
};
check_member(mtk_dem_regs, dem_dbgbusclk_en, 0x002C);
check_member(mtk_dem_regs, dem_atb, 0x0070);
/* Fmeter Type */
enum fmeter_id {
APLL1_CTRL,
APLL2_CTRL,
ARMPLL_BL_CTRL,
ARMPLL_LL_CTRL,
CCIPLL_CTRL,
MAINPLL_CTRL,
MMPLL_CTRL,
MSDCPLL_CTRL,
UFSPLL_CTRL,
UNIVPLL_CTRL,
EMIPLL_CTRL,
TVDPLL1_CTRL,
TVDPLL2_CTRL,
MFGPLL_CTRL,
ETHPLL_CTRL,
APUPLL_CTRL,
APUPLL2_CTRL,
VLP_CKSYS_TOP_CTRL,
};
/* PLL set rate list */
enum pll_rate_type {
ARMPLL_LL_RATE = 0,
ARMPLL_BL_RATE,
CCIPLL_RATE,
PLL_RATE_NUM,
};
#define ARMPLL_BL_ID 6
#define ARMPLL_LL_ID 8
#define CCIPLL_ID 10
enum {
ARMPLL_LL_HZ = 1600UL * MHz,
ARMPLL_BL_HZ = 1700UL * MHz,
CCIPLL_HZ = 1140UL * MHz,
MAINPLL_HZ = 2184UL * MHz,
UNIVPLL_HZ = 2496UL * MHz,
MMPLL_HZ = 2750UL * MHz,
MFGPLL_HZ = 390 * MHz,
APLL1_HZ = 180633600UL,
APLL2_HZ = 196608UL * KHz,
EMIPLL_HZ = 387 * MHz,
APUPLL2_HZ = 230 * MHz,
APUPLL_HZ = 330 * MHz,
TVDPLL1_HZ = 594 * MHz,
TVDPLL2_HZ = 594 * MHz,
ETHPLL_HZ = 500 * MHz,
MSDCPLL_HZ = 416 * MHz,
UFSPLL_HZ = 594 * MHz,
};
enum {
CLK26M_HZ = 26 * MHz,
UNIVPLL_D6_D2_HZ = UNIVPLL_HZ / 6 / 2,
};
enum {
PCW_INTEGER_BITS = 8,
};
enum {
SPI_HZ = UNIVPLL_D6_D2_HZ,
UART_HZ = CLK26M_HZ,
};
enum {
PLL_EN_DELAY = 20,
};
enum {
MCU_DIV_MASK = 0x1f << 17,
MCU_DIV_1 = 0x8 << 17,
MCU_MUX_MASK = 0x3 << 9,
MCU_MUX_SRC_PLL = 0x1 << 9,
MCU_MUX_SRC_26M = 0x0 << 9,
};
/*
* Clock manager functions
*/
void mt_pll_post_init(void);
u32 mt_get_vlpck_freq(u32 id);
void mt_set_topck_default(void);
#endif /* __SOC_MEDIATEK_MT8189_INCLUDE_SOC_PLL_H__ */

View file

@ -0,0 +1,727 @@
/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
/*
* This file is created based on MT8189 Functional Specification
* Chapter number: 8.1
*/
#include <console/console.h>
#include <delay.h>
#include <device/mmio.h>
#include <timer.h>
#include <soc/addressmap.h>
#include <soc/mtcmos.h>
#include <soc/pll.h>
#include <soc/spm.h>
#include <soc/spm_mtcmos.h>
#define VLP_FM_WAIT_TIME 40
enum mux_id {
CLK_TOP_AXI_SEL,
CLK_TOP_AXI_PERI_SEL,
CLK_TOP_AXI_U_SEL,
CLK_TOP_BUS_AXIMEM_SEL,
CLK_TOP_DISP0_SEL,
CLK_TOP_MMINFRA_SEL,
CLK_TOP_UART_SEL,
CLK_TOP_SPI0_SEL,
CLK_TOP_SPI1_SEL,
CLK_TOP_SPI2_SEL,
CLK_TOP_SPI3_SEL,
CLK_TOP_SPI4_SEL,
CLK_TOP_SPI5_SEL,
CLK_TOP_MSDC_MACRO_0P_SEL,
CLK_TOP_MSDC50_0_HCLK_SEL,
CLK_TOP_MSDC50_0_SEL,
CLK_TOP_AES_MSDCFDE_SEL,
CLK_TOP_MSDC_MACRO_1P_SEL,
CLK_TOP_MSDC30_1_SEL,
CLK_TOP_MSDC30_1_HCLK_SEL,
CLK_TOP_MSDC_MACRO_2P_SEL,
CLK_TOP_MSDC30_2_SEL,
CLK_TOP_MSDC30_2_HCLK_SEL,
CLK_TOP_AUD_INTBUS_SEL,
CLK_TOP_ATB_SEL,
CLK_TOP_DISP_PWM_SEL,
CLK_TOP_USB_TOP_P0_SEL,
CLK_TOP_USB_XHCI_P0_SEL,
CLK_TOP_USB_TOP_P1_SEL,
CLK_TOP_USB_XHCI_P1_SEL,
CLK_TOP_USB_TOP_P2_SEL,
CLK_TOP_USB_XHCI_P2_SEL,
CLK_TOP_USB_TOP_P3_SEL,
CLK_TOP_USB_XHCI_P3_SEL,
CLK_TOP_USB_TOP_P4_SEL,
CLK_TOP_USB_XHCI_P4_SEL,
CLK_TOP_I2C_SEL,
CLK_TOP_AUD_ENGEN1_SEL,
CLK_TOP_AUD_ENGEN2_SEL,
CLK_TOP_AES_UFSFDE_SEL,
CLK_TOP_U_SEL,
CLK_TOP_U_MBIST_SEL,
CLK_TOP_AUD_1_SEL,
CLK_TOP_AUD_2_SEL,
CLK_TOP_PWM_SEL,
CLK_TOP_AUDIO_H_SEL,
CLK_TOP_MCUPM_SEL,
CLK_TOP_MEM_SUB_SEL,
CLK_TOP_MEM_SUB_U_SEL,
CLK_TOP_DXCC_SEL,
CLK_TOP_DP_SEL,
CLK_TOP_EDP_SEL,
CLK_TOP_EDP_FAVT_SEL,
CLK_TOP_SFLASH_SEL,
CLK_TOP_ECC_SEL,
CLK_TOP_APLL_I2SIN0_MCK_SEL,
CLK_TOP_APLL_I2SIN1_MCK_SEL,
CLK_TOP_APLL_I2SIN4_MCK_SEL,
CLK_TOP_APLL_I2SOUT0_MCK_SEL,
CLK_TOP_APLL_I2SOUT1_MCK_SEL,
CLK_TOP_APLL_I2SOUT4_MCK_SEL,
CLK_TOP_APLL_TDMOUT_MCK_SEL,
};
enum vlp_mux_id {
CLK_VLP_CK_SCP_SEL,
CLK_VLP_CK_PWRAP_ULPOSC_SEL,
CLK_VLP_CK_SPMI_P_MST_SEL,
CLK_VLP_CK_DVFSRC_SEL,
CLK_VLP_CK_PWM_VLP_SEL,
CLK_VLP_CK_AXI_VLP_SEL,
CLK_VLP_CK_SYSTIMER_26M_SEL,
CLK_VLP_CK_SSPM_SEL,
CLK_VLP_CK_SSPM_F26M_SEL,
CLK_VLP_CK_SRCK_SEL,
CLK_VLP_CK_SCP_SPI_SEL,
CLK_VLP_CK_SCP_IIC_SEL,
CLK_VLP_CK_SCP_SPI_HIGH_SPD_SEL,
CLK_VLP_CK_SCP_IIC_HIGH_SPD_SEL,
CLK_VLP_CK_SSPM_ULPOSC_SEL,
CLK_VLP_CK_APXGPT_26M_SEL,
CLK_VLP_CK_AUD_ADC_SEL,
CLK_VLP_CK_KP_IRQ_GEN_SEL
};
struct mux_sel {
u8 id;
u8 sel;
};
struct vlp_mux_sel {
u8 id;
u8 sel;
};
#define MUX(_id, _sys, _clk_cfg, _mux_shift, _mux_width)\
[_id] = { \
.reg = &_sys->_clk_cfg.cfg, \
.set_reg = &_sys->_clk_cfg.set, \
.clr_reg = &_sys->_clk_cfg.clr, \
.mux_shift = _mux_shift, \
.mux_width = _mux_width, \
}
#define MUX_UPD(_id, _sys, _clk_cfg, _mux_shift, _mux_width, _upd_reg, _upd_shift)\
[_id] = { \
.reg = &_sys->_clk_cfg.cfg, \
.set_reg = &_sys->_clk_cfg.set, \
.clr_reg = &_sys->_clk_cfg.clr, \
.mux_shift = _mux_shift, \
.mux_width = _mux_width, \
.upd_reg = &_sys->_upd_reg, \
.upd_shift = _upd_shift, \
}
#define CKSYS_MUX(_id, _clk_cfg, _mux_shift, _mux_width)\
MUX(_id, mtk_topckgen, _clk_cfg, _mux_shift, _mux_width)
#define CKSYS_MUX_UPD(_id, _clk_cfg, _mux_shift, _mux_width, _upd_reg, _upd_shift)\
MUX_UPD(_id, mtk_topckgen, _clk_cfg, _mux_shift, _mux_width, _upd_reg, _upd_shift)
#define VLP_MUX_UPD(_id, _clk_cfg, _mux_shift, _mux_width, _upd_shift)\
MUX_UPD(_id, mtk_vlpsys, _clk_cfg, _mux_shift, _mux_width, vlp_clk_cfg_update, \
_upd_shift)
static const struct mux muxes[] = {
CKSYS_MUX_UPD(CLK_TOP_AXI_SEL, clk_cfg[0], 0, 3, clk_cfg_update[0], 0),
CKSYS_MUX_UPD(CLK_TOP_AXI_PERI_SEL, clk_cfg[0], 8, 2, clk_cfg_update[0], 1),
CKSYS_MUX_UPD(CLK_TOP_AXI_U_SEL, clk_cfg[0], 16, 2, clk_cfg_update[0], 2),
CKSYS_MUX_UPD(CLK_TOP_BUS_AXIMEM_SEL, clk_cfg[0], 24, 3, clk_cfg_update[0], 3),
CKSYS_MUX_UPD(CLK_TOP_DISP0_SEL, clk_cfg[1], 0, 4, clk_cfg_update[0], 4),
CKSYS_MUX_UPD(CLK_TOP_MMINFRA_SEL, clk_cfg[1], 8, 4, clk_cfg_update[0], 5),
CKSYS_MUX_UPD(CLK_TOP_UART_SEL, clk_cfg[1], 16, 1, clk_cfg_update[0], 6),
CKSYS_MUX_UPD(CLK_TOP_SPI0_SEL, clk_cfg[1], 24, 3, clk_cfg_update[0], 7),
CKSYS_MUX_UPD(CLK_TOP_SPI1_SEL, clk_cfg[2], 0, 3, clk_cfg_update[0], 8),
CKSYS_MUX_UPD(CLK_TOP_SPI2_SEL, clk_cfg[2], 8, 3, clk_cfg_update[0], 9),
CKSYS_MUX_UPD(CLK_TOP_SPI3_SEL, clk_cfg[2], 16, 3, clk_cfg_update[0], 10),
CKSYS_MUX_UPD(CLK_TOP_SPI4_SEL, clk_cfg[2], 24, 3, clk_cfg_update[0], 11),
CKSYS_MUX_UPD(CLK_TOP_SPI5_SEL, clk_cfg[3], 0, 3, clk_cfg_update[0], 12),
CKSYS_MUX_UPD(CLK_TOP_MSDC_MACRO_0P_SEL, clk_cfg[3], 8, 2, clk_cfg_update[0], 13),
CKSYS_MUX_UPD(CLK_TOP_MSDC50_0_HCLK_SEL, clk_cfg[3], 16, 2, clk_cfg_update[0], 14),
CKSYS_MUX_UPD(CLK_TOP_MSDC50_0_SEL, clk_cfg[3], 24, 3, clk_cfg_update[0], 15),
CKSYS_MUX_UPD(CLK_TOP_AES_MSDCFDE_SEL, clk_cfg[4], 0, 3, clk_cfg_update[0], 16),
CKSYS_MUX_UPD(CLK_TOP_MSDC_MACRO_1P_SEL, clk_cfg[4], 8, 2, clk_cfg_update[0], 17),
CKSYS_MUX_UPD(CLK_TOP_MSDC30_1_SEL, clk_cfg[4], 16, 3, clk_cfg_update[0], 18),
CKSYS_MUX_UPD(CLK_TOP_MSDC30_1_HCLK_SEL, clk_cfg[4], 24, 2, clk_cfg_update[0], 19),
CKSYS_MUX_UPD(CLK_TOP_MSDC_MACRO_2P_SEL, clk_cfg[5], 0, 2, clk_cfg_update[0], 20),
CKSYS_MUX_UPD(CLK_TOP_MSDC30_2_SEL, clk_cfg[5], 8, 3, clk_cfg_update[0], 21),
CKSYS_MUX_UPD(CLK_TOP_MSDC30_2_HCLK_SEL, clk_cfg[5], 16, 2, clk_cfg_update[0], 22),
CKSYS_MUX_UPD(CLK_TOP_AUD_INTBUS_SEL, clk_cfg[5], 24, 2, clk_cfg_update[0], 23),
CKSYS_MUX_UPD(CLK_TOP_ATB_SEL, clk_cfg[6], 0, 2, clk_cfg_update[0], 24),
CKSYS_MUX_UPD(CLK_TOP_DISP_PWM_SEL, clk_cfg[6], 8, 3, clk_cfg_update[0], 25),
CKSYS_MUX_UPD(CLK_TOP_USB_TOP_P0_SEL, clk_cfg[6], 16, 2, clk_cfg_update[0], 26),
CKSYS_MUX_UPD(CLK_TOP_USB_XHCI_P0_SEL, clk_cfg[6], 24, 2, clk_cfg_update[0], 27),
CKSYS_MUX_UPD(CLK_TOP_USB_TOP_P1_SEL, clk_cfg[7], 0, 2, clk_cfg_update[0], 28),
CKSYS_MUX_UPD(CLK_TOP_USB_XHCI_P1_SEL, clk_cfg[7], 8, 2, clk_cfg_update[0], 29),
CKSYS_MUX_UPD(CLK_TOP_USB_TOP_P2_SEL, clk_cfg[7], 16, 2, clk_cfg_update[0], 30),
CKSYS_MUX_UPD(CLK_TOP_USB_XHCI_P2_SEL, clk_cfg[7], 24, 2, clk_cfg_update[1], 0),
CKSYS_MUX_UPD(CLK_TOP_USB_TOP_P3_SEL, clk_cfg[8], 0, 2, clk_cfg_update[1], 1),
CKSYS_MUX_UPD(CLK_TOP_USB_XHCI_P3_SEL, clk_cfg[8], 8, 2, clk_cfg_update[1], 2),
CKSYS_MUX_UPD(CLK_TOP_USB_TOP_P4_SEL, clk_cfg[8], 16, 2, clk_cfg_update[1], 3),
CKSYS_MUX_UPD(CLK_TOP_USB_XHCI_P4_SEL, clk_cfg[8], 24, 2, clk_cfg_update[1], 4),
CKSYS_MUX_UPD(CLK_TOP_I2C_SEL, clk_cfg[9], 0, 2, clk_cfg_update[1], 5),
CKSYS_MUX_UPD(CLK_TOP_AUD_ENGEN1_SEL, clk_cfg[9], 24, 2, clk_cfg_update[1], 8),
CKSYS_MUX_UPD(CLK_TOP_AUD_ENGEN2_SEL, clk_cfg[10], 0, 2, clk_cfg_update[1], 9),
CKSYS_MUX_UPD(CLK_TOP_AES_UFSFDE_SEL, clk_cfg[10], 8, 3, clk_cfg_update[1], 10),
CKSYS_MUX_UPD(CLK_TOP_U_SEL, clk_cfg[10], 16, 3, clk_cfg_update[1], 11),
CKSYS_MUX_UPD(CLK_TOP_U_MBIST_SEL, clk_cfg[10], 24, 2, clk_cfg_update[1], 12),
CKSYS_MUX_UPD(CLK_TOP_AUD_1_SEL, clk_cfg[11], 0, 1, clk_cfg_update[1], 13),
CKSYS_MUX_UPD(CLK_TOP_AUD_2_SEL, clk_cfg[11], 8, 1, clk_cfg_update[1], 14),
CKSYS_MUX_UPD(CLK_TOP_PWM_SEL, clk_cfg[12], 0, 1, clk_cfg_update[1], 17),
CKSYS_MUX_UPD(CLK_TOP_AUDIO_H_SEL, clk_cfg[12], 8, 2, clk_cfg_update[1], 18),
CKSYS_MUX_UPD(CLK_TOP_MCUPM_SEL, clk_cfg[12], 16, 2, clk_cfg_update[1], 19),
CKSYS_MUX_UPD(CLK_TOP_MEM_SUB_SEL, clk_cfg[12], 24, 4, clk_cfg_update[1], 20),
CKSYS_MUX_UPD(CLK_TOP_MEM_SUB_U_SEL, clk_cfg[13], 8, 3, clk_cfg_update[1], 22),
CKSYS_MUX_UPD(CLK_TOP_DXCC_SEL, clk_cfg[15], 24, 2, clk_cfg_update[2], 1),
CKSYS_MUX_UPD(CLK_TOP_DP_SEL, clk_cfg[16], 16, 3, clk_cfg_update[2], 4),
CKSYS_MUX_UPD(CLK_TOP_EDP_SEL, clk_cfg[16], 24, 3, clk_cfg_update[2], 5),
CKSYS_MUX_UPD(CLK_TOP_EDP_FAVT_SEL, clk_cfg_17, 0, 3, clk_cfg_update[2], 6),
CKSYS_MUX_UPD(CLK_TOP_SFLASH_SEL, clk_cfg_18, 0, 3, clk_cfg_update[2], 10),
CKSYS_MUX_UPD(CLK_TOP_ECC_SEL, clk_cfg_19, 8, 3, clk_cfg_update[2], 15),
};
static const struct mux_sel mux_sels[] = {
{ .id = CLK_TOP_AXI_SEL, .sel = 2 },
{ .id = CLK_TOP_AXI_PERI_SEL, .sel = 2 },
{ .id = CLK_TOP_AXI_U_SEL, .sel = 2 },
{ .id = CLK_TOP_BUS_AXIMEM_SEL, .sel = 2 },
{ .id = CLK_TOP_DISP0_SEL, .sel = 11 },
{ .id = CLK_TOP_MMINFRA_SEL, .sel = 14 },
{ .id = CLK_TOP_UART_SEL, .sel = 1 },
{ .id = CLK_TOP_SPI0_SEL, .sel = 1 },
{ .id = CLK_TOP_SPI1_SEL, .sel = 1 },
{ .id = CLK_TOP_SPI2_SEL, .sel = 1 },
{ .id = CLK_TOP_SPI3_SEL, .sel = 1 },
{ .id = CLK_TOP_SPI4_SEL, .sel = 1 },
{ .id = CLK_TOP_SPI5_SEL, .sel = 1 },
{ .id = CLK_TOP_MSDC_MACRO_0P_SEL, .sel = 1 },
{ .id = CLK_TOP_MSDC50_0_HCLK_SEL, .sel = 1 },
{ .id = CLK_TOP_MSDC50_0_SEL, .sel = 1 },
{ .id = CLK_TOP_AES_MSDCFDE_SEL, .sel = 4 },
{ .id = CLK_TOP_MSDC_MACRO_1P_SEL, .sel = 1 },
{ .id = CLK_TOP_MSDC30_1_SEL, .sel = 4 },
{ .id = CLK_TOP_MSDC30_1_HCLK_SEL, .sel = 1 },
{ .id = CLK_TOP_MSDC_MACRO_2P_SEL, .sel = 1 },
{ .id = CLK_TOP_MSDC30_2_SEL, .sel = 4 },
{ .id = CLK_TOP_MSDC30_2_HCLK_SEL, .sel = 1 },
{ .id = CLK_TOP_AUD_INTBUS_SEL, .sel = 1 },
{ .id = CLK_TOP_ATB_SEL, .sel = 1 },
{ .id = CLK_TOP_DISP_PWM_SEL, .sel = 6 },
{ .id = CLK_TOP_USB_TOP_P0_SEL, .sel = 1 },
{ .id = CLK_TOP_USB_XHCI_P0_SEL, .sel = 1 },
{ .id = CLK_TOP_USB_TOP_P1_SEL, .sel = 1 },
{ .id = CLK_TOP_USB_XHCI_P1_SEL, .sel = 1 },
{ .id = CLK_TOP_USB_TOP_P2_SEL, .sel = 1 },
{ .id = CLK_TOP_USB_XHCI_P2_SEL, .sel = 1 },
{ .id = CLK_TOP_USB_TOP_P3_SEL, .sel = 1 },
{ .id = CLK_TOP_USB_XHCI_P3_SEL, .sel = 1 },
{ .id = CLK_TOP_USB_TOP_P4_SEL, .sel = 1 },
{ .id = CLK_TOP_USB_XHCI_P4_SEL, .sel = 1 },
{ .id = CLK_TOP_I2C_SEL, .sel = 2 },
{ .id = CLK_TOP_AUD_ENGEN1_SEL, .sel = 2 },
{ .id = CLK_TOP_AUD_ENGEN2_SEL, .sel = 2 },
{ .id = CLK_TOP_AES_UFSFDE_SEL, .sel = 1 },
{ .id = CLK_TOP_U_SEL, .sel = 5 },
{ .id = CLK_TOP_U_MBIST_SEL, .sel = 3 },
{ .id = CLK_TOP_AUD_1_SEL, .sel = 1 },
{ .id = CLK_TOP_AUD_2_SEL, .sel = 1 },
{ .id = CLK_TOP_PWM_SEL, .sel = 0 },
{ .id = CLK_TOP_AUDIO_H_SEL, .sel = 3 },
{ .id = CLK_TOP_MCUPM_SEL, .sel = 2 },
{ .id = CLK_TOP_MEM_SUB_SEL, .sel = 9 },
{ .id = CLK_TOP_MEM_SUB_U_SEL, .sel = 7 },
{ .id = CLK_TOP_DXCC_SEL, .sel = 1 },
{ .id = CLK_TOP_DP_SEL, .sel = 4 },
{ .id = CLK_TOP_EDP_SEL, .sel = 4 },
{ .id = CLK_TOP_EDP_FAVT_SEL, .sel = 4 },
{ .id = CLK_TOP_SFLASH_SEL, .sel = 0 },
{ .id = CLK_TOP_ECC_SEL, .sel = 5 },
};
static const struct mux vlp_muxes[] = {
VLP_MUX_UPD(CLK_VLP_CK_SCP_SEL, vlp_clk_cfg[0], 0, 4, 0),
VLP_MUX_UPD(CLK_VLP_CK_PWRAP_ULPOSC_SEL, vlp_clk_cfg[0], 8, 3, 1),
VLP_MUX_UPD(CLK_VLP_CK_SPMI_P_MST_SEL, vlp_clk_cfg[0], 16, 4, 2),
VLP_MUX_UPD(CLK_VLP_CK_DVFSRC_SEL, vlp_clk_cfg[0], 24, 1, 3),
VLP_MUX_UPD(CLK_VLP_CK_PWM_VLP_SEL, vlp_clk_cfg[1], 0, 3, 4),
VLP_MUX_UPD(CLK_VLP_CK_AXI_VLP_SEL, vlp_clk_cfg[1], 8, 3, 5),
VLP_MUX_UPD(CLK_VLP_CK_SYSTIMER_26M_SEL, vlp_clk_cfg[1], 16, 1, 6),
VLP_MUX_UPD(CLK_VLP_CK_SSPM_SEL, vlp_clk_cfg[1], 24, 3, 7),
VLP_MUX_UPD(CLK_VLP_CK_SSPM_F26M_SEL, vlp_clk_cfg[2], 0, 1, 8),
VLP_MUX_UPD(CLK_VLP_CK_SRCK_SEL, vlp_clk_cfg[2], 8, 1, 9),
VLP_MUX_UPD(CLK_VLP_CK_SCP_SPI_SEL, vlp_clk_cfg[2], 16, 2, 10),
VLP_MUX_UPD(CLK_VLP_CK_SCP_IIC_SEL, vlp_clk_cfg[2], 24, 2, 11),
VLP_MUX_UPD(CLK_VLP_CK_SCP_SPI_HIGH_SPD_SEL, vlp_clk_cfg[3], 0, 2, 12),
VLP_MUX_UPD(CLK_VLP_CK_SCP_IIC_HIGH_SPD_SEL, vlp_clk_cfg[3], 8, 2, 13),
VLP_MUX_UPD(CLK_VLP_CK_SSPM_ULPOSC_SEL, vlp_clk_cfg[3], 16, 2, 14),
VLP_MUX_UPD(CLK_VLP_CK_APXGPT_26M_SEL, vlp_clk_cfg[3], 24, 1, 15),
VLP_MUX_UPD(CLK_VLP_CK_AUD_ADC_SEL, vlp_clk_cfg[5], 16, 2, 22),
VLP_MUX_UPD(CLK_VLP_CK_KP_IRQ_GEN_SEL, vlp_clk_cfg[5], 24, 3, 23),
};
static const struct vlp_mux_sel vlp_mux_sels[] = {
{ .id = CLK_VLP_CK_SCP_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_PWRAP_ULPOSC_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_SPMI_P_MST_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_DVFSRC_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_PWM_VLP_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_AXI_VLP_SEL, .sel = 4 },
{ .id = CLK_VLP_CK_SYSTIMER_26M_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_SSPM_SEL, .sel = 4 },
{ .id = CLK_VLP_CK_SSPM_F26M_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_SRCK_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_SCP_SPI_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_SCP_IIC_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_SCP_SPI_HIGH_SPD_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_SCP_IIC_HIGH_SPD_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_SSPM_ULPOSC_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_APXGPT_26M_SEL, .sel = 0 },
{ .id = CLK_VLP_CK_AUD_ADC_SEL, .sel = 1 },
{ .id = CLK_VLP_CK_KP_IRQ_GEN_SEL, .sel = 4 }
};
enum pll_id {
CLK_APMIXED_ARMPLL_LL,
CLK_APMIXED_ARMPLL_BL,
CLK_APMIXED_CCIPLL,
CLK_APMIXED_MAINPLL,
CLK_APMIXED_UNIVPLL,
CLK_APMIXED_MMPLL,
CLK_APMIXED_MFGPLL,
CLK_APMIXED_APLL1,
CLK_APMIXED_APLL2,
CLK_APMIXED_EMIPLL,
CLK_APMIXED_APUPLL2,
CLK_APMIXED_APUPLL,
CLK_APMIXED_TVDPLL1,
CLK_APMIXED_TVDPLL2,
CLK_APMIXED_ETHPLL,
CLK_APMIXED_MSDCPLL,
CLK_APMIXED_UFSPLL
};
struct rate {
u8 id; /* enum pll_id */
u32 rate;
};
static const struct rate pll_rates[] = {
{ CLK_APMIXED_ARMPLL_LL, ARMPLL_LL_HZ },
{ CLK_APMIXED_ARMPLL_BL, ARMPLL_BL_HZ },
{ CLK_APMIXED_CCIPLL, CCIPLL_HZ },
{ CLK_APMIXED_MAINPLL, MAINPLL_HZ },
{ CLK_APMIXED_UNIVPLL, UNIVPLL_HZ },
{ CLK_APMIXED_MMPLL, MMPLL_HZ },
{ CLK_APMIXED_MFGPLL, MFGPLL_HZ },
{ CLK_APMIXED_APLL1, APLL1_HZ },
{ CLK_APMIXED_APLL2, APLL2_HZ },
{ CLK_APMIXED_EMIPLL, EMIPLL_HZ },
{ CLK_APMIXED_APUPLL2, APUPLL2_HZ },
{ CLK_APMIXED_APUPLL, APUPLL_HZ },
{ CLK_APMIXED_TVDPLL1, TVDPLL1_HZ },
{ CLK_APMIXED_TVDPLL2, TVDPLL2_HZ },
{ CLK_APMIXED_ETHPLL, ETHPLL_HZ },
{ CLK_APMIXED_MSDCPLL, MSDCPLL_HZ },
{ CLK_APMIXED_UFSPLL, UFSPLL_HZ }
};
static const u32 pll_div_rate[] = {
3800UL * MHz,
1900 * MHz,
950 * MHz,
475 * MHz,
237500 * KHz,
0,
};
#define PLL_SYS(_id, _reg, _rstb, _pcwbits, _div_reg, _div_shift, \
_pcw_reg, _pcw_shift, _div_rate) \
[_id] = { \
.reg = &mtk_apmixed->_reg, \
.rstb_shift = _rstb, \
.pcwbits = _pcwbits, \
.div_reg = &mtk_apmixed->_div_reg, \
.div_shift = _div_shift, \
.pcw_reg = &mtk_apmixed->_pcw_reg, \
.pcw_shift = _pcw_shift, \
.div_rate = _div_rate, \
}
static const struct pll plls[] = {
PLL_SYS(CLK_APMIXED_ARMPLL_LL, armpll_ll_con[0], NO_RSTB_SHIFT, 22,
armpll_ll_con[1], 24, armpll_ll_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_ARMPLL_BL, armpll_bl_con[0], NO_RSTB_SHIFT, 22,
armpll_bl_con[1], 24, armpll_bl_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_CCIPLL, ccipll_con[0], NO_RSTB_SHIFT, 22,
ccipll_con[1], 24, ccipll_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_MAINPLL, mainpll_con[0], 23, 22,
mainpll_con[1], 24, mainpll_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_UNIVPLL, univpll_con[0], 23, 22,
univpll_con[1], 24, univpll_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_MMPLL, mmpll_con[0], 23, 22,
mmpll_con[1], 24, mmpll_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_MFGPLL, mfgpll_con[0], NO_RSTB_SHIFT, 22,
mfgpll_con[1], 24, mfgpll_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_APLL1, apll1_con[0], NO_RSTB_SHIFT, 32,
apll1_con[1], 24, apll1_con[2], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_APLL2, apll2_con[0], NO_RSTB_SHIFT, 32,
apll2_con[1], 24, apll2_con[2], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_EMIPLL, emipll_con[0], NO_RSTB_SHIFT, 22,
emipll_con[1], 24, emipll_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_APUPLL2, apupll2_con[0], NO_RSTB_SHIFT, 22,
apupll2_con[1], 24, apupll2_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_APUPLL, apupll_con[0], NO_RSTB_SHIFT, 22,
apupll_con[1], 24, apupll_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_TVDPLL1, tvdpll1_con[0], NO_RSTB_SHIFT, 22,
tvdpll1_con[1], 24, tvdpll1_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_TVDPLL2, tvdpll2_con[0], NO_RSTB_SHIFT, 22,
tvdpll2_con[1], 24, tvdpll2_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_ETHPLL, ethpll_con[0], NO_RSTB_SHIFT, 22,
ethpll_con[1], 24, ethpll_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_MSDCPLL, msdcpll_con[0], NO_RSTB_SHIFT, 22,
msdcpll_con[1], 24, msdcpll_con[1], 0, pll_div_rate),
PLL_SYS(CLK_APMIXED_UFSPLL, ufspll_con[0], NO_RSTB_SHIFT, 22,
ufspll_con[1], 24, ufspll_con[1], 0, pll_div_rate),
};
struct pll_reg_list {
const char *name;
void *div_reg;
void *con0;
void *con1;
};
struct fmeter_data {
u8 id;
void *pll_con0;
void *pll_con1;
void *con0;
void *con1;
};
static const struct fmeter_data fmd[] = {
[APLL1_CTRL] = {APLL1_CTRL, &mtk_apmixed->apll1_con[0]},
[APLL2_CTRL] = {APLL2_CTRL, &mtk_apmixed->apll2_con[0]},
[ARMPLL_BL_CTRL] = {ARMPLL_BL_CTRL, &mtk_apmixed->armpll_bl_con[0]},
[ARMPLL_LL_CTRL] = {ARMPLL_LL_CTRL, &mtk_apmixed->armpll_ll_con[0]},
[CCIPLL_CTRL] = {CCIPLL_CTRL, &mtk_apmixed->ccipll_con[0]},
[MAINPLL_CTRL] = {MAINPLL_CTRL, &mtk_apmixed->mainpll_con[0]},
[MMPLL_CTRL] = {MMPLL_CTRL, &mtk_apmixed->mmpll_con[0]},
[MSDCPLL_CTRL] = {MSDCPLL_CTRL, &mtk_apmixed->msdcpll_con[0]},
[UFSPLL_CTRL] = {UFSPLL_CTRL, &mtk_apmixed->ufspll_con[0]},
[UNIVPLL_CTRL] = {UNIVPLL_CTRL, &mtk_apmixed->univpll_con[0]},
[EMIPLL_CTRL] = {EMIPLL_CTRL, &mtk_apmixed->emipll_con[0]},
[TVDPLL1_CTRL] = {TVDPLL1_CTRL, &mtk_apmixed->tvdpll1_con[0]},
[TVDPLL2_CTRL] = {TVDPLL2_CTRL, &mtk_apmixed->tvdpll2_con[0]},
[MFGPLL_CTRL] = {MFGPLL_CTRL, &mtk_apmixed->mfgpll_con[0]},
[ETHPLL_CTRL] = {ETHPLL_CTRL, &mtk_apmixed->ethpll_con[0]},
[APUPLL_CTRL] = {APUPLL_CTRL, &mtk_apmixed->apupll_con[0]},
[APUPLL2_CTRL] = {APUPLL2_CTRL, &mtk_apmixed->apupll2_con[0]},
[VLP_CKSYS_TOP_CTRL] = {VLP_CKSYS_TOP_CTRL, 0, 0,
&mtk_vlpsys->vlp_fqmtr_con[0],
&mtk_vlpsys->vlp_fqmtr_con[1]},
};
static u32 mt_get_subsys_freq(const struct fmeter_data fm_data, u32 id)
{
u32 output = 0, ckdiv_en = 0;
u32 temp;
if (fm_data.pll_con0 != 0) {
/* check ckdiv_en */
if (read32(fm_data.pll_con0) & 0x00010000)
ckdiv_en = 1;
/* pll con0[19] = 1, pll con0[16] = 1, pll con0[12] = 1 */
/* select pll_ckdiv, enable pll_ckdiv, enable test clk */
setbits32(fm_data.pll_con0, BIT(19) | BIT(16) | BIT(12));
}
/* CLK26CALI_0[15]: rst 1 -> 0 */
write32(fm_data.con0, 0);
/* CLK26CALI_0[15]: rst 0 -> 1 */
setbits32(fm_data.con0, BIT(15));
/* vlp freq meter sel ckgen[20:16] */
/* other subsys freq meter sel ckgen[2:0] */
if (fm_data.id == VLP_CKSYS_TOP_CTRL)
clrsetbits32(fm_data.con0, GENMASK(20, 16), id << 16);
else
clrsetbits32(fm_data.con0, GENMASK(2, 0), id);
clrsetbits32(fm_data.con1, GENMASK(31, 16), 0x1FF << 16);
/* select divider?dvt set zero */
clrbits32(fm_data.con0, GENMASK(31, 24));
setbits32(fm_data.con0, BIT(12));
setbits32(fm_data.con0, BIT(4));
/* fmeter con0[1:0] = 0 */
/* choose test clk */
clrbits32(fm_data.con0, BIT(1) | BIT(0));
/* wait frequency meter finish */
if (fm_data.id == VLP_CKSYS_TOP_CTRL)
udelay(VLP_FM_WAIT_TIME);
else
wait_us(1000, !(read32(fm_data.con0) & BIT(4)));
temp = read32(fm_data.con1) & 0xFFFF;
output = ((temp * 26000)) / 512; /* Khz */
if (fm_data.pll_con0 != 0) {
/* pll con0[19] = 0, pll con0[12] = 0 */
if (ckdiv_en)
clrbits32(fm_data.pll_con0, BIT(19) | BIT(12));
else
clrbits32(fm_data.pll_con0, BIT(19) | BIT(16) | BIT(12));
}
write32(fm_data.con0, 0x8000);
printk(BIOS_INFO, "subsys meter[%d:%d] = %d Khz\n", fm_data.id, id, output);
return output;
}
u32 mt_get_vlpck_freq(u32 id)
{
return mt_get_subsys_freq(fmd[VLP_CKSYS_TOP_CTRL], id);
}
void mt_set_topck_default(void)
{
int i;
write32(&mtk_topckgen->clk_cfg[0].clr, 0xFFFFFFF0);
for (i = 1; i <= 16; i++)
write32(&mtk_topckgen->clk_cfg[i].clr, 0xFFFFFFFF);
write32(&mtk_topckgen->clk_cfg_17.clr, 0xFFFFFFFF);
write32(&mtk_topckgen->clk_cfg_18.clr, 0xFFFFFFFF);
write32(&mtk_topckgen->clk_cfg_19.clr, 0xFFFFFFFF);
write32(&mtk_topckgen->clk_cfg_update[0], 0x7FFFFFFE);
write32(&mtk_topckgen->clk_cfg_update[1], 0x7FFFFFFF);
write32(&mtk_topckgen->clk_cfg_update[2], 0x0000FFFF);
}
void pll_set_pcw_change(const struct pll *pll)
{
setbits32(pll->div_reg, PLL_PCW_CHG);
}
void mt_pll_init(void)
{
int i;
printk(BIOS_INFO, "Pll init start...\n");
spm_power_on();
printk(BIOS_INFO, "pll control start...\n");
/* [0]=1 (CLKSQ_EN) + Default Value to avoid using BootROM's setting */
setbits32(&mtk_apmixed->ap_clksq_con0, BIT(0));
/* Wait 100us */
udelay(100);
/* [2]=1 (CLKSQ_LPF_EN) */
setbits32(&mtk_apmixed->ap_clksq_con0, BIT(2));
for (i = 0; i < ARRAY_SIZE(pll_rates); i++)
pll_set_rate(&plls[pll_rates[i].id], pll_rates[i].rate);
write32(&mtk_apmixed->apll1_tuner_con0, 0x6F28BD4D);
write32(&mtk_apmixed->apll2_tuner_con0, 0x78FD5266);
setbits32(&mtk_apmixed->emipll_con[0], BIT(8));
/* PLL all enable */
write32(&mtk_apmixed->pllen_all_set, 0x0007FFFC);
/* Wait PLL stable (20us) */
udelay(20);
/* turn on pll div en */
setbits32(&mtk_apmixed->mainpll_con[0], GENMASK(31, 24));
setbits32(&mtk_apmixed->univpll_con[0], GENMASK(31, 24));
udelay(20);
/* pll all rstb */
write32(&mtk_apmixed->pll_div_rstb_all_set, 0x00000007);
printk(BIOS_INFO, "pll control done...\n");
/* [10:9] muxsel: switch to PLL speed */
clrsetbits32(&mtk_cpu_plldiv_cfg->cpu_plldiv_0_cfg0, GENMASK(10, 9), BIT(9));
/* [10:9] muxsel: switch to PLL speed */
clrsetbits32(&mtk_cpu_plldiv_cfg->cpu_plldiv_1_cfg0, GENMASK(10, 9), BIT(9));
/* [10:9] muxsel: switch to PLL speed */
clrsetbits32(&mtk_bus_plldiv_cfg->bus_plldiv_cfg0, GENMASK(10, 9), BIT(9));
/* Infra DCM divider */
setbits32(&mtk_infra_ao_bcrm->vdnr_dcm_infra_par_bus_ctrl_0, BIT(6) | BIT(3));
/* Peri DCM divider */
setbits32(&mtk_peri_ao_bcrm->vdnr_dcm_peri_par_bus_ctrl_0, BIT(10) | BIT(7) | BIT(4));
printk(BIOS_INFO, "mux switch control start...\n");
for (i = 0; i < ARRAY_SIZE(mux_sels); i++)
pll_mux_set_sel(&muxes[mux_sels[i].id], mux_sels[i].sel);
/* update mux */
write32(&mtk_topckgen->clk_cfg_update[0], 0x7FFFFFFF);
write32(&mtk_topckgen->clk_cfg_update[1], 0x7FFFFFFF);
write32(&mtk_topckgen->clk_cfg_update[2], 0x0000FFFF);
/* femisys_dvfs_ck_gfmux_sel = 1(emipll_ck) */
write32(&mtk_topckgen->clk_mem_dfs_cfg, 0x1);
for (i = 0; i < ARRAY_SIZE(vlp_mux_sels); i++)
pll_mux_set_sel(&vlp_muxes[vlp_mux_sels[i].id], vlp_mux_sels[i].sel);
/* update mux */
write32(&mtk_vlpsys->vlp_clk_cfg_update, 0x00FFFFFF);
printk(BIOS_INFO, "mux switch control done...\n");
printk(BIOS_INFO, "Pll init Done!!\n");
}
void mt_pll_post_init(void)
{
/* for CG */
printk(BIOS_INFO, "subsysCG enable start...\n");
/* TOPCKGEN CG Clear */
write32(&mtk_topckgen->clk_misc_cfg_3.clr, 0x00010000);
write32(&mtk_topckgen->clk_misc_cfg_3.set, 0xDF3CFCFF);
/* INFRACFG_AO CG Clear */
write32(&mtk_infracfg_ao->infracfg_ao_module_cg_0_clr, 0x10000000);
write32(&mtk_infracfg_ao->infracfg_ao_module_cg_1_clr, 0x21000000);
write32(&mtk_infracfg_ao->infracfg_ao_module_cg_2_clr, 0x08000000);
write32(&mtk_infracfg_ao->infracfg_ao_module_cg_3_clr, 0x02000000);
/* PERICFG_AO CG Clear */
write32(&mtk_pericfg_ao->pericfg_ao_peri_cg_0_clr, 0x3FFFFFFF);
write32(&mtk_pericfg_ao->pericfg_ao_peri_cg_1_clr, 0x3DBDFBF6);
write32(&mtk_pericfg_ao->pericfg_ao_peri_cg_2_clr, 0x0FFFFFFB);
/* UFSCFG_AO_REG CG Clear */
write32(&mtk_ufscfg_ao->ufscfg_ao_reg_ufs_ao_cg_0_clr, 0x0000007F);
/* IMP_IIC_WRAP_WS CG Clear */
write32(&mtk_imp_iic_wrap_ws->imp_iic_wrap_ws_ap_clock_cg_clr, 0x00000001);
/* IMP_IIC_WRAP_E CG Clear */
write32(&mtk_imp_iic_wrap_e->imp_iic_wrap_e_ap_clock_cg_clr, 0x00000003);
/* IMP_IIC_WRAP_S CG Clear */
write32(&mtk_imp_iic_wrap_s->imp_iic_wrap_s_ap_clock_cg_clr, 0x0000000F);
/* IMP_IIC_WRAP_EN CG Clear */
write32(&mtk_imp_iic_wrap_en->imp_iic_wrap_en_ap_clock_cg_clr, 0x00000003);
/* VLP_CK CG Clear */
write32(&mtk_vlpsys->vlp_clk_cfg_30_set, 0x00000832);
/* SCP_IIC CG Clear */
write32(&mtk_scp_iic->scp_iic_ccu_clock_cg_set, 0x00000003);
/* SCP CG Clear */
setbits32(&mtk_scp->scp_ap_spi_cg, BIT(1) | BIT(0));
/* VLPCFG_AO_REG CG Clear */
clrbits32(&mtk_vlpcfg_ao->vlpcfg_ao_reg_debugtop_vlpao_ctrl, BIT(8));
/* VLPCFG_REG CG Clear */
setbits32(&mtk_vlpcfg->vlp_test_ck_ctrl,
BIT(28) | BIT(24) | BIT(23) | BIT(22) | BIT(21) | BIT(20) |
BIT(18) | BIT(13) | BIT(12) | BIT(11) | BIT(10) | BIT(9) |
BIT(8) | BIT(7) | BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0));
/* DVFSRC_TOP CG Clear */
setbits32(&mtk_dvfsrc_top->dvfsrc_top_dvfsrc_basic_control, BIT(0));
/* DBGAO CG Clear */
setbits32(&mtk_dbgao->dbgao_atb, BIT(0));
/* DEM CG Clear*/
setbits32(&mtk_dem->dem_atb, BIT(0));
setbits32(&mtk_dem->dem_dbgbusclk_en, BIT(0));
setbits32(&mtk_dem->dem_dbgsysclk_en, BIT(0));
/* UFSCFG_PDN_REG CG Clear */
write32(&mtk_ufscfg_pdn->ufscfg_pdn_reg_ufs_pdn_cg_0_clr, 0x0000002B);
/* MMINFRA_CONFIG CG Clear */
write32(&mtk_mminfra_config->mminfra_config_mminfra_cg_0_clr, 0x00000007);
write32(&mtk_mminfra_config->mminfra_config_mminfra_cg_1_clr, 0x00020000);
/* GCE CG Clear */
clrbits32(&mtk_gce_d->gce_gce_ctl_int0, BIT(16));
printk(BIOS_INFO, "subsysCG enable done...\n");
}
void mt_pll_raise_little_cpu_freq(u32 freq)
{
/* switch clock source to intermediate clock */
clrsetbits32(&mtk_cpu_plldiv_cfg->cpu_plldiv_0_cfg0, MCU_MUX_MASK, MCU_MUX_SRC_26M);
/* disable armpll_ll frequency output */
write32(&mtk_apmixed->pllen_all_clr, 0x40000);
/* raise armpll_ll frequency */
pll_set_rate(&plls[CLK_APMIXED_ARMPLL_LL], freq);
/* enable armpll_ll frequency output */
write32(&mtk_apmixed->pllen_all_set, 0x40000);
udelay(PLL_EN_DELAY);
/* switch clock source back to armpll_ll */
clrsetbits32(&mtk_cpu_plldiv_cfg->cpu_plldiv_0_cfg0, MCU_MUX_MASK, MCU_MUX_SRC_PLL);
}
void mt_pll_raise_cci_freq(u32 freq)
{
/* switch clock source to intermediate clock */
clrsetbits32(&mtk_bus_plldiv_cfg->bus_plldiv_cfg0, MCU_MUX_MASK, MCU_MUX_SRC_26M);
/* disable ccipll frequency output */
write32(&mtk_apmixed->pllen_all_clr, 0x10000);
/* raise ccipll frequency */
pll_set_rate(&plls[CLK_APMIXED_CCIPLL], freq);
/* enable ccipll frequency output */
write32(&mtk_apmixed->pllen_all_set, 0x10000);
udelay(PLL_EN_DELAY);
/* switch clock source back to ccipll */
clrsetbits32(&mtk_bus_plldiv_cfg->bus_plldiv_cfg0, MCU_MUX_MASK, MCU_MUX_SRC_PLL);
}
void mt_pll_set_tvd_pll1_freq(u32 freq)
{
/* disable tvdpll frequency output */
write32(&mtk_apmixed->pllen_all_clr, 0x200);
/* set tvdpll frequency */
pll_set_rate(&plls[CLK_APMIXED_TVDPLL2], freq);
/* enable tvdpll frequency output */
write32(&mtk_apmixed->pllen_all_set, 0x200);
udelay(PLL_EN_DELAY);
}
void mt_pll_edp_mux_set_sel(u32 sel)
{
pll_mux_set_sel(&muxes[CLK_TOP_EDP_SEL], sel);
}