]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
media: venus: Convert into devm_pm_domain_attach_list() for OPP PM domain
authorUlf Hansson <ulf.hansson@linaro.org>
Wed, 2 Oct 2024 12:22:30 +0000 (14:22 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Thu, 10 Oct 2024 12:18:35 +0000 (14:18 +0200)
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
drivers/media/platform/qcom/venus/core.c
drivers/media/platform/qcom/venus/core.h
drivers/media/platform/qcom/venus/pm_helpers.c

index 84e95a46dfc9832981ac1c0c58e226a506896ade..8ad36ed0ca8b1e27c0938f9c5722ce1427951d41 100644 (file)
@@ -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,
index 55202b89e1b9fcdd9aa9dc8299f74a62de252c59..43532543292280be15adf688fc0c30f44e207c7f 100644 (file)
@@ -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;
index ea8a2bd9419e6d78f0fed3a51a9106f8ab14d092..33a5a659c0ada0ca97eebb5522c5f349f95c49c7 100644 (file)
@@ -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)