diff options
author | Anders Bauer <anders.bauer@stericsson.com> | 2011-04-18 12:47:34 +0200 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@linaro.org> | 2011-07-22 15:45:15 +0200 |
commit | 3620c9b3bf2de5338519d1a43d733d1262244ac7 (patch) | |
tree | 789c9182696ac8c5e656d04195bc2d9453d3753e /drivers/video/mcde | |
parent | 3877b73e35255a95d95792d42204aaffe858d582 (diff) |
mcde: make sure all data is sent to display before next command
There is no way of knowing if all display data has been
sent when calling mcde_dsi_dcs_read or mcde_dsi_dcs_write.
A wait_for_channel and a status bit read (CSM_RUNNING) is
added to make sure we don't send new dcs command before
all previous display data is done.
ST-Ericsson ID: 329670
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: Ife94b4164615c77c4a075a665ec8ee73fa7c0c1c
Signed-off-by: Anders Bauer <anders.bauer@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/21008
Reviewed-by: QATEST
Reviewed-by: Dan JOHANSSON <dan.johansson@stericsson.com>
Diffstat (limited to 'drivers/video/mcde')
-rw-r--r-- | drivers/video/mcde/mcde_hw.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/video/mcde/mcde_hw.c b/drivers/video/mcde/mcde_hw.c index c05ac38cca3..0ffba918e53 100644 --- a/drivers/video/mcde/mcde_hw.c +++ b/drivers/video/mcde/mcde_hw.c @@ -1941,6 +1941,21 @@ int mcde_dsi_dcs_write(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int len) if (!chnl->formatter_updated) (void)update_channel_static_registers(chnl); + wait_for_channel(chnl); + if (chnl->port.type == MCDE_PORTTYPE_DSI) { + u8 counter = 10; + /* + * Wait for CSM_RUNNING, + * all data sent for display + */ + while (dsi_rfld(chnl->port.link, + DSI_CMD_MODE_STS, CSM_RUNNING) + && counter--) { + cpu_relax(); + udelay(100); + } + } + wrdat[0] = cmd; for (i = 1; i <= len; i++) wrdat[i>>2] |= ((u32)data[i-1] << ((i & 3) * 8)); @@ -2007,6 +2022,21 @@ int mcde_dsi_dcs_read(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int *len) if (!chnl->formatter_updated) (void)update_channel_static_registers(chnl); + wait_for_channel(chnl); + if (chnl->port.type == MCDE_PORTTYPE_DSI) { + u8 counter = 10; + /* + * Wait for CSM_RUNNING, + * all data sent for display + */ + while (dsi_rfld(chnl->port.link, + DSI_CMD_MODE_STS, CSM_RUNNING) + && counter--) { + cpu_relax(); + udelay(100); + } + } + dsi_wfld(link, DSI_MCTL_MAIN_DATA_CTL, BTA_EN, true); dsi_wfld(link, DSI_MCTL_MAIN_DATA_CTL, READ_EN, true); settings = DSI_DIRECT_CMD_MAIN_SETTINGS_CMD_NAT_ENUM(READ) | |