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>
struct tegra_dsi_cmd *cmd, u8 delay_ms)
{
int err = 0;
struct tegra_dsi_cmd *cmd, u8 delay_ms)
{
int err = 0;
struct dsi_status *init_status;
init_status = tegra_dsi_prepare_host_transmission(
struct dsi_status *init_status;
init_status = tegra_dsi_prepare_host_transmission(
}
err = _tegra_dsi_write_data(dsi, cmd);
}
err = _tegra_dsi_write_data(dsi, cmd);
dev_err(&dc->ndev->dev, "Failed DSI write\n");
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;
+ }
u32 i;
int err;
u8 delay_ms;
u32 i;
int err;
u8 delay_ms;
err = 0;
for (i = 0; i < n_cmd; i++) {
err = 0;
for (i = 0; i < n_cmd; i++) {
delay_ms = cmd[i + 1].sp_len_dly.delay_ms;
i++;
}
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,
+ if (err < 0) {
+ retry_count--;
+ dev_err(&dsi->dc->ndev->dev,
+ "dsi: %s failed, retrying...\n",__func__);
+ } else {
+ retry_count = 0;
+ }
+ } while (retry_count);
#define DSI_DELAY_FOR_READ_FIFO 5
#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
/* Dsi virtual channel bit position, refer to the DSI specs */
#define DSI_VIR_CHANNEL_BIT_POSITION 6