drm/i915: Move the lvds OpRegion lid detection code to panel and reuse for eDP
authorChris Wilson <chris@chris-wilson.co.uk>
Sat, 12 Feb 2011 10:29:38 +0000 (10:29 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 16 Feb 2011 09:41:07 +0000 (09:41 +0000)
Share the lid detection code for the all panels for consistent behaviour
and a single place to add the eventual quirks for crap hardware.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_lvds.c
drivers/gpu/drm/i915/intel_panel.c

index e478f6a94535b42f5311b0ee0336eb7742a36b72..65959a29ab2bd2c81f09be689a1396fe9094e08b 100644 (file)
@@ -1522,9 +1522,13 @@ ironlake_dp_detect(struct intel_dp *intel_dp)
 {
        enum drm_connector_status status;
 
-       /* Can't disconnect eDP */
-       if (is_edp(intel_dp))
-               return connector_status_connected;
+       /* Can't disconnect eDP, but you can close the lid... */
+       if (is_edp(intel_dp)) {
+               status = intel_panel_detect(intel_dp->base.base.dev);
+               if (status == connector_status_unknown)
+                       status = connector_status_connected;
+               return status;
+       }
 
        status = connector_status_disconnected;
        if (intel_dp_aux_native_read(intel_dp,
index 5ce4a5f13de1ee2290b4394bcd305b058426ca91..4a19eb6d65abe96bb368e377ba7db9a7102ed230 100644 (file)
@@ -267,6 +267,7 @@ extern void intel_panel_set_backlight(struct drm_device *dev, u32 level);
 extern void intel_panel_setup_backlight(struct drm_device *dev);
 extern void intel_panel_enable_backlight(struct drm_device *dev);
 extern void intel_panel_disable_backlight(struct drm_device *dev);
+extern enum drm_connector_status intel_panel_detect(struct drm_device *dev);
 
 extern void intel_crtc_load_lut(struct drm_crtc *crtc);
 extern void intel_encoder_prepare (struct drm_encoder *encoder);
index cd089607eb89c7ea5c91aac6dd6db346bef65a20..8f909cda62d885fa2f48575c533ed4d692278bb8 100644 (file)
@@ -473,14 +473,11 @@ static enum drm_connector_status
 intel_lvds_detect(struct drm_connector *connector, bool force)
 {
        struct drm_device *dev = connector->dev;
-       struct drm_i915_private *dev_priv = dev->dev_private;
        enum drm_connector_status status = connector_status_connected;
 
-       /* Assume that the BIOS does not lie through the OpRegion... */
-       if (dev_priv->opregion.lid_state)
-               return ioread32(dev_priv->opregion.lid_state) & 0x1 ?
-                       connector_status_connected :
-                       connector_status_disconnected;
+       status = intel_panel_detect(dev);
+       if (status != connector_status_unknown)
+               return status;
 
        /* ACPI lid methods were generally unreliable in this generation, so
         * don't even bother.
index c65992df458d6a905c1bab7dcb38f38d9dfeab49..286995a9a84ae6c7fc32a918e799f0cf6ff8546d 100644 (file)
@@ -281,3 +281,17 @@ void intel_panel_setup_backlight(struct drm_device *dev)
        dev_priv->backlight_level = intel_panel_get_backlight(dev);
        dev_priv->backlight_enabled = dev_priv->backlight_level != 0;
 }
+
+enum drm_connector_status
+intel_panel_detect(struct drm_device *dev)
+{
+       struct drm_i915_private *dev_priv = dev->dev_private;
+
+       /* Assume that the BIOS does not lie through the OpRegion... */
+       if (dev_priv->opregion.lid_state)
+               return ioread32(dev_priv->opregion.lid_state) & 0x1 ?
+                       connector_status_connected :
+                       connector_status_disconnected;
+
+       return connector_status_unknown;
+}