lkml.org 
[lkml]   [2021]   [Jan]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH v2 3/5] drm/panel-simple: Retry if we timeout waiting for HPD
    From
    Date
    Quoting Douglas Anderson (2021-01-15 14:44:18)
    > On an Innolux N116BCA panel that I have in front of me, sometimes HPD
    > simply doesn't assert no matter how long you wait for it. As per the
    > very wise advice of The IT Crowd ("Have you tried turning it off and
    > on again?") it appears that power cycling is enough to kick this panel
    > back into a sane state.
    >
    > From tests on this panel, it appears that leaving it powered off for a
    > while stimulates the problem. Adding a 6 second sleep at the start of
    > panel_simple_prepare_once() makes it happen fairly reliably and, with
    > this delay, I saw up to 3 retries needed sometimes. Without the 6
    > second sleep, however, the panel came up much more reliably the first
    > time or after only 1 retry.
    >
    > While it's unknown what the problems are with this panel (and probably
    > the hardware should be debugged), adding a few retries to the power on
    > routine doesn't seem insane. Even if this panel's problems are
    > attributed to the fact that it's pre-production and/or can be fixed,
    > retries clearly can help in some cases and really don't hurt.
    >
    > Signed-off-by: Douglas Anderson <dianders@chromium.org>

    Reviewed-by: Stephen Boyd <swboyd@chromium.org>

    > @@ -440,6 +441,31 @@ static int panel_simple_prepare(struct drm_panel *panel)
    > return err;
    > }
    >
    > +/*
    > + * Some panels simply don't always come up and need to be power cycled to
    > + * work properly. We'll allow for a handful of retries.
    > + */
    > +#define MAX_PANEL_PREPARE_TRIES 5

    Is this define used anywhere else? Feels like it would be better to
    inline the constant and move the comment above the loop, but I guess
    this is OK too.

    > +
    > +static int panel_simple_prepare(struct drm_panel *panel)
    > +{
    > + int ret;
    > + int try;
    > +
    > + for (try = 0; try < MAX_PANEL_PREPARE_TRIES; try++) {
    > + ret = panel_simple_prepare_once(panel);
    > + if (ret != -ETIMEDOUT)
    > + break;
    > + }
    > +
    > + if (ret == -ETIMEDOUT)
    > + dev_err(panel->dev, "Prepare timeout after %d tries\n", try);
    > + else if (try)
    > + dev_warn(panel->dev, "Prepare needed %d retries\n", try);
    > +

    \
     
     \ /
      Last update: 2021-01-25 21:32    [W:4.033 / U:0.908 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site