blob: fb7d17fb5486871a92f879cb34d187d1cc03a4ad [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef SOC_MEDIATEK_MT8195_SPM_H
#define SOC_MEDIATEK_MT8195_SPM_H
#include <device/mmio.h>
#include <soc/addressmap.h>
#include <soc/mtcmos.h>
#include <stdint.h>
#include <types.h>
/* SPM READ/WRITE CFG */
#define SPM_PROJECT_CODE 0xb16
#define SPM_REGWR_CFG_KEY (SPM_PROJECT_CODE << 16)
/* POWERON_CONFIG_EN (0x10006000+0x000) */
#define BCLK_CG_EN_LSB (1U << 0)
/* SPM_CLK_CON (0x10006000+0x00C) */
DEFINE_BIT(REG_SYSCLK1_SRC_MD2_SRCCLKENA, 28)
/* PCM_CON0 (0x10006000+0x018) */
#define PCM_CK_EN_LSB (1U << 2)
#define PCM_SW_RESET_LSB (1U << 15)
/* PCM_CON1 (0x10006000+0x01C) */
#define RG_IM_SLAVE_LSB (1U << 0)
#define RG_AHBMIF_APBEN_LSB (1U << 3)
#define RG_PCM_TIMER_EN_LSB (1U << 5)
#define SPM_EVENT_COUNTER_CLR_LSB (1U << 6)
#define RG_PCM_WDT_WAKE_LSB (1U << 9)
#define REG_SPM_SRAM_ISOINT_B_LSB (1U << 11)
#define REG_EVENT_LOCK_EN_LSB (1U << 12)
#define REG_MD32_APB_INTERNAL_EN_LSB (1U << 14)
/* SPM_WAKEUP_EVENT_MASK (0x10006000+0x0D0) */
#define SPM_WAKEUP_EVENT_MASK_BIT0 (1U << 0)
#define SPM_WAKEUP_EVENT_MASK_CSYSPWREQ_B (1U << 11)
/* DDR_EN_DBC_CON1 (0x10006000+0x0EC) */
#define REG_ALL_DDR_EN_DBC_EN_LSB (1U << 0)
/* SPM_DVFS_MISC (0x10006000+0x4AC) */
DEFINE_BIT(SPM_DVFS_FORCE_ENABLE_LSB, 2)
DEFINE_BIT(SPM_DVFSRC_ENABLE_LSB, 4)
/* SPM_SW_FLAG_0 (0x10006000+0x600) */
#define SPM_FLAG_DISABLE_VCORE_DVS (1U << 3)
#define SPM_FLAG_DISABLE_VCORE_DFS (1U << 4)
#define SPM_FLAG_RUN_COMMON_SCENARIO (1U << 10)
/* SYS_TIMER_CON (0x10006000+0x98C) */
DEFINE_BIT(SYS_TIMER_START_EN_LSB, 0)
/* MD32PCM_CFGREG_SW_RSTN (0x10006000+0xA00) */
DEFINE_BIT(MD32PCM_CFGREG_SW_RSTN_RESET, 0)
/**************************************
* Config and Parameter
**************************************/
#define POWER_ON_VAL1_DEF 0x80015860
#define SPM_WAKEUP_EVENT_MASK_DEF 0xffffffff
#define SPM_BUS_PROTECT_MASK_B_DEF 0xffffffff
#define SPM_BUS_PROTECT2_MASK_B_DEF 0xffffffff
#define MD32PCM_DMA0_CON_VAL 0x0003820e
#define MD32PCM_DMA0_START_VAL 0x00008000
#define MD32PCM_CFGREG_SW_RSTN_RUN 0x1
#define SPM_DVFS_LEVEL_DEF 0x00000001
#define SPM_DVS_DFS_LEVEL_DEF 0x00010001
#define SPM_RESOURCE_ACK_CON0_DEF 0xffffffff
#define SPM_RESOURCE_ACK_CON1_DEF 0xffffffff
#define SPM_RESOURCE_ACK_CON2_DEF 0xffffffff
#define SPM_RESOURCE_ACK_CON3_DEF 0xffffffff
#define ARMPLL_CLK_SEL_DEF 0x3ff
#define SPM_SYSCLK_SETTLE 0x60fe
#define SPM_INIT_DONE_US 20
#define PCM_WDT_TIMEOUT (30 * 32768)
#define PCM_TIMER_MAX (0xffffffff - PCM_WDT_TIMEOUT)
/**************************************
* Definition and Declaration
**************************************/
/* SPM_IRQ_MASK */
DEFINE_BIT(ISRM_TWAM_BF, 2)
DEFINE_BITFIELD(ISRM_RET_IRQ_AUX_BF, 17, 8)
#define ISRM_TWAM (1U << 2)
#define ISRM_RET_IRQ_AUX (0x3ff << 8)
#define ISRM_ALL_EXC_TWAM (ISRM_RET_IRQ_AUX)
#define ISRM_ALL (ISRM_ALL_EXC_TWAM | ISRM_TWAM)
/* SPM_IRQ_STA */
#define ISRS_TWAM (1U << 2)
#define ISRS_PCM_RETURN (1U << 3)
#define ISRC_TWAM ISRS_TWAM
#define ISRC_ALL_EXC_TWAM ISRS_PCM_RETURN
#define ISRC_ALL (ISRC_ALL_EXC_TWAM | ISRC_TWAM)
/* PCM_PWR_IO_EN */
#define PCM_PWRIO_EN_R0 (1U << 0)
#define PCM_PWRIO_EN_R7 (1U << 7)
#define PCM_RF_SYNC_R0 (1U << 16)
#define PCM_RF_SYNC_R6 (1U << 22)
#define PCM_RF_SYNC_R7 (1U << 23)
/* SPM_SWINT */
#define PCM_SW_INT_ALL 0x3ff
struct pwr_ctrl {
/* for SPM */
uint32_t pcm_flags;
/* can override pcm_flags */
uint32_t pcm_flags_cust;
/* set bit of pcm_flags, after pcm_flags_cust */
uint32_t pcm_flags_cust_set;
/* clr bit of pcm_flags, after pcm_flags_cust */
uint32_t pcm_flags_cust_clr;
uint32_t pcm_flags1;
/* can override pcm_flags1 */
uint32_t pcm_flags1_cust;
/* set bit of pcm_flags1, after pcm_flags1_cust */
uint32_t pcm_flags1_cust_set;
/* clr bit of pcm_flags1, after pcm_flags1_cust */
uint32_t pcm_flags1_cust_clr;
/* @ 1T 32K */
uint32_t timer_val;
/* @ 1T 32K, can override timer_val */
uint32_t timer_val_cust;
/* stress for dpidle */
uint32_t timer_val_ramp_en;
/* stress for suspend */
uint32_t timer_val_ramp_en_sec;
uint32_t wake_src;
/* can override wake_src */
uint32_t wake_src_cust;
/* disable wdt in suspend */
uint8_t wdt_disable;
/* SPM_AP_STANDBY_CON */
/* [0] */
uint8_t reg_wfi_op;
/* [1] */
uint8_t reg_wfi_type;
/* [2] */
uint8_t reg_mp0_cputop_idle_mask;
/* [3] */
uint8_t reg_mp1_cputop_idle_mask;
/* [4] */
uint8_t reg_mcusys_idle_mask;
/* [25] */
uint8_t reg_md_apsrc_1_sel;
/* [26] */
uint8_t reg_md_apsrc_0_sel;
/* [29] */
uint8_t reg_conn_apsrc_sel;
/* SPM_SRC_REQ */
/* [0] */
uint8_t reg_spm_apsrc_req;
/* [1] */
uint8_t reg_spm_f26m_req;
/* [3] */
uint8_t reg_spm_infra_req;
/* [4] */
uint8_t reg_spm_vrf18_req;
/* [7] */
uint8_t reg_spm_ddr_en_req;
/* [8] */
uint8_t reg_spm_dvfs_req;
/* [9] */
uint8_t reg_spm_sw_mailbox_req;
/* [10] */
uint8_t reg_spm_sspm_mailbox_req;
/* [11] */
uint8_t reg_spm_adsp_mailbox_req;
/* [12] */
uint8_t reg_spm_scp_mailbox_req;
/* SPM_SRC_MASK */
/* [0] */
uint8_t reg_sspm_srcclkena_0_mask_b;
/* [1] */
uint8_t reg_sspm_infra_req_0_mask_b;
/* [2] */
uint8_t reg_sspm_apsrc_req_0_mask_b;
/* [3] */
uint8_t reg_sspm_vrf18_req_0_mask_b;
/* [4] */
uint8_t reg_sspm_ddr_en_0_mask_b;
/* [5] */
uint8_t reg_scp_srcclkena_mask_b;
/* [6] */
uint8_t reg_scp_infra_req_mask_b;
/* [7] */
uint8_t reg_scp_apsrc_req_mask_b;
/* [8] */
uint8_t reg_scp_vrf18_req_mask_b;
/* [9] */
uint8_t reg_scp_ddr_en_mask_b;
/* [10] */
uint8_t reg_audio_dsp_srcclkena_mask_b;
/* [11] */
uint8_t reg_audio_dsp_infra_req_mask_b;
/* [12] */
uint8_t reg_audio_dsp_apsrc_req_mask_b;
/* [13] */
uint8_t reg_audio_dsp_vrf18_req_mask_b;
/* [14] */
uint8_t reg_audio_dsp_ddr_en_mask_b;
/* [15] */
uint8_t reg_apu_srcclkena_mask_b;
/* [16] */
uint8_t reg_apu_infra_req_mask_b;
/* [17] */
uint8_t reg_apu_apsrc_req_mask_b;
/* [18] */
uint8_t reg_apu_vrf18_req_mask_b;
/* [19] */
uint8_t reg_apu_ddr_en_mask_b;
/* [20] */
uint8_t reg_cpueb_srcclkena_mask_b;
/* [21] */
uint8_t reg_cpueb_infra_req_mask_b;
/* [22] */
uint8_t reg_cpueb_apsrc_req_mask_b;
/* [23] */
uint8_t reg_cpueb_vrf18_req_mask_b;
/* [24] */
uint8_t reg_cpueb_ddr_en_mask_b;
/* [25] */
uint8_t reg_bak_psri_srcclkena_mask_b;
/* [26] */
uint8_t reg_bak_psri_infra_req_mask_b;
/* [27] */
uint8_t reg_bak_psri_apsrc_req_mask_b;
/* [28] */
uint8_t reg_bak_psri_vrf18_req_mask_b;
/* [29] */
uint8_t reg_bak_psri_ddr_en_mask_b;
/* SPM_SRC2_MASK */
/* [0] */
uint8_t reg_msdc0_srcclkena_mask_b;
/* [1] */
uint8_t reg_msdc0_infra_req_mask_b;
/* [2] */
uint8_t reg_msdc0_apsrc_req_mask_b;
/* [3] */
uint8_t reg_msdc0_vrf18_req_mask_b;
/* [4] */
uint8_t reg_msdc0_ddr_en_mask_b;
/* [5] */
uint8_t reg_msdc1_srcclkena_mask_b;
/* [6] */
uint8_t reg_msdc1_infra_req_mask_b;
/* [7] */
uint8_t reg_msdc1_apsrc_req_mask_b;
/* [8] */
uint8_t reg_msdc1_vrf18_req_mask_b;
/* [9] */
uint8_t reg_msdc1_ddr_en_mask_b;
/* [10] */
uint8_t reg_msdc2_srcclkena_mask_b;
/* [11] */
uint8_t reg_msdc2_infra_req_mask_b;
/* [12] */
uint8_t reg_msdc2_apsrc_req_mask_b;
/* [13] */
uint8_t reg_msdc2_vrf18_req_mask_b;
/* [14] */
uint8_t reg_msdc2_ddr_en_mask_b;
/* [15] */
uint8_t reg_ufs_srcclkena_mask_b;
/* [16] */
uint8_t reg_ufs_infra_req_mask_b;
/* [17] */
uint8_t reg_ufs_apsrc_req_mask_b;
/* [18] */
uint8_t reg_ufs_vrf18_req_mask_b;
/* [19] */
uint8_t reg_ufs_ddr_en_mask_b;
/* [20] */
uint8_t reg_usb_srcclkena_mask_b;
/* [21] */
uint8_t reg_usb_infra_req_mask_b;
/* [22] */
uint8_t reg_usb_apsrc_req_mask_b;
/* [23] */
uint8_t reg_usb_vrf18_req_mask_b;
/* [24] */
uint8_t reg_usb_ddr_en_mask_b;
/* [25] */
uint8_t reg_pextp_p0_srcclkena_mask_b;
/* [26] */
uint8_t reg_pextp_p0_infra_req_mask_b;
/* [27] */
uint8_t reg_pextp_p0_apsrc_req_mask_b;
/* [28] */
uint8_t reg_pextp_p0_vrf18_req_mask_b;
/* [29] */
uint8_t reg_pextp_p0_ddr_en_mask_b;
/* SPM_SRC3_MASK */
/* [0] */
uint8_t reg_pextp_p1_srcclkena_mask_b;
/* [1] */
uint8_t reg_pextp_p1_infra_req_mask_b;
/* [2] */
uint8_t reg_pextp_p1_apsrc_req_mask_b;
/* [3] */
uint8_t reg_pextp_p1_vrf18_req_mask_b;
/* [4] */
uint8_t reg_pextp_p1_ddr_en_mask_b;
/* [5] */
uint8_t reg_gce0_infra_req_mask_b;
/* [6] */
uint8_t reg_gce0_apsrc_req_mask_b;
/* [7] */
uint8_t reg_gce0_vrf18_req_mask_b;
/* [8] */
uint8_t reg_gce0_ddr_en_mask_b;
/* [9] */
uint8_t reg_gce1_infra_req_mask_b;
/* [10] */
uint8_t reg_gce1_apsrc_req_mask_b;
/* [11] */
uint8_t reg_gce1_vrf18_req_mask_b;
/* [12] */
uint8_t reg_gce1_ddr_en_mask_b;
/* [13] */
uint8_t reg_spm_srcclkena_reserved_mask_b;
/* [14] */
uint8_t reg_spm_infra_req_reserved_mask_b;
/* [15] */
uint8_t reg_spm_apsrc_req_reserved_mask_b;
/* [16] */
uint8_t reg_spm_vrf18_req_reserved_mask_b;
/* [17] */
uint8_t reg_spm_ddr_en_reserved_mask_b;
/* [18] */
uint8_t reg_disp0_apsrc_req_mask_b;
/* [19] */
uint8_t reg_disp0_ddr_en_mask_b;
/* [20] */
uint8_t reg_disp1_apsrc_req_mask_b;
/* [21] */
uint8_t reg_disp1_ddr_en_mask_b;
/* [22] */
uint8_t reg_disp2_apsrc_req_mask_b;
/* [23] */
uint8_t reg_disp2_ddr_en_mask_b;
/* [24] */
uint8_t reg_disp3_apsrc_req_mask_b;
/* [25] */
uint8_t reg_disp3_ddr_en_mask_b;
/* [26] */
uint8_t reg_infrasys_apsrc_req_mask_b;
/* [27] */
uint8_t reg_infrasys_ddr_en_mask_b;
/* [28] */
uint8_t reg_cg_check_srcclkena_mask_b;
/* [29] */
uint8_t reg_cg_check_apsrc_req_mask_b;
/* [30] */
uint8_t reg_cg_check_vrf18_req_mask_b;
/* [31] */
uint8_t reg_cg_check_ddr_en_mask_b;
/* SPM_SRC4_MASK */
/* [8:0] */
uint32_t reg_mcusys_merge_apsrc_req_mask_b;
/* [17:9] */
uint32_t reg_mcusys_merge_ddr_en_mask_b;
/* [19:18] */
uint8_t reg_dramc_md32_infra_req_mask_b;
/* [21:20] */
uint8_t reg_dramc_md32_vrf18_req_mask_b;
/* [23:22] */
uint8_t reg_dramc_md32_ddr_en_mask_b;
/* [24] */
uint8_t reg_dvfsrc_event_trigger_mask_b;
/* SPM_WAKEUP_EVENT_MASK2 */
/* [3:0] */
uint8_t reg_sc_sw2spm_wakeup_mask_b;
/* [4] */
uint8_t reg_sc_adsp2spm_wakeup_mask_b;
/* [8:5] */
uint8_t reg_sc_sspm2spm_wakeup_mask_b;
/* [9] */
uint8_t reg_sc_scp2spm_wakeup_mask_b;
/* [10] */
uint8_t reg_csyspwrup_ack_mask;
/* [11] */
uint8_t reg_csyspwrup_req_mask;
/* SPM_WAKEUP_EVENT_MASK */
/* [31:0] */
uint32_t reg_wakeup_event_mask;
/* SPM_WAKEUP_EVENT_EXT_MASK */
/* [31:0] */
uint32_t reg_ext_wakeup_event_mask;
};
enum {
DISP_PWR_STA_MASK = 0x1 << 20,
DISP_SRAM_PDN_MASK = 0x1 << 8,
DISP_SRAM_ACK_MASK = 0x1 << 12,
AUDIO_PWR_STA_MASK = 0x1 << 21,
AUDIO_SRAM_PDN_MASK = 0x1 << 8,
AUDIO_SRAM_ACK_MASK = 0x1 << 12,
};
struct mtk_spm_regs {
u32 poweron_config_set;
u32 spm_power_on_val0;
u32 spm_power_on_val1;
u32 spm_clk_con;
u32 spm_clk_settle;
u32 spm_ap_standby_con;
u32 pcm_con0;
u32 pcm_con1;
u32 spm_power_on_val2;
u32 spm_power_on_val3;
u32 pcm_reg_data_ini;
u32 pcm_pwr_io_en;
u32 pcm_timer_val;
u32 pcm_wdt_val;
u32 rsv_6038[2];
u32 spm_sw_rst_con;
u32 spm_sw_rst_con_set;
u32 spm_sw_rst_con_clr;
u32 rsv_604c;
u32 spm_arbiter_en;
u32 scpsys_clk_con;
u32 spm_sram_rsv_con;
u32 spm_swint;
u32 spm_swint_set;
u32 spm_swint_clr;
u32 spm_scp_mailbox;
u32 scp_spm_mailbox;
u32 spm_scp_irq;
u32 spm_cpu_wakeup_event;
u32 spm_irq_mask;
u32 rsv_607c;
u32 spm_src_req;
u32 spm_src_mask;
u32 spm_src2_mask;
u32 rsv_608c;
u32 spm_src3_mask;
u32 spm_src4_mask;
u32 spm_wakeup_event_mask2;
u32 spm_wakeup_event_mask;
u32 spm_wakeup_event_sens;
u32 spm_wakeup_event_clear;
u32 spm_wakeup_event_ext_mask;
u32 scp_clk_con;
u32 pcm_debug_con;
u32 ddren_dbc_con;
u32 spm_resource_ack_con0;
u32 spm_resource_ack_con1;
u32 spm_resource_ack_con2;
u32 spm_resource_ack_con3;
u32 spm_resource_ack_con4;
u32 spm_sram_con;
u32 rsv_60d0[12];
u32 pcm_reg0_data;
u32 pcm_reg2_data;
u32 pcm_reg6_data;
u32 pcm_reg7_data;
u32 pcm_reg13_data;
u32 src_req_sta_0;
u32 src_req_sta_1;
u32 rsv_611c;
u32 src_req_sta_2;
u32 src_req_sta_3;
u32 src_req_sta_4;
u32 rsv_612c;
u32 pcm_timer_out;
u32 pcm_wdt_out;
u32 spm_irq_sta;
u32 md32pcm_wakeup_sta;
u32 md32pcm_event_sta;
u32 spm_wakeup_sta;
u32 spm_wakeup_ext_sta;
u32 spm_wakeup_misc;
u32 mm_dvfs_halt;
u32 rsv_6154[4];
u32 subsys_idle_sta;
u32 pcm_sta;
u32 pwr_status;
u32 pwr_status_2nd;
u32 cpu_pwr_status;
u32 cpu_pwr_status_2nd;
u32 spm_vtcxo_event_count_sta;
u32 spm_infra_event_count_sta;
u32 spm_vrf18_event_count_sta;
u32 spm_apsrc_event_count_sta;
u32 spm_ddren_event_count_sta;
u32 md32pcm_sta;
u32 md32pcm_pc;
u32 other_pwr_status;
u32 dvfsrc_event_sta;
u32 bus_protect_rdy;
u32 bus_protect1_rdy;
u32 bus_protect2_rdy;
u32 bus_protect3_rdy;
u32 bus_protect4_rdy;
u32 bus_protect5_rdy;
u32 bus_protect6_rdy;
u32 bus_protect7_rdy;
u32 bus_protect8_rdy;
u32 bus_protect9_rdy;
u32 rsv_61c8[2];
u32 spm_twam_last_sta0;
u32 spm_twam_last_sta1;
u32 spm_twam_last_sta2;
u32 spm_twam_last_sta3;
u32 spm_twam_curr_sta0;
u32 spm_twam_curr_sta1;
u32 spm_twam_curr_sta2;
u32 spm_twam_curr_sta3;
u32 spm_twam_timer_out;
u32 spm_cg_check_sta;
u32 spm_dvfs_sta;
u32 spm_dvfs_opp_sta;
u32 cpueb_pwr_con;
u32 spm_mcusys_pwr_con;
u32 spm_cputop_pwr_con;
u32 spm_cpu0_pwr_con;
u32 spm_cpu1_pwr_con;
u32 spm_cpu2_pwr_con;
u32 spm_cpu3_pwr_con;
u32 spm_cpu4_pwr_con;
u32 spm_cpu5_pwr_con;
u32 spm_cpu6_pwr_con;
u32 spm_cpu7_pwr_con;
u32 armpll_clk_con;
u32 mcusys_idle_sta;
u32 gic_wakeup_sta;
u32 cpu_spare_con;
u32 cpu_spare_con_set;
u32 cpu_spare_con_clr;
u32 armpll_clk_sel;
u32 ext_int_wakeup_req;
u32 ext_int_wakeup_req_set;
u32 ext_int_wakeup_req_clr;
u32 rsv_6254[3];
u32 cpu_irq_mask;
u32 cpu_irq_mask_set;
u32 cpu_irq_mask_clr;
u32 rsv_626c[5];
u32 cpu_wfi_en;
u32 cpu_wfi_en_set;
u32 cpu_wfi_en_clr;
u32 rsv_628c;
u32 sysram_con;
u32 sysrom_con;
u32 rsv_6298[2];
u32 root_cputop_addr;
u32 root_core_addr;
u32 rsv_62a8[10];
u32 spm2sw_mailbox_0;
u32 spm2sw_mailbox_1;
u32 spm2sw_mailbox_2;
u32 spm2sw_mailbox_3;
u32 sw2spm_int;
u32 sw2spm_int_set;
u32 sw2spm_int_clr;
u32 sw2spm_mailbox_0;
u32 sw2spm_mailbox_1;
u32 sw2spm_mailbox_2;
u32 sw2spm_mailbox_3;
u32 sw2spm_cfg;
u32 mfg0_pwr_con;
u32 mfg1_pwr_con;
u32 mfg2_pwr_con;
u32 mfg3_pwr_con;
u32 mfg4_pwr_con;
u32 mfg5_pwr_con;
u32 mfg6_pwr_con;
u32 ifr_pwr_con;
u32 ifr_sub_pwr_con;
u32 peri_pwr_con;
u32 pextp_mac_top_p0_pwr_con;
u32 pextp_mac_top_p1_pwr_con;
u32 pcie_phy_pwr_con;
u32 ssusb_pcie_phy_pwr_con;
u32 ssusb_top_p1_pwr_con;
u32 ssusb_top_p2_pwr_con;
u32 ssusb_top_p3_pwr_con;
u32 ether_pwr_con;
u32 dpy0_pwr_con;
u32 dpy1_pwr_con;
u32 dpm0_pwr_con;
u32 dpm1_pwr_con;
u32 audio_pwr_con;
u32 audio_asrc_pwr_con;
u32 adsp_pwr_con;
u32 vppsys0_pwr_con;
u32 vppsys1_pwr_con;
u32 vdosys0_pwr_con;
u32 vdosys1_pwr_con;
u32 wpesys_pwr_con;
u32 dp_tx_pwr_con;
u32 edp_tx_pwr_con;
u32 hdmi_tx_pwr_con;
u32 hdmi_rx_pwr_con;
u32 vde0_pwr_con;
u32 vde1_pwr_con;
u32 vde2_pwr_con;
u32 ven_pwr_con;
u32 ven_core1_pwr_con;
u32 cam_pwr_con;
u32 cam_rawa_pwr_con;
u32 cam_rawb_pwr_con;
u32 cam_rawc_pwr_con;
u32 img_m_pwr_con;
u32 img_d_pwr_con;
u32 ipe_pwr_con;
u32 nna0_pwr_con;
u32 nna1_pwr_con;
u32 ipnna_pwr_con;
u32 csi_rx_top_pwr_con;
u32 rsv_63c8;
u32 sspm_sram_con;
u32 scp_sram_con;
u32 ufs_sram_con;
u32 devapc_ifr_sram_con;
u32 devapc_subifr_sram_con;
u32 devapc_acp_sram_con;
u32 usb_sram_con;
u32 dummy_sram_con;
u32 ext_buck_iso;
u32 msdc_sram_con;
u32 debugtop_sram_con;
u32 dpmaif_sram_con;
u32 gcpu_sram_con;
u32 spm_mem_ck_sel;
u32 spm_bus_protect_mask_b;
u32 spm_bus_protect1_mask_b;
u32 spm_bus_protect2_mask_b;
u32 spm_bus_protect3_mask_b;
u32 spm_bus_protect4_mask_b;
u32 spm_bus_protect5_mask_b;
u32 spm_bus_protect6_mask_b;
u32 spm_bus_protect7_mask_b;
u32 spm_bus_protect8_mask_b;
u32 spm_bus_protect9_mask_b;
u32 spm_emi_bw_mode;
u32 rsv_6430;
u32 spm2mm_con;
u32 spm2cpueb_con;
u32 ap_mdsrc_req;
u32 spm2emi_enter_ulpm;
u32 spm_pll_con;
u32 rc_spm_ctrl;
u32 spm_dram_mcu_sw_con_0;
u32 spm_dram_mcu_sw_con_1;
u32 spm_dram_mcu_sw_con_2;
u32 spm_dram_mcu_sw_con_3;
u32 spm_dram_mcu_sw_con_4;
u32 spm_dram_mcu_sta_0;
u32 spm_dram_mcu_sta_1;
u32 spm_dram_mcu_sta_2;
u32 spm_dram_mcu_sw_sel_0;
u32 relay_dvfs_level;
u32 dramc_dpy_clk_sw_con_0;
u32 dramc_dpy_clk_sw_con_1;
u32 dramc_dpy_clk_sw_con_2;
u32 dramc_dpy_clk_sw_con_3;
u32 dramc_dpy_clk_sw_sel_0;
u32 dramc_dpy_clk_sw_sel_1;
u32 dramc_dpy_clk_sw_sel_2;
u32 dramc_dpy_clk_sw_sel_3;
u32 dramc_dpy_clk_spm_con;
u32 spm_dvfs_level;
u32 spm_cirq_con;
u32 spm_dvfs_misc;
u32 rg_module_sw_cg_0_mask_req_0;
u32 rg_module_sw_cg_0_mask_req_1;
u32 rg_module_sw_cg_0_mask_req_2;
u32 rg_module_sw_cg_1_mask_req_0;
u32 rg_module_sw_cg_1_mask_req_1;
u32 rg_module_sw_cg_1_mask_req_2;
u32 rg_module_sw_cg_2_mask_req_0;
u32 rg_module_sw_cg_2_mask_req_1;
u32 rg_module_sw_cg_2_mask_req_2;
u32 rg_module_sw_cg_3_mask_req_0;
u32 rg_module_sw_cg_3_mask_req_1;
u32 rg_module_sw_cg_3_mask_req_2;
u32 pwr_status_mask_req_0;
u32 pwr_status_mask_req_1;
u32 pwr_status_mask_req_2;
u32 spm_cg_check_con;
u32 spm_src_rdy_sta;
u32 spm_dvs_dfs_level;
u32 spm_force_dvfs;
u32 dramc_mcu_sram_con;
u32 dramc_mcu2_sram_con;
u32 dpy_shu_sram_con;
u32 dpy_shu2_sram_con;
u32 rsv_6500[64];
u32 spm_sw_flag_0;
u32 spm_sw_debug_0;
u32 spm_sw_flag_1;
u32 spm_sw_debug_1;
u32 spm_sw_rsv_0;
u32 spm_sw_rsv_1;
u32 spm_sw_rsv_2;
u32 spm_sw_rsv_3;
u32 spm_sw_rsv_4;
u32 spm_sw_rsv_5;
u32 spm_sw_rsv_6;
u32 spm_sw_rsv_7;
u32 spm_sw_rsv_8;
u32 spm_bk_wake_event;
u32 spm_bk_vtcxo_dur;
u32 spm_bk_wake_misc;
u32 spm_bk_pcm_timer;
u32 ulposc_con;
u32 rsv_6648[2];
u32 spm_rsv_con_0;
u32 spm_rsv_con_1;
u32 spm_rsv_sta_0;
u32 spm_rsv_sta_1;
u32 spm_spare_con;
u32 spm_spare_con_set;
u32 spm_spare_con_clr;
u32 spm_cross_wake_m00_req;
u32 spm_cross_wake_m01_req;
u32 spm_cross_wake_m02_req;
u32 spm_cross_wake_m03_req;
u32 scp_vcore_level;
u32 sc_mm_ck_sel_con;
u32 spare_ack_mask;
u32 rsv_6688;
u32 spm_dv_con_0;
u32 spm_dv_con_1;
u32 spm_dv_sta;
u32 conn_xowcn_debug_en;
u32 spm_sema_m0;
u32 spm_sema_m1;
u32 spm_sema_m2;
u32 spm_sema_m3;
u32 spm_sema_m4;
u32 spm_sema_m5;
u32 spm_sema_m6;
u32 spm_sema_m7;
u32 spm2adsp_mailbox;
u32 adsp2spm_mailbox;
u32 spm_adsp_irq;
u32 spm_md32_irq;
u32 spm2pmcu_mailbox_0;
u32 spm2pmcu_mailbox_1;
u32 spm2pmcu_mailbox_2;
u32 spm2pmcu_mailbox_3;
u32 pmcu2spm_mailbox_0;
u32 pmcu2spm_mailbox_1;
u32 pmcu2spm_mailbox_2;
u32 pmcu2spm_mailbox_3;
u32 ufs_psri_sw;
u32 ufs_psri_sw_set;
u32 ufs_psri_sw_clr;
u32 spm_ap_sema;
u32 spm_spm_sema;
u32 spm_dvfs_con;
u32 spm_dvfs_con_sta;
u32 spm_pmic_spmi_con;
u32 rsv_670c;
u32 spm_dvfs_cmd0;
u32 spm_dvfs_cmd1;
u32 spm_dvfs_cmd2;
u32 spm_dvfs_cmd3;
u32 spm_dvfs_cmd4;
u32 spm_dvfs_cmd5;
u32 spm_dvfs_cmd6;
u32 spm_dvfs_cmd7;
u32 spm_dvfs_cmd8;
u32 spm_dvfs_cmd9;
u32 spm_dvfs_cmd10;
u32 spm_dvfs_cmd11;
u32 spm_dvfs_cmd12;
u32 spm_dvfs_cmd13;
u32 spm_dvfs_cmd14;
u32 spm_dvfs_cmd15;
u32 spm_dvfs_cmd16;
u32 spm_dvfs_cmd17;
u32 spm_dvfs_cmd18;
u32 spm_dvfs_cmd19;
u32 spm_dvfs_cmd20;
u32 spm_dvfs_cmd21;
u32 spm_dvfs_cmd22;
u32 spm_dvfs_cmd23;
u32 sys_timer_value_l;
u32 sys_timer_value_h;
u32 sys_timer_start_l;
u32 sys_timer_start_h;
u32 sys_timer_latch_l_00;
u32 sys_timer_latch_h_00;
u32 sys_timer_latch_l_01;
u32 sys_timer_latch_h_01;
u32 sys_timer_latch_l_02;
u32 sys_timer_latch_h_02;
u32 sys_timer_latch_l_03;
u32 sys_timer_latch_h_03;
u32 sys_timer_latch_l_04;
u32 sys_timer_latch_h_04;
u32 sys_timer_latch_l_05;
u32 sys_timer_latch_h_05;
u32 sys_timer_latch_l_06;
u32 sys_timer_latch_h_06;
u32 sys_timer_latch_l_07;
u32 sys_timer_latch_h_07;
u32 sys_timer_latch_l_08;
u32 sys_timer_latch_h_08;
u32 sys_timer_latch_l_09;
u32 sys_timer_latch_h_09;
u32 sys_timer_latch_l_10;
u32 sys_timer_latch_h_10;
u32 sys_timer_latch_l_11;
u32 sys_timer_latch_h_11;
u32 sys_timer_latch_l_12;
u32 sys_timer_latch_h_12;
u32 sys_timer_latch_l_13;
u32 sys_timer_latch_h_13;
u32 sys_timer_latch_l_14;
u32 sys_timer_latch_h_14;
u32 sys_timer_latch_l_15;
u32 sys_timer_latch_h_15;
u32 pcm_wdt_latch_0;
u32 pcm_wdt_latch_1;
u32 pcm_wdt_latch_2;
u32 pcm_wdt_latch_3;
u32 pcm_wdt_latch_4;
u32 pcm_wdt_latch_5;
u32 pcm_wdt_latch_6;
u32 pcm_wdt_latch_7;
u32 pcm_wdt_latch_8;
u32 pcm_wdt_latch_9;
u32 pcm_wdt_latch_10;
u32 pcm_wdt_latch_11;
u32 pcm_wdt_latch_12;
u32 pcm_wdt_latch_13;
u32 pcm_wdt_latch_14;
u32 pcm_wdt_latch_15;
u32 pcm_wdt_latch_16;
u32 pcm_wdt_latch_17;
u32 pcm_wdt_latch_18;
u32 pcm_wdt_latch_spare_0;
u32 pcm_wdt_latch_spare_1;
u32 pcm_wdt_latch_spare_2;
u32 rsv_6858[18];
u32 dramc_gating_err_latch_ch0_0;
u32 dramc_gating_err_latch_ch0_1;
u32 dramc_gating_err_latch_ch0_2;
u32 dramc_gating_err_latch_ch0_3;
u32 dramc_gating_err_latch_ch0_4;
u32 dramc_gating_err_latch_ch0_5;
u32 rsv_68b8[15];
u32 dramc_gating_err_latch_spare_0;
u32 rsv_68f8[2];
u32 spm_ack_chk_con_0;
u32 spm_ack_chk_pc_0;
u32 spm_ack_chk_sel_0;
u32 spm_ack_chk_timer_0;
u32 spm_ack_chk_sta_0;
u32 spm_ack_chk_swint_0;
u32 rsv_6918[2];
u32 spm_ack_chk_con_1;
u32 spm_ack_chk_pc_1;
u32 spm_ack_chk_sel_1;
u32 spm_ack_chk_timer_1;
u32 spm_ack_chk_sta_1;
u32 spm_ack_chk_swint_1;
u32 rsv_6938[2];
u32 spm_ack_chk_con_2;
u32 spm_ack_chk_pc_2;
u32 spm_ack_chk_sel_2;
u32 spm_ack_chk_timer_2;
u32 spm_ack_chk_sta_2;
u32 spm_ack_chk_swint_2;
u32 rsv_6958[2];
u32 spm_ack_chk_con_3;
u32 spm_ack_chk_pc_3;
u32 spm_ack_chk_sel_3;
u32 spm_ack_chk_timer_3;
u32 spm_ack_chk_sta_3;
u32 spm_ack_chk_swint_3;
u32 spm_counter_0;
u32 spm_counter_1;
u32 spm_counter_2;
u32 rsv_6984[2];
u32 sys_timer_con;
u32 spm_twam_con;
u32 spm_twam_window_len;
u32 spm_twam_idle_sel;
u32 spm_twam_event_clear;
u32 rsv_69a0[24];
u32 md32pcm_cfgreg_sw_rstn;
u32 rsv_a04[127];
u32 md32pcm_dma0_src;
u32 md32pcm_dma0_dst;
u32 md32pcm_dma0_wppt;
u32 md32pcm_dma0_wpto;
u32 md32pcm_dma0_count;
u32 md32pcm_dma0_con;
u32 md32pcm_dma0_start;
u32 rsv_c1c[2];
u32 md32pcm_dma0_rlct;
u32 rsv_c28[182];
u32 pmsr_last_dat;
u32 pmsr_last_cnt;
u32 pmsr_last_ack;
u32 rsv_6f0c;
u32 spm_pmsr_sel_con0;
u32 spm_pmsr_sel_con1;
u32 spm_pmsr_sel_con2;
u32 spm_pmsr_sel_con3;
u32 spm_pmsr_sel_con4;
u32 spm_pmsr_sel_con5;
u32 spm_pmsr_sel_con6;
u32 spm_pmsr_sel_con7;
u32 spm_pmsr_sel_con8;
u32 spm_pmsr_sel_con9;
u32 rsv_6f38;
u32 spm_pmsr_sel_con10;
u32 spm_pmsr_sel_con11;
u32 rsv_6f44[29];
u32 spm_pmsr_tiemr_sta0;
u32 spm_pmsr_tiemr_sta1;
u32 spm_pmsr_tiemr_sta2;
u32 spm_pmsr_general_con0;
u32 spm_pmsr_general_con1;
u32 spm_pmsr_general_con2;
u32 spm_pmsr_general_con3;
u32 spm_pmsr_general_con4;
u32 spm_pmsr_general_con5;
u32 spm_pmsr_sw_reset;
u32 spm_pmsr_mon_con0;
u32 spm_pmsr_mon_con1;
u32 spm_pmsr_mon_con2;
u32 spm_pmsr_len_con0;
u32 spm_pmsr_len_con1;
u32 spm_pmsr_len_con2;
};
check_member(mtk_spm_regs, pwr_status, 0x016c);
check_member(mtk_spm_regs, audio_pwr_con, 0x0358);
check_member(mtk_spm_regs, ap_mdsrc_req, 0x043c);
check_member(mtk_spm_regs, ulposc_con, 0x644);
static struct mtk_spm_regs *const mtk_spm = (void *)SPM_BASE;
struct pcm_desc {
u32 pmem_words;
u32 total_words;
u32 pmem_start;
u32 dmem_start;
};
struct dyna_load_pcm {
u8 *buf; /* binary array */
struct pcm_desc desc;
};
int spm_init(void);
static const struct power_domain_data disp[] = {
{
.pwr_con = &mtk_spm->vppsys0_pwr_con,
.pwr_sta_mask = 0x1 << 11,
.sram_pdn_mask = 0x1 << 8,
.sram_ack_mask = 0x1 << 12,
},
{
.pwr_con = &mtk_spm->vdosys0_pwr_con,
.pwr_sta_mask = 0x1 << 13,
.sram_pdn_mask = 0x1 << 8,
.sram_ack_mask = 0x1 << 12,
},
{
.pwr_con = &mtk_spm->vppsys1_pwr_con,
.pwr_sta_mask = 0x1 << 12,
.sram_pdn_mask = 0x1 << 8,
.sram_ack_mask = 0x1 << 12,
},
{
.pwr_con = &mtk_spm->vdosys1_pwr_con,
.pwr_sta_mask = 0x1 << 14,
.sram_pdn_mask = 0x1 << 8,
.sram_ack_mask = 0x1 << 12,
},
{
.pwr_con = &mtk_spm->edp_tx_pwr_con,
.pwr_sta_mask = 0x1 << 17,
.sram_pdn_mask = 0x1 << 8,
.sram_ack_mask = 0x1 << 12,
},
};
static const struct power_domain_data audio[] = {
{
.pwr_con = &mtk_spm->audio_pwr_con,
.pwr_sta_mask = AUDIO_PWR_STA_MASK,
.sram_pdn_mask = AUDIO_SRAM_PDN_MASK,
.sram_ack_mask = AUDIO_SRAM_ACK_MASK,
},
};
#endif /* SOC_MEDIATEK_MT8195_SPM_H */