Hi Laurent,

Thank you for your feedback!

> From: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
> Sent: 02 August 2019 09:08
> Subject: Re: [PATCH/RFC 06/12] drm: rcar-du: lvds: Do not look at ports for 
> identifying bridges
> 
> Hi Fabrizio,
> 
> Thank you for the patch.
> 
> On Fri, Aug 02, 2019 at 08:34:03AM +0100, Fabrizio Castro wrote:
> > We may be connected to a dual LVDS display, therefore checking
> > if node != remote_input for identifying bridges is not going to
> > work anymore.
> > We could try to match the ports on the remote end to the LVDS
> > encoders, however the companion LVDS encoder instance doesn't
> > hold a reference to the primary LVDS encoder instance.
> > We know we could be connected to either a bridge, or a panel,
> > therefore look through the registered bridges and panels, until
> > we have a match.
> >
> > Signed-off-by: Fabrizio Castro <fabrizio.cas...@bp.renesas.com>
> > ---
> >  drivers/gpu/drm/rcar-du/rcar_lvds.c | 29 +++--------------------------
> >  1 file changed, 3 insertions(+), 26 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c 
> > b/drivers/gpu/drm/rcar-du/rcar_lvds.c
> > index c306fab..2d54ae5 100644
> > --- a/drivers/gpu/drm/rcar-du/rcar_lvds.c
> > +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c
> > @@ -711,10 +711,7 @@ static int rcar_lvds_parse_dt_companion(struct 
> > rcar_lvds *lvds)
> >  static int rcar_lvds_parse_dt(struct rcar_lvds *lvds)
> >  {
> >     struct device_node *local_output = NULL;
> > -   struct device_node *remote_input = NULL;
> >     struct device_node *remote = NULL;
> > -   struct device_node *node;
> > -   bool is_bridge = false;
> >     int ret = 0;
> >
> >     local_output = of_graph_get_endpoint_by_regs(lvds->dev->of_node, 1, 0);
> > @@ -742,27 +739,8 @@ static int rcar_lvds_parse_dt(struct rcar_lvds *lvds)
> >             goto done;
> >     }
> >
> > -   remote_input = of_graph_get_remote_endpoint(local_output);
> > -
> > -   for_each_endpoint_of_node(remote, node) {
> > -           if (node != remote_input) {
> > -                   /*
> > -                    * We've found one endpoint other than the input, this
> > -                    * must be a bridge.
> > -                    */
> > -                   is_bridge = true;
> > -                   of_node_put(node);
> > -                   break;
> > -           }
> > -   }
> > -
> > -   if (is_bridge) {
> > -           lvds->next_bridge = of_drm_find_bridge(remote);
> > -           if (!lvds->next_bridge) {
> > -                   ret = -EPROBE_DEFER;
> > -                   goto done;
> > -           }
> > -
> > +   lvds->next_bridge = of_drm_find_bridge(remote);
> 
> How about using drm_of_find_panel_or_bridge() ?

It sounds like drm_of_find_panel_or_bridge is exactly what we need here, I'll 
give it a try,
thank you for the pointer!

Thanks,
Fab

> 
> > +   if (lvds->next_bridge) {
> >             if (lvds->info->quirks & RCAR_LVDS_QUIRK_DUAL_LINK)
> >                     lvds->dual_link = lvds->next_bridge->timings
> >                                     ? lvds->next_bridge->timings->dual_link
> > @@ -770,7 +748,7 @@ static int rcar_lvds_parse_dt(struct rcar_lvds *lvds)
> >     } else {
> >             lvds->panel = of_drm_find_panel(remote);
> >             if (IS_ERR(lvds->panel)) {
> > -                   ret = PTR_ERR(lvds->panel);
> > +                   ret = -EPROBE_DEFER;
> >                     goto done;
> >             }
> >     }
> > @@ -784,7 +762,6 @@ static int rcar_lvds_parse_dt(struct rcar_lvds *lvds)
> >
> >  done:
> >     of_node_put(local_output);
> > -   of_node_put(remote_input);
> >     of_node_put(remote);
> >
> >     switch (ret) {
> 
> --
> Regards,
> 
> Laurent Pinchart

Reply via email to