drm_connector_init(drm, &hdmi->connector, &dw_hdmi_connector_funcs,
                           DRM_MODE_CONNECTOR_HDMIA);
 
-       hdmi->connector.encoder = encoder;
-
        drm_mode_connector_attach_encoder(&hdmi->connector, encoder);
 
        return 0;
 
 {
        int i;
 
+       /*
+        * In the past, drivers have attempted to model the static association
+        * of connector to encoder in simple connector/encoder devices using a
+        * direct assignment of connector->encoder = encoder. This connection
+        * is a logical one and the responsibility of the core, so drivers are
+        * expected not to mess with this.
+        *
+        * Note that the error return should've been enough here, but a large
+        * majority of drivers ignores the return value, so add in a big WARN
+        * to get people's attention.
+        */
+       if (WARN_ON(connector->encoder))
+               return -EINVAL;
+
        for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
                if (connector->encoder_ids[i] == 0) {
                        connector->encoder_ids[i] = encoder->base.id;
 
        if (ret < 0)
                goto err_backlight;
 
-       connector->encoder = encoder;
-
        drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
        drm_object_property_set_value(&connector->base,
                sdev->ddev->mode_config.dpms_property, DRM_MODE_DPMS_OFF);