If the HPD signal never asserts in panel_simple_prepare() and we
return an error, we should unset the enable GPIO and disable the
regulator to make it consistent for the caller.

At the moment I have some hardware where HPD sometimes doesn't assert.
Obviously that needs to be debugged, but this patch makes it so that
if I add a retry that I can make things work.

Fixes: 48834e6084f1 ("drm/panel-simple: Support hpd-gpios for delaying 
prepare()")
Signed-off-by: Douglas Anderson <diand...@chromium.org>
---
Stephen: I didn't take your Reviewed-by tag since I made a small
change.  If you're OK with this change please re-add.

Changes in v2:
- Set the "unprepared_time" so if we retry we give the proper delay.

 drivers/gpu/drm/panel/panel-simple.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-simple.c 
b/drivers/gpu/drm/panel/panel-simple.c
index 71ae200ac48a..581ab6810b70 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -406,7 +406,7 @@ static int panel_simple_prepare(struct drm_panel *panel)
                if (IS_ERR(p->hpd_gpio)) {
                        err = panel_simple_get_hpd_gpio(panel->dev, p, false);
                        if (err)
-                               return err;
+                               goto error;
                }
 
                err = readx_poll_timeout(gpiod_get_value_cansleep, p->hpd_gpio,
@@ -418,13 +418,20 @@ static int panel_simple_prepare(struct drm_panel *panel)
                if (err) {
                        dev_err(panel->dev,
                                "error waiting for hpd GPIO: %d\n", err);
-                       return err;
+                       goto error;
                }
        }
 
        p->prepared_time = ktime_get();
 
        return 0;
+
+error:
+       gpiod_set_value_cansleep(p->enable_gpio, 0);
+       regulator_disable(p->supply);
+       p->unprepared_time = ktime_get();
+
+       return err;
 }
 
 static int panel_simple_enable(struct drm_panel *panel)
-- 
2.30.0.284.gd98b1dd5eaa7-goog

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to