From bd387266b7948f07aaec4d9f99298045f3ba273a Mon Sep 17 00:00:00 2001 From: Prafull Suryawanshi Date: Thu, 20 Aug 2015 14:33:52 +0530 Subject: [PATCH] video: tegra: dsi: attempt retry for dsi write fail This logic adds retry attempts for possible dsi write failure. It also takes care of error to be propagated to caller. bug 200124422 Change-Id: I652ac4c6e513585a4f94048b6596e4aec9f22b4b Signed-off-by: Prafull Suryawanshi Reviewed-on: http://git-master/r/786469 (cherry picked from commit e9f89cda70103526c1a524576de6d310fed434f2) Reviewed-on: http://git-master/r/786467 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/video/tegra/dc/dsi.c | 23 +++++++++++++++++++---- drivers/video/tegra/dc/dsi.h | 2 ++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c index eb4c37c6204..a663eaba57c 100644 --- a/drivers/video/tegra/dc/dsi.c +++ b/drivers/video/tegra/dc/dsi.c @@ -3384,6 +3384,7 @@ static int tegra_dsi_write_data_nosync(struct tegra_dc *dc, struct tegra_dsi_cmd *cmd, u8 delay_ms) { int err = 0; + int restore_err = 0; struct dsi_status *init_status; init_status = tegra_dsi_prepare_host_transmission( @@ -3395,8 +3396,13 @@ static int tegra_dsi_write_data_nosync(struct tegra_dc *dc, } err = _tegra_dsi_write_data(dsi, cmd); - if (err < 0) + if (err < 0) { dev_err(&dc->ndev->dev, "Failed DSI write\n"); + restore_err = tegra_dsi_restore_state(dc, dsi, init_status); + if (restore_err < 0) + dev_err(&dc->ndev->dev, "Failed to restore prev state\n"); + goto fail; + } mdelay(delay_ms); @@ -3496,6 +3502,7 @@ int tegra_dsi_send_panel_cmd(struct tegra_dc *dc, u32 i; int err; u8 delay_ms; + int retry_count; err = 0; for (i = 0; i < n_cmd; i++) { @@ -3536,10 +3543,18 @@ int tegra_dsi_send_panel_cmd(struct tegra_dc *dc, delay_ms = cmd[i + 1].sp_len_dly.delay_ms; i++; } - err = tegra_dsi_write_data_nosync(dc, dsi, + retry_count = DSI_WRITE_DATA_RETRY_ATTEMPTS; + do { + err = tegra_dsi_write_data_nosync(dc, dsi, cur_cmd, delay_ms); - if (err < 0) - break; + if (err < 0) { + retry_count--; + dev_err(&dsi->dc->ndev->dev, + "dsi: %s failed, retrying...\n",__func__); + } else { + retry_count = 0; + } + } while (retry_count); } } return err; diff --git a/drivers/video/tegra/dc/dsi.h b/drivers/video/tegra/dc/dsi.h index 7665c2b70bc..f8b6154e1aa 100644 --- a/drivers/video/tegra/dc/dsi.h +++ b/drivers/video/tegra/dc/dsi.h @@ -166,6 +166,8 @@ struct tegra_dc_dsi_data { #define DSI_DELAY_FOR_READ_FIFO 5 +#define DSI_WRITE_DATA_RETRY_ATTEMPTS 5 + /* Dsi virtual channel bit position, refer to the DSI specs */ #define DSI_VIR_CHANNEL_BIT_POSITION 6 -- 2.39.2