diff mbox

[11/22] drm/i915: Update connector DPMS state after an atomic modeset

Message ID 1352741580-12141-12-git-send-email-ville.syrjala@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ville Syrjala Nov. 12, 2012, 5:32 p.m. UTC
From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Update the connector DPMS state after atomic modeset operations.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_atomic.c |   31 +++++++++++++++++++++++++++++++
 1 files changed, 31 insertions(+), 0 deletions(-)
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_atomic.c b/drivers/gpu/drm/i915/intel_atomic.c
index c5558cc..1fce359 100644
--- a/drivers/gpu/drm/i915/intel_atomic.c
+++ b/drivers/gpu/drm/i915/intel_atomic.c
@@ -1475,6 +1475,36 @@  static void update_props(struct drm_device *dev,
 	}
 }
 
+/*
+ * FIXME
+ * Perhaps atomic modeset shouldn't actually change the DPMS state,
+ * unless explicitly asked to do so. That's the way we treat everything
+ * else, so it makes sense. Although the dpms property is already a bit
+ * special in the legacy codepaths, so maybe we should follow the same
+ * pattern. Ie. a modeset forces DPMS to on (which is what we do here).
+ */
+static void update_connector_dpms(struct drm_device *dev, struct drm_crtc *crtc)
+{
+	struct drm_connector *connector;
+
+	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+		int dpms = connector->dpms;
+
+		if (connector->encoder && connector->encoder->crtc == crtc)
+			dpms = DRM_MODE_DPMS_ON;
+		else if (!connector->encoder || !connector->encoder->crtc)
+			dpms = DRM_MODE_DPMS_OFF;
+
+		if (connector->dpms == dpms)
+			continue;
+
+		connector->dpms = dpms;
+		drm_connector_property_set_value(connector,
+						 dev->mode_config.dpms_property,
+						 dpms);
+	}
+}
+
 static void update_crtc(struct drm_device *dev,
 			struct intel_atomic_state *s)
 {
@@ -1494,6 +1524,7 @@  static void update_crtc(struct drm_device *dev,
 		if (st->mode_dirty) {
 			drm_calc_timestamping_constants(crtc);
 			intel_crtc_update_sarea(crtc, crtc->enabled);
+			update_connector_dpms(dev, crtc);
 		}
 
 		if (st->fb_dirty)