//extern void enter_pasr_dpd_config(unsigned char segment_rank0, unsigned char segment_rank1); //extern void exit_pasr_dpd_config(void); static int enter_pasrdpd(void) { int error = 0; u32 sr = 0, dpd = 0; slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("[%s]\n",__FUNCTION__); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); /* Setup SPM wakeup event firstly */ spm_set_wakeup_src_check(); /* Start PASR/DPD SW operations */ error = pasr_enter(&sr, &dpd); if (error) { slp_crit2("[PM_WAKEUP] Failed to enter PASR!\n"); } else { /* Call SPM/DPD control API */ slp_crit2("MR17[0x%x] DPD[0x%x]\n",sr,dpd); /* Should configure SR */ if (mtkpasr_enable_sr == 0) { sr = 0x0; slp_crit2("[%s][%d] No configuration on SR\n",__FUNCTION__,__LINE__); } /* Configure PASR */ //enter_pasr_dpd_config((sr & 0xFF), (sr >> 0x8)); //if (mrw_error) { // printk(KERN_ERR "[%s][%d] PM: Failed to configure MRW PASR [%d]!\n",__FUNCTION__,__LINE__,mrw_error); //} } slp_crit2("Bye [%s]\n",__FUNCTION__); return error; }
static int slp_suspend_ops_enter(suspend_state_t state) { /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("Chip_pm_enter\n"); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); if (slp_dump_gpio) gpio_dump_regs(); if (slp_dump_regs) slp_dump_pm_regs(); if (!spm_cpusys_can_power_down()) { slp_error("CANNOT SLEEP DUE TO CPU1/2/3 PON\n"); return -EPERM; } if (slp_infra_pdn && !slp_cpu_pdn) { slp_error("CANNOT SLEEP DUE TO INFRA PDN BUT CPU PON\n"); return -EPERM; } #if SLP_SLEEP_DPIDLE_EN if (slp_ck26m_on) slp_wake_reason = spm_go_to_sleep_dpidle(slp_cpu_pdn, 0); else #endif slp_wake_reason = spm_go_to_sleep(slp_cpu_pdn, slp_infra_pdn); return 0; }
static void slp_suspend_ops_end(void) { /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_notice("Chip_pm_end\n"); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); }
static void slp_suspend_ops_finish(void) { /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("Chip_pm_finish\n"); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); }
static int slp_suspend_ops_begin(suspend_state_t state) { /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_notice("Chip_pm_begin(%u)(%u)\n", is_cpu_pdn(slp_spm_flags), is_infra_pdn(slp_spm_flags)); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_wake_reason = WR_NONE; return 0; }
static int slp_suspend_ops_prepare(void) { /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("Chip_pm_prepare\n"); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); if (slp_chk_golden) mt_power_gs_dump_suspend(); return 0; }
static int slp_suspend_ops_prepare(void) { /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("Chip_pm_prepare\n"); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); if (slp_chk_golden) Golden_Setting_Compare_for_Suspend(); return 0; }
static int slp_suspend_ops_prepare(void) { /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("Chip_pm_prepare\n"); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); //FIXME: for K2 fpga early porting #if 1 if (slp_chk_golden) mt_power_gs_dump_suspend(); #endif return 0; }
static void leave_pasrdpd(void) { int mrw_error = 0; slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("[%s]\n",__FUNCTION__); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); /* Disable PASR */ mrw_error = configure_mrw_pasr(0x0, 0x0); /* End PASR/DPD SW operations */ pasr_exit(); }
static void leave_pasrdpd(void) { slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("[%s]\n",__FUNCTION__); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); /* Disable PASR */ //exit_pasr_dpd_config(); slp_crit2("[%d]\n",__LINE__); /* End PASR/DPD SW operations */ pasr_exit(); slp_crit2("Bye [%s]\n",__FUNCTION__); }
/* * wakesrc : WAKE_SRC_XXX * enable : enable or disable @wakesrc * ck26m_on: if true, mean @wakesrc needs 26M to work */ int slp_set_wakesrc(u32 wakesrc, bool enable, bool ck26m_on) { int r; unsigned long flags; slp_notice("wakesrc = 0x%x, enable = %u, ck26m_on = %u\n", wakesrc, enable, ck26m_on); #if SLP_REPLACE_DEF_WAKESRC if (wakesrc & WAKE_SRC_CFG_KEY) #else if (!(wakesrc & WAKE_SRC_CFG_KEY)) #endif return -EPERM; spin_lock_irqsave(&slp_lock, flags); #if SLP_REPLACE_DEF_WAKESRC if (ck26m_on) r = spm_set_dpidle_wakesrc(wakesrc, enable, true); else r = spm_set_sleep_wakesrc(wakesrc, enable, true); #else if (ck26m_on) r = spm_set_dpidle_wakesrc(wakesrc & ~WAKE_SRC_CFG_KEY, enable, false); else r = spm_set_sleep_wakesrc(wakesrc & ~WAKE_SRC_CFG_KEY, enable, false); #endif if (!r) slp_ck26m_on = ck26m_on; spin_unlock_irqrestore(&slp_lock, flags); return r; }
static int slp_suspend_ops_enter(suspend_state_t state) { #ifdef CONFIG_MTKPASR /* PASR SW operations */ if (enter_pasrdpd()) goto pending_wakeup; #endif /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("Chip_pm_enter\n"); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); if (slp_dump_gpio) gpio_dump_regs(); if (slp_dump_regs) slp_dump_pm_regs(); if (!spm_cpusys0_can_power_down()) { slp_error("CANNOT SLEEP DUE TO CPU1/2/3 PON\n"); return -EPERM; } if (slp_infra_pdn && !slp_cpu_pdn) { slp_error("CANNOT SLEEP DUE TO INFRA PDN BUT CPU PON\n"); return -EPERM; } #if SLP_SLEEP_DPIDLE_EN if (slp_ck26m_on) slp_wake_reason = spm_go_to_sleep_dpidle(slp_cpu_pdn, slp_pwrlevel, slp_pwake_time); else #endif slp_wake_reason = spm_go_to_sleep(slp_cpu_pdn, slp_infra_pdn, slp_pwake_time); #ifdef CONFIG_MTKPASR /* PASR SW operations */ leave_pasrdpd(); pending_wakeup: #endif return 0; }
static void slp_suspend_ops_end(void) { /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_notice("Chip_pm_end\n"); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); if (1 == slp_auto_suspend_resume) { slp_crit2("slp_auto_suspend_resume_cnt = %d \n", slp_auto_suspend_resume_cnt); slp_auto_suspend_resume_cnt++; if (10 < slp_auto_suspend_resume_cnt) { slp_crit2("do spm_usb_resume\n"); wake_lock(&spm_suspend_lock); slp_auto_suspend_resume = 0; slp_auto_suspend_resume_cnt =0; } } }
void slp_module_init(void) { spm_output_sleep_option(); slp_notice("SLEEP_DPIDLE_EN:%d, REPLACE_DEF_WAKESRC:%d, SUSPEND_LOG_EN:%d\n", SLP_SLEEP_DPIDLE_EN, SLP_REPLACE_DEF_WAKESRC, SLP_SUSPEND_LOG_EN); suspend_set_ops(&slp_suspend_ops); #if SLP_SUSPEND_LOG_EN console_suspend_enabled = 0; #endif }
void slp_module_init(void) { spm_output_sleep_option(); slp_notice("SLEEP_DPIDLE_EN:%d, REPLACE_DEF_WAKESRC:%d, SUSPEND_LOG_EN:%d\n", SLP_SLEEP_DPIDLE_EN, SLP_REPLACE_DEF_WAKESRC, SLP_SUSPEND_LOG_EN); // FIXME: for bring up #if 1 suspend_set_ops(&slp_suspend_ops); #endif #if SLP_SUSPEND_LOG_EN console_suspend_enabled = 0; #endif spm_set_suspned_pcm_init_flag(&slp_spm_flags); wake_lock_init(&spm_suspend_lock, WAKE_LOCK_SUSPEND, "spm_wakelock"); }
static void slp_suspend_ops_wake(void) { slp_notice("[%s]\n",__FUNCTION__); }
static int slp_suspend_ops_prepare_late(void) { slp_notice("[%s]\n",__FUNCTION__); mtkpasr_phaseone_ops(); return 0; }
static int slp_suspend_ops_enter(suspend_state_t state) { int ret = 0; #ifdef CONFIG_MTK_TC1_FM_AT_SUSPEND int fm_radio_is_playing = 0; if ( ConditionEnterSuspend() == true ) fm_radio_is_playing = 0; else fm_radio_is_playing = 1; #endif /* CONFIG_MTK_TC1_FM_AT_SUSPEND */ #ifdef CONFIG_MTKPASR /* PASR SW operations */ enter_pasrdpd(); #endif /* legacy log */ slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); slp_crit2("Chip_pm_enter\n"); slp_notice("@@@@@@@@@@@@@@@@@@@@\n"); //FIXME: for K2 bring up if (slp_dump_gpio) gpio_dump_regs(); #if 0 if (slp_dump_regs) slp_dump_pm_regs(); #endif if (slp_check_mtcmos_pll) slp_check_pm_mtcmos_pll(); if (!spm_cpusys0_can_power_down()) { slp_error("CANNOT SLEEP DUE TO CPU1~x PON, SPM_PWR_STATUS = 0x%x, SPM_PWR_STATUS_2ND = 0x%x\n", slp_read(SPM_PWR_STATUS), slp_read(SPM_PWR_STATUS_2ND)); //return -EPERM; ret = -EPERM; goto LEAVE_SLEEP; } if (is_infra_pdn(slp_spm_flags) && !is_cpu_pdn(slp_spm_flags)) { slp_error("CANNOT SLEEP DUE TO INFRA PDN BUT CPU PON\n"); //return -EPERM; ret = -EPERM; goto LEAVE_SLEEP; } /* only for test */ #if 0 slp_pasr_en(1, 0x0); slp_dpd_en(1); #endif #if SLP_SLEEP_DPIDLE_EN #ifdef CONFIG_MTK_TC1_FM_AT_SUSPEND if (slp_ck26m_on | fm_radio_is_playing) #else if (slp_ck26m_on) #endif slp_wake_reason = spm_go_to_sleep_dpidle(slp_spm_deepidle_flags, slp_spm_data); else #endif slp_wake_reason = spm_go_to_sleep(slp_spm_flags, slp_spm_data); LEAVE_SLEEP: #ifdef CONFIG_MTKPASR /* PASR SW operations */ leave_pasrdpd(); #endif #ifdef CONFIG_MTK_SYSTRACKER systracker_enable(); #endif return ret; }