Commit 5e7222a3 authored by Douglas Anderson's avatar Douglas Anderson Committed by Linus Walleij

drm/panel-simple: Undo enable if HPD never asserts

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: 48834e60 ("drm/panel-simple: Support hpd-gpios for delaying prepare()")
Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
Reviewed-by: default avatarStephen Boyd <swboyd@chromium.org>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20210115144345.v2.1.I33fcbd64ab409cfe4f9491bf449f51925a4d3281@changeid
parent 429fc6f9
...@@ -406,7 +406,7 @@ static int panel_simple_prepare(struct drm_panel *panel) ...@@ -406,7 +406,7 @@ static int panel_simple_prepare(struct drm_panel *panel)
if (IS_ERR(p->hpd_gpio)) { if (IS_ERR(p->hpd_gpio)) {
err = panel_simple_get_hpd_gpio(panel->dev, p, false); err = panel_simple_get_hpd_gpio(panel->dev, p, false);
if (err) if (err)
return err; goto error;
} }
err = readx_poll_timeout(gpiod_get_value_cansleep, p->hpd_gpio, err = readx_poll_timeout(gpiod_get_value_cansleep, p->hpd_gpio,
...@@ -418,13 +418,20 @@ static int panel_simple_prepare(struct drm_panel *panel) ...@@ -418,13 +418,20 @@ static int panel_simple_prepare(struct drm_panel *panel)
if (err) { if (err) {
dev_err(panel->dev, dev_err(panel->dev,
"error waiting for hpd GPIO: %d\n", err); "error waiting for hpd GPIO: %d\n", err);
return err; goto error;
} }
} }
p->prepared_time = ktime_get(); p->prepared_time = ktime_get();
return 0; 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) static int panel_simple_enable(struct drm_panel *panel)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment