int mmdvfs_set_step(MTK_SMI_BWC_SCEN scenario, mmdvfs_voltage_enum step) { int i, scen_index; mmdvfs_voltage_enum final_step = mmdvfs_get_default_step(); #if !MMDVFS_ENABLE return 0; #endif #if defined(SMI_D1) /* D1 FHD always HPM. do not have to trigger vcore dvfs. */ if (mmdvfs_get_lcd_resolution() == MMDVFS_LCD_SIZE_FHD) return 0; #endif MMDVFSMSG("MMDVFS set voltage scen %d step %d\n", scenario, step); if ((scenario >= MMDVFS_SCEN_COUNT) || (scenario < SMI_BWC_SCEN_NORMAL)) { MMDVFSERR("invalid scenario\n"); return -1; } /* dump information */ mmdvfs_dump_info(); /* go through all scenarios to decide the final step */ scen_index = (int)scenario; spin_lock(&g_mmdvfs_mgr->scen_lock); g_mmdvfs_scenario_voltage[scen_index] = step; /* one high = final high */ for (i = 0; i < MMDVFS_SCEN_COUNT; i++) { if (g_mmdvfs_scenario_voltage[i] == MMDVFS_VOLTAGE_HIGH) { final_step = MMDVFS_VOLTAGE_HIGH; break; } } g_mmdvfs_current_step = final_step; spin_unlock(&g_mmdvfs_mgr->scen_lock); MMDVFSMSG("MMDVFS set voltage scen %d step %d final %d\n", scenario, step, final_step); #if MMDVFS_ENABLE /* call vcore dvfs API */ if (final_step == MMDVFS_VOLTAGE_HIGH) vcorefs_request_dvfs_opp(KIR_MM, OPPI_PERF); else vcorefs_request_dvfs_opp(KIR_MM, OPPI_UNREQ); #endif return 0; }
int mmdvfs_set_step(MTK_SMI_BWC_SCEN scenario, mmdvfs_voltage_enum step) { int i, scen_index; mmdvfs_voltage_enum final_step = mmdvfs_get_default_step(); #if !MMDVFS_ENABLE return 0; #endif #if !MMDVFS_ENABLE_WQHD /* do nothing if disable MMDVFS in WQHD */ if (mmdvfs_get_lcd_resolution() == MMDVFS_LCD_SIZE_WQHD) { return 0; } #endif /* MMDVFS_ENABLE_WQHD */ MMDVFSMSG("MMDVFS set voltage scen %d step %d\n", scenario, step); if (scenario >= SMI_BWC_SCEN_CNT || (scenario < SMI_BWC_SCEN_NORMAL)) { MMDVFSERR("invalid scenario\n"); return -1; } /* dump information */ mmdvfs_dump_info(); /* go through all scenarios to decide the final step */ scen_index = (int)scenario; spin_lock(&g_mmdvfs_mgr->scen_lock); g_mmdvfs_scenario_voltage[scen_index] = step; /* one high = final high */ for (i = 0; i < SMI_BWC_SCEN_CNT; i++) { if (g_mmdvfs_scenario_voltage[i] == MMDVFS_VOLTAGE_HIGH) { final_step = MMDVFS_VOLTAGE_HIGH; break; } } g_mmdvfs_current_step = final_step; spin_unlock(&g_mmdvfs_mgr->scen_lock); MMDVFSMSG("MMDVFS set voltage scen %d step %d final %d\n", scenario, step, final_step); #if MMDVFS_ENABLE /* call vcore dvfs API */ if (mmdvfs_get_lcd_resolution() == MMDVFS_LCD_SIZE_WQHD) { /* WQHD */ // TODO: use final_step and retry vcore dvfs MMDVFSMSG("HIGH to %d\n", step); if (step == MMDVFS_VOLTAGE_LOW) { vcorefs_request_dvfs_opp(KR_MM_SCEN, OPPI_LOW_PWR); } else { vcorefs_request_dvfs_opp(KR_MM_SCEN, OPPI_UNREQ); } } else { /* FHD */ MMDVFSMSG("FHD %d\n", final_step); if (final_step == MMDVFS_VOLTAGE_HIGH) { vcorefs_request_dvfs_opp(KR_MM_SCEN, OPPI_PERF); } else { vcorefs_request_dvfs_opp(KR_MM_SCEN, OPPI_UNREQ); } } #endif return 0; }