aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2015-11-16 12:19:53 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2016-01-13 07:30:53 -0500
commiteb47fe8033d6c2013ce47ec44f39fa0092aa8551 (patch)
treeed1c06cf3f002c6f2ba3dbe9ad853c38e6f598e2
parent3d7b75fdae9c81dd71c7573dbc285af90e0924fa (diff)
drm: Do not set connector->encoder in drivers
An encoder is associated with a connector by the DRM core as a result of setting up a configuration. Drivers using the atomic or legacy helpers should never set up this link, even if it is a static one. While at it, try to catch this kind of error in the future by adding a WARN_ON() in drm_mode_connector_attach_encoder(). Note that this doesn't cover all the cases, since drivers could set this up after attaching. Drivers that use the atomic helpers will get a warning later on, though, so hopefully the two combined cover enough to help people avoid this in the future. Cc: Russell King <rmk+kernel@arm.linux.org.uk> Cc: Philipp Zabel <p.zabel@pengutronix.de> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Cc: Liviu Dudau <Liviu.Dudau@arm.com> Cc: Mark yao <mark.yao@rock-chips.com> Signed-off-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/1447694393-24700-1-git-send-email-thierry.reding@gmail.com
-rw-r--r--drivers/gpu/drm/bridge/dw_hdmi.c2
-rw-r--r--drivers/gpu/drm/drm_crtc.c14
-rw-r--r--drivers/gpu/drm/i2c/tda998x_drv.c1
-rw-r--r--drivers/gpu/drm/imx/parallel-display.c2
-rw-r--r--drivers/gpu/drm/shmobile/shmob_drm_crtc.c2
5 files changed, 14 insertions, 7 deletions
diff --git a/drivers/gpu/drm/bridge/dw_hdmi.c b/drivers/gpu/drm/bridge/dw_hdmi.c
index 210d8df0e5f4..f22494504912 100644
--- a/drivers/gpu/drm/bridge/dw_hdmi.c
+++ b/drivers/gpu/drm/bridge/dw_hdmi.c
@@ -1648,8 +1648,6 @@ static int dw_hdmi_register(struct drm_device *drm, struct dw_hdmi *hdmi)
1648 drm_connector_init(drm, &hdmi->connector, &dw_hdmi_connector_funcs, 1648 drm_connector_init(drm, &hdmi->connector, &dw_hdmi_connector_funcs,
1649 DRM_MODE_CONNECTOR_HDMIA); 1649 DRM_MODE_CONNECTOR_HDMIA);
1650 1650
1651 hdmi->connector.encoder = encoder;
1652
1653 drm_mode_connector_attach_encoder(&hdmi->connector, encoder); 1651 drm_mode_connector_attach_encoder(&hdmi->connector, encoder);
1654 1652
1655 return 0; 1653 return 0;
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 62fa95fa5471..d40bab29747e 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -5054,6 +5054,20 @@ int drm_mode_connector_attach_encoder(struct drm_connector *connector,
5054{ 5054{
5055 int i; 5055 int i;
5056 5056
5057 /*
5058 * In the past, drivers have attempted to model the static association
5059 * of connector to encoder in simple connector/encoder devices using a
5060 * direct assignment of connector->encoder = encoder. This connection
5061 * is a logical one and the responsibility of the core, so drivers are
5062 * expected not to mess with this.
5063 *
5064 * Note that the error return should've been enough here, but a large
5065 * majority of drivers ignores the return value, so add in a big WARN
5066 * to get people's attention.
5067 */
5068 if (WARN_ON(connector->encoder))
5069 return -EINVAL;
5070
5057 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { 5071 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
5058 if (connector->encoder_ids[i] == 0) { 5072 if (connector->encoder_ids[i] == 0) {
5059 connector->encoder_ids[i] = encoder->base.id; 5073 connector->encoder_ids[i] = encoder->base.id;
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c
index a46248f0c9c3..7885859b6386 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -1439,7 +1439,6 @@ static int tda998x_bind(struct device *dev, struct device *master, void *data)
1439 if (ret) 1439 if (ret)
1440 goto err_sysfs; 1440 goto err_sysfs;
1441 1441
1442 priv->connector.encoder = &priv->encoder;
1443 drm_mode_connector_attach_encoder(&priv->connector, &priv->encoder); 1442 drm_mode_connector_attach_encoder(&priv->connector, &priv->encoder);
1444 1443
1445 return 0; 1444 return 0;
diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c
index b74bf8e334f5..0ffef172afb4 100644
--- a/drivers/gpu/drm/imx/parallel-display.c
+++ b/drivers/gpu/drm/imx/parallel-display.c
@@ -204,8 +204,6 @@ static int imx_pd_register(struct drm_device *drm,
204 204
205 drm_mode_connector_attach_encoder(&imxpd->connector, &imxpd->encoder); 205 drm_mode_connector_attach_encoder(&imxpd->connector, &imxpd->encoder);
206 206
207 imxpd->connector.encoder = &imxpd->encoder;
208
209 return 0; 207 return 0;
210} 208}
211 209
diff --git a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
index b80802f55143..db0763794edc 100644
--- a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
+++ b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c
@@ -739,8 +739,6 @@ int shmob_drm_connector_create(struct shmob_drm_device *sdev,
739 if (ret < 0) 739 if (ret < 0)
740 goto err_backlight; 740 goto err_backlight;
741 741
742 connector->encoder = encoder;
743
744 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); 742 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
745 drm_object_property_set_value(&connector->base, 743 drm_object_property_set_value(&connector->base,
746 sdev->ddev->mode_config.dpms_property, DRM_MODE_DPMS_OFF); 744 sdev->ddev->mode_config.dpms_property, DRM_MODE_DPMS_OFF);