On Thu, Oct 25, 2018 at 03:21:30PM -0700, Douglas Anderson wrote: > Some eDP panels that are designed to be always connected to a board > use their HPD signal to signal that they've finished powering on and > they're ready to be talked to. > > However, for various reasons it's possible that the HPD signal from > the panel isn't actually hooked up. In the case where the HPD isn't > hooked up you can look at the timing diagram on the panel datasheet > and insert a delay for the maximum amount of time that the HPD might > take to come up. > > Let's add support in simple-panel for this concept. > > At the moment we will co-opt the existing "prepare" delay to keep > track of the delay and we'll use a boolean to specify that a given > panel should only apply the delay if the "no-hpd" property was > specified. > > Signed-off-by: Douglas Anderson <dianders@xxxxxxxxxxxx> Reviewed-by: Sean Paul <sean@xxxxxxxxxx> > --- > > Changes in v2: > - Use "hpd_absent_delay" property instead of a bool + prepare delay > > drivers/gpu/drm/panel/panel-simple.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c > index 97964f7f2ace..687fd087b9fc 100644 > --- a/drivers/gpu/drm/panel/panel-simple.c > +++ b/drivers/gpu/drm/panel/panel-simple.c > @@ -56,6 +56,8 @@ struct panel_desc { > /** > * @prepare: the time (in milliseconds) that it takes for the panel to > * become ready and start receiving video data > + * @hpd_absent_delay: Add this to the prepare delay if we know Hot > + * Plug Detect isn't used. > * @enable: the time (in milliseconds) that it takes for the panel to > * display the first valid frame after starting to receive > * video data > @@ -66,6 +68,7 @@ struct panel_desc { > */ > struct { > unsigned int prepare; > + unsigned int hpd_absent_delay; > unsigned int enable; > unsigned int disable; > unsigned int unprepare; > @@ -79,6 +82,7 @@ struct panel_simple { > struct drm_panel base; > bool prepared; > bool enabled; > + bool no_hpd; > > const struct panel_desc *desc; > > @@ -202,6 +206,7 @@ static int panel_simple_unprepare(struct drm_panel *panel) > static int panel_simple_prepare(struct drm_panel *panel) > { > struct panel_simple *p = to_panel_simple(panel); > + unsigned int delay; > int err; > > if (p->prepared) > @@ -215,8 +220,11 @@ static int panel_simple_prepare(struct drm_panel *panel) > > gpiod_set_value_cansleep(p->enable_gpio, 1); > > - if (p->desc->delay.prepare) > - msleep(p->desc->delay.prepare); > + delay = p->desc->delay.prepare; > + if (p->no_hpd) > + delay += p->desc->delay.hpd_absent_delay; > + if (delay) > + msleep(delay); > > p->prepared = true; > > @@ -305,6 +313,8 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc) > panel->prepared = false; > panel->desc = desc; > > + panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd"); > + > panel->supply = devm_regulator_get(dev, "power"); > if (IS_ERR(panel->supply)) > return PTR_ERR(panel->supply); > -- > 2.19.1.568.g152ad8e336-goog > -- Sean Paul, Software Engineer, Google / Chromium OS