DPI_STATUS DPI_Deinit(void) { DPI_DisableClk(); DPI_PowerOff(); return DPI_STATUS_OK; }
int disphal_panel_enable(const LCM_DRIVER *lcm_drv, struct mutex* pLcmCmdMutex, BOOL enable) { if (enable) { if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DSI_SetMode(CMD_MODE); } mutex_lock(pLcmCmdMutex); //#ifdef MTK_DISP_CONFIG_SUPPORT if(get_fbconfig_start_lcm_config()) { fbconfig_apply_new_lcm_setting(); //do not call lcm_init if you have ever started LCM config until you reset lcm config ; } else //#endif lcm_drv->resume(); mutex_unlock(pLcmCmdMutex); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { //DSI_clk_HS_mode(1); DSI_WaitForNotBusy(); DSI_SetMode(lcm_params->dsi.mode); } } else { LCD_CHECK_RET(LCD_WaitForNotBusy()); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode == CMD_MODE) DSI_CHECK_RET(DSI_WaitForNotBusy()); if (lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DPI_CHECK_RET(DPI_DisableClk()); //msleep(200); DSI_Reset(); DSI_clk_HS_mode(0); DSI_SetMode(CMD_MODE); } mutex_lock(pLcmCmdMutex); //#ifdef MTK_DISP_CONFIG_SUPPORT if(get_fbconfig_start_lcm_config()) { fbconfig_apply_new_lcm_setting(); //do not call lcm_init if you have ever started LCM config until you reset lcm config ; } else //#endif lcm_drv->suspend(); mutex_unlock(pLcmCmdMutex); } return 0; }
DISP_STATUS DISP_PanelEnable(BOOL enable) { static BOOL s_enabled = FALSE; disp_drv_init_context(); if (!lcm_drv->suspend || !lcm_drv->resume) { return DISP_STATUS_NOT_IMPLEMENTED; } if (enable && !s_enabled) { s_enabled = TRUE; if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DSI_SetMode(CMD_MODE); } lcm_drv->resume(); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { //DSI_clk_HS_mode(1); DSI_SetMode(lcm_params->dsi.mode); //DPI_CHECK_RET(DPI_EnableClk()); //DSI_CHECK_RET(DSI_EnableClk()); } } else if (!enable && s_enabled) { LCD_CHECK_RET(LCD_WaitForNotBusy()); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode == CMD_MODE) DSI_CHECK_RET(DSI_WaitForNotBusy()); s_enabled = FALSE; if (lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DPI_CHECK_RET(DPI_DisableClk()); udelay(200*1000); DSI_Reset(); DSI_clk_HS_mode(0); DSI_SetMode(CMD_MODE); } lcm_drv->suspend(); } return DISP_STATUS_OK; }
int disphal_panel_enable(const LCM_DRIVER *lcm_drv, struct mutex* pLcmCmdMutex, BOOL enable) { if (enable) { if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DSI_SetMode(CMD_MODE); } mutex_lock(pLcmCmdMutex); lcm_drv->resume(); if(lcm_drv->check_status) lcm_drv->check_status(); DSI_LP_Reset(); mutex_unlock(pLcmCmdMutex); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { //DSI_clk_HS_mode(1); DSI_WaitForNotBusy(); DSI_SetMode(lcm_params->dsi.mode); } } else { LCD_CHECK_RET(LCD_WaitForNotBusy()); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode == CMD_MODE) DSI_CHECK_RET(DSI_WaitForNotBusy()); if (lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DPI_CHECK_RET(DPI_DisableClk()); //msleep(200); //DSI_Reset(); DSI_clk_HS_mode(0); DSI_SetMode(CMD_MODE); } mutex_lock(pLcmCmdMutex); lcm_drv->suspend(); mutex_unlock(pLcmCmdMutex); } return 0; }
static DISP_STATUS dpi_enable_power(BOOL enable) { if (enable) { DPI_CHECK_RET(DPI_PowerOn()); init_mipi_pll();//for MT6573 and later chip, Must re-init mipi pll for dpi, because pll register have located in //MMSYS1 except MT6516 init_io_pad(); LCD_CHECK_RET(LCD_PowerOn()); DPI_CHECK_RET(DPI_EnableClk()); } else { DPI_CHECK_RET(DPI_DisableClk()); DPI_CHECK_RET(DPI_PowerOff()); LCD_CHECK_RET(LCD_PowerOff()); DPI_mipi_switch(false); } return DISP_STATUS_OK; }
static void lcm_suspend(void) { unsigned int data_array[16]; dsi_set_cmdq_V3(lcm_initialization_sleep_in_V3, sizeof(lcm_initialization_sleep_in_V3) / sizeof(LCM_setting_table_V3), 1); MDELAY(120); lcm_set_pwm_for_mix(0); MDELAY(16); DPI_DisableClk(); DSI_Reset(); DSI_clk_HS_mode(1); DSI_SetMode(0); /* MDELAY(1); */ dsi_set_cmdq_V3(lcm_suspend_ULPS_for_data0_in_V3, sizeof(lcm_suspend_ULPS_for_data0_in_V3) / sizeof(LCM_setting_table_V3), 1); MDELAY(200); LCM_PRINT("[LCD] lcm_suspend\n"); }
// called by "esd_recovery_kthread" // protected by sem_early_suspend, sem_update_screen void dsi_esd_reset(void) { /// we assume the power is on here /// what we need is some setting for LCM init if(lcm_params->dsi.mode == CMD_MODE) { DSI_clk_HS_mode(0); DSI_clk_ULP_mode(0); DSI_lane0_ULP_mode(0); } else { DSI_SetMode(CMD_MODE); DSI_clk_HS_mode(0); // clock/data lane go to Ideal DSI_Reset(); DPI_CHECK_RET(DPI_DisableClk()); } }
static irqreturn_t _DPI_InterruptHandler(int irq, void *dev_id) { static int counter = 0; DPI_REG_INTERRUPT status = DPI_REG->INT_STATUS; // if (status.FIFO_EMPTY) ++ counter; if(status.VSYNC) { if(dpiIntCallback) dpiIntCallback(DISP_DPI_VSYNC_INT); #ifndef BUILD_UBOOT if(atomic_read(&wait_dpi_vsync)){ if(-1 != hrtimer_try_to_cancel(&hrtimer_vsync_dpi)){ atomic_set(&wait_dpi_vsync, 0); atomic_set(&dpi_vsync, 1); wake_up_interruptible(&_vsync_wait_queue_dpi); hrtimer_start(&hrtimer_vsync_dpi, ktime_set(0, VSYNC_US_TO_NS(vsync_timer_dpi)), HRTIMER_MODE_REL); } } #endif } if (status.VSYNC && counter) { DISP_LOG_PRINT(ANDROID_LOG_ERROR, "DPI", "[Error] DPI FIFO is empty, " "received %d times interrupt !!!\n", counter); counter = 0; } if (status.FIFO_EMPTY) { int need_reset = 0; unsigned long long temp = sched_clock(); unsigned int debug_while_loop_cnt = 0; volatile unsigned int dsi_state = INREG32(DSI_BASE+0x154); if((dsi_state & 0x1ff) == 0x80) { auto_sync_reset_count++; if(auto_sync_reset_count == 10) { auto_sync_reset_count = 0; need_reset = 2; } } else { auto_sync_reset_count = 0; } //printk("gmce,0x%08x, %d\n",(INREG32(DSI_BASE+0x154))&0x1ff, (unsigned int)(temp - last_fifo_empty_stamp)); if(_fifo_empty_monitor_insert((unsigned int)(temp - last_fifo_empty_stamp))) { need_reset = 1; } last_fifo_empty_stamp = temp; if(need_reset) { unsigned int mode, suspend; mode = DSI_GetMode(); suspend = DISP_GetSuspendMode(); if ((mode != CMD_MODE) && !suspend) { DPI_DisableClk(); #if 0 while(1) { debug_while_loop_cnt++; dsi_state = INREG32(DSI_BASE+0x154); if((dsi_state &0x1ff) == 0x100) break; if(debug_while_loop_cnt > 0x1000000) { printk("FATAL Error!! dsi in vact when dpi fifo empty, and can't into vfp until 0x100000 loops!!\n"); } } #endif DSI_clk_HS_mode(0); DSI_SetMode(CMD_MODE); DSI_Reset(); DSI_SetMode(SYNC_PULSE_VDO_MODE); DSI_clk_HS_mode(1); DPI_EnableClk(); DSI_EnableClk(); } printk("[DSI/DPI]reset[%d] mode[%d], suspend[%d]\n", need_reset, mode, suspend); need_reset = 0; } } _DPI_LogRefreshRate(status); OUTREG32(&DPI_REG->INT_STATUS, 0); return IRQ_HANDLED; }
DISP_STATUS DISP_PanelEnable(BOOL enable) { static BOOL s_enabled = TRUE; DISP_STATUS ret = DISP_STATUS_OK; DISP_LOG("panel is %s\n", enable?"enabled":"disabled"); if (down_interruptible(&sem_update_screen)) { DISP_LOG("ERROR: Can't get sem_update_screen in DISP_PanelEnable()\n"); return DISP_STATUS_ERROR; } disp_drv_init_context(); is_lcm_in_suspend_mode = enable ? FALSE : TRUE; if (!lcm_drv->suspend || !lcm_drv->resume) { ret = DISP_STATUS_NOT_IMPLEMENTED; goto End; } if (enable && !s_enabled) { s_enabled = TRUE; if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DSI_SetMode(CMD_MODE); } lcm_drv->resume(); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { //DSI_clk_HS_mode(1); DSI_SetMode(lcm_params->dsi.mode); //DPI_CHECK_RET(DPI_EnableClk()); //DSI_CHECK_RET(DSI_EnableClk()); msleep(200); } } else if (!enable && s_enabled) { LCD_CHECK_RET(LCD_WaitForNotBusy()); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode == CMD_MODE) DSI_CHECK_RET(DSI_WaitForNotBusy()); s_enabled = FALSE; if (lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DPI_CHECK_RET(DPI_DisableClk()); //msleep(200); DSI_Reset(); DSI_clk_HS_mode(0); DSI_SetMode(CMD_MODE); } lcm_drv->suspend(); } End: up(&sem_update_screen); return ret; }