[PATCH v2 13/50] drm/bridge: panel: Implement bridge connector operations

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Aug 23 00:39:10 UTC 2019


Hi Boris,

On Thu, Aug 22, 2019 at 08:02:47PM +0200, Boris Brezillon wrote:
> On Thu, 22 Aug 2019 19:35:24 +0300 Laurent Pinchart wrote:
> > On Thu, Aug 22, 2019 at 06:29:09PM +0200, Boris Brezillon wrote:
> >> On Tue, 20 Aug 2019 04:16:44 +0300 Laurent Pinchart wrote:
> >>   
> >>> Implement the newly added bridge connector operations, allowing the
> >>> usage of drm_bridge_panel with drm_bridge_connector.
> >>> 
> >>> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> >>> ---
> >>>  drivers/gpu/drm/bridge/panel.c | 18 +++++++++++++++++-
> >>>  1 file changed, 17 insertions(+), 1 deletion(-)
> >>> 
> >>> diff --git a/drivers/gpu/drm/bridge/panel.c b/drivers/gpu/drm/bridge/panel.c
> >>> index f5b8e55301ac..1c7f5b648f05 100644
> >>> --- a/drivers/gpu/drm/bridge/panel.c
> >>> +++ b/drivers/gpu/drm/bridge/panel.c
> >>> @@ -60,7 +60,7 @@ static int panel_bridge_attach(struct drm_bridge *bridge,
> >>>  	int ret;
> >>>  
> >>>  	if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
> >>> -		return -EINVAL;
> >>> +		return 0;
> >>>  
> >>>  	if (!bridge->encoder) {
> >>>  		DRM_ERROR("Missing encoder\n");
> >>> @@ -123,6 +123,18 @@ static void panel_bridge_post_disable(struct drm_bridge *bridge)
> >>>  	drm_panel_unprepare(panel_bridge->panel);
> >>>  }
> >>>  
> >>> +static int panel_bridge_get_modes(struct drm_bridge *bridge,
> >>> +				  struct drm_connector *connector)
> >>> +{
> >>> +	struct panel_bridge *panel_bridge = drm_bridge_to_panel_bridge(bridge);
> >>> +
> >>> +	/*
> >>> +	 * FIXME: drm_panel_get_modes() should take the connector as an
> >>> +	 * argument.
> >>> +	 */
> >>> +	return drm_panel_get_modes(panel_bridge->panel);
> >>> +}
> >>> +
> >>>  static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
> >>>  	.attach = panel_bridge_attach,
> >>>  	.detach = panel_bridge_detach,
> >>> @@ -130,6 +142,7 @@ static const struct drm_bridge_funcs panel_bridge_bridge_funcs = {
> >>>  	.enable = panel_bridge_enable,
> >>>  	.disable = panel_bridge_disable,
> >>>  	.post_disable = panel_bridge_post_disable,
> >>> +	.get_modes = panel_bridge_get_modes,
> >>>  };
> >>>  
> >>>  /**
> >>> @@ -175,6 +188,9 @@ struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel,
> >>>  #ifdef CONFIG_OF
> >>>  	panel_bridge->bridge.of_node = panel->dev->of_node;
> >>>  #endif
> >>> +	panel_bridge->bridge.ops = DRM_BRIDGE_OP_MODES;
> >>> +	/* FIXME: The panel should report its type. */
> >>> +	panel_bridge->bridge.type = DRM_MODE_CONNECTOR_DPI;  
> >> 
> >> Shouldn't we patch all panel drivers to expose this type before doing
> >> this change? I mean, the connector type is exposed to userspace, and I
> >> wouldn't be surprised if some userspace apps/libs decided to base their
> >> output selection logic on this field.  
> > 
> > Note that this type will only make it to userspace for drivers that use
> > the bridge->type field, likely through the drm bridge connector helper.
> > I do agree that panel drivers should be updated, but given the number of
> > panels in panel-simple and the fact that the information would need to
> > be researched for most of them, this will be significant work. Can't
> > this be done when converting display controller drivers on a need basis
> > ?
> 
> I think setting a default value and fixing things on a need basis is
> okay, but that doesn't prevent you from adding the necessary
> infrastructure to let panel drivers pass this type (we can fallback to a
> default type in panel drivers instead of here).

I'll add the infrastructure/

> I'm also not sure why 'DPI' is chosen as the default, shouldn't we use
> 'Unknown' instead?

Mostly to avoid breaking userspace, as most panels supported by
drm_panel use DPI.

> > Or maybe we could, as an interim measure, derive the type from the bus
> > formats reported by the panel if the panel type is not set ? If the
> > panel reports MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
> > MEDIA_BUS_FMT_RGB666_1X7X4_SPWG or MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA then
> > we can set the type to LVDS, otherwise we set it to DPI.
> 
> Hm, aren't we better off patching panel descs exposing these bus formats
> to also explicitly set desc->type to LVDS, leaving others to Unknown
> (Unknown is 0, so you don't have to patch all panel_desc definitions)?

I was thinking about adding this logic to
drivers/gpu/drm/bridge/panel.c, which would avoid patching lots of panel
drivers as a prerequisite. With such a logic there, plus a default to
DPI, I thought we would be good enough for an initial version. It would
leave DSI unhandled, so maybe not the best :-S

> > I can submit a
> > patch to add a type field to the panel structure and implement this
> > logic.

-- 
Regards,

Laurent Pinchart


More information about the dri-devel mailing list