disp: msm: defer panel TE disable with poms switch
DSI host vsync is expected to align with panel internal vsync during transition from command mode to video mode operation. In order to facilitate this, keep panel TE enabled in video mode operation until it is aligned with vysnc. Change-Id: I3fc59b01336b30cd436be332af6953c5a01be7fd Signed-off-by: Narendra Muppalla <NarendraM@codeaurora.org>
This commit is contained in:
@@ -5819,6 +5819,7 @@ int dsi_display_get_info(struct drm_connector *connector,
|
||||
info->max_height = 1080;
|
||||
info->qsync_min_fps =
|
||||
display->panel->qsync_min_fps;
|
||||
info->poms_align_vsync = display->panel->poms_align_vsync;
|
||||
|
||||
switch (display->panel->panel_mode) {
|
||||
case DSI_OP_VIDEO_MODE:
|
||||
@@ -7357,6 +7358,25 @@ int dsi_display_pre_disable(struct dsi_display *display)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void dsi_display_handle_poms_te(struct work_struct *work)
|
||||
{
|
||||
struct dsi_display *display = NULL;
|
||||
struct delayed_work *dw = to_delayed_work(work);
|
||||
struct mipi_dsi_device *dsi;
|
||||
int rc = 0;
|
||||
|
||||
display = container_of(dw, struct dsi_display, poms_te_work);
|
||||
if (!display || !display->panel) {
|
||||
DSI_ERR("Invalid params\n");
|
||||
return;
|
||||
}
|
||||
|
||||
dsi = &display->panel->mipi_device;
|
||||
rc = mipi_dsi_dcs_set_tear_off(dsi);
|
||||
if (rc < 0)
|
||||
DSI_ERR("failed to set tear off\n");
|
||||
}
|
||||
|
||||
int dsi_display_disable(struct dsi_display *display)
|
||||
{
|
||||
int rc = 0;
|
||||
@@ -7369,6 +7389,11 @@ int dsi_display_disable(struct dsi_display *display)
|
||||
SDE_EVT32(SDE_EVTLOG_FUNC_ENTRY);
|
||||
mutex_lock(&display->display_lock);
|
||||
|
||||
/* cancel delayed work */
|
||||
if (display->poms_pending &&
|
||||
display->panel->poms_align_vsync)
|
||||
cancel_delayed_work_sync(&display->poms_te_work);
|
||||
|
||||
rc = dsi_display_wake_up(display);
|
||||
if (rc)
|
||||
DSI_ERR("[%s] display wake up failed, rc=%d\n",
|
||||
@@ -7380,6 +7405,18 @@ int dsi_display_disable(struct dsi_display *display)
|
||||
DSI_ERR("[%s]failed to disable DSI vid engine, rc=%d\n",
|
||||
display->name, rc);
|
||||
} else if (display->config.panel_mode == DSI_OP_CMD_MODE) {
|
||||
/**
|
||||
* On POMS request , disable panel TE through
|
||||
* delayed work queue.
|
||||
*/
|
||||
if (display->poms_pending &&
|
||||
display->panel->poms_align_vsync) {
|
||||
INIT_DELAYED_WORK(&display->poms_te_work,
|
||||
dsi_display_handle_poms_te);
|
||||
queue_delayed_work(system_wq,
|
||||
&display->poms_te_work,
|
||||
msecs_to_jiffies(100));
|
||||
}
|
||||
rc = dsi_display_cmd_engine_disable(display);
|
||||
if (rc)
|
||||
DSI_ERR("[%s]failed to disable DSI cmd engine, rc=%d\n",
|
||||
|
Reference in New Issue
Block a user