Message ID | 1564731249-22671-7-git-send-email-fabrizio.castro@bp.renesas.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Kieran Bingham |
Headers | show |
Series | Add dual-LVDS panel support to EK874 | expand |
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.castro@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() ? > + 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) {
Hi Laurent, Thank you for your feedback! > From: Laurent Pinchart <laurent.pinchart@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.castro@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
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); + 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) {
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.castro@bp.renesas.com> --- drivers/gpu/drm/rcar-du/rcar_lvds.c | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-)