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

Commit a74d2cf7 authored by Dhaval Patel's avatar Dhaval Patel
Browse files

disp: msm: add runtime_pm ops support in drm driver



Add runtime_pm ops support in drm driver instead
of direct sde_power_resource_enable/disable call.
It allows drm driver to use runtime pm refcount logic
to track the resources instead of custom implementation.
The change also removes the NRT_CLIENT support from
sde_power_handle code to simplify it further.

Change-Id: Ib14692dca5876703d0a230da2512d731b69b8ebb
Signed-off-by: default avatarDhaval Patel <pdhaval@codeaurora.org>
parent a702cd89
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1213,7 +1213,8 @@ static int dp_init_sub_modules(struct dp_display_private *dp)
		goto error_power;
	}

	rc = dp->power->power_client_init(dp->power, &dp->priv->phandle);
	rc = dp->power->power_client_init(dp->power, &dp->priv->phandle,
		dp->dp_display.drm_dev);
	if (rc) {
		pr_err("Power client create failed\n");
		goto error_aux;
+12 −29
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@
#define pr_fmt(fmt)	"[drm-dp] %s: " fmt, __func__

#include <linux/clk.h>
#include <linux/pm_runtime.h>
#include <drm/drmP.h>
#include "dp_power.h"
#include "dp_catalog.h"

@@ -20,8 +22,6 @@ struct dp_power_private {
	struct clk *pixel1_parent;

	struct dp_power dp_power;
	struct sde_power_client *dp_core_client;
	struct sde_power_handle *phandle;

	bool core_clks_on;
	bool link_clks_on;
@@ -458,14 +458,13 @@ static int dp_power_config_gpios(struct dp_power_private *power, bool flip,
}

static int dp_power_client_init(struct dp_power *dp_power,
		struct sde_power_handle *phandle)
	struct sde_power_handle *phandle, struct drm_device *drm_dev)
{
	int rc = 0;
	struct dp_power_private *power;
	char dp_client_name[DP_CLIENT_NAME_SIZE];

	if (!dp_power) {
		pr_err("invalid power data\n");
	if (!drm_dev) {
		pr_err("invalid drm_dev\n");
		return -EINVAL;
	}

@@ -482,20 +481,11 @@ static int dp_power_client_init(struct dp_power *dp_power,
		pr_err("failed to init clocks\n");
		goto error_clk;
	}
	dp_power->phandle = phandle;
	dp_power->drm_dev = drm_dev;

	power->phandle = phandle;
	snprintf(dp_client_name, DP_CLIENT_NAME_SIZE, "dp_core_client");
	power->dp_core_client = sde_power_client_create(phandle,
			dp_client_name);
	if (IS_ERR_OR_NULL(power->dp_core_client)) {
		pr_err("[%s] client creation failed for DP\n", dp_client_name);
		rc = -EINVAL;
		goto error_client;
	}
	return 0;

error_client:
	dp_power_clk_init(power, false);
error_clk:
	dp_power_regulator_deinit(power);
error_power:
@@ -513,7 +503,6 @@ static void dp_power_client_deinit(struct dp_power *dp_power)

	power = container_of(dp_power, struct dp_power_private, dp_power);

	sde_power_client_destroy(power->phandle, power->dp_core_client);
	dp_power_clk_init(power, false);
	dp_power_regulator_deinit(power);
}
@@ -559,7 +548,7 @@ static u64 dp_power_clk_get_rate(struct dp_power *dp_power, char *clk_name)
	}

	power = container_of(dp_power, struct dp_power_private, dp_power);
	mp = &power->phandle->mp;
	mp = &dp_power->phandle->mp;
	for (i = 0; i < mp->num_clk; i++) {
		if (!strcmp(mp->clk_config[i].clk_name, clk_name)) {
			rate = clk_get_rate(mp->clk_config[i].clk);
@@ -613,9 +602,8 @@ static int dp_power_init(struct dp_power *dp_power, bool flip)
		goto err_gpio;
	}

	rc = sde_power_resource_enable(power->phandle,
		power->dp_core_client, true);
	if (rc) {
	rc = pm_runtime_get_sync(dp_power->drm_dev->dev);
	if (rc < 0) {
		pr_err("Power resource enable failed\n");
		goto err_sde_power;
	}
@@ -629,7 +617,7 @@ static int dp_power_init(struct dp_power *dp_power, bool flip)
	return 0;

err_clk:
	sde_power_resource_enable(power->phandle, power->dp_core_client, false);
	pm_runtime_put_sync(dp_power->drm_dev->dev);
err_sde_power:
	dp_power_config_gpios(power, flip, false);
err_gpio:
@@ -657,13 +645,8 @@ static int dp_power_deinit(struct dp_power *dp_power)
		dp_power_clk_enable(dp_power, DP_LINK_PM, false);

	dp_power_clk_enable(dp_power, DP_CORE_PM, false);
	pm_runtime_put_sync(dp_power->drm_dev->dev);

	rc = sde_power_resource_enable(power->phandle,
			power->dp_core_client, false);
	if (rc) {
		pr_err("Power resource disable failed, rc=%d\n", rc);
		goto exit;
	}
	dp_power_config_gpios(power, false, false);
	dp_power_pinctrl_set(power, false);
	dp_power_regulator_ctrl(power, false);
+4 −1
Original line number Diff line number Diff line
@@ -19,6 +19,8 @@
 * @clk_get_rate: get the current rate for provided clk_name
 */
struct dp_power {
	struct drm_device *drm_dev;
	struct sde_power_handle *phandle;
	int (*init)(struct dp_power *power, bool flip);
	int (*deinit)(struct dp_power *power);
	int (*clk_enable)(struct dp_power *power, enum dp_pm_type pm_type,
@@ -26,7 +28,8 @@ struct dp_power {
	int (*set_pixel_clk_parent)(struct dp_power *power, u32 stream_id);
	u64 (*clk_get_rate)(struct dp_power *power, char *clk_name);
	int (*power_client_init)(struct dp_power *power,
				struct sde_power_handle *phandle);
		struct sde_power_handle *phandle,
		struct drm_device *drm_dev);
	void (*power_client_deinit)(struct dp_power *power);
};

+3 −5
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@
#include <linux/platform_device.h>
#include <linux/types.h>
#include <linux/clk.h>
#include "sde_power_handle.h"
#include <drm/drmP.h>

#define MAX_STRING_LEN 32
#define MAX_DSI_CTRL 2
@@ -72,8 +72,7 @@ struct clk_ctrl_cb {
 * @core_mmss_clk:       Handle to MMSS core clock.
 * @bus_clk:             Handle to bus clock.
 * @mnoc_clk:            Handle to MMSS NOC clock.
 * @dsi_core_client:	 Pointer to SDE power client
 * @phandle:             Pointer to SDE power handle
 * @drm:                 Pointer to drm device node
 */
struct dsi_core_clk_info {
	struct clk *mdp_core_clk;
@@ -81,8 +80,7 @@ struct dsi_core_clk_info {
	struct clk *core_mmss_clk;
	struct clk *bus_clk;
	struct clk *mnoc_clk;
	struct sde_power_client *dsi_core_client;
	struct sde_power_handle *phandle;
	struct drm_device *drm;
};

/**
+9 −20
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/msm-bus.h>
#include <linux/pm_runtime.h>
#include "dsi_clk.h"

struct dsi_core_clks {
@@ -554,10 +555,9 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks,
	 */

	m_clks = &clks[master_ndx];
	rc = sde_power_resource_enable(m_clks->clks.phandle,
			m_clks->clks.dsi_core_client, true);

	if (rc) {
	rc = pm_runtime_get_sync(m_clks->clks.drm->dev);
	if (rc < 0) {
		pr_err("Power resource enable failed, rc=%d\n", rc);
		goto error;
	}
@@ -574,9 +574,8 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks,
		if (!clk || (clk == m_clks))
			continue;

		rc = sde_power_resource_enable(clk->clks.phandle,
				clk->clks.dsi_core_client, true);
		if (rc) {
		rc = pm_runtime_get_sync(m_clks->clks.drm->dev);
		if (rc < 0) {
			pr_err("Power resource enable failed, rc=%d\n", rc);
			goto error_disable_master;
		}
@@ -584,8 +583,7 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks,
		rc = dsi_core_clk_start(clk);
		if (rc) {
			pr_err("failed to turn on clocks, rc=%d\n", rc);
			(void)sde_power_resource_enable(clk->clks.phandle,
					clk->clks.dsi_core_client, false);
			pm_runtime_put_sync(m_clks->clks.drm->dev);
			goto error_disable_master;
		}
	}
@@ -594,8 +592,7 @@ static int dsi_display_core_clk_enable(struct dsi_core_clks *clks,
	(void)dsi_core_clk_stop(m_clks);

error_disable_master_resource:
	(void)sde_power_resource_enable(m_clks->clks.phandle,
				m_clks->clks.dsi_core_client, false);
	pm_runtime_put_sync(m_clks->clks.drm->dev);
error:
	return rc;
}
@@ -697,12 +694,7 @@ static int dsi_display_core_clk_disable(struct dsi_core_clks *clks,
			goto error;
		}

		rc = sde_power_resource_enable(clk->clks.phandle,
				clk->clks.dsi_core_client, false);
		if (rc) {
			pr_err("Power resource disable failed: %d\n", rc);
			goto error;
		}
		pm_runtime_put_sync(m_clks->clks.drm->dev);
	}

	rc = dsi_core_clk_stop(m_clks);
@@ -711,10 +703,7 @@ static int dsi_display_core_clk_disable(struct dsi_core_clks *clks,
		goto error;
	}

	rc = sde_power_resource_enable(m_clks->clks.phandle,
				m_clks->clks.dsi_core_client, false);
	if (rc)
		pr_err("Power resource disable failed: %d\n", rc);
	pm_runtime_put_sync(m_clks->clks.drm->dev);
error:
	return rc;
}
Loading