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

Commit 8f7d234e authored by Sandeep Panda's avatar Sandeep Panda
Browse files

msm: mdss: enable ref count based PM_QOS request for DSI



DSI controller requests for PM_QOS while sending DCS commands,
so that CPU does not go to idle state until DCS command transfer
is finished. But this request can come independently from multiple
clients such as different DSI controllers. So this change adds
ref count based PM_QOS request to avoid warning for multiple QOS add
request and unwanted results, if one client removes the request while
the other clients still need it.

Change-Id: If3ca0161923fcd73fdde77984aa5d80bfaec79a1
Signed-off-by: default avatarSandeep Panda <spanda@codeaurora.org>
parent 9f60bf16
Loading
Loading
Loading
Loading
+30 −10
Original line number Diff line number Diff line
@@ -45,18 +45,38 @@ static struct mdss_dsi_data *mdss_dsi_res;

static struct pm_qos_request mdss_dsi_pm_qos_request;

static void mdss_dsi_pm_qos_add_request(void)
static void mdss_dsi_pm_qos_add_request(struct dsi_shared_data *sdata)
{
	if (!sdata)
		return;

	mutex_lock(&sdata->pm_qos_lock);
	if (!sdata->pm_qos_req_cnt) {
		pr_debug("%s: add request", __func__);
	pm_qos_add_request(&mdss_dsi_pm_qos_request, PM_QOS_CPU_DMA_LATENCY,
			PM_QOS_DEFAULT_VALUE);
		pm_qos_add_request(&mdss_dsi_pm_qos_request,
			PM_QOS_CPU_DMA_LATENCY,	PM_QOS_DEFAULT_VALUE);
	}
	sdata->pm_qos_req_cnt++;
	mutex_unlock(&sdata->pm_qos_lock);
}

static void mdss_dsi_pm_qos_remove_request(void)
static void mdss_dsi_pm_qos_remove_request(struct dsi_shared_data *sdata)
{
	if (!sdata)
		return;

	mutex_lock(&sdata->pm_qos_lock);
	if (sdata->pm_qos_req_cnt) {
		sdata->pm_qos_req_cnt--;
		if (!sdata->pm_qos_req_cnt) {
			pr_debug("%s: remove request", __func__);
			pm_qos_remove_request(&mdss_dsi_pm_qos_request);
		}
	} else {
		pr_warn("%s: unbalanced pm_qos ref count\n", __func__);
	}
	mutex_unlock(&sdata->pm_qos_lock);
}

static void mdss_dsi_pm_qos_update_request(int val)
{
@@ -3131,14 +3151,13 @@ static int mdss_dsi_ctrl_probe(struct platform_device *pdev)
	pr_info("%s: Dsi Ctrl->%d initialized, DSI rev:0x%x, PHY rev:0x%x\n",
		__func__, index, ctrl_pdata->shared_data->hw_rev,
		ctrl_pdata->shared_data->phy_rev);
	mdss_dsi_pm_qos_add_request(ctrl_pdata->shared_data);

	if (index == 0)
		ctrl_pdata->shared_data->dsi0_active = true;
	else
		ctrl_pdata->shared_data->dsi1_active = true;

	mdss_dsi_pm_qos_add_request();

	return 0;

error_shadow_clk_deinit:
@@ -3335,6 +3354,7 @@ static int mdss_dsi_res_init(struct platform_device *pdev)
		}

		mutex_init(&sdata->phy_reg_lock);
		mutex_init(&sdata->pm_qos_lock);

		for (i = 0; i < DSI_CTRL_MAX; i++) {
			mdss_dsi_res->ctrl_pdata[i] = devm_kzalloc(&pdev->dev,
@@ -3605,7 +3625,7 @@ static int mdss_dsi_ctrl_remove(struct platform_device *pdev)
		return -ENODEV;
	}

	mdss_dsi_pm_qos_remove_request();
	mdss_dsi_pm_qos_remove_request(ctrl_pdata->shared_data);

	if (msm_dss_config_vreg(&pdev->dev,
			ctrl_pdata->panel_power_data.vreg_config,
+4 −0
Original line number Diff line number Diff line
@@ -279,6 +279,10 @@ struct dsi_shared_data {
	struct msm_bus_scale_pdata *bus_scale_table;
	u32 bus_handle;
	u32 bus_refcount;

	/* Shared mutex for pm_qos ref count */
	struct mutex pm_qos_lock;
	u32 pm_qos_req_cnt;
};

struct mdss_dsi_data {