void mmdvfs_notify_scenario_enter(MTK_SMI_BWC_SCEN scen) { #if !MMDVFS_ENABLE return; #endif MMDVFSMSG("enter %d\n", scen); if (mmdvfs_get_lcd_resolution() == MMDVFS_LCD_SIZE_WQHD) { #if MMDVFS_ENABLE_WQHD if (scen == SMI_BWC_SCEN_VP) { mmdvfs_start_gpu_monitor(&g_mmdvfs_mgr->gpu_monitor); } #endif /* MMDVFS_ENABLE_WQHD */ } else { /* FHD */ switch (scen) { case SMI_BWC_SCEN_ICFP: mmdvfs_set_step(scen, MMDVFS_VOLTAGE_HIGH); break; case SMI_BWC_SCEN_VR: case SMI_BWC_SCEN_VR_SLOW: mmdvfs_set_step(scen, mmdvfs_query(scen, NULL)); /* workaround for ICFP...its mmdvfs_set() will come after leaving ICFP */ mmdvfs_set_step(SMI_BWC_SCEN_ICFP, mmdvfs_get_default_step()); break; default: break; } } }
void mmdvfs_notify_scenario_enter(MTK_SMI_BWC_SCEN scen) { #if !MMDVFS_ENABLE return; #endif MMDVFSMSG("enter %d\n", scen); /* ISP ON = high */ switch (scen) { #if defined(SMI_D2) /* d2 sensor > 6M */ case SMI_BWC_SCEN_VR: mmdvfs_set_step(scen, mmdvfs_query(scen, NULL)); break; case SMI_BWC_SCEN_VR_SLOW: #elif defined(SMI_D1) /* default VR high */ case SMI_BWC_SCEN_VR: case SMI_BWC_SCEN_VR_SLOW: #else /* D3 */ case SMI_BWC_SCEN_WFD: case SMI_BWC_SCEN_VSS: #endif /* Fall through */ case SMI_BWC_SCEN_ICFP: /* Fall through */ case SMI_BWC_SCEN_FORCE_MMDVFS: mmdvfs_set_step(scen, MMDVFS_VOLTAGE_HIGH); break; default: break; } }
static void mmdvfs_start_cam_monitor(void) { mmdvfs_stop_cam_monitor(); MMDVFSMSG("CAM start %d\n", jiffies_to_msecs(jiffies)); mmdvfs_set_step(MMDVFS_CAM_MON_SCEN, MMDVFS_VOLTAGE_HIGH); /* 4 seconds for PIP switch preview aspect delays... */ schedule_delayed_work(&g_mmdvfs_cam_work, MMDVFS_CAM_MON_DELAY); }
void mmdvfs_handle_cmd(MTK_MMDVFS_CMD *cmd) { #if !MMDVFS_ENABLE return; #endif MMDVFSMSG("MMDVFS cmd %u %d\n", cmd->type, cmd->scen); switch (cmd->type) { case MTK_MMDVFS_CMD_TYPE_SET: /* save cmd */ mmdvfs_update_cmd(cmd); cmd->ret = mmdvfs_set_step(cmd->scen, mmdvfs_query(cmd->scen, cmd)); break; case MTK_MMDVFS_CMD_TYPE_QUERY: { /* query with some parameters */ if (mmdvfs_get_lcd_resolution() == MMDVFS_LCD_SIZE_FHD) { /* QUERY ALWAYS HIGH for FHD */ cmd->ret = (unsigned int)MMDVFS_STEP_HIGH2HIGH; } else { /* FHD */ mmdvfs_voltage_enum query_voltage = mmdvfs_query(cmd->scen, cmd); mmdvfs_voltage_enum current_voltage = mmdvfs_get_current_step(); if (current_voltage < query_voltage) { cmd->ret = (unsigned int)MMDVFS_STEP_LOW2HIGH; } else if (current_voltage > query_voltage) { cmd->ret = (unsigned int)MMDVFS_STEP_HIGH2LOW; } else { cmd->ret = (unsigned int)(query_voltage == MMDVFS_VOLTAGE_HIGH ? MMDVFS_STEP_HIGH2HIGH : MMDVFS_STEP_LOW2LOW); } } MMDVFSMSG("query %d\n", cmd->ret); /* cmd->ret = (unsigned int)query_voltage; */ break; } default: MMDVFSMSG("invalid mmdvfs cmd\n"); BUG(); break; } }
void mmdvfs_notify_scenario_exit(MTK_SMI_BWC_SCEN scen) { #if !MMDVFS_ENABLE return; #endif MMDVFSMSG("leave %d\n", scen); if (mmdvfs_get_lcd_resolution() == MMDVFS_LCD_SIZE_WQHD) { #if MMDVFS_ENABLE_WQHD if (scen == SMI_BWC_SCEN_VP) { mmdvfs_stop_gpu_monitor(&g_mmdvfs_mgr->gpu_monitor); } #endif /* MMDVFS_ENABLE_WQHD */ } /* reset scenario voltage to default when it exits */ mmdvfs_set_step(scen, mmdvfs_get_default_step()); }
void mmdvfs_notify_scenario_exit(MTK_SMI_BWC_SCEN scen) { #if !MMDVFS_ENABLE return; #endif MMDVFSMSG("leave %d\n", scen); #if !defined(SMI_D3) /* d3 does not need this workaround because the MMCLK is always the highest */ /* * keep HPM for 4 seconds after exiting camera scenarios to get rid of * cam framework will let us go to normal scenario for a short time * (ex: STOP PREVIEW --> NORMAL --> START PREVIEW) * where the LPM mode (low MMCLK) may cause ISP failures */ if ((scen == SMI_BWC_SCEN_VR) || (scen == SMI_BWC_SCEN_VR_SLOW) || (scen == SMI_BWC_SCEN_ICFP)) { mmdvfs_start_cam_monitor(); } #endif /* !defined(SMI_D3) */ /* reset scenario voltage to default when it exits */ mmdvfs_set_step(scen, mmdvfs_get_default_step()); }
static void mmdvfs_cam_work_handler(struct work_struct *work) { MMDVFSMSG("CAM handler %d\n", jiffies_to_msecs(jiffies)); mmdvfs_set_step(MMDVFS_CAM_MON_SCEN, mmdvfs_get_default_step()); }