Messages in this thread | | | Date | Wed, 2 Aug 2023 10:35:33 +0200 | From | Neil Armstrong <> | Subject | Re: [PATCH 2/4] drm/bridge-connector: handle subconnector types |
| |
On 29/07/2023 02:49, Dmitry Baryshkov wrote: > If the created connector type supports subconnector type property, > create and attach corresponding it. The default subtype value is 0, > which maps to the DRM_MODE_SUBCONNECTOR_Unknown type. > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > --- > drivers/gpu/drm/drm_bridge_connector.c | 33 +++++++++++++++++++++++++- > include/drm/drm_bridge.h | 4 ++++ > 2 files changed, 36 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_bridge_connector.c b/drivers/gpu/drm/drm_bridge_connector.c > index 07b5930b1282..a7b92f0d2430 100644 > --- a/drivers/gpu/drm/drm_bridge_connector.c > +++ b/drivers/gpu/drm/drm_bridge_connector.c > @@ -329,7 +329,9 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, > struct drm_connector *connector; > struct i2c_adapter *ddc = NULL; > struct drm_bridge *bridge, *panel_bridge = NULL; > + enum drm_mode_subconnector subconnector; > int connector_type; > + int ret; > > bridge_connector = kzalloc(sizeof(*bridge_connector), GFP_KERNEL); > if (!bridge_connector) > @@ -365,8 +367,10 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, > if (bridge->ops & DRM_BRIDGE_OP_MODES) > bridge_connector->bridge_modes = bridge; > > - if (!drm_bridge_get_next_bridge(bridge)) > + if (!drm_bridge_get_next_bridge(bridge)) { > connector_type = bridge->type; > + subconnector = bridge->subtype; > + } > > #ifdef CONFIG_OF > if (!drm_bridge_get_next_bridge(bridge) && > @@ -399,6 +403,33 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, > if (panel_bridge) > drm_panel_bridge_set_orientation(connector, panel_bridge); > > + if (connector_type == DRM_MODE_CONNECTOR_DisplayPort) { > + drm_connector_attach_dp_subconnector_property(connector, subconnector); > + } else if (connector_type == DRM_MODE_CONNECTOR_DVII) { > + ret = drm_mode_create_dvi_i_properties(drm); > + if (ret) > + return ERR_PTR(ret); > + > + drm_object_attach_property(&connector->base, > + drm->mode_config.dvi_i_subconnector_property, > + subconnector); > + } else if (connector_type == DRM_MODE_CONNECTOR_TV) { > + ret = drm_mode_create_tv_properties(drm, > + BIT(DRM_MODE_TV_MODE_NTSC) | > + BIT(DRM_MODE_TV_MODE_NTSC_443) | > + BIT(DRM_MODE_TV_MODE_NTSC_J) | > + BIT(DRM_MODE_TV_MODE_PAL) | > + BIT(DRM_MODE_TV_MODE_PAL_M) | > + BIT(DRM_MODE_TV_MODE_PAL_N) | > + BIT(DRM_MODE_TV_MODE_SECAM)); > + if (ret) > + return ERR_PTR(ret);
I don't think this is right, this should be called from the appropriate encoder device depending on the analog tv mode capabilities.
> + > + drm_object_attach_property(&connector->base, > + drm->mode_config.tv_subconnector_property, > + subconnector);
Here, only add the property if drm->mode_config.tv_subconnector_property exists, and perhaps add a warning if not.
AFAIK same for DRM_MODE_CONNECTOR_DVII.
> + } > + > return connector; > } > EXPORT_SYMBOL_GPL(drm_bridge_connector_init); > diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h > index bf964cdfb330..68b14ac5ac0d 100644 > --- a/include/drm/drm_bridge.h > +++ b/include/drm/drm_bridge.h > @@ -739,6 +739,10 @@ struct drm_bridge { > * identifies the type of connected display. > */ > int type; > + /** > + * @subtype: the subtype of the connector for the DP/TV/DVI-I cases. > + */ > + enum drm_mode_subconnector subtype; > /** > * @interlace_allowed: Indicate that the bridge can handle interlaced > * modes.
| |