diff options
| author | Ray Zhang <rayzhang@codeaurora.org> | 2013-05-30 11:11:57 +0800 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:18:32 -0700 |
| commit | 70ba4df2d63aab32059e73c8a2c08c9303a35c40 (patch) | |
| tree | 81a937cb2be399c54cc49587cab745584e938c82 | |
| parent | af929cdef96115b6d83e5da53dde63a38265f5da (diff) | |
mdss: dsi: turn on/off TE output from DSI panel.
DSI command mode needs TE singal to keep tearing check work.
Change-Id: Ib29ebab3df12671211a0e0ae1b52ea390a17e117
Signed-off-by: Ray Zhang <rayzhang@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_dsi.c | 16 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_dsi.h | 2 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_dsi_host.c | 34 |
3 files changed, 52 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dsi.c b/drivers/video/fbdev/msm/mdss_dsi.c index f69945d132fb..c725cdb49a67 100644 --- a/drivers/video/fbdev/msm/mdss_dsi.c +++ b/drivers/video/fbdev/msm/mdss_dsi.c @@ -602,6 +602,13 @@ static int mdss_dsi_unblank(struct mdss_panel_data *pdata) } mdss_dsi_op_mode_config(mipi->mode, pdata); + if (pdata->panel_info.type == MIPI_CMD_PANEL) { + if (mipi->vsync_enable && mipi->hw_vsync_mode + && gpio_is_valid(ctrl_pdata->disp_te_gpio)) { + mdss_dsi_set_tear_on(ctrl_pdata); + } + } + pr_debug("%s-:\n", __func__); return ret; @@ -610,6 +617,7 @@ static int mdss_dsi_unblank(struct mdss_panel_data *pdata) static int mdss_dsi_blank(struct mdss_panel_data *pdata) { int ret = 0; + struct mipi_panel_info *mipi; struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; pr_debug("%s+:\n", __func__); @@ -621,9 +629,17 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata) ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); + mipi = &pdata->panel_info.mipi; mdss_dsi_op_mode_config(DSI_CMD_MODE, pdata); + if (pdata->panel_info.type == MIPI_CMD_PANEL) { + if (mipi->vsync_enable && mipi->hw_vsync_mode + && gpio_is_valid(ctrl_pdata->disp_te_gpio)) { + mdss_dsi_set_tear_off(ctrl_pdata); + } + } + if (ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_INIT) { ret = ctrl_pdata->off(pdata); if (ret) { diff --git a/drivers/video/fbdev/msm/mdss_dsi.h b/drivers/video/fbdev/msm/mdss_dsi.h index 965a23f73146..8a8e4caf67ae 100644 --- a/drivers/video/fbdev/msm/mdss_dsi.h +++ b/drivers/video/fbdev/msm/mdss_dsi.h @@ -382,6 +382,8 @@ int mdss_dsi_cmds_rx(struct mdss_dsi_ctrl_pdata *ctrl, void mdss_dsi_host_init(struct mipi_panel_info *pinfo, struct mdss_panel_data *pdata); +void mdss_dsi_set_tear_on(struct mdss_dsi_ctrl_pdata *ctrl); +void mdss_dsi_set_tear_off(struct mdss_dsi_ctrl_pdata *ctrl); void mdss_dsi_op_mode_config(int mode, struct mdss_panel_data *pdata); void mdss_dsi_cmd_mode_ctrl(int enable); diff --git a/drivers/video/fbdev/msm/mdss_dsi_host.c b/drivers/video/fbdev/msm/mdss_dsi_host.c index 3e70afd76892..2f29b3d782f5 100644 --- a/drivers/video/fbdev/msm/mdss_dsi_host.c +++ b/drivers/video/fbdev/msm/mdss_dsi_host.c @@ -1100,6 +1100,40 @@ void mdss_dsi_cmd_bta_sw_trigger(struct mdss_panel_data *pdata) pr_debug("%s: BTA done, status = %d\n", __func__, status); } +static char set_tear_on[2] = {0x35, 0x00}; +static struct dsi_cmd_desc dsi_tear_on_cmd = { + {DTYPE_DCS_WRITE1, 1, 0, 0, 0, sizeof(set_tear_on)}, set_tear_on}; + +static char set_tear_off[2] = {0x34, 0x00}; +static struct dsi_cmd_desc dsi_tear_off_cmd = { + {DTYPE_DCS_WRITE, 1, 0, 0, 0, sizeof(set_tear_off)}, set_tear_off}; + +void mdss_dsi_set_tear_on(struct mdss_dsi_ctrl_pdata *ctrl) +{ + struct dcs_cmd_req cmdreq; + + cmdreq.cmds = &dsi_tear_on_cmd; + cmdreq.cmds_cnt = 1; + cmdreq.flags = CMD_REQ_COMMIT; + cmdreq.rlen = 0; + cmdreq.cb = NULL; + + mdss_dsi_cmdlist_put(ctrl, &cmdreq); +} + +void mdss_dsi_set_tear_off(struct mdss_dsi_ctrl_pdata *ctrl) +{ + struct dcs_cmd_req cmdreq; + + cmdreq.cmds = &dsi_tear_off_cmd; + cmdreq.cmds_cnt = 1; + cmdreq.flags = CMD_REQ_COMMIT; + cmdreq.rlen = 0; + cmdreq.cb = NULL; + + mdss_dsi_cmdlist_put(ctrl, &cmdreq); +} + int mdss_dsi_cmd_reg_tx(u32 data, unsigned char *ctrl_base) { |
