A lifecycle transition can continue after a required state restore
operation fails, leaving software state inconsistent with hardware.

Propagate the failure and unwind state acquired by the transition so
callers cannot observe a false success.

Signed-off-by: Pengpeng Hou <[email protected]>
---
 drivers/gpu/drm/tegra/dc.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c
index 0b3fcc7011b3..bac78b57dcff 100644
--- a/drivers/gpu/drm/tegra/dc.c
+++ b/drivers/gpu/drm/tegra/dc.c
@@ -2878,8 +2878,14 @@ static int tegra_dc_runtime_suspend(struct host1x_client 
*client)
                return err;
        }
 
-       if (dc->soc->has_powergate)
-               tegra_pmc_powergate_power_off(dc->pmc, dc->powergate);
+       if (dc->soc->has_powergate) {
+               err = tegra_pmc_powergate_power_off(dc->pmc, dc->powergate);
+               if (err < 0) {
+                       dev_err(dev, "failed to powergate partition: %d\n", 
err);
+                       reset_control_deassert(dc->rst);
+                       return err;
+               }
+       }
 
        clk_disable_unprepare(dc->clk);
        pm_runtime_put_sync(dev);
-- 
2.43.0

Reply via email to