| From 8ffa1674cc6aace38d9b2df1cdc46e5850454a68 Mon Sep 17 00:00:00 2001 |
| From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Date: Tue, 17 Jan 2017 10:28:59 +0200 |
| Subject: [PATCH 244/255] drm: bridge: dw-hdmi: Create connector in the bridge |
| attach operation |
| |
| The DRM device is not guaranteed by the bridge API to be available |
| before the attach callback. The driver performs properly at the moment |
| as it doesn't use the drm_bridge_add() registration method. As this will |
| be changed later, move connector creation to attach time to ensure |
| compatibility with the API. |
| |
| Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> |
| Reviewed-by: Jose Abreu <joabreu@synopsys.com> |
| Signed-off-by: Archit Taneja <architt@codeaurora.org> |
| Link: http://patchwork.freedesktop.org/patch/msgid/20170117082910.27023-10-laurent.pinchart+renesas@ideasonboard.com |
| (cherry picked from commit d2ae94ae840bd0b347e417e88b1637df95d499ac) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/gpu/drm/bridge/dw-hdmi.c | 33 ++++++++++++++++++++------------- |
| 1 file changed, 20 insertions(+), 13 deletions(-) |
| |
| --- a/drivers/gpu/drm/bridge/dw-hdmi.c |
| +++ b/drivers/gpu/drm/bridge/dw-hdmi.c |
| @@ -1667,6 +1667,25 @@ static const struct drm_connector_helper |
| .best_encoder = drm_atomic_helper_best_encoder, |
| }; |
| |
| +static int dw_hdmi_bridge_attach(struct drm_bridge *bridge) |
| +{ |
| + struct dw_hdmi *hdmi = bridge->driver_private; |
| + struct drm_encoder *encoder = bridge->encoder; |
| + struct drm_connector *connector = &hdmi->connector; |
| + |
| + connector->interlace_allowed = 1; |
| + connector->polled = DRM_CONNECTOR_POLL_HPD; |
| + |
| + drm_connector_helper_add(connector, &dw_hdmi_connector_helper_funcs); |
| + |
| + drm_connector_init(bridge->dev, connector, &dw_hdmi_connector_funcs, |
| + DRM_MODE_CONNECTOR_HDMIA); |
| + |
| + drm_mode_connector_attach_encoder(connector, encoder); |
| + |
| + return 0; |
| +} |
| + |
| static void dw_hdmi_bridge_mode_set(struct drm_bridge *bridge, |
| struct drm_display_mode *orig_mode, |
| struct drm_display_mode *mode) |
| @@ -1704,6 +1723,7 @@ static void dw_hdmi_bridge_enable(struct |
| } |
| |
| static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = { |
| + .attach = dw_hdmi_bridge_attach, |
| .enable = dw_hdmi_bridge_enable, |
| .disable = dw_hdmi_bridge_disable, |
| .mode_set = dw_hdmi_bridge_mode_set, |
| @@ -1829,17 +1849,6 @@ static int dw_hdmi_register(struct drm_e |
| return -EINVAL; |
| } |
| |
| - hdmi->connector.polled = DRM_CONNECTOR_POLL_HPD; |
| - |
| - drm_connector_helper_add(&hdmi->connector, |
| - &dw_hdmi_connector_helper_funcs); |
| - |
| - drm_connector_init(encoder->dev, &hdmi->connector, |
| - &dw_hdmi_connector_funcs, |
| - DRM_MODE_CONNECTOR_HDMIA); |
| - |
| - drm_mode_connector_attach_encoder(&hdmi->connector, encoder); |
| - |
| return 0; |
| } |
| |
| @@ -1862,8 +1871,6 @@ int dw_hdmi_bind(struct platform_device |
| if (!hdmi) |
| return -ENOMEM; |
| |
| - hdmi->connector.interlace_allowed = 1; |
| - |
| hdmi->plat_data = plat_data; |
| hdmi->dev = dev; |
| hdmi->dev_type = plat_data->dev_type; |