|
| 1 | +From 31f91817a35ddbc2f57327ec8ab9ac0039bf50a7 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Loic Poulain < [email protected]> |
| 3 | +Date: Thu, 27 Mar 2025 13:53:04 +0100 |
| 4 | +Subject: [PATCH] media: venus: Fix probe error handling |
| 5 | + |
| 6 | +Video device registering has been moved earlier in the probe function, |
| 7 | +but the new order has not been propagated to error handling. This means |
| 8 | +we can end with unreleased resources on error (e.g dangling video device |
| 9 | +on missing firmware probe aborting). |
| 10 | + |
| 11 | +Fixes: 08b1cf474b7f7 ("media: venus: core, venc, vdec: Fix probe dependency error") |
| 12 | + |
| 13 | +Signed-off-by: Loic Poulain < [email protected]> |
| 14 | +Reviewed-by: Dikshita Agarwal < [email protected]> |
| 15 | +Reviewed-by: Bryan O'Donoghue < [email protected]> |
| 16 | +Signed-off-by: Bryan O'Donoghue < [email protected]> |
| 17 | +Signed-off-by: Hans Verkuil < [email protected]> |
| 18 | +Upstream-Status: Backport [https://git.kernel.org/torvalds/linux/c/523cea3a19f0] |
| 19 | +--- |
| 20 | + drivers/media/platform/qcom/venus/core.c | 16 ++++++++-------- |
| 21 | + 1 file changed, 8 insertions(+), 8 deletions(-) |
| 22 | + |
| 23 | +diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c |
| 24 | +index 04641a7dcc9832..5bd99d0aafe4d7 100644 |
| 25 | +--- a/drivers/media/platform/qcom/venus/core.c |
| 26 | ++++ b/drivers/media/platform/qcom/venus/core.c |
| 27 | +@@ -438,7 +438,7 @@ static int venus_probe(struct platform_device *pdev) |
| 28 | + |
| 29 | + ret = v4l2_device_register(dev, &core->v4l2_dev); |
| 30 | + if (ret) |
| 31 | +- goto err_core_deinit; |
| 32 | ++ goto err_hfi_destroy; |
| 33 | + |
| 34 | + platform_set_drvdata(pdev, core); |
| 35 | + |
| 36 | +@@ -476,24 +476,24 @@ static int venus_probe(struct platform_device *pdev) |
| 37 | + |
| 38 | + ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_DEC); |
| 39 | + if (ret) |
| 40 | +- goto err_venus_shutdown; |
| 41 | ++ goto err_core_deinit; |
| 42 | + |
| 43 | + ret = venus_enumerate_codecs(core, VIDC_SESSION_TYPE_ENC); |
| 44 | + if (ret) |
| 45 | +- goto err_venus_shutdown; |
| 46 | ++ goto err_core_deinit; |
| 47 | + |
| 48 | + ret = pm_runtime_put_sync(dev); |
| 49 | + if (ret) { |
| 50 | + pm_runtime_get_noresume(dev); |
| 51 | +- goto err_dev_unregister; |
| 52 | ++ goto err_core_deinit; |
| 53 | + } |
| 54 | + |
| 55 | + venus_dbgfs_init(core); |
| 56 | + |
| 57 | + return 0; |
| 58 | + |
| 59 | +-err_dev_unregister: |
| 60 | +- v4l2_device_unregister(&core->v4l2_dev); |
| 61 | ++err_core_deinit: |
| 62 | ++ hfi_core_deinit(core, false); |
| 63 | + err_venus_shutdown: |
| 64 | + venus_shutdown(core); |
| 65 | + err_firmware_deinit: |
| 66 | +@@ -506,9 +506,9 @@ static int venus_probe(struct platform_device *pdev) |
| 67 | + pm_runtime_put_noidle(dev); |
| 68 | + pm_runtime_disable(dev); |
| 69 | + pm_runtime_set_suspended(dev); |
| 70 | ++ v4l2_device_unregister(&core->v4l2_dev); |
| 71 | ++err_hfi_destroy: |
| 72 | + hfi_destroy(core); |
| 73 | +-err_core_deinit: |
| 74 | +- hfi_core_deinit(core, false); |
| 75 | + err_core_put: |
| 76 | + if (core->pm_ops->core_put) |
| 77 | + core->pm_ops->core_put(core); |
| 78 | +-- |
| 79 | +2.49.0 |
| 80 | + |
0 commit comments