mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 02:34:10 -04:00
media: venus: Convert to dev_pm_domain_attach|detach_list() for vcodec
Let's avoid some of the boilerplate code to manage the vcodec PM domains, by converting into using dev_pm_domain_attach|detach_list(). Cc: Mauro Carvalho Chehab <mchehab@kernel.org> Cc: Stanimir Varbanov <stanimir.k.varbanov@gmail.com> Cc: Vikash Garodia <quic_vgarodia@quicinc.com> Cc: Bjorn Andersson <andersson@kernel.org> Cc: Konrad Dybcio <konrad.dybcio@linaro.org> Cc: <linux-media@vger.kernel.org> Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Link: https://lore.kernel.org/r/20240130123951.236243-6-ulf.hansson@linaro.org
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/pm_domain.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <media/videobuf2-v4l2.h>
|
||||
#include <media/v4l2-mem2mem.h>
|
||||
@@ -114,7 +115,8 @@ static void venus_sys_error_handler(struct work_struct *work)
|
||||
pm_runtime_put_sync(core->dev);
|
||||
|
||||
for (i = 0; i < max_attempts; i++) {
|
||||
if (!core->pmdomains[0] || !pm_runtime_active(core->pmdomains[0]))
|
||||
if (!core->pmdomains ||
|
||||
!pm_runtime_active(core->pmdomains->pd_devs[0]))
|
||||
break;
|
||||
usleep_range(1000, 1500);
|
||||
}
|
||||
@@ -705,7 +707,7 @@ static const struct venus_resources sdm845_res_v2 = {
|
||||
.vcodec0_clks = { "vcodec0_core", "vcodec0_bus" },
|
||||
.vcodec1_clks = { "vcodec1_core", "vcodec1_bus" },
|
||||
.vcodec_clks_num = 2,
|
||||
.vcodec_pmdomains = { "venus", "vcodec0", "vcodec1" },
|
||||
.vcodec_pmdomains = (const char *[]) { "venus", "vcodec0", "vcodec1" },
|
||||
.vcodec_pmdomains_num = 3,
|
||||
.opp_pmdomain = (const char *[]) { "cx", NULL },
|
||||
.vcodec_num = 2,
|
||||
@@ -754,7 +756,7 @@ static const struct venus_resources sc7180_res = {
|
||||
.clks_num = 3,
|
||||
.vcodec0_clks = { "vcodec0_core", "vcodec0_bus" },
|
||||
.vcodec_clks_num = 2,
|
||||
.vcodec_pmdomains = { "venus", "vcodec0" },
|
||||
.vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
|
||||
.vcodec_pmdomains_num = 2,
|
||||
.opp_pmdomain = (const char *[]) { "cx", NULL },
|
||||
.vcodec_num = 1,
|
||||
@@ -811,7 +813,7 @@ static const struct venus_resources sm8250_res = {
|
||||
.resets_num = 2,
|
||||
.vcodec0_clks = { "vcodec0_core" },
|
||||
.vcodec_clks_num = 1,
|
||||
.vcodec_pmdomains = { "venus", "vcodec0" },
|
||||
.vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
|
||||
.vcodec_pmdomains_num = 2,
|
||||
.opp_pmdomain = (const char *[]) { "mx", NULL },
|
||||
.vcodec_num = 1,
|
||||
@@ -870,7 +872,7 @@ static const struct venus_resources sc7280_res = {
|
||||
.clks_num = 3,
|
||||
.vcodec0_clks = {"vcodec_core", "vcodec_bus"},
|
||||
.vcodec_clks_num = 2,
|
||||
.vcodec_pmdomains = { "venus", "vcodec0" },
|
||||
.vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
|
||||
.vcodec_pmdomains_num = 2,
|
||||
.opp_pmdomain = (const char *[]) { "cx", NULL },
|
||||
.vcodec_num = 1,
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
|
||||
#define VIDC_CLKS_NUM_MAX 4
|
||||
#define VIDC_VCODEC_CLKS_NUM_MAX 2
|
||||
#define VIDC_PMDOMAINS_NUM_MAX 3
|
||||
#define VIDC_RESETS_NUM_MAX 2
|
||||
|
||||
extern int venus_fw_debug;
|
||||
@@ -72,7 +71,7 @@ struct venus_resources {
|
||||
const char * const vcodec0_clks[VIDC_VCODEC_CLKS_NUM_MAX];
|
||||
const char * const vcodec1_clks[VIDC_VCODEC_CLKS_NUM_MAX];
|
||||
unsigned int vcodec_clks_num;
|
||||
const char * const vcodec_pmdomains[VIDC_PMDOMAINS_NUM_MAX];
|
||||
const char **vcodec_pmdomains;
|
||||
unsigned int vcodec_pmdomains_num;
|
||||
const char **opp_pmdomain;
|
||||
unsigned int vcodec_num;
|
||||
@@ -134,7 +133,7 @@ struct venus_format {
|
||||
* @video_path: an interconnect handle to video to/from memory path
|
||||
* @cpucfg_path: an interconnect handle to cpu configuration path
|
||||
* @has_opp_table: does OPP table exist
|
||||
* @pmdomains: an array of pmdomains struct device pointers
|
||||
* @pmdomains: a pointer to a list of pmdomains
|
||||
* @opp_dl_venus: an device-link for device OPP
|
||||
* @opp_pmdomain: an OPP power-domain
|
||||
* @resets: an array of reset signals
|
||||
@@ -187,7 +186,7 @@ struct venus_core {
|
||||
struct icc_path *video_path;
|
||||
struct icc_path *cpucfg_path;
|
||||
bool has_opp_table;
|
||||
struct device *pmdomains[VIDC_PMDOMAINS_NUM_MAX];
|
||||
struct dev_pm_domain_list *pmdomains;
|
||||
struct device_link *opp_dl_venus;
|
||||
struct device *opp_pmdomain;
|
||||
struct reset_control *resets[VIDC_RESETS_NUM_MAX];
|
||||
|
||||
@@ -455,7 +455,7 @@ static int poweroff_coreid(struct venus_core *core, unsigned int coreid_mask)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_put_sync(core->pmdomains[1]);
|
||||
ret = pm_runtime_put_sync(core->pmdomains->pd_devs[1]);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
@@ -471,7 +471,7 @@ static int poweroff_coreid(struct venus_core *core, unsigned int coreid_mask)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = pm_runtime_put_sync(core->pmdomains[2]);
|
||||
ret = pm_runtime_put_sync(core->pmdomains->pd_devs[2]);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
@@ -484,7 +484,7 @@ static int poweron_coreid(struct venus_core *core, unsigned int coreid_mask)
|
||||
int ret;
|
||||
|
||||
if (coreid_mask & VIDC_CORE_ID_1) {
|
||||
ret = pm_runtime_get_sync(core->pmdomains[1]);
|
||||
ret = pm_runtime_get_sync(core->pmdomains->pd_devs[1]);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -502,7 +502,7 @@ static int poweron_coreid(struct venus_core *core, unsigned int coreid_mask)
|
||||
}
|
||||
|
||||
if (coreid_mask & VIDC_CORE_ID_2) {
|
||||
ret = pm_runtime_get_sync(core->pmdomains[2]);
|
||||
ret = pm_runtime_get_sync(core->pmdomains->pd_devs[2]);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -860,19 +860,18 @@ static int vcodec_domains_get(struct venus_core *core)
|
||||
struct device **opp_virt_dev;
|
||||
struct device *dev = core->dev;
|
||||
const struct venus_resources *res = core->res;
|
||||
struct device *pd;
|
||||
unsigned int i;
|
||||
struct dev_pm_domain_attach_data vcodec_data = {
|
||||
.pd_names = res->vcodec_pmdomains,
|
||||
.num_pd_names = res->vcodec_pmdomains_num,
|
||||
.pd_flags = PD_FLAG_NO_DEV_LINK,
|
||||
};
|
||||
|
||||
if (!res->vcodec_pmdomains_num)
|
||||
goto skip_pmdomains;
|
||||
|
||||
for (i = 0; i < res->vcodec_pmdomains_num; i++) {
|
||||
pd = dev_pm_domain_attach_by_name(dev,
|
||||
res->vcodec_pmdomains[i]);
|
||||
if (IS_ERR_OR_NULL(pd))
|
||||
return pd ? PTR_ERR(pd) : -ENODATA;
|
||||
core->pmdomains[i] = pd;
|
||||
}
|
||||
ret = dev_pm_domain_attach_list(dev, &vcodec_data, &core->pmdomains);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
skip_pmdomains:
|
||||
if (!core->res->opp_pmdomain)
|
||||
@@ -896,30 +895,14 @@ static int vcodec_domains_get(struct venus_core *core)
|
||||
return 0;
|
||||
|
||||
opp_attach_err:
|
||||
for (i = 0; i < res->vcodec_pmdomains_num; i++) {
|
||||
if (IS_ERR_OR_NULL(core->pmdomains[i]))
|
||||
continue;
|
||||
dev_pm_domain_detach(core->pmdomains[i], true);
|
||||
}
|
||||
|
||||
dev_pm_domain_detach_list(core->pmdomains);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void vcodec_domains_put(struct venus_core *core)
|
||||
{
|
||||
const struct venus_resources *res = core->res;
|
||||
unsigned int i;
|
||||
dev_pm_domain_detach_list(core->pmdomains);
|
||||
|
||||
if (!res->vcodec_pmdomains_num)
|
||||
goto skip_pmdomains;
|
||||
|
||||
for (i = 0; i < res->vcodec_pmdomains_num; i++) {
|
||||
if (IS_ERR_OR_NULL(core->pmdomains[i]))
|
||||
continue;
|
||||
dev_pm_domain_detach(core->pmdomains[i], true);
|
||||
}
|
||||
|
||||
skip_pmdomains:
|
||||
if (!core->has_opp_table)
|
||||
return;
|
||||
|
||||
@@ -1035,7 +1018,8 @@ static void core_put_v4(struct venus_core *core)
|
||||
static int core_power_v4(struct venus_core *core, int on)
|
||||
{
|
||||
struct device *dev = core->dev;
|
||||
struct device *pmctrl = core->pmdomains[0];
|
||||
struct device *pmctrl = core->pmdomains ?
|
||||
core->pmdomains->pd_devs[0] : NULL;
|
||||
int ret = 0;
|
||||
|
||||
if (on == POWER_ON) {
|
||||
|
||||
Reference in New Issue
Block a user