If nvif_outp_edid_get() fails, nouveau_connector_detect() returns
early without dropping the runtime PM reference taken at the start
of the function, keeping the device powered on until the next
successful detect.

Balance the reference on the error path like the other exit paths
do.

Fixes: 0cd7e0718139 ("drm/nouveau/disp: add output method to fetch edid")
Cc: [email protected]
Signed-off-by: Wentao Liang <[email protected]>
---
 drivers/gpu/drm/nouveau/nouveau_connector.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c 
b/drivers/gpu/drm/nouveau/nouveau_connector.c
index cc239492c7f0..4a750d4bf1f4 100644
--- a/drivers/gpu/drm/nouveau/nouveau_connector.c
+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c
@@ -600,8 +600,11 @@ nouveau_connector_detect(struct drm_connector *connector, 
bool force)
                                new_edid = drm_get_edid(connector, 
nv_encoder->i2c);
                } else {
                        ret = nvif_outp_edid_get(&nv_encoder->outp, (u8 
**)&new_edid);
-                       if (ret < 0)
+                       if (ret < 0) {
+                               pm_runtime_mark_last_busy(dev->dev);
+                               pm_runtime_put_autosuspend(dev->dev);
                                return connector_status_disconnected;
+                       }
                }
 
                nouveau_connector_set_edid(nv_connector, new_edid);
-- 
2.34.1

Reply via email to