In preparation to introduce bridge hotplug, split out from drm_bridge_connector_init() the code adding the drm_connector into a dedicated function. This will be needed to be able to add (and re-add) the connector from different code paths.
No functional changes. Just moving code around. Signed-off-by: Luca Ceresoli <[email protected]> --- drivers/gpu/drm/display/drm_bridge_connector.c | 81 ++++++++++++++++---------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c index 62c4cb1e241f..6813c6008985 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -773,26 +773,19 @@ static void drm_bridge_connector_put_bridges(struct drm_device *dev, void *data) } /** - * drm_bridge_connector_init - Initialise a connector for a chain of bridges - * @drm: the DRM device - * @encoder: the encoder where the bridge chain starts - * - * Create a new &drm_bridge_connector for the @drm device. The connector is - * allocated, initialised, registered with the @drm device and attached to - * @encoder. + * drm_bridge_connector_add_connector - add the drm_connector + * @bridge_connector: drm_bridge_connector to add the drm_connector to * - * The connector is associated with a chain of bridges that starts at - * the @encoder. All bridges in the chain shall report bridge operation flags - * (&drm_bridge->ops) and bridge output type (&drm_bridge->type), and none of - * them may create a DRM connector directly. + * Preconditions: the drm_bridge_connector is initialized (the + * @bridge_connector->drm and @bridge_connector->encoder fields are + * assigned at least) * - * Returns a pointer to the new connector on success, or a negative error - * pointer otherwise. + * Returns a pointer to the new drm_connector on success, or a negative + * error pointer otherwise. */ -struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, - struct drm_encoder *encoder) +static struct drm_connector * +drm_bridge_connector_add_connector(struct drm_bridge_connector *bridge_connector) { - struct drm_bridge_connector *bridge_connector; struct drm_connector *connector; struct i2c_adapter *ddc = NULL; struct drm_bridge *panel_bridge __free(drm_bridge_put) = NULL; @@ -802,17 +795,6 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, int connector_type; int ret; - bridge_connector = drmm_kzalloc(drm, sizeof(*bridge_connector), GFP_KERNEL); - if (!bridge_connector) - return ERR_PTR(-ENOMEM); - - ret = drmm_add_action(drm, drm_bridge_connector_put_bridges, bridge_connector); - if (ret) - return ERR_PTR(ret); - - bridge_connector->drm = drm; - bridge_connector->encoder = encoder; - /* * TODO: Handle doublescan_allowed and stereo_allowed. */ @@ -828,7 +810,7 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, * detection are available, we don't support hotplug detection at all. */ connector_type = DRM_MODE_CONNECTOR_Unknown; - drm_for_each_bridge_in_chain_scoped(encoder, bridge) { + drm_for_each_bridge_in_chain_scoped(bridge_connector->encoder, bridge) { if (!bridge->interlace_allowed) connector->interlace_allowed = false; if (!bridge->ycbcr_420_allowed) @@ -984,7 +966,7 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, bridge_connector->hdmi_funcs.spd = drm_bridge_connector_hdmi_spd_infoframe; - ret = drmm_connector_hdmi_init(drm, connector, + ret = drmm_connector_hdmi_init(bridge_connector->drm, connector, bridge_connector->bridge_hdmi->vendor, bridge_connector->bridge_hdmi->product, &drm_bridge_connector_funcs, @@ -995,7 +977,7 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, if (ret) return ERR_PTR(ret); } else { - ret = drmm_connector_init(drm, connector, + ret = drmm_connector_init(bridge_connector->drm, connector, &drm_bridge_connector_funcs, connector_type, ddc); if (ret) @@ -1063,10 +1045,47 @@ struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, IS_ENABLED(CONFIG_DRM_DISPLAY_HDCP_HELPER)) drm_connector_attach_content_protection_property(connector, true); - ret = drm_connector_attach_encoder(connector, encoder); + ret = drm_connector_attach_encoder(connector, bridge_connector->encoder); if (ret) return ERR_PTR(ret); return connector; } + +/** + * drm_bridge_connector_init - Initialise a connector for a chain of bridges + * @drm: the DRM device + * @encoder: the encoder where the bridge chain starts + * + * Create a new &drm_bridge_connector for the @drm device. The connector is + * allocated, initialised, registered with the @drm device and attached to + * @encoder. + * + * The connector is associated with a chain of bridges that starts at + * the @encoder. All bridges in the chain shall report bridge operation flags + * (&drm_bridge->ops) and bridge output type (&drm_bridge->type), and none of + * them may create a DRM connector directly. + * + * Returns a pointer to the new connector on success, or a negative error + * pointer otherwise. + */ +struct drm_connector *drm_bridge_connector_init(struct drm_device *drm, + struct drm_encoder *encoder) +{ + struct drm_bridge_connector *bridge_connector; + int ret; + + bridge_connector = drmm_kzalloc(drm, sizeof(*bridge_connector), GFP_KERNEL); + if (!bridge_connector) + return ERR_PTR(-ENOMEM); + + ret = drmm_add_action(drm, drm_bridge_connector_put_bridges, bridge_connector); + if (ret) + return ERR_PTR(ret); + + bridge_connector->drm = drm; + bridge_connector->encoder = encoder; + + return drm_bridge_connector_add_connector(bridge_connector); +} EXPORT_SYMBOL_GPL(drm_bridge_connector_init); -- 2.54.0
