mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-09 06:43:09 +00:00
media: venus: Convert into devm_pm_domain_attach_list() for OPP PM domain
Rather than hooking up the PM domain through devm_pm_opp_attach_genpd() and manage the device-link, let's avoid the boilerplate-code by converting into devm_pm_domain_attach_list(). Acked-by: Stanimir Varbanov <stanimir.k.varbanov@gmail.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Link: https://lore.kernel.org/r/20241002122232.194245-10-ulf.hansson@linaro.org
This commit is contained in:
parent
1ce91bf7da
commit
a79d5da21b
@ -752,7 +752,7 @@ static const struct venus_resources sdm845_res_v2 = {
|
||||
.vcodec_clks_num = 2,
|
||||
.vcodec_pmdomains = (const char *[]) { "venus", "vcodec0", "vcodec1" },
|
||||
.vcodec_pmdomains_num = 3,
|
||||
.opp_pmdomain = (const char *[]) { "cx", NULL },
|
||||
.opp_pmdomain = (const char *[]) { "cx" },
|
||||
.vcodec_num = 2,
|
||||
.max_load = 3110400, /* 4096x2160@90 */
|
||||
.hfi_version = HFI_VERSION_4XX,
|
||||
@ -801,7 +801,7 @@ static const struct venus_resources sc7180_res = {
|
||||
.vcodec_clks_num = 2,
|
||||
.vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
|
||||
.vcodec_pmdomains_num = 2,
|
||||
.opp_pmdomain = (const char *[]) { "cx", NULL },
|
||||
.opp_pmdomain = (const char *[]) { "cx" },
|
||||
.vcodec_num = 1,
|
||||
.hfi_version = HFI_VERSION_4XX,
|
||||
.vpu_version = VPU_VERSION_AR50,
|
||||
@ -858,7 +858,7 @@ static const struct venus_resources sm8250_res = {
|
||||
.vcodec_clks_num = 1,
|
||||
.vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
|
||||
.vcodec_pmdomains_num = 2,
|
||||
.opp_pmdomain = (const char *[]) { "mx", NULL },
|
||||
.opp_pmdomain = (const char *[]) { "mx" },
|
||||
.vcodec_num = 1,
|
||||
.max_load = 7833600,
|
||||
.hfi_version = HFI_VERSION_6XX,
|
||||
@ -917,7 +917,7 @@ static const struct venus_resources sc7280_res = {
|
||||
.vcodec_clks_num = 2,
|
||||
.vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
|
||||
.vcodec_pmdomains_num = 2,
|
||||
.opp_pmdomain = (const char *[]) { "cx", NULL },
|
||||
.opp_pmdomain = (const char *[]) { "cx" },
|
||||
.vcodec_num = 1,
|
||||
.hfi_version = HFI_VERSION_6XX,
|
||||
.vpu_version = VPU_VERSION_IRIS2_1,
|
||||
|
@ -132,9 +132,7 @@ struct venus_format {
|
||||
* @vcodec1_clks: an array of vcodec1 struct clk pointers
|
||||
* @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: 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
|
||||
* @vdev_dec: a reference to video device structure for decoder instances
|
||||
@ -186,10 +184,8 @@ struct venus_core {
|
||||
struct clk *vcodec1_clks[VIDC_VCODEC_CLKS_NUM_MAX];
|
||||
struct icc_path *video_path;
|
||||
struct icc_path *cpucfg_path;
|
||||
bool has_opp_table;
|
||||
struct dev_pm_domain_list *pmdomains;
|
||||
struct device_link *opp_dl_venus;
|
||||
struct device *opp_pmdomain;
|
||||
struct dev_pm_domain_list *opp_pmdomain;
|
||||
struct reset_control *resets[VIDC_RESETS_NUM_MAX];
|
||||
struct video_device *vdev_dec;
|
||||
struct video_device *vdev_enc;
|
||||
|
@ -864,7 +864,6 @@ static int venc_power_v4(struct device *dev, int on)
|
||||
static int vcodec_domains_get(struct venus_core *core)
|
||||
{
|
||||
int ret;
|
||||
struct device **opp_virt_dev;
|
||||
struct device *dev = core->dev;
|
||||
const struct venus_resources *res = core->res;
|
||||
struct dev_pm_domain_attach_data vcodec_data = {
|
||||
@ -872,6 +871,11 @@ static int vcodec_domains_get(struct venus_core *core)
|
||||
.num_pd_names = res->vcodec_pmdomains_num,
|
||||
.pd_flags = PD_FLAG_NO_DEV_LINK,
|
||||
};
|
||||
struct dev_pm_domain_attach_data opp_pd_data = {
|
||||
.pd_names = res->opp_pmdomain,
|
||||
.num_pd_names = 1,
|
||||
.pd_flags = PD_FLAG_DEV_LINK_ON | PD_FLAG_REQUIRED_OPP,
|
||||
};
|
||||
|
||||
if (!res->vcodec_pmdomains_num)
|
||||
goto skip_pmdomains;
|
||||
@ -881,37 +885,15 @@ static int vcodec_domains_get(struct venus_core *core)
|
||||
return ret;
|
||||
|
||||
skip_pmdomains:
|
||||
if (!core->res->opp_pmdomain)
|
||||
if (!res->opp_pmdomain)
|
||||
return 0;
|
||||
|
||||
/* Attach the power domain for setting performance state */
|
||||
ret = devm_pm_opp_attach_genpd(dev, res->opp_pmdomain, &opp_virt_dev);
|
||||
if (ret)
|
||||
goto opp_attach_err;
|
||||
|
||||
core->opp_pmdomain = *opp_virt_dev;
|
||||
core->opp_dl_venus = device_link_add(dev, core->opp_pmdomain,
|
||||
DL_FLAG_RPM_ACTIVE |
|
||||
DL_FLAG_PM_RUNTIME |
|
||||
DL_FLAG_STATELESS);
|
||||
if (!core->opp_dl_venus) {
|
||||
ret = -ENODEV;
|
||||
goto opp_attach_err;
|
||||
}
|
||||
ret = devm_pm_domain_attach_list(dev, &opp_pd_data, &core->opp_pmdomain);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
|
||||
opp_attach_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void vcodec_domains_put(struct venus_core *core)
|
||||
{
|
||||
if (!core->has_opp_table)
|
||||
return;
|
||||
|
||||
if (core->opp_dl_venus)
|
||||
device_link_del(core->opp_dl_venus);
|
||||
}
|
||||
|
||||
static int core_resets_reset(struct venus_core *core)
|
||||
@ -1000,9 +982,7 @@ static int core_get_v4(struct venus_core *core)
|
||||
|
||||
if (core->res->opp_pmdomain) {
|
||||
ret = devm_pm_opp_of_add_table(dev);
|
||||
if (!ret) {
|
||||
core->has_opp_table = true;
|
||||
} else if (ret != -ENODEV) {
|
||||
if (ret && ret != -ENODEV) {
|
||||
dev_err(dev, "invalid OPP table in device tree\n");
|
||||
return ret;
|
||||
}
|
||||
@ -1013,10 +993,6 @@ static int core_get_v4(struct venus_core *core)
|
||||
|
||||
static void core_put_v4(struct venus_core *core)
|
||||
{
|
||||
if (legacy_binding)
|
||||
return;
|
||||
|
||||
vcodec_domains_put(core);
|
||||
}
|
||||
|
||||
static int core_power_v4(struct venus_core *core, int on)
|
||||
|
Loading…
Reference in New Issue
Block a user