From: Matti Lehtimäki <matti.lehtim...@gmail.com>

Both MSM8974 and MSM8226 have only CX as power domain with MX & PX being
handled as regulators. Handle this case by reodering pd_names to have CX
first, and handling that the driver core will already attach a single
power domain internally.

Signed-off-by: Matti Lehtimäki <matti.lehtim...@gmail.com>
[luca: minor changes]
Signed-off-by: Luca Weiss <l...@lucaweiss.eu>
---
 drivers/remoteproc/qcom_wcnss.c | 32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/drivers/remoteproc/qcom_wcnss.c b/drivers/remoteproc/qcom_wcnss.c
index 
a7bb9da27029db23f3759b19e423fab11b8430e4..4658ffb9bb13dfd52ecb23e85e0ad2d36af0cc80
 100644
--- a/drivers/remoteproc/qcom_wcnss.c
+++ b/drivers/remoteproc/qcom_wcnss.c
@@ -117,10 +117,10 @@ static const struct wcnss_data pronto_v1_data = {
        .pmu_offset = 0x1004,
        .spare_offset = 0x1088,
 
-       .pd_names = { "mx", "cx" },
+       .pd_names = { "cx", "mx" },
        .vregs = (struct wcnss_vreg_info[]) {
-               { "vddmx", 950000, 1150000, 0 },
                { "vddcx", .super_turbo = true},
+               { "vddmx", 950000, 1150000, 0 },
                { "vddpx", 1800000, 1800000, 0 },
        },
        .num_pd_vregs = 2,
@@ -131,10 +131,10 @@ static const struct wcnss_data pronto_v2_data = {
        .pmu_offset = 0x1004,
        .spare_offset = 0x1088,
 
-       .pd_names = { "mx", "cx" },
+       .pd_names = { "cx", "mx" },
        .vregs = (struct wcnss_vreg_info[]) {
-               { "vddmx", 1287500, 1287500, 0 },
                { "vddcx", .super_turbo = true },
+               { "vddmx", 1287500, 1287500, 0 },
                { "vddpx", 1800000, 1800000, 0 },
        },
        .num_pd_vregs = 2,
@@ -397,8 +397,17 @@ static irqreturn_t wcnss_stop_ack_interrupt(int irq, void 
*dev)
 static int wcnss_init_pds(struct qcom_wcnss *wcnss,
                          const char * const pd_names[WCNSS_MAX_PDS])
 {
+       struct device *dev = wcnss->dev;
        int i, ret;
 
+       /* Handle single power domain */
+       if (dev->pm_domain) {
+               wcnss->pds[0] = dev;
+               wcnss->num_pds = 1;
+               pm_runtime_enable(dev);
+               return 0;
+       }
+
        for (i = 0; i < WCNSS_MAX_PDS; i++) {
                if (!pd_names[i])
                        break;
@@ -418,8 +427,15 @@ static int wcnss_init_pds(struct qcom_wcnss *wcnss,
 
 static void wcnss_release_pds(struct qcom_wcnss *wcnss)
 {
+       struct device *dev = wcnss->dev;
        int i;
 
+       /* Handle single power domain */
+       if (wcnss->num_pds == 1 && dev->pm_domain) {
+               pm_runtime_disable(dev);
+               return;
+       }
+
        for (i = 0; i < wcnss->num_pds; i++)
                dev_pm_domain_detach(wcnss->pds[i], false);
 }
@@ -437,9 +453,11 @@ static int wcnss_init_regulators(struct qcom_wcnss *wcnss,
         * the regulators for the power domains. For old device trees we need to
         * reserve extra space to manage them through the regulator interface.
         */
-       if (wcnss->num_pds)
-               info += num_pd_vregs;
-       else
+       if (wcnss->num_pds) {
+               info += wcnss->num_pds;
+               /* Handle single power domain case */
+               num_vregs += num_pd_vregs - wcnss->num_pds;
+       } else
                num_vregs += num_pd_vregs;
 
        bulk = devm_kcalloc(wcnss->dev,

-- 
2.48.1


Reply via email to