aboutsummaryrefslogtreecommitdiff
path: root/drivers/video/mcde
diff options
context:
space:
mode:
authorAnders Bauer <anders.bauer@stericsson.com>2011-04-18 12:47:34 +0200
committerPhilippe Langlais <philippe.langlais@linaro.org>2011-07-22 15:45:15 +0200
commit3620c9b3bf2de5338519d1a43d733d1262244ac7 (patch)
tree789c9182696ac8c5e656d04195bc2d9453d3753e /drivers/video/mcde
parent3877b73e35255a95d95792d42204aaffe858d582 (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.c30
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) |