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

Commit 17cb169a authored by Ashish Garg's avatar Ashish Garg
Browse files

msm: mdss: Fix dynamic refresh sequence



Dynamic refresh done interrupt is received and it is cleared.
Unmasking of PLL_UNLOCKED interrupt should be done only after
checking if RESETSM_READY_STATUS.CORE_READY is 1. This would
ensure that the clocks are in proper state before PLL_UNLOCKED
interrupt is unmasked.

Change-Id: I5d5762fada1a0722d0eb71fd9006d14e847ca388
Signed-off-by: default avatarAshish Garg <ashigarg@codeaurora.org>
parent f62dfbb4
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -2034,6 +2034,13 @@ static int __mdss_dsi_dfps_update_clks(struct mdss_panel_data *pdata,
		MIPI_OUTP((sctrl_pdata->ctrl_base) + DSI_DYNAMIC_REFRESH_CTRL,
				0x00);

	rc = mdss_dsi_phy_pll_reset_status(ctrl_pdata);
	if (rc) {
		pr_err("%s: pll cannot be locked reset core ready failed %d\n",
			__func__, rc);
		goto dfps_timeout;
	}

	__mdss_dsi_mask_dfps_errors(ctrl_pdata, false);
	if (sctrl_pdata)
		__mdss_dsi_mask_dfps_errors(sctrl_pdata, false);
+1 −0
Original line number Diff line number Diff line
@@ -663,6 +663,7 @@ void mdss_dsi_dfps_config_8996(struct mdss_dsi_ctrl_pdata *ctrl);
void mdss_dsi_set_burst_mode(struct mdss_dsi_ctrl_pdata *ctrl);
void mdss_dsi_set_reg(struct mdss_dsi_ctrl_pdata *ctrl, int off,
	u32 mask, u32 val);
int mdss_dsi_phy_pll_reset_status(struct mdss_dsi_ctrl_pdata *ctrl);

static inline const char *__mdss_dsi_pm_name(enum dsi_pm_type module)
{
+16 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@
#include <linux/err.h>
#include <linux/io.h>
#include <linux/clk/msm-clk.h>
#include <linux/iopoll.h>
#include <linux/kthread.h>

#include "mdss_dsi.h"
#include "mdss_edp.h"
@@ -427,6 +429,20 @@ static void mdss_dsi_ctrl_phy_reset(struct mdss_dsi_ctrl_pdata *ctrl)
	wmb();	/* maek sure reset cleared */
}

int mdss_dsi_phy_pll_reset_status(struct mdss_dsi_ctrl_pdata *ctrl)
{
	int rc;
	u32 val;
	u32 const sleep_us = 10, timeout_us = 100;

	pr_debug("%s: polling for RESETSM_READY_STATUS.CORE_READY\n",
		__func__);
	rc = readl_poll_timeout(ctrl->phy_io.base + 0x4cc, val,
		(val & 0x1), sleep_us, timeout_us);

	return rc;
}

void mdss_dsi_phy_sw_reset(struct mdss_dsi_ctrl_pdata *ctrl)
{
	struct mdss_dsi_ctrl_pdata *sctrl = NULL;