Chuck Ebbert b5010d0
diff -up linux-2.6.30.noarch/drivers/gpu/drm/drm_crtc_helper.c.jx linux-2.6.30.noarch/drivers/gpu/drm/drm_crtc_helper.c
Chuck Ebbert b5010d0
--- linux-2.6.30.noarch/drivers/gpu/drm/drm_crtc_helper.c.jx	2009-09-09 08:57:39.000000000 -0400
Chuck Ebbert b5010d0
+++ linux-2.6.30.noarch/drivers/gpu/drm/drm_crtc_helper.c	2009-09-09 09:35:24.000000000 -0400
Chuck Ebbert b5010d0
@@ -92,6 +92,18 @@ int drm_helper_probe_single_connector_mo
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 	connector->status = connector->funcs->detect(connector);
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
+	/* fast path if the driver tracks disconnection */
Chuck Ebbert b5010d0
+	if (connector->status == connector_status_cached) {
Chuck Ebbert b5010d0
+		DRM_DEBUG_KMS("%s still connected\n",
Chuck Ebbert b5010d0
+			      drm_get_connector_name(connector));
Chuck Ebbert b5010d0
+		list_for_each_entry_safe(mode, t, &connector->modes, head) {
Chuck Ebbert b5010d0
+			count++;
Chuck Ebbert b5010d0
+			mode->status = MODE_OK;
Chuck Ebbert b5010d0
+		}
Chuck Ebbert b5010d0
+		connector->status = connector_status_connected;
Chuck Ebbert b5010d0
+		return count;
Chuck Ebbert b5010d0
+	}
Chuck Ebbert b5010d0
+
Chuck Ebbert b5010d0
 	if (connector->status == connector_status_disconnected) {
Chuck Ebbert b5010d0
 		DRM_DEBUG_KMS("%s is disconnected\n",
Chuck Ebbert b5010d0
 			  drm_get_connector_name(connector));
Chuck Ebbert b5010d0
diff -up linux-2.6.30.noarch/drivers/gpu/drm/i915/intel_lvds.c.jx linux-2.6.30.noarch/drivers/gpu/drm/i915/intel_lvds.c
Chuck Ebbert b5010d0
--- linux-2.6.30.noarch/drivers/gpu/drm/i915/intel_lvds.c.jx	2009-09-09 08:57:39.000000000 -0400
Chuck Ebbert b5010d0
+++ linux-2.6.30.noarch/drivers/gpu/drm/i915/intel_lvds.c	2009-09-09 09:56:18.000000000 -0400
Chuck Ebbert b5010d0
@@ -593,7 +593,14 @@ static void intel_lvds_mode_set(struct d
Chuck Ebbert b5010d0
  */
Chuck Ebbert b5010d0
 static enum drm_connector_status intel_lvds_detect(struct drm_connector *connector)
Chuck Ebbert b5010d0
 {
Chuck Ebbert b5010d0
-	return connector_status_connected;
Chuck Ebbert b5010d0
+	static int done;
Chuck Ebbert b5010d0
+
Chuck Ebbert b5010d0
+	if (!done) {
Chuck Ebbert b5010d0
+		done = 1;
Chuck Ebbert b5010d0
+		return connector_status_connected;
Chuck Ebbert b5010d0
+	} else {
Chuck Ebbert b5010d0
+		return connector_status_cached;
Chuck Ebbert b5010d0
+	}
Chuck Ebbert b5010d0
 }
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 /**
Chuck Ebbert b5010d0
diff -up linux-2.6.30.noarch/include/drm/drm_crtc.h.jx linux-2.6.30.noarch/include/drm/drm_crtc.h
Chuck Ebbert b5010d0
--- linux-2.6.30.noarch/include/drm/drm_crtc.h.jx	2009-09-09 08:57:39.000000000 -0400
Chuck Ebbert b5010d0
+++ linux-2.6.30.noarch/include/drm/drm_crtc.h	2009-09-09 09:35:24.000000000 -0400
Chuck Ebbert b5010d0
@@ -172,6 +172,7 @@ enum drm_connector_status {
Chuck Ebbert b5010d0
 	connector_status_connected = 1,
Chuck Ebbert b5010d0
 	connector_status_disconnected = 2,
Chuck Ebbert b5010d0
 	connector_status_unknown = 3,
Chuck Ebbert b5010d0
+	connector_status_cached = 4,
Chuck Ebbert b5010d0
 };
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 enum subpixel_order {
Chuck Ebbert b5010d0
diff -up linux-2.6.30.x86_64/drivers/gpu/drm/drm_crtc.c.jx linux-2.6.30.x86_64/drivers/gpu/drm/drm_crtc.c
Chuck Ebbert b5010d0
--- linux-2.6.30.x86_64/drivers/gpu/drm/drm_crtc.c.jx	2009-09-09 10:10:44.000000000 -0400
Chuck Ebbert b5010d0
+++ linux-2.6.30.x86_64/drivers/gpu/drm/drm_crtc.c	2009-09-09 11:23:14.000000000 -0400
Chuck Ebbert b5010d0
@@ -185,7 +185,8 @@ EXPORT_SYMBOL(drm_get_connector_name);
Chuck Ebbert b5010d0
 
Chuck Ebbert b5010d0
 char *drm_get_connector_status_name(enum drm_connector_status status)
Chuck Ebbert b5010d0
 {
Chuck Ebbert b5010d0
-	if (status == connector_status_connected)
Chuck Ebbert b5010d0
+	if (status == connector_status_connected ||
Chuck Ebbert b5010d0
+	    status == connector_status_cached)
Chuck Ebbert b5010d0
 		return "connected";
Chuck Ebbert b5010d0
 	else if (status == connector_status_disconnected)
Chuck Ebbert b5010d0
 		return "disconnected";