lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 15 Jan 2021 14:44:16 -0800 From: Douglas Anderson <dianders@...omium.org> To: Thierry Reding <thierry.reding@...il.com>, Sam Ravnborg <sam@...nborg.org> Cc: Rob Clark <robdclark@...omium.org>, Stephen Boyd <swboyd@...omium.org>, Douglas Anderson <dianders@...omium.org>, Daniel Vetter <daniel@...ll.ch>, David Airlie <airlied@...ux.ie>, Linus Walleij <linus.walleij@...aro.org>, dri-devel@...ts.freedesktop.org, linux-kernel@...r.kernel.org Subject: [PATCH v2 1/5] 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: 48834e6084f1 ("drm/panel-simple: Support hpd-gpios for delaying prepare()") Signed-off-by: Douglas Anderson <dianders@...omium.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
Powered by blists - more mailing lists