Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dccf96ec authored by Siddhartha Agrawal's avatar Siddhartha Agrawal Committed by Gerrit - the friendly Code Review server
Browse files

msm: mdss: wait for hs clk recovery to finish



There are instances where the hs clock lane recovery takes
more time than usual. Poll for some extra time before bailing
out.

CRs-Fixed: 865047
Change-Id: I24ddcf561096e808c0f62def141ed7691cdfa11e
Signed-off-by: default avatarKuogee Hsieh <khsieh@codeaurora.org>
parent 16bd12a5
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -494,7 +494,7 @@ static inline bool mdss_dsi_poll_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
	if (readl_poll_timeout(((ctrl->ctrl_base) + 0x00a8),
				clk,
				(clk & 0x0010),
				10, 1000)) {
				100, 20000)) {
		pr_err("%s: ndx=%d clk lane NOT stopped, clk=%x\n",
					__func__, ctrl->ndx, clk);

@@ -530,11 +530,12 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl);
 */
static void mdss_dsi_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
{

	/* make sure clk lane is stopped */
	mdss_dsi_stop_hs_clk_lane(ctrl);

	mutex_lock(&ctrl->clk_lane_mutex);
	MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt, current->pid,
			XLOG_FUNC_ENTRY);
	mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 1);
	if (ctrl->clk_lane_cnt) {
		pr_err("%s: ndx=%d do-wait, cnt=%d\n",
@@ -548,6 +549,8 @@ static void mdss_dsi_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
	pr_debug("%s: ndx=%d, set_hs, cnt=%d\n", __func__,
				ctrl->ndx, ctrl->clk_lane_cnt);
	mdss_dsi_clk_ctrl(ctrl, DSI_ALL_CLKS, 0);
	MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt,
			current->pid, XLOG_FUNC_EXIT);
	mutex_unlock(&ctrl->clk_lane_mutex);
}

@@ -555,6 +558,10 @@ static void mdss_dsi_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
 * mdss_dsi_stop_hs_clk_lane:
 * this function is work around solution for 8994 dsi clk lane
 * may stuck at HS problem
 * since this function is called by event_thread, it may wakeup
 * after next kickoff had been lunched and start_hs_clk_lane
 * had been started. Therefore more than 1 vsync polling time is needed.
 * Use 50ms timeout to cover 30 FPS case.
 */
static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
{
@@ -562,6 +569,8 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
	u32 lane = 0;

	mutex_lock(&ctrl->clk_lane_mutex);
	MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt, current->pid,
			XLOG_FUNC_ENTRY);
	if (ctrl->clk_lane_cnt == 0)	/* stopped already */
		goto release;

@@ -570,7 +579,7 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
	if (readl_poll_timeout(((ctrl->ctrl_base) + 0x000c),
			   fifo,
			   ((fifo & 0x11110000) == 0x11110000),
			       10, 1000)) {
			       100, 50000)) {
		pr_err("%s: fifo NOT empty, fifo=%x\n",
					__func__, fifo);
		goto end;
@@ -580,7 +589,7 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl)
	if (readl_poll_timeout(((ctrl->ctrl_base) + 0x00a8),
			   lane,
			   ((lane & 0x000f) == 0x000f),
			       100, 2000)) {
			       100, 20000)) {
		pr_err("%s: datalane NOT stopped, lane=%x\n",
					__func__, lane);
	}
@@ -596,6 +605,8 @@ release:
	pr_debug("%s: ndx=%d, cnt=%d\n", __func__,
			ctrl->ndx, ctrl->clk_lane_cnt);

	MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt,
			current->pid, XLOG_FUNC_EXIT);
	mutex_unlock(&ctrl->clk_lane_mutex);
}