]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
remoteproc: qcom: wcss: Remove subdevs on the error path of q6v5_wcss_probe()
authorJoe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
Fri, 8 Nov 2024 04:13:55 +0000 (13:13 +0900)
committerBjorn Andersson <andersson@kernel.org>
Sat, 16 Nov 2024 03:25:29 +0000 (19:25 -0800)
Current implementation of q6v5_wcss_probe() in qcom_q6v5_wcss.c and does
not remove the subdevs on the error path. Fix this bug by calling
qcom_remove_{ssr,sysmon,pdm,glink}_subdev(), and qcom_q6v5_deinit()
appropriately.

Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
Link: https://lore.kernel.org/r/c4437393bfaeda69351157849b5e0a904586b1c2.1731038950.git.joe@pf.is.s.u-tokyo.ac.jp
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
drivers/remoteproc/qcom_q6v5_wcss.c

index 810441f43396f595c70aef2243f4d1bd8c446ee8..f869187e8e77b2662487fbe1fa8c48e755a9375e 100644 (file)
@@ -1056,18 +1056,33 @@ static int q6v5_wcss_probe(struct platform_device *pdev)
        qcom_add_pdm_subdev(rproc, &wcss->pdm_subdev);
        qcom_add_ssr_subdev(rproc, &wcss->ssr_subdev, "q6wcss");
 
-       if (desc->ssctl_id)
+       if (desc->ssctl_id) {
                wcss->sysmon = qcom_add_sysmon_subdev(rproc,
                                                      desc->sysmon_name,
                                                      desc->ssctl_id);
+               if (IS_ERR(wcss->sysmon)) {
+                       ret = PTR_ERR(wcss->sysmon);
+                       goto deinit_remove_subdevs;
+               }
+       }
 
        ret = rproc_add(rproc);
        if (ret)
-               return ret;
+               goto remove_sysmon_subdev;
 
        platform_set_drvdata(pdev, rproc);
 
        return 0;
+
+remove_sysmon_subdev:
+       if (desc->ssctl_id)
+               qcom_remove_sysmon_subdev(wcss->sysmon);
+deinit_remove_subdevs:
+       qcom_q6v5_deinit(&wcss->q6v5);
+       qcom_remove_glink_subdev(rproc, &wcss->glink_subdev);
+       qcom_remove_pdm_subdev(rproc, &wcss->pdm_subdev);
+       qcom_remove_ssr_subdev(rproc, &wcss->ssr_subdev);
+       return ret;
 }
 
 static void q6v5_wcss_remove(struct platform_device *pdev)