drm/i915: simplify possible_clones computation
[deliverable/linux.git] / drivers / gpu / drm / i915 / intel_crt.c
index 61d55d3141c7bbb9e0ecf00a085872e54fcfbc88..e1d02be368a5860e3eb081ae790991e17f3e09b3 100644 (file)
@@ -132,7 +132,7 @@ static int intel_crt_mode_valid(struct drm_connector *connector,
 }
 
 static bool intel_crt_mode_fixup(struct drm_encoder *encoder,
-                                struct drm_display_mode *mode,
+                                const struct drm_display_mode *mode,
                                 struct drm_display_mode *adjusted_mode)
 {
        return true;
@@ -330,39 +330,34 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
 {
        struct intel_crt *crt = intel_attached_crt(connector);
        struct drm_i915_private *dev_priv = crt->base.base.dev->dev_private;
+       struct edid *edid;
+       struct i2c_adapter *i2c;
+
+       BUG_ON(crt->base.type != INTEL_OUTPUT_ANALOG);
 
-       /* CRT should always be at 0, but check anyway */
-       if (crt->base.type != INTEL_OUTPUT_ANALOG)
-               return false;
+       i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin);
+       edid = drm_get_edid(connector, i2c);
 
-       if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) {
-               struct edid *edid;
-               bool is_digital = false;
-               struct i2c_adapter *i2c;
+       if (edid) {
+               bool is_digital = edid->input & DRM_EDID_INPUT_DIGITAL;
 
-               i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin);
-               edid = drm_get_edid(connector, i2c);
                /*
                 * This may be a DVI-I connector with a shared DDC
                 * link between analog and digital outputs, so we
                 * have to check the EDID input spec of the attached device.
-                *
-                * On the other hand, what should we do if it is a broken EDID?
                 */
-               if (edid != NULL) {
-                       is_digital = edid->input & DRM_EDID_INPUT_DIGITAL;
-                       connector->display_info.raw_edid = NULL;
-                       kfree(edid);
-               }
-
                if (!is_digital) {
                        DRM_DEBUG_KMS("CRT detected via DDC:0x50 [EDID]\n");
                        return true;
-               } else {
-                       DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID reports a digital panel]\n");
                }
+
+               DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID reports a digital panel]\n");
+       } else {
+               DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [no valid EDID found]\n");
        }
 
+       kfree(edid);
+
        return false;
 }
 
@@ -663,9 +658,7 @@ void intel_crt_init(struct drm_device *dev)
        intel_connector_attach_encoder(intel_connector, &crt->base);
 
        crt->base.type = INTEL_OUTPUT_ANALOG;
-       crt->base.clone_mask = (1 << INTEL_SDVO_NON_TV_CLONE_BIT |
-                               1 << INTEL_ANALOG_CLONE_BIT |
-                               1 << INTEL_SDVO_LVDS_CLONE_BIT);
+       crt->base.cloneable = true;
        if (IS_HASWELL(dev))
                crt->base.crtc_mask = (1 << 0);
        else
This page took 0.028485 seconds and 5 git commands to generate.