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: Dhaval Patel <pdhaval@codeaurora.org>
Cette révision appartient à :
@@ -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);
|
||||
|
Référencer dans un nouveau ticket
Bloquer un utilisateur