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>
This commit is contained in:
@@ -13,6 +13,8 @@
|
||||
#include <linux/dma-buf.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/list_sort.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include "sde_dbg.h"
|
||||
#include "sde/sde_hw_catalog.h"
|
||||
@@ -196,7 +198,6 @@ struct sde_dbg_regbuf {
|
||||
* @reg_base_list: list of register dumping regions
|
||||
* @dev: device pointer
|
||||
* @mutex: mutex to serialize access to serialze dumps, debugfs access
|
||||
* @power_ctrl: callback structure for enabling power for reading hw registers
|
||||
* @req_dump_blks: list of blocks requested for dumping
|
||||
* @panic_on_err: whether to kernel panic after triggering dump via debugfs
|
||||
* @dump_work: work struct for deferring register dump work to separate thread
|
||||
@@ -216,7 +217,6 @@ static struct sde_dbg_base {
|
||||
struct list_head reg_base_list;
|
||||
struct device *dev;
|
||||
struct mutex mutex;
|
||||
struct sde_dbg_power_ctrl power_ctrl;
|
||||
|
||||
struct sde_dbg_reg_base *req_dump_blks[SDE_DBG_BASE_MAX];
|
||||
|
||||
@@ -2825,21 +2825,6 @@ static struct vbif_debug_bus_entry vbif_dbg_bus_msm8998[] = {
|
||||
{0x21c, 0x214, 0, 14, 0, 0xc}, /* xin blocks - clock side */
|
||||
};
|
||||
|
||||
/**
|
||||
* _sde_dbg_enable_power - use callback to turn power on for hw register access
|
||||
* @enable: whether to turn power on or off
|
||||
* Return: zero if success; error code otherwise
|
||||
*/
|
||||
static inline int _sde_dbg_enable_power(int enable)
|
||||
{
|
||||
if (!sde_dbg_base.power_ctrl.enable_fn)
|
||||
return -EINVAL;
|
||||
return sde_dbg_base.power_ctrl.enable_fn(
|
||||
sde_dbg_base.power_ctrl.handle,
|
||||
sde_dbg_base.power_ctrl.client,
|
||||
enable);
|
||||
}
|
||||
|
||||
/**
|
||||
* _sde_dump_reg - helper function for dumping rotator register set content
|
||||
* @dump_name: register set name
|
||||
@@ -2901,8 +2886,8 @@ static void _sde_dump_reg(const char *dump_name, u32 reg_dump_flag,
|
||||
}
|
||||
|
||||
if (!from_isr) {
|
||||
rc = _sde_dbg_enable_power(true);
|
||||
if (rc) {
|
||||
rc = pm_runtime_get_sync(sde_dbg_base.dev);
|
||||
if (rc < 0) {
|
||||
pr_err("failed to enable power %d\n", rc);
|
||||
return;
|
||||
}
|
||||
@@ -2933,7 +2918,7 @@ static void _sde_dump_reg(const char *dump_name, u32 reg_dump_flag,
|
||||
}
|
||||
|
||||
if (!from_isr)
|
||||
_sde_dbg_enable_power(false);
|
||||
pm_runtime_put_sync(sde_dbg_base.dev);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3138,8 +3123,8 @@ static void _sde_dbg_dump_sde_dbg_bus(struct sde_dbg_sde_debug_bus *bus)
|
||||
}
|
||||
}
|
||||
|
||||
rc = _sde_dbg_enable_power(true);
|
||||
if (rc) {
|
||||
rc = pm_runtime_get_sync(sde_dbg_base.dev);
|
||||
if (rc < 0) {
|
||||
pr_err("failed to enable power %d\n", rc);
|
||||
return;
|
||||
}
|
||||
@@ -3183,7 +3168,7 @@ static void _sde_dbg_dump_sde_dbg_bus(struct sde_dbg_sde_debug_bus *bus)
|
||||
head->wr_addr != DBGBUS_DSPP)
|
||||
writel_relaxed(0x0, mem_base + DBGBUS_DSPP);
|
||||
}
|
||||
_sde_dbg_enable_power(false);
|
||||
pm_runtime_put_sync(sde_dbg_base.dev);
|
||||
|
||||
dev_info(sde_dbg_base.dev, "======== end %s dump =========\n",
|
||||
bus->cmn.name);
|
||||
@@ -3295,8 +3280,8 @@ static void _sde_dbg_dump_vbif_dbg_bus(struct sde_dbg_vbif_debug_bus *bus)
|
||||
}
|
||||
}
|
||||
|
||||
rc = _sde_dbg_enable_power(true);
|
||||
if (rc) {
|
||||
rc = pm_runtime_get_sync(sde_dbg_base.dev);
|
||||
if (rc < 0) {
|
||||
pr_err("failed to enable power %d\n", rc);
|
||||
return;
|
||||
}
|
||||
@@ -3350,7 +3335,7 @@ static void _sde_dbg_dump_vbif_dbg_bus(struct sde_dbg_vbif_debug_bus *bus)
|
||||
dump_addr += (head->block_cnt * head->test_pnt_cnt * 4);
|
||||
}
|
||||
|
||||
_sde_dbg_enable_power(false);
|
||||
pm_runtime_put_sync(sde_dbg_base.dev);
|
||||
|
||||
dev_info(sde_dbg_base.dev, "======== end %s dump =========\n",
|
||||
bus->cmn.name);
|
||||
@@ -4234,8 +4219,8 @@ static ssize_t sde_dbg_reg_base_reg_write(struct file *file,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
rc = _sde_dbg_enable_power(true);
|
||||
if (rc) {
|
||||
rc = pm_runtime_get_sync(sde_dbg_base.dev);
|
||||
if (rc < 0) {
|
||||
mutex_unlock(&sde_dbg_base.mutex);
|
||||
pr_err("failed to enable power %d\n", rc);
|
||||
return rc;
|
||||
@@ -4243,7 +4228,7 @@ static ssize_t sde_dbg_reg_base_reg_write(struct file *file,
|
||||
|
||||
writel_relaxed(data, dbg->base + off);
|
||||
|
||||
_sde_dbg_enable_power(false);
|
||||
pm_runtime_put_sync(sde_dbg_base.dev);
|
||||
|
||||
mutex_unlock(&sde_dbg_base.mutex);
|
||||
|
||||
@@ -4301,8 +4286,8 @@ static ssize_t sde_dbg_reg_base_reg_read(struct file *file,
|
||||
ptr = dbg->base + dbg->off;
|
||||
tot = 0;
|
||||
|
||||
rc = _sde_dbg_enable_power(true);
|
||||
if (rc) {
|
||||
rc = pm_runtime_get_sync(sde_dbg_base.dev);
|
||||
if (rc < 0) {
|
||||
mutex_unlock(&sde_dbg_base.mutex);
|
||||
pr_err("failed to enable power %d\n", rc);
|
||||
return rc;
|
||||
@@ -4324,7 +4309,7 @@ static ssize_t sde_dbg_reg_base_reg_read(struct file *file,
|
||||
break;
|
||||
}
|
||||
|
||||
_sde_dbg_enable_power(false);
|
||||
pm_runtime_put_sync(sde_dbg_base.dev);
|
||||
|
||||
dbg->buf_len = tot;
|
||||
}
|
||||
@@ -4457,9 +4442,9 @@ void sde_dbg_init_dbg_buses(u32 hwversion)
|
||||
}
|
||||
}
|
||||
|
||||
int sde_dbg_init(struct device *dev, struct sde_dbg_power_ctrl *power_ctrl)
|
||||
int sde_dbg_init(struct device *dev)
|
||||
{
|
||||
if (!dev || !power_ctrl) {
|
||||
if (!dev) {
|
||||
pr_err("invalid params\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -4467,7 +4452,6 @@ int sde_dbg_init(struct device *dev, struct sde_dbg_power_ctrl *power_ctrl)
|
||||
mutex_init(&sde_dbg_base.mutex);
|
||||
INIT_LIST_HEAD(&sde_dbg_base.reg_base_list);
|
||||
sde_dbg_base.dev = dev;
|
||||
sde_dbg_base.power_ctrl = *power_ctrl;
|
||||
|
||||
sde_dbg_base.evtlog = sde_evtlog_init();
|
||||
if (IS_ERR_OR_NULL(sde_dbg_base.evtlog))
|
||||
|
Reference in New Issue
Block a user