We should not leave device half enabled if there is failure somewhere
it power up sequence. Fix device init and resume paths.

Reviewed-by: Karol Wachowski <karol.wachow...@linux.intel.com>
Signed-off-by: Stanislaw Gruszka <stanislaw.grus...@linux.intel.com>
---
 drivers/accel/ivpu/ivpu_drv.c |  2 +-
 drivers/accel/ivpu/ivpu_pm.c  | 30 +++++++++++++++++-------------
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/drivers/accel/ivpu/ivpu_drv.c b/drivers/accel/ivpu/ivpu_drv.c
index 39bac45d88b5..064cabef41bb 100644
--- a/drivers/accel/ivpu/ivpu_drv.c
+++ b/drivers/accel/ivpu/ivpu_drv.c
@@ -543,7 +543,7 @@ static int ivpu_dev_init(struct ivpu_device *vdev)
        /* Power up early so the rest of init code can access VPU registers */
        ret = ivpu_hw_power_up(vdev);
        if (ret)
-               goto err_xa_destroy;
+               goto err_power_down;
 
        ret = ivpu_mmu_global_context_init(vdev);
        if (ret)
diff --git a/drivers/accel/ivpu/ivpu_pm.c b/drivers/accel/ivpu/ivpu_pm.c
index 74688cc57583..7d17f7ea4949 100644
--- a/drivers/accel/ivpu/ivpu_pm.c
+++ b/drivers/accel/ivpu/ivpu_pm.c
@@ -70,27 +70,31 @@ static int ivpu_resume(struct ivpu_device *vdev)
        ret = ivpu_hw_power_up(vdev);
        if (ret) {
                ivpu_err(vdev, "Failed to power up HW: %d\n", ret);
-               return ret;
+               goto err_power_down;
        }
 
        ret = ivpu_mmu_enable(vdev);
        if (ret) {
                ivpu_err(vdev, "Failed to resume MMU: %d\n", ret);
-               ivpu_hw_power_down(vdev);
-               return ret;
+               goto err_power_down;
        }
 
        ret = ivpu_boot(vdev);
-       if (ret) {
-               ivpu_mmu_disable(vdev);
-               ivpu_hw_power_down(vdev);
-               if (!ivpu_fw_is_cold_boot(vdev)) {
-                       ivpu_warn(vdev, "Failed to resume the FW: %d. Retrying 
cold boot..\n", ret);
-                       ivpu_pm_prepare_cold_boot(vdev);
-                       goto retry;
-               } else {
-                       ivpu_err(vdev, "Failed to resume the FW: %d\n", ret);
-               }
+       if (ret)
+               goto err_mmu_disable;
+
+       return 0;
+
+err_mmu_disable:
+       ivpu_mmu_disable(vdev);
+err_power_down:
+       ivpu_hw_power_down(vdev);
+
+       if (!ivpu_fw_is_cold_boot(vdev)) {
+               ivpu_pm_prepare_cold_boot(vdev);
+               goto retry;
+       } else {
+               ivpu_err(vdev, "Failed to resume the FW: %d\n", ret);
        }
 
        return ret;
-- 
2.25.1

Reply via email to