Message ID | 20250304101530.969920-6-victor.liu@nxp.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | drm/bridge: simple-bridge: Add DPI color encoder support | expand |
On Tue, Mar 04, 2025 at 06:15:30PM +0800, Liu Ying wrote: > The next bridge connected to a simple bridge could be a panel, e.g., > a DPI panel connected to a DPI color encoder. Add the next panel support, > instead of supporting non-panel next bridge only. > > Signed-off-by: Liu Ying <victor.liu@nxp.com> > --- > drivers/gpu/drm/bridge/Kconfig | 1 + > drivers/gpu/drm/bridge/simple-bridge.c | 32 ++++++++++++++++---------- > 2 files changed, 21 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig > index d20f1646dac2..92187dbdd32b 100644 > --- a/drivers/gpu/drm/bridge/Kconfig > +++ b/drivers/gpu/drm/bridge/Kconfig > @@ -310,6 +310,7 @@ config DRM_SIMPLE_BRIDGE > tristate "Simple DRM bridge support" > depends on OF > select DRM_KMS_HELPER > + select DRM_PANEL_BRIDGE > help > Support for non-programmable DRM bridges, such as ADI ADV7123, TI > THS8134 and THS8135 or passive resistor ladder DACs. > diff --git a/drivers/gpu/drm/bridge/simple-bridge.c b/drivers/gpu/drm/bridge/simple-bridge.c > index c0445bd20e07..4c585e5583ca 100644 > --- a/drivers/gpu/drm/bridge/simple-bridge.c > +++ b/drivers/gpu/drm/bridge/simple-bridge.c > @@ -19,6 +19,7 @@ > #include <drm/drm_crtc.h> > #include <drm/drm_edid.h> > #include <drm/drm_of.h> > +#include <drm/drm_panel.h> > #include <drm/drm_print.h> > #include <drm/drm_probe_helper.h> > > @@ -35,6 +36,7 @@ struct simple_bridge { > const struct simple_bridge_info *info; > > struct drm_bridge *next_bridge; > + struct drm_panel *next_panel; > struct regulator *vdd; > struct gpio_desc *enable; > > @@ -114,6 +116,10 @@ static int simple_bridge_attach(struct drm_bridge *bridge, > struct simple_bridge *sbridge = drm_bridge_to_simple_bridge(bridge); > int ret; > > + if (sbridge->next_panel) > + return drm_bridge_attach(bridge->encoder, sbridge->next_bridge, > + bridge, flags); > + > ret = drm_bridge_attach(bridge->encoder, sbridge->next_bridge, bridge, > DRM_BRIDGE_ATTACH_NO_CONNECTOR); > if (ret < 0) > @@ -247,7 +253,6 @@ static int simple_bridge_get_dpi_color_coding(struct simple_bridge *sbridge, > static int simple_bridge_probe(struct platform_device *pdev) > { > struct simple_bridge *sbridge; > - struct device_node *remote; > int ret; > > sbridge = devm_kzalloc(&pdev->dev, sizeof(*sbridge), GFP_KERNEL); > @@ -257,17 +262,20 @@ static int simple_bridge_probe(struct platform_device *pdev) > sbridge->info = of_device_get_match_data(&pdev->dev); > > /* Get the next bridge in the pipeline. */ > - remote = of_graph_get_remote_node(pdev->dev.of_node, 1, -1); > - if (!remote) > - return -EINVAL; > - > - sbridge->next_bridge = of_drm_find_bridge(remote); > - of_node_put(remote); > - > - if (!sbridge->next_bridge) { > - dev_dbg(&pdev->dev, "Next bridge not found, deferring probe\n"); > - return -EPROBE_DEFER; > - } > + ret = drm_of_find_panel_or_bridge(pdev->dev.of_node, 1, -1, > + &sbridge->next_panel, > + &sbridge->next_bridge); > + if (ret) > + return dev_err_probe(&pdev->dev, ret, > + "Next panel or bridge not found\n"); > + > + if (sbridge->next_panel) > + sbridge->next_bridge = devm_drm_panel_bridge_add(&pdev->dev, > + sbridge->next_panel); > + > + if (IS_ERR(sbridge->next_bridge)) > + return dev_err_probe(&pdev->dev, PTR_ERR(sbridge->next_bridge), > + "Next bridge not found\n"); This makes sense in general, but I think a better approach would be to use devm/drmm_of_get_bridge here. Maxime
diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index d20f1646dac2..92187dbdd32b 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -310,6 +310,7 @@ config DRM_SIMPLE_BRIDGE tristate "Simple DRM bridge support" depends on OF select DRM_KMS_HELPER + select DRM_PANEL_BRIDGE help Support for non-programmable DRM bridges, such as ADI ADV7123, TI THS8134 and THS8135 or passive resistor ladder DACs. diff --git a/drivers/gpu/drm/bridge/simple-bridge.c b/drivers/gpu/drm/bridge/simple-bridge.c index c0445bd20e07..4c585e5583ca 100644 --- a/drivers/gpu/drm/bridge/simple-bridge.c +++ b/drivers/gpu/drm/bridge/simple-bridge.c @@ -19,6 +19,7 @@ #include <drm/drm_crtc.h> #include <drm/drm_edid.h> #include <drm/drm_of.h> +#include <drm/drm_panel.h> #include <drm/drm_print.h> #include <drm/drm_probe_helper.h> @@ -35,6 +36,7 @@ struct simple_bridge { const struct simple_bridge_info *info; struct drm_bridge *next_bridge; + struct drm_panel *next_panel; struct regulator *vdd; struct gpio_desc *enable; @@ -114,6 +116,10 @@ static int simple_bridge_attach(struct drm_bridge *bridge, struct simple_bridge *sbridge = drm_bridge_to_simple_bridge(bridge); int ret; + if (sbridge->next_panel) + return drm_bridge_attach(bridge->encoder, sbridge->next_bridge, + bridge, flags); + ret = drm_bridge_attach(bridge->encoder, sbridge->next_bridge, bridge, DRM_BRIDGE_ATTACH_NO_CONNECTOR); if (ret < 0) @@ -247,7 +253,6 @@ static int simple_bridge_get_dpi_color_coding(struct simple_bridge *sbridge, static int simple_bridge_probe(struct platform_device *pdev) { struct simple_bridge *sbridge; - struct device_node *remote; int ret; sbridge = devm_kzalloc(&pdev->dev, sizeof(*sbridge), GFP_KERNEL); @@ -257,17 +262,20 @@ static int simple_bridge_probe(struct platform_device *pdev) sbridge->info = of_device_get_match_data(&pdev->dev); /* Get the next bridge in the pipeline. */ - remote = of_graph_get_remote_node(pdev->dev.of_node, 1, -1); - if (!remote) - return -EINVAL; - - sbridge->next_bridge = of_drm_find_bridge(remote); - of_node_put(remote); - - if (!sbridge->next_bridge) { - dev_dbg(&pdev->dev, "Next bridge not found, deferring probe\n"); - return -EPROBE_DEFER; - } + ret = drm_of_find_panel_or_bridge(pdev->dev.of_node, 1, -1, + &sbridge->next_panel, + &sbridge->next_bridge); + if (ret) + return dev_err_probe(&pdev->dev, ret, + "Next panel or bridge not found\n"); + + if (sbridge->next_panel) + sbridge->next_bridge = devm_drm_panel_bridge_add(&pdev->dev, + sbridge->next_panel); + + if (IS_ERR(sbridge->next_bridge)) + return dev_err_probe(&pdev->dev, PTR_ERR(sbridge->next_bridge), + "Next bridge not found\n"); /* Get the regulator and GPIO resources. */ sbridge->vdd = devm_regulator_get_optional(&pdev->dev, "vdd");
The next bridge connected to a simple bridge could be a panel, e.g., a DPI panel connected to a DPI color encoder. Add the next panel support, instead of supporting non-panel next bridge only. Signed-off-by: Liu Ying <victor.liu@nxp.com> --- drivers/gpu/drm/bridge/Kconfig | 1 + drivers/gpu/drm/bridge/simple-bridge.c | 32 ++++++++++++++++---------- 2 files changed, 21 insertions(+), 12 deletions(-)