On Fri, 25 Apr 2025 at 00:00, Abhinav Kumar <quic_abhin...@quicinc.com> wrote: > > > > On 4/24/2025 3:23 AM, Dmitry Baryshkov wrote: > > On Wed, Apr 23, 2025 at 07:04:16PM -0700, Abhinav Kumar wrote: > >> > >> > >> On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote: > >>> LVDS support in MDP4 driver makes use of drm_connector directly. However > >>> LCDC encoder and LVDS connector are wrappers around drm_panel. Switch > >>> them to use drm_panel_bridge/drm_bridge_connector. This allows using > >>> standard interface for the drm_panel and also inserting additional > >>> bridges between encoder and panel. > >>> > >>> Signed-off-by: Dmitry Baryshkov <dmitry.barysh...@linaro.org> > >>> --- > >>> drivers/gpu/drm/msm/Makefile | 1 - > >>> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 34 +++++-- > >>> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 6 +- > >>> drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 20 +---- > >>> .../gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c | 100 > >>> --------------------- > >>> 5 files changed, 28 insertions(+), 133 deletions(-) > >>> > >>> @@ -199,27 +201,43 @@ static int mdp4_modeset_init_intf(struct mdp4_kms > >>> *mdp4_kms, > >>> * bail out early if there is no panel node (no need to > >>> * initialize LCDC encoder and LVDS connector) > >>> */ > >>> - panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, > >>> 0); > >>> - if (!panel_node) > >>> - return 0; > >>> + next_bridge = devm_drm_of_get_bridge(dev->dev, > >>> dev->dev->of_node, 0, 0); > >>> + if (IS_ERR(next_bridge)) { > >>> + ret = PTR_ERR(next_bridge); > >>> + if (ret == -ENODEV) > >>> + return 0; > >>> + return ret; > >>> + } > >>> - encoder = mdp4_lcdc_encoder_init(dev, panel_node); > >>> + encoder = mdp4_lcdc_encoder_init(dev); > >>> if (IS_ERR(encoder)) { > >>> DRM_DEV_ERROR(dev->dev, "failed to construct LCDC > >>> encoder\n"); > >>> - of_node_put(panel_node); > >>> return PTR_ERR(encoder); > >>> } > >>> /* LCDC can be hooked to DMA_P (TODO: Add DMA_S later?) */ > >>> encoder->possible_crtcs = 1 << DMA_P; > >>> - connector = mdp4_lvds_connector_init(dev, panel_node, > >>> encoder); > >>> + ret = drm_bridge_attach(encoder, next_bridge, NULL, > >>> DRM_BRIDGE_ATTACH_NO_CONNECTOR); > >>> + if (ret) { > >>> + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS > >>> panel/bridge: %d\n", ret); > >>> + > >>> + return ret; > >>> + } > >> > >> Can you pls point me to the lvds bridge used with this apq8064 board? I was > >> unable to find it. Just wanted to compare that against this while > >> reviewing. > > > > It's the panel bridge, wrapping one of the LVDS panels. > > > > Yes but what I wanted to check was which LVDS panel was being used so > far. Looks like for arm32 the dts is missing? As I couldnt find the lvds > out endpoint. So can you pls point me to the lvds panel you verified > this with?
I used the AUO b101xtn01 panel connected to the LVDS connector on the IFC6410. I'm not posting DT bits since the panel is not a part of the kit. > > > >>> + > >>> + connector = drm_bridge_connector_init(dev, encoder); > >>> if (IS_ERR(connector)) { > >>> DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS > >>> connector\n"); > >>> - of_node_put(panel_node); > >>> return PTR_ERR(connector); > >>> } > >>> + ret = drm_connector_attach_encoder(connector, encoder); > >>> + if (ret) { > >>> + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS > >>> connector: %d\n", ret); > >>> + > >>> + return ret; > >>> + } > >>> + > >>> break; > >>> case DRM_MODE_ENCODER_TMDS: > >>> encoder = mdp4_dtv_encoder_init(dev); > > > -- With best wishes Dmitry