]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
remoteproc: qcom_q6v5_pas: Make single-PD handling more robust
authorLuca Weiss <luca@lucaweiss.eu>
Tue, 28 Jan 2025 21:54:00 +0000 (22:54 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 10 Apr 2025 12:39:18 +0000 (14:39 +0200)
[ Upstream commit e917b73234b02aa4966325e7380d2559bf127ba9 ]

Only go into the if condition for single-PD handling when there's
actually just one power domain specified there. Otherwise it'll be an
issue in the dts and we should fail in the regular code path.

This also mirrors the latest changes in the qcom_q6v5_mss driver.

Suggested-by: Stephan Gerhold <stephan.gerhold@linaro.org>
Fixes: 17ee2fb4e856 ("remoteproc: qcom: pas: Vote for active/proxy power domains")
Signed-off-by: Luca Weiss <luca@lucaweiss.eu>
Reviewed-by: Stephan Gerhold <stephan.gerhold@linaro.org>
Link: https://lore.kernel.org/r/20250128-pas-singlepd-v1-2-85d9ae4b0093@lucaweiss.eu
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/remoteproc/qcom_q6v5_pas.c

index 1a2d08ec9de9ef8a4be944a68f0fac93c108fc20..179a0afd5fe6f6f6273ab76bf2dba82b00dbddd1 100644 (file)
@@ -509,16 +509,16 @@ static int adsp_pds_attach(struct device *dev, struct device **devs,
        if (!pd_names)
                return 0;
 
+       while (pd_names[num_pds])
+               num_pds++;
+
        /* Handle single power domain */
-       if (dev->pm_domain) {
+       if (num_pds == 1 && dev->pm_domain) {
                devs[0] = dev;
                pm_runtime_enable(dev);
                return 1;
        }
 
-       while (pd_names[num_pds])
-               num_pds++;
-
        for (i = 0; i < num_pds; i++) {
                devs[i] = dev_pm_domain_attach_by_name(dev, pd_names[i]);
                if (IS_ERR_OR_NULL(devs[i])) {
@@ -543,7 +543,7 @@ static void adsp_pds_detach(struct qcom_adsp *adsp, struct device **pds,
        int i;
 
        /* Handle single power domain */
-       if (dev->pm_domain && pd_count) {
+       if (pd_count == 1 && dev->pm_domain) {
                pm_runtime_disable(dev);
                return;
        }