]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: dsi: attempt retry for dsi write fail
authorPrafull Suryawanshi <prafulls@nvidia.com>
Thu, 20 Aug 2015 09:03:52 +0000 (14:33 +0530)
committermobile promotions <svcmobile_promotions@nvidia.com>
Fri, 11 Sep 2015 15:50:07 +0000 (08:50 -0700)
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 <prafulls@nvidia.com>
Reviewed-on: http://git-master/r/786469
(cherry picked from commit e9f89cda70103526c1a524576de6d310fed434f2)
Reviewed-on: http://git-master/r/786467
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
drivers/video/tegra/dc/dsi.c
drivers/video/tegra/dc/dsi.h

index eb4c37c6204c04c425aba84b45ff578778818006..a663eaba57c3436c2b86f1ea39cb0f435db67c76 100644 (file)
@@ -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;
index 7665c2b70bc72bc7d58286005ced6c9904abfe0c..f8b6154e1aa59d365e2333e0b50f0eaf8f1abcae 100644 (file)
@@ -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