summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorKuogee Hsieh <khsieh@codeaurora.org>2014-11-10 10:18:50 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:38:44 -0700
commit6faada771461712c3cbdfd18de5c2142004511fe (patch)
treee3cc0c562fb794cf92f2cab7b5593ab7072f46eb /drivers/video/fbdev
parent0aa2dc71b8572bec00cfe6ec8072391d77146658 (diff)
msm: mdss: set dsi clock lane to proper state on 8994
For 8994, dsi clock lane may get stuck at hs mode. It needs manual control of clock lane to avoid it. Force clock lane to HS mode before kick off and clear it after completion. CRs-Fixed: 774612 Change-Id: I8182489d2d5eaf041b4869af71155378dd3aea99 Signed-off-by: Kuogee Hsieh <khsieh@codeaurora.org> (cherry picked from commit 5d9e1ace6123d8f5a1ac8f0eb62e9fd8c841d5f8) [veeras@codeaurora.org: Resolve merge conflict in mdss_dsi_host.c] Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi.c4
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi.h4
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi_host.c304
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c4
-rw-r--r--drivers/video/fbdev/msm/mdss_panel.h3
5 files changed, 208 insertions, 111 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dsi.c b/drivers/video/fbdev/msm/mdss_dsi.c
index 7b12663dd84c..2429921f6138 100644
--- a/drivers/video/fbdev/msm/mdss_dsi.c
+++ b/drivers/video/fbdev/msm/mdss_dsi.c
@@ -1336,6 +1336,7 @@ static int mdss_dsi_event_handler(struct mdss_panel_data *pdata,
pdata);
break;
case MDSS_EVENT_UNBLANK:
+ mdss_dsi_get_hw_revision(ctrl_pdata);
if (ctrl_pdata->refresh_clk_rate)
rc = mdss_dsi_clk_refresh(pdata);
@@ -1399,9 +1400,6 @@ static int mdss_dsi_event_handler(struct mdss_panel_data *pdata,
rc = mdss_dsi_register_recovery_handler(ctrl_pdata,
(struct mdss_intf_recovery *)arg);
break;
- case MDSS_EVENT_INTF_RESTORE:
- mdss_dsi_ctrl_phy_restore(ctrl_pdata);
- break;
default:
pr_debug("%s: unhandled event=%d\n", __func__, event);
break;
diff --git a/drivers/video/fbdev/msm/mdss_dsi.h b/drivers/video/fbdev/msm/mdss_dsi.h
index f3b3ef86794f..1c8063b2545a 100644
--- a/drivers/video/fbdev/msm/mdss_dsi.h
+++ b/drivers/video/fbdev/msm/mdss_dsi.h
@@ -284,6 +284,7 @@ enum {
#define DSI_EV_MDP_FIFO_UNDERFLOW 0x0002
#define DSI_EV_DSI_FIFO_EMPTY 0x0004
#define DSI_EV_DLNx_FIFO_OVERFLOW 0x0008
+#define DSI_EV_STOP_HS_CLK_LANE 0x40000000
#define DSI_EV_MDP_BUSY_RELEASE 0x80000000
struct mdss_dsi_ctrl_pdata {
@@ -336,6 +337,7 @@ struct mdss_dsi_ctrl_pdata {
int bklt_max;
int new_fps;
int pwm_enabled;
+ int clk_lane_cnt;
bool dmap_iommu_map;
bool panel_bias_vreg;
bool dsi_irq_line;
@@ -379,6 +381,7 @@ struct mdss_dsi_ctrl_pdata {
struct mutex cmd_mutex;
struct regulator *lab; /* vreg handle */
struct regulator *ibb; /* vreg handle */
+ struct mutex clk_lane_mutex;
u32 ulps_clamp_ctrl_off;
u32 ulps_phyrst_ctrl_off;
@@ -473,6 +476,7 @@ bool __mdss_dsi_clk_enabled(struct mdss_dsi_ctrl_pdata *ctrl, u8 clk_type);
void mdss_dsi_ctrl_setup(struct mdss_dsi_ctrl_pdata *ctrl);
void mdss_dsi_dln0_phy_err(struct mdss_dsi_ctrl_pdata *ctrl);
void mdss_dsi_lp_cd_rx(struct mdss_dsi_ctrl_pdata *ctrl);
+void mdss_dsi_get_hw_revision(struct mdss_dsi_ctrl_pdata *ctrl);
int mdss_dsi_panel_init(struct device_node *node,
struct mdss_dsi_ctrl_pdata *ctrl_pdata,
diff --git a/drivers/video/fbdev/msm/mdss_dsi_host.c b/drivers/video/fbdev/msm/mdss_dsi_host.c
index a4a640b77110..1d762e34ee30 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_host.c
+++ b/drivers/video/fbdev/msm/mdss_dsi_host.c
@@ -56,6 +56,7 @@ static struct mutex dsi_mtx;
/* event */
struct dsi_event_q {
struct mdss_dsi_ctrl_pdata *ctrl;
+ u32 arg;
u32 todo;
};
@@ -106,6 +107,7 @@ void mdss_dsi_ctrl_init(struct device *ctrl_dev,
spin_lock_init(&ctrl->mdp_lock);
mutex_init(&ctrl->mutex);
mutex_init(&ctrl->cmd_mutex);
+ mutex_init(&ctrl->clk_lane_mutex);
mdss_dsi_buf_alloc(ctrl_dev, &ctrl->tx_buf, SZ_4K);
mdss_dsi_buf_alloc(ctrl_dev, &ctrl->rx_buf, SZ_4K);
mdss_dsi_buf_alloc(ctrl_dev, &ctrl->status_buf, SZ_4K);
@@ -261,6 +263,13 @@ void mdss_dsi_read_hw_revision(struct mdss_dsi_ctrl_pdata *ctrl)
{
/* clock must be on */
ctrl->hw_rev = MIPI_INP(ctrl->ctrl_base);
+}
+
+void mdss_dsi_get_hw_revision(struct mdss_dsi_ctrl_pdata *ctrl)
+{
+ mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 1);
+ ctrl->hw_rev = MIPI_INP(ctrl->ctrl_base);
+ mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 0);
pr_debug("%s: ndx=%d hw_rev=%x\n", __func__,
ctrl->ndx, ctrl->hw_rev);
@@ -459,107 +468,163 @@ void mdss_dsi_sw_reset(struct mdss_dsi_ctrl_pdata *ctrl, bool restore)
}
}
-void mdss_dsi_ctrl_phy_restore(struct mdss_dsi_ctrl_pdata *ctrl)
+static void mdss_dsi_cfg_lane_ctrl(struct mdss_dsi_ctrl_pdata *ctrl,
+ u32 bits, int set)
{
- struct mdss_dsi_ctrl_pdata *ctrl0, *ctrl1;
- u32 ln0, ln1, ln_ctrl0, ln_ctrl1, i;
- /*
- * Add delay suggested by HW team.
- */
- u32 loop = 10;
+ u32 data;
+
+ data = MIPI_INP(ctrl->ctrl_base + 0x00ac);
+ if (set)
+ data |= bits;
+ else
+ data &= ~bits;
+ MIPI_OUTP(ctrl->ctrl_base + 0x0ac, data);
+}
+
- if (ctrl->ndx == DSI_CTRL_1)
+static inline bool mdss_dsi_poll_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
+{
+ u32 clk = 0;
+
+ if (readl_poll_timeout(((ctrl->ctrl_base) + 0x00a8),
+ clk,
+ (clk & 0x0010),
+ 10, 1000)) {
+ pr_err("%s: ndx=%d clk lane NOT stopped, clk=%x\n",
+ __func__, ctrl->ndx, clk);
+
+ return false;
+ }
+ return true;
+}
+
+static void mdss_dsi_wait_clk_lane_to_stop(struct mdss_dsi_ctrl_pdata *ctrl)
+{
+ if (mdss_dsi_poll_clk_lane(ctrl)) /* stopped */
return;
- pr_debug("MDSS DSI CTRL PHY restore. ctrl-num = %d\n", ctrl->ndx);
+ /* clk stuck at hs, start recovery process */
- ctrl0 = mdss_dsi_get_ctrl_by_index(DSI_CTRL_0);
- if (mdss_dsi_split_display_enabled()) {
- ctrl1 = mdss_dsi_get_ctrl_by_index(DSI_CTRL_1);
- if (!ctrl1)
- return;
+ /* force clk lane tx stop -- bit 20 */
+ mdss_dsi_cfg_lane_ctrl(ctrl, BIT(20), 1);
- ln_ctrl0 = MIPI_INP(ctrl0->ctrl_base + 0x00ac);
- ln_ctrl1 = MIPI_INP(ctrl1->ctrl_base + 0x00ac);
- MIPI_OUTP(ctrl0->ctrl_base + 0x0ac, ln_ctrl0 & ~BIT(28));
- MIPI_OUTP(ctrl1->ctrl_base + 0x0ac, ln_ctrl1 & ~BIT(28));
+ if (mdss_dsi_poll_clk_lane(ctrl) == false)
+ pr_err("%s: clk lane recovery failed\n", __func__);
- /*
- * Toggle Clk lane Force TX stop so that
- * clk lane status is no more in stop state
- */
- ln0 = MIPI_INP(ctrl0->ctrl_base + 0x00a8);
- ln1 = MIPI_INP(ctrl1->ctrl_base + 0x00a8);
+ /* clear clk lane tx stop -- bit 20 */
+ mdss_dsi_cfg_lane_ctrl(ctrl, BIT(20), 0);
+}
+/*
+ * mdss_dsi_start_hs_clk_lane:
+ * this function is work around solution for 8994 dsi clk lane
+ * may stuck at HS problem
+ */
+static void mdss_dsi_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
+{
+ mutex_lock(&ctrl->clk_lane_mutex);
+ if (ctrl->clk_lane_cnt) {
+ pr_err("%s: ndx=%d do-wait, cnt=%d\n",
+ __func__, ctrl->ndx, ctrl->clk_lane_cnt);
+ mdss_dsi_wait_clk_lane_to_stop(ctrl);
+ }
+
+ /* force clk lane hs for next dma or mdp stream */
+ mdss_dsi_cfg_lane_ctrl(ctrl, BIT(28), 1);
+ ctrl->clk_lane_cnt++;
+ pr_debug("%s: ndx=%d, set_hs, cnt=%d\n", __func__,
+ ctrl->ndx, ctrl->clk_lane_cnt);
+ mutex_unlock(&ctrl->clk_lane_mutex);
+}
- pr_debug("%s: lane status, ctrl0 = 0x%x, ctrl1 = 0x%x\n",
- __func__, ln0, ln1);
-
- if ((ln0 == 0x1f0f) || (ln1 == 0x1f0f)) {
- ln_ctrl0 = MIPI_INP(ctrl0->ctrl_base + 0x00ac);
- ln_ctrl1 = MIPI_INP(ctrl1->ctrl_base + 0x00ac);
- MIPI_OUTP(ctrl0->ctrl_base + 0x0ac, ln_ctrl0 | BIT(20));
- MIPI_OUTP(ctrl1->ctrl_base + 0x0ac, ln_ctrl1 | BIT(20));
-
- for (i = 0; i < loop; i++) {
- ln0 = MIPI_INP(ctrl0->ctrl_base + 0x00a8);
- ln1 = MIPI_INP(ctrl1->ctrl_base + 0x00a8);
- if ((ln0 == 0x1f1f) && (ln1 == 0x1f1f))
- break;
- else
- /*
- * check clk lane status for every 1
- * milli second
- */
- udelay(1000);
- }
- pr_debug("%s: lane ctrl, ctrl0 = 0x%x, ctrl1 = 0x%x\n",
- __func__, ln0, ln1);
- MIPI_OUTP(ctrl0->ctrl_base + 0x0ac,
- ln_ctrl0 & ~BIT(20));
- MIPI_OUTP(ctrl1->ctrl_base + 0x0ac,
- ln_ctrl1 & ~BIT(20));
- }
+/*
+ * mdss_dsi_stop_hs_clk_lane:
+ * this function is work around solution for 8994 dsi clk lane
+ * may stuck at HS problem
+ */
+static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl,
+ u32 term)
+{
+ u32 fifo = 0;
+ u32 lane = 0;
+ unsigned long flags;
- ln_ctrl0 = MIPI_INP(ctrl0->ctrl_base + 0x00ac);
- ln_ctrl1 = MIPI_INP(ctrl1->ctrl_base + 0x00ac);
- MIPI_OUTP(ctrl0->ctrl_base + 0x0ac, ln_ctrl0 | BIT(28));
- MIPI_OUTP(ctrl1->ctrl_base + 0x0ac, ln_ctrl1 | BIT(28));
- } else {
- ln_ctrl0 = MIPI_INP(ctrl0->ctrl_base + 0x00ac);
- MIPI_OUTP(ctrl0->ctrl_base + 0x0ac, ln_ctrl0 & ~BIT(28));
+ mutex_lock(&ctrl->clk_lane_mutex);
+ if (ctrl->clk_lane_cnt != 1) {
+ pr_err("%s: ndx=%d wait had been done, cnt=%d\n",
+ __func__, ctrl->ndx, ctrl->clk_lane_cnt);
+ goto release;
+ }
- /*
- * Toggle Clk lane Force TX stop so that
- * clk lane status is no more in stop state
- */
- ln0 = MIPI_INP(ctrl0->ctrl_base + 0x00a8);
+ /* fifo */
+ if (readl_poll_timeout(((ctrl->ctrl_base) + 0x000c),
+ fifo,
+ ((fifo & 0x11110000) == 0x11110000),
+ 10, 1000)) {
+ pr_err("%s: fifo NOT empty, fifo=%x\n",
+ __func__, fifo);
+ goto end;
+ }
- pr_debug("%s: lane status, ctrl0 = 0x%x\n", __func__, ln0);
-
- if (ln0 == 0x1f0f) {
- ln_ctrl0 = MIPI_INP(ctrl0->ctrl_base + 0x00ac);
- MIPI_OUTP(ctrl0->ctrl_base + 0x0ac, ln_ctrl0 | BIT(20));
-
- for (i = 0; i < loop; i++) {
- ln0 = MIPI_INP(ctrl0->ctrl_base + 0x00a8);
- if (ln0 == 0x1f1f)
- break;
- else
- /*
- * check clk lane status for every 1
- * milli second
- */
- udelay(1000);
- }
- pr_debug("%s: lane ctrl, ctrl0 = 0x%x\n",
- __func__, ln0);
- MIPI_OUTP(ctrl0->ctrl_base + 0x0ac,
- ln_ctrl0 & ~BIT(20));
- }
+ /* data lane status */
+ if (readl_poll_timeout(((ctrl->ctrl_base) + 0x00a8),
+ lane,
+ ((lane & 0x000f) == 0x000f),
+ 100, 2000)) {
+ pr_err("%s: datalane NOT stopped, lane=%x\n",
+ __func__, lane);
+ }
- ln_ctrl0 = MIPI_INP(ctrl0->ctrl_base + 0x00ac);
- MIPI_OUTP(ctrl0->ctrl_base + 0x0ac, ln_ctrl0 | BIT(28));
+end:
+ /* stop force clk lane hs */
+ mdss_dsi_cfg_lane_ctrl(ctrl, BIT(28), 0);
+
+ mdss_dsi_wait_clk_lane_to_stop(ctrl);
+
+ ctrl->clk_lane_cnt = 0;
+
+release:
+ if (term == DSI_MDP_TERM) {
+ spin_lock_irqsave(&ctrl->mdp_lock, flags);
+ ctrl->mdp_busy = false;
+ complete(&ctrl->mdp_comp);
+ spin_unlock_irqrestore(&ctrl->mdp_lock, flags);
+ }
+ pr_debug("%s: ndx=%d, cnt=%d\n", __func__,
+ ctrl->ndx, ctrl->clk_lane_cnt);
+
+ mutex_unlock(&ctrl->clk_lane_mutex);
+}
+
+static void mdss_dsi_cmd_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
+{
+ struct mdss_dsi_ctrl_pdata *mctrl = NULL;
+
+ if (mdss_dsi_sync_wait_enable(ctrl)) {
+ if (!mdss_dsi_sync_wait_trigger(ctrl))
+ return;
+ mctrl = mdss_dsi_get_other_ctrl(ctrl);
+
+ if (mctrl)
+ mdss_dsi_start_hs_clk_lane(mctrl);
+ }
+
+ mdss_dsi_start_hs_clk_lane(ctrl);
+}
+
+static void mdss_dsi_cmd_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
+{
+ struct mdss_dsi_ctrl_pdata *mctrl = NULL;
+
+ if (mdss_dsi_sync_wait_enable(ctrl)) {
+ if (!mdss_dsi_sync_wait_trigger(ctrl))
+ return;
+ mctrl = mdss_dsi_get_other_ctrl(ctrl);
+
+ if (mctrl)
+ mdss_dsi_stop_hs_clk_lane(mctrl, DSI_CMD_TERM);
}
+
+ mdss_dsi_stop_hs_clk_lane(ctrl, DSI_CMD_TERM);
}
static void mdss_dsi_ctl_phy_reset(struct mdss_dsi_ctrl_pdata *ctrl)
@@ -1902,8 +1967,12 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp)
if (mdss_get_sd_client_cnt())
return -EPERM;
- if (from_mdp) /* from mdp kickoff */
+ if (from_mdp) { /* from mdp kickoff */
mutex_lock(&ctrl->cmd_mutex);
+ pinfo = &ctrl->panel_data.panel_info;
+ if (pinfo->partial_update_enabled)
+ roi = &pinfo->roi;
+ }
req = mdss_dsi_cmdlist_get(ctrl);
@@ -1916,6 +1985,27 @@ int mdss_dsi_cmdlist_commit(struct mdss_dsi_ctrl_pdata *ctrl, int from_mdp)
pr_debug("%s: ctrl=%d from_mdp=%d pid=%d\n", __func__,
ctrl->ndx, from_mdp, current->pid);
+ if (from_mdp) { /* from mdp kickoff */
+ /*
+ * when partial update enabled, the roi of pinfo
+ * is updated before mdp kickoff. Either width or
+ * height of roi is 0, then it is false kickoff so
+ * no mdp_busy flag set needed.
+ * when partial update disabled, mdp_busy flag
+ * alway set.
+ */
+ if (!roi || (roi->w != 0 || roi->h != 0)) {
+ if (ctrl->hw_rev == MDSS_DSI_HW_REV_103 &&
+ ctrl->panel_mode == DSI_CMD_MODE)
+ mdss_dsi_start_hs_clk_lane(ctrl);
+ }
+ } else { /* from dcs send */
+ if (ctrl->hw_rev == MDSS_DSI_HW_REV_103 &&
+ ctrl->panel_mode == DSI_CMD_MODE)
+ mdss_dsi_cmd_start_hs_clk_lane(ctrl);
+ }
+
+
if (req == NULL)
goto need_lock;
@@ -1978,20 +2068,21 @@ need_lock:
* when partial update disabled, mdp_busy flag
* alway set.
*/
- pinfo = &ctrl->panel_data.panel_info;
- if (pinfo->partial_update_enabled)
- roi = &pinfo->roi;
-
if (!roi || (roi->w != 0 || roi->h != 0))
mdss_dsi_cmd_mdp_start(ctrl);
mutex_unlock(&ctrl->cmd_mutex);
+ } else { /* from dcs send */
+ if (ctrl->hw_rev == MDSS_DSI_HW_REV_103 &&
+ ctrl->panel_mode == DSI_CMD_MODE)
+ mdss_dsi_cmd_stop_hs_clk_lane(ctrl);
}
return ret;
}
-static void dsi_send_events(struct mdss_dsi_ctrl_pdata *ctrl, u32 events)
+static void dsi_send_events(struct mdss_dsi_ctrl_pdata *ctrl,
+ u32 events, u32 arg)
{
struct dsi_event_q *evq;
@@ -2003,6 +2094,7 @@ static void dsi_send_events(struct mdss_dsi_ctrl_pdata *ctrl, u32 events)
spin_lock(&dsi_event.event_lock);
evq = &dsi_event.todo_list[dsi_event.event_pndx++];
evq->todo = events;
+ evq->arg = arg;
evq->ctrl = ctrl;
dsi_event.event_pndx %= DSI_EVENT_Q_MAX;
wake_up(&dsi_event.event_q);
@@ -2017,6 +2109,7 @@ static int dsi_event_thread(void *data)
unsigned long flag;
struct sched_param param;
u32 todo = 0, ln_status;
+ u32 arg;
int ret;
param.sched_priority = 16;
@@ -2035,6 +2128,7 @@ static int dsi_event_thread(void *data)
evq = &ev->todo_list[ev->event_gndx++];
todo = evq->todo;
ctrl = evq->ctrl;
+ arg = evq->arg;
evq->todo = 0;
ev->event_gndx %= DSI_EVENT_Q_MAX;
spin_unlock_irqrestore(&ev->event_lock, flag);
@@ -2117,6 +2211,8 @@ static int dsi_event_thread(void *data)
mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 0);
}
+ if (todo & DSI_EV_STOP_HS_CLK_LANE)
+ mdss_dsi_stop_hs_clk_lane(ctrl, arg);
}
return 0;
@@ -2183,14 +2279,14 @@ void mdss_dsi_fifo_status(struct mdss_dsi_ctrl_pdata *ctrl)
MIPI_OUTP(base + 0x000c, status);
pr_err("%s: status=%x\n", __func__, status);
if (status & 0x44440000) {/* DLNx_HS_FIFO_OVERFLOW */
- dsi_send_events(ctrl, DSI_EV_DLNx_FIFO_OVERFLOW);
+ dsi_send_events(ctrl, DSI_EV_DLNx_FIFO_OVERFLOW, 0);
/* Ignore FIFO EMPTY when overflow happens */
status = status & 0xeeeeffff;
}
if (status & 0x0080) /* CMD_DMA_FIFO_UNDERFLOW */
- dsi_send_events(ctrl, DSI_EV_MDP_FIFO_UNDERFLOW);
+ dsi_send_events(ctrl, DSI_EV_MDP_FIFO_UNDERFLOW, 0);
if (status & 0x11110000) /* DLN_FIFO_EMPTY */
- dsi_send_events(ctrl, DSI_EV_DSI_FIFO_EMPTY);
+ dsi_send_events(ctrl, DSI_EV_DSI_FIFO_EMPTY, 0);
}
}
@@ -2219,7 +2315,7 @@ void mdss_dsi_clk_status(struct mdss_dsi_ctrl_pdata *ctrl)
if (status & 0x10000) { /* DSI_CLK_PLL_UNLOCKED */
MIPI_OUTP(base + 0x0120, status);
- dsi_send_events(ctrl, DSI_EV_PLL_UNLOCKED);
+ dsi_send_events(ctrl, DSI_EV_PLL_UNLOCKED, 0);
pr_err("%s: status=%x\n", __func__, status);
}
}
@@ -2245,7 +2341,7 @@ void mdss_dsi_error(struct mdss_dsi_ctrl_pdata *ctrl)
intr |= DSI_INTR_ERROR;
MIPI_OUTP(ctrl->ctrl_base + 0x0110, intr);
- dsi_send_events(ctrl, DSI_EV_MDP_BUSY_RELEASE);
+ dsi_send_events(ctrl, DSI_EV_MDP_BUSY_RELEASE, 0);
}
irqreturn_t mdss_dsi_isr(int irq, void *ptr)
@@ -2288,9 +2384,15 @@ irqreturn_t mdss_dsi_isr(int irq, void *ptr)
if (isr & DSI_INTR_CMD_MDP_DONE) {
MDSS_XLOG(ctrl->ndx, ctrl->mdp_busy, isr, 0x99);
spin_lock(&ctrl->mdp_lock);
- ctrl->mdp_busy = false;
mdss_dsi_disable_irq_nosync(ctrl, DSI_MDP_TERM);
- complete(&ctrl->mdp_comp);
+ if (ctrl->hw_rev == MDSS_DSI_HW_REV_103 &&
+ ctrl->panel_mode == DSI_CMD_MODE) {
+ dsi_send_events(ctrl, DSI_EV_STOP_HS_CLK_LANE,
+ DSI_MDP_TERM);
+ } else {
+ ctrl->mdp_busy = false;
+ complete(&ctrl->mdp_comp);
+ }
spin_unlock(&ctrl->mdp_lock);
}
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
index 6985382bf675..d158db7993ab 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_cmd.c
@@ -942,10 +942,6 @@ int mdss_mdp_cmd_kickoff(struct mdss_mdp_ctl *ctl, void *arg)
if (sctx)
mdss_mdp_irq_enable(MDSS_MDP_IRQ_PING_PONG_COMP, sctx->pp_num);
- if (ctl->mdata->mdp_rev == MDSS_MDP_HW_REV_105 ||
- ctl->mdata->mdp_rev == MDSS_MDP_HW_REV_109)
- mdss_mdp_ctl_intf_event(ctl, MDSS_EVENT_INTF_RESTORE, NULL);
-
if (!ctx->autorefresh_pending && !ctl->cmd_autorefresh_en) {
/* Kickoff */
mdss_mdp_ctl_write(ctl, MDSS_MDP_REG_CTL_START, 1);
diff --git a/drivers/video/fbdev/msm/mdss_panel.h b/drivers/video/fbdev/msm/mdss_panel.h
index d58e23bf40d3..c0b298316eed 100644
--- a/drivers/video/fbdev/msm/mdss_panel.h
+++ b/drivers/video/fbdev/msm/mdss_panel.h
@@ -181,8 +181,6 @@ struct mdss_intf_recovery {
* - 1: update to command mode
* @MDSS_EVENT_REGISTER_RECOVERY_HANDLER: Event to recover the interface in
* case there was any errors detected.
- * @MDSS_EVENT_INTF_RESTORE: Event to restore the interface in case there
- * was any errors detected during normal operation.
*/
enum mdss_intf_events {
MDSS_EVENT_RESET = 1,
@@ -205,7 +203,6 @@ enum mdss_intf_events {
MDSS_EVENT_DSI_STREAM_SIZE,
MDSS_EVENT_DSI_DYNAMIC_SWITCH,
MDSS_EVENT_REGISTER_RECOVERY_HANDLER,
- MDSS_EVENT_INTF_RESTORE,
};
struct lcd_panel_info {