To support bridge hotplug we will need better control over the steps involved in the crm_connector creation, especially in terms of error management. This will be complicated by the length and amount of return points in this function. In preparation, split the code to initialize HDMI audio and CEC fields out to a separate function.
No functional changes. Just moving code around. Signed-off-by: Luca Ceresoli <[email protected]> --- drivers/gpu/drm/display/drm_bridge_connector.c | 102 ++++++++++++++----------- 1 file changed, 57 insertions(+), 45 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/drm/display/drm_bridge_connector.c index d8a033ed8f41..e6306e98a167 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -930,6 +930,60 @@ static int drm_bridge_connector_get_bridges(struct drm_bridge_connector *bridge_ return 0; } +static struct drm_bridge_connector * +drm_bridge_connector_init_hdmi_audio_cec(struct drm_bridge_connector *bridge_connector) +{ + int ret; + + if (bridge_connector->bridge_hdmi_audio || + bridge_connector->bridge_dp_audio) { + struct device *dev; + struct drm_bridge *bridge; + + if (bridge_connector->bridge_hdmi_audio) + bridge = bridge_connector->bridge_hdmi_audio; + else + bridge = bridge_connector->bridge_dp_audio; + + dev = bridge->hdmi_audio_dev; + + ret = drm_connector_hdmi_audio_init(&bridge_connector->base, dev, + &drm_bridge_connector_hdmi_audio_funcs, + bridge->hdmi_audio_max_i2s_playback_channels, + bridge->hdmi_audio_i2s_formats, + bridge->hdmi_audio_spdif_playback, + bridge->hdmi_audio_dai_port); + if (ret) + return ERR_PTR(ret); + } + + if (bridge_connector->bridge_hdmi_cec && + bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) { + struct drm_bridge *bridge = bridge_connector->bridge_hdmi_cec; + + ret = drmm_connector_hdmi_cec_notifier_register(&bridge_connector->base, + NULL, + bridge->hdmi_cec_dev); + if (ret) + return ERR_PTR(ret); + } + + if (bridge_connector->bridge_hdmi_cec && + bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_ADAPTER) { + struct drm_bridge *bridge = bridge_connector->bridge_hdmi_cec; + + ret = drmm_connector_hdmi_cec_register(&bridge_connector->base, + &drm_bridge_connector_hdmi_cec_funcs, + bridge->hdmi_cec_adapter_name, + bridge->hdmi_cec_available_las, + bridge->hdmi_cec_dev); + if (ret) + return ERR_PTR(ret); + } + + return bridge_connector; +} + /** * drm_bridge_connector_add_connector - add the drm_connector * @bridge_connector: drm_bridge_connector to add the drm_connector to @@ -997,51 +1051,9 @@ drm_bridge_connector_add_connector(struct drm_bridge_connector *bridge_connector return ERR_PTR(ret); } - if (bridge_connector->bridge_hdmi_audio || - bridge_connector->bridge_dp_audio) { - struct device *dev; - struct drm_bridge *bridge; - - if (bridge_connector->bridge_hdmi_audio) - bridge = bridge_connector->bridge_hdmi_audio; - else - bridge = bridge_connector->bridge_dp_audio; - - dev = bridge->hdmi_audio_dev; - - ret = drm_connector_hdmi_audio_init(connector, dev, - &drm_bridge_connector_hdmi_audio_funcs, - bridge->hdmi_audio_max_i2s_playback_channels, - bridge->hdmi_audio_i2s_formats, - bridge->hdmi_audio_spdif_playback, - bridge->hdmi_audio_dai_port); - if (ret) - return ERR_PTR(ret); - } - - if (bridge_connector->bridge_hdmi_cec && - bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER) { - struct drm_bridge *bridge = bridge_connector->bridge_hdmi_cec; - - ret = drmm_connector_hdmi_cec_notifier_register(connector, - NULL, - bridge->hdmi_cec_dev); - if (ret) - return ERR_PTR(ret); - } - - if (bridge_connector->bridge_hdmi_cec && - bridge_connector->bridge_hdmi_cec->ops & DRM_BRIDGE_OP_HDMI_CEC_ADAPTER) { - struct drm_bridge *bridge = bridge_connector->bridge_hdmi_cec; - - ret = drmm_connector_hdmi_cec_register(connector, - &drm_bridge_connector_hdmi_cec_funcs, - bridge->hdmi_cec_adapter_name, - bridge->hdmi_cec_available_las, - bridge->hdmi_cec_dev); - if (ret) - return ERR_PTR(ret); - } + bridge_connector = drm_bridge_connector_init_hdmi_audio_cec(bridge_connector); + if (IS_ERR(bridge_connector)) + return bridge_connector; drm_connector_helper_add(connector, &drm_bridge_connector_helper_funcs); -- 2.54.0
