]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
media: venus: scale MMCX power domain on SM8250
authorDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Mon, 9 Feb 2026 01:32:18 +0000 (03:32 +0200)
committerBryan O'Donoghue <bod@kernel.org>
Sun, 10 May 2026 10:16:55 +0000 (11:16 +0100)
On SM8250 most of the video clocks are powered by the MMCX domain, while
the PLL is powered on by the MX domain. Extend the driver to support
scaling both power domains, while keeping compatibility with the
existing DTs, which define only the MX domain.

Fixes: 0aeabfa29a9c ("media: venus: core: add sm8250 DT compatible and resource data")
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Reviewed-by: Dikshita Agarwal <dikshita.agarwal@oss.qualcomm.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Signed-off-by: Bryan O'Donoghue <bod@kernel.org>
drivers/media/platform/qcom/venus/core.c
drivers/media/platform/qcom/venus/core.h
drivers/media/platform/qcom/venus/pm_helpers.c

index 7e639760c41d95061bb3b2408ff17d8733706e7f..00fb6806c1298819eecbbaf1c4b42430a75fccd8 100644 (file)
@@ -882,6 +882,7 @@ static const struct venus_resources sdm845_res_v2 = {
        .vcodec_pmdomains = (const char *[]) { "venus", "vcodec0", "vcodec1" },
        .vcodec_pmdomains_num = 3,
        .opp_pmdomain = (const char *[]) { "cx" },
+       .opp_pmdomain_num = 1,
        .vcodec_num = 2,
        .max_load = 3110400,    /* 4096x2160@90 */
        .hfi_version = HFI_VERSION_4XX,
@@ -933,6 +934,7 @@ static const struct venus_resources sc7180_res = {
        .vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
        .vcodec_pmdomains_num = 2,
        .opp_pmdomain = (const char *[]) { "cx" },
+       .opp_pmdomain_num = 1,
        .vcodec_num = 1,
        .hfi_version = HFI_VERSION_4XX,
        .vpu_version = VPU_VERSION_AR50,
@@ -991,7 +993,8 @@ 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" },
+       .opp_pmdomain = (const char *[]) { "mx", "mmcx" },
+       .opp_pmdomain_num = 2,
        .vcodec_num = 1,
        .max_load = 7833600,
        .hfi_version = HFI_VERSION_6XX,
@@ -1053,6 +1056,7 @@ static const struct venus_resources sc7280_res = {
        .vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
        .vcodec_pmdomains_num = 2,
        .opp_pmdomain = (const char *[]) { "cx" },
+       .opp_pmdomain_num = 1,
        .vcodec_num = 1,
        .hfi_version = HFI_VERSION_6XX,
        .vpu_version = VPU_VERSION_IRIS2_1,
@@ -1100,6 +1104,7 @@ static const struct venus_resources qcm2290_res = {
        .vcodec_pmdomains = (const char *[]) { "venus", "vcodec0" },
        .vcodec_pmdomains_num = 2,
        .opp_pmdomain = (const char *[]) { "cx" },
+       .opp_pmdomain_num = 1,
        .vcodec_num = 1,
        .hfi_version = HFI_VERSION_4XX,
        .vpu_version = VPU_VERSION_AR50_LITE,
index 7506f5d0f609ac8984ab90ba207e64750df8a9ec..70e7b40affa93892bd767f33306bdb6339de0d2d 100644 (file)
@@ -83,6 +83,7 @@ struct venus_resources {
        const char **vcodec_pmdomains;
        unsigned int vcodec_pmdomains_num;
        const char **opp_pmdomain;
+       unsigned int opp_pmdomain_num;
        unsigned int vcodec_num;
        const char * const resets[VIDC_RESETS_NUM_MAX];
        unsigned int resets_num;
index f0269524ac70eb72384a06aa6a215e2046abf5c2..14a4e8311a643171542887b773b61672ef8057ea 100644 (file)
@@ -887,7 +887,7 @@ static int vcodec_domains_get(struct venus_core *core)
        };
        struct dev_pm_domain_attach_data opp_pd_data = {
                .pd_names = res->opp_pmdomain,
-               .num_pd_names = 1,
+               .num_pd_names = res->opp_pmdomain_num,
                .pd_flags = PD_FLAG_DEV_LINK_ON | PD_FLAG_REQUIRED_OPP,
        };
 
@@ -904,6 +904,12 @@ skip_pmdomains:
 
        /* Attach the power domain for setting performance state */
        ret = devm_pm_domain_attach_list(dev, &opp_pd_data, &core->opp_pmdomain);
+       /* backwards compatibility for incomplete ABI SM8250 */
+       if (ret == -ENODEV &&
+           of_device_is_compatible(dev->of_node, "qcom,sm8250-venus")) {
+               opp_pd_data.num_pd_names--;
+               ret = devm_pm_domain_attach_list(dev, &opp_pd_data, &core->opp_pmdomain);
+       }
        if (ret < 0)
                return ret;