| From 16f14551d0df9e7cd283545d7d748829594d912f Mon Sep 17 00:00:00 2001 |
| From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> |
| Date: Fri, 16 Sep 2022 13:29:08 +0100 |
| Subject: slimbus: qcom-ngd: cleanup in probe error path |
| |
| From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> |
| |
| commit 16f14551d0df9e7cd283545d7d748829594d912f upstream. |
| |
| Add proper error path in probe() to cleanup resources previously |
| acquired/allocated to fix warnings visible during probe deferral: |
| |
| notifier callback qcom_slim_ngd_ssr_notify already registered |
| WARNING: CPU: 6 PID: 70 at kernel/notifier.c:28 notifier_chain_register+0x5c/0x90 |
| Modules linked in: |
| CPU: 6 PID: 70 Comm: kworker/u16:1 Not tainted 6.0.0-rc3-next-20220830 #380 |
| Call trace: |
| notifier_chain_register+0x5c/0x90 |
| srcu_notifier_chain_register+0x44/0x90 |
| qcom_register_ssr_notifier+0x38/0x4c |
| qcom_slim_ngd_ctrl_probe+0xd8/0x400 |
| platform_probe+0x6c/0xe0 |
| really_probe+0xbc/0x2d4 |
| __driver_probe_device+0x78/0xe0 |
| driver_probe_device+0x3c/0x12c |
| __device_attach_driver+0xb8/0x120 |
| bus_for_each_drv+0x78/0xd0 |
| __device_attach+0xa8/0x1c0 |
| device_initial_probe+0x18/0x24 |
| bus_probe_device+0xa0/0xac |
| deferred_probe_work_func+0x88/0xc0 |
| process_one_work+0x1d4/0x320 |
| worker_thread+0x2cc/0x44c |
| kthread+0x110/0x114 |
| ret_from_fork+0x10/0x20 |
| |
| Fixes: e1ae85e1830e ("slimbus: qcom-ngd-ctrl: add Protection Domain Restart Support") |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> |
| Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> |
| Link: https://lore.kernel.org/r/20220916122910.170730-3-srinivas.kandagatla@linaro.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/slimbus/qcom-ngd-ctrl.c | 13 +++++++++++-- |
| 1 file changed, 11 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/slimbus/qcom-ngd-ctrl.c |
| +++ b/drivers/slimbus/qcom-ngd-ctrl.c |
| @@ -1576,18 +1576,27 @@ static int qcom_slim_ngd_ctrl_probe(stru |
| ctrl->pdr = pdr_handle_alloc(slim_pd_status, ctrl); |
| if (IS_ERR(ctrl->pdr)) { |
| dev_err(dev, "Failed to init PDR handle\n"); |
| - return PTR_ERR(ctrl->pdr); |
| + ret = PTR_ERR(ctrl->pdr); |
| + goto err_pdr_alloc; |
| } |
| |
| pds = pdr_add_lookup(ctrl->pdr, "avs/audio", "msm/adsp/audio_pd"); |
| if (IS_ERR(pds) && PTR_ERR(pds) != -EALREADY) { |
| ret = PTR_ERR(pds); |
| dev_err(dev, "pdr add lookup failed: %d\n", ret); |
| - return ret; |
| + goto err_pdr_lookup; |
| } |
| |
| platform_driver_register(&qcom_slim_ngd_driver); |
| return of_qcom_slim_ngd_register(dev, ctrl); |
| + |
| +err_pdr_alloc: |
| + qcom_unregister_ssr_notifier(ctrl->notifier, &ctrl->nb); |
| + |
| +err_pdr_lookup: |
| + pdr_handle_release(ctrl->pdr); |
| + |
| + return ret; |
| } |
| |
| static int qcom_slim_ngd_ctrl_remove(struct platform_device *pdev) |