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 à :
Dhaval Patel
2018-05-04 10:08:05 -07:00
Parent a702cd897f
révision a74d2cf7fa
26 fichiers modifiés avec 324 ajouts et 958 suppressions

Voir le fichier

@@ -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);