| From dcaee1b0c4e3e892a2dcb0c0ebde68dfd70403e3 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 8 Nov 2024 13:13:53 +0900 |
| Subject: remoteproc: qcom: pas: Remove subdevs on the error path of |
| adsp_probe() |
| |
| From: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp> |
| |
| [ Upstream commit 587b67cf62a91b10a47f41c20ed8ad71db375334 ] |
| |
| Current implementation of adsp_probe() in qcom_q6v5_pas.c does not |
| remove the subdevs of adsp on the error path. Fix this bug by calling |
| qcom_remove_{ssr,sysmon,pdm,smd,glink}_subdev(), qcom_q6v5_deinit(), and |
| adsp_unassign_memory_region() appropriately. |
| |
| Fixes: 4b48921a8f74 ("remoteproc: qcom: Use common SMD edge handler") |
| Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp> |
| Link: https://lore.kernel.org/r/a1cabc64240022a7f1d5237aa2aa6f72d8fb7052.1731038950.git.joe@pf.is.s.u-tokyo.ac.jp |
| Signed-off-by: Bjorn Andersson <andersson@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/remoteproc/qcom_q6v5_pas.c | 20 +++++++++++++++----- |
| 1 file changed, 15 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c |
| index 88e7b84f223c0..65467876f09e2 100644 |
| --- a/drivers/remoteproc/qcom_q6v5_pas.c |
| +++ b/drivers/remoteproc/qcom_q6v5_pas.c |
| @@ -759,16 +759,16 @@ static int adsp_probe(struct platform_device *pdev) |
| |
| ret = adsp_init_clock(adsp); |
| if (ret) |
| - goto free_rproc; |
| + goto unassign_mem; |
| |
| ret = adsp_init_regulator(adsp); |
| if (ret) |
| - goto free_rproc; |
| + goto unassign_mem; |
| |
| ret = adsp_pds_attach(&pdev->dev, adsp->proxy_pds, |
| desc->proxy_pd_names); |
| if (ret < 0) |
| - goto free_rproc; |
| + goto unassign_mem; |
| adsp->proxy_pd_count = ret; |
| |
| ret = qcom_q6v5_init(&adsp->q6v5, pdev, rproc, desc->crash_reason_smem, desc->load_state, |
| @@ -784,18 +784,28 @@ static int adsp_probe(struct platform_device *pdev) |
| desc->ssctl_id); |
| if (IS_ERR(adsp->sysmon)) { |
| ret = PTR_ERR(adsp->sysmon); |
| - goto detach_proxy_pds; |
| + goto deinit_remove_pdm_smd_glink; |
| } |
| |
| qcom_add_ssr_subdev(rproc, &adsp->ssr_subdev, desc->ssr_name); |
| ret = rproc_add(rproc); |
| if (ret) |
| - goto detach_proxy_pds; |
| + goto remove_ssr_sysmon; |
| |
| return 0; |
| |
| +remove_ssr_sysmon: |
| + qcom_remove_ssr_subdev(rproc, &adsp->ssr_subdev); |
| + qcom_remove_sysmon_subdev(adsp->sysmon); |
| +deinit_remove_pdm_smd_glink: |
| + qcom_remove_pdm_subdev(rproc, &adsp->pdm_subdev); |
| + qcom_remove_smd_subdev(rproc, &adsp->smd_subdev); |
| + qcom_remove_glink_subdev(rproc, &adsp->glink_subdev); |
| + qcom_q6v5_deinit(&adsp->q6v5); |
| detach_proxy_pds: |
| adsp_pds_detach(adsp, adsp->proxy_pds, adsp->proxy_pd_count); |
| +unassign_mem: |
| + adsp_unassign_memory_region(adsp); |
| free_rproc: |
| device_init_wakeup(adsp->dev, false); |
| |
| -- |
| 2.43.0 |
| |