msm: mdss: ignore overflow error when trigger BTA for video mode panel

This overflow only happens once after device is out of phy reset state
when BTA is triggered, however, data are still transmitted and BTA
interrupt still returns, indicating that there is nothing wrong with
data and panel. After the first overflow is ignored, there is no such
error any more when s/w trigger more BTAs.

Change-Id: Icb861e2232bda22f8fde008cf8e439594aef6732
Signed-off-by: Huaibin Yang <huaibiny@codeaurora.org>
This commit is contained in:
Huaibin Yang 2015-02-19 16:54:23 -08:00 committed by David Keitel
parent 2416d448bc
commit 4be1de768e

View file

@ -2238,6 +2238,16 @@ void mdss_dsi_ack_err_status(struct mdss_dsi_ctrl_pdata *ctrl)
MIPI_OUTP(base + 0x0068, status);
/* Writing of an extra 0 needed to clear error bits */
MIPI_OUTP(base + 0x0068, 0);
/*
* After bta done, h/w may have a fake overflow and
* that overflow may further cause ack_err about 3 ms
* later which is another false alarm. Here the
* warning message is ignored.
*/
if (ctrl->panel_data.panel_info.esd_check_enabled &&
(ctrl->status_mode == ESD_BTA) && (status & 0x1008000))
return;
pr_err("%s: status=%x\n", __func__, status);
}
}
@ -2368,6 +2378,29 @@ irqreturn_t mdss_dsi_isr(int irq, void *ptr)
pr_debug("%s: ndx=%d isr=%x\n", __func__, ctrl->ndx, isr);
if (isr & DSI_INTR_BTA_DONE) {
spin_lock(&ctrl->mdp_lock);
mdss_dsi_disable_irq_nosync(ctrl, DSI_BTA_TERM);
complete(&ctrl->bta_comp);
/*
* When bta done happens, the panel should be in good
* state. However, bta could cause the fake overflow
* error for video mode. The similar issue happens when
* sending dcs cmd. This overflow further causes
* flicking because of phy reset which is unncessary,
* so here overflow error is ignored, and errors are
* cleared.
*/
if (ctrl->panel_data.panel_info.esd_check_enabled &&
(ctrl->status_mode == ESD_BTA) &&
(ctrl->panel_mode == DSI_VIDEO_MODE)) {
isr &= ~DSI_INTR_ERROR;
/* clear only overflow */
mdss_dsi_set_reg(ctrl, 0x0c, 0x44440000, 0x44440000);
}
spin_unlock(&ctrl->mdp_lock);
}
if (isr & DSI_INTR_ERROR) {
MDSS_XLOG(ctrl->ndx, ctrl->mdp_busy, isr, 0x97);
mdss_dsi_error(ctrl);
@ -2403,13 +2436,6 @@ irqreturn_t mdss_dsi_isr(int irq, void *ptr)
spin_unlock(&ctrl->mdp_lock);
}
if (isr & DSI_INTR_BTA_DONE) {
spin_lock(&ctrl->mdp_lock);
mdss_dsi_disable_irq_nosync(ctrl, DSI_BTA_TERM);
complete(&ctrl->bta_comp);
spin_unlock(&ctrl->mdp_lock);
}
if (isr & DSI_INTR_DYNAMIC_REFRESH_DONE) {
spin_lock(&ctrl->mdp_lock);
mdss_dsi_disable_irq_nosync(ctrl, DSI_DYNAMIC_TERM);