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

Commit 509f01b2 authored by Sandeep Panda's avatar Sandeep Panda Committed by Kyle Yan
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 3a3f6a5c
Loading
Loading
Loading
Loading
+40 −10
Original line number Diff line number Diff line
@@ -45,18 +45,48 @@ 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 mdss_dsi_ctrl_pdata *ctrl_pdata)
{
	pr_debug("%s: add request", __func__);
	pm_qos_add_request(&mdss_dsi_pm_qos_request, PM_QOS_CPU_DMA_LATENCY,
			PM_QOS_DEFAULT_VALUE);
	struct irq_info *irq_info;

	if (!ctrl_pdata || !ctrl_pdata->shared_data)
		return;

	irq_info = ctrl_pdata->dsi_hw->irq_info;

	if (!irq_info)
		return;

	mutex_lock(&ctrl_pdata->shared_data->pm_qos_lock);
	if (!ctrl_pdata->shared_data->pm_qos_req_cnt) {
		pr_debug("%s: add request irq\n", __func__);

		mdss_dsi_pm_qos_request.type = PM_QOS_REQ_AFFINE_IRQ;
		mdss_dsi_pm_qos_request.irq = irq_info->irq;
		pm_qos_add_request(&mdss_dsi_pm_qos_request,
			PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE);
	}
	ctrl_pdata->shared_data->pm_qos_req_cnt++;
	mutex_unlock(&ctrl_pdata->shared_data->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)
{
@@ -3183,14 +3213,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);

	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:
@@ -3387,6 +3416,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,
@@ -3657,7 +3687,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
@@ -281,6 +281,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 {