From: Rob Clark <r...@ti.com>

The connector's dpms fxn is only triggered by userspace.  When the
driver is loaded and detected displays configured, drm core only
calls the crtc and encoder's dpms functions.

Signed-off-by: Rob Clark <r...@ti.com>
---
Arguably, this could be called a work-around, and instead drm core
should call connector's dpms functions and rely on
drm_helper_connector_dpms to call encoder and crtc dpms functions.
If people think it is better to fix this in drm core, and don't
mind me making that change, then I will do that instead.

 drivers/staging/omapdrm/omap_connector.c |   15 ++-------------
 drivers/staging/omapdrm/omap_drv.h       |    1 +
 drivers/staging/omapdrm/omap_encoder.c   |   16 ++++++++++++++++
 3 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/drivers/staging/omapdrm/omap_connector.c 
b/drivers/staging/omapdrm/omap_connector.c
index 6177f30..1c1db90 100644
--- a/drivers/staging/omapdrm/omap_connector.c
+++ b/drivers/staging/omapdrm/omap_connector.c
@@ -74,20 +74,13 @@ static inline void copy_timings_drm_to_omap(struct 
omap_video_timings *timings,
        timings->vbp = mode->vtotal - mode->vsync_end;
 }
 
-static void omap_connector_dpms(struct drm_connector *connector, int mode)
+void omap_connector_dpms(struct drm_connector *connector, int mode)
 {
        struct omap_connector *omap_connector = to_omap_connector(connector);
        struct omap_dss_device *dssdev = omap_connector->dssdev;
-       int old_dpms;
 
        DBG("%s: %d", dssdev->name, mode);
 
-       old_dpms = connector->dpms;
-
-       /* from off to on, do from crtc to connector */
-       if (mode < old_dpms)
-               drm_helper_connector_dpms(connector, mode);
-
        if (mode == DRM_MODE_DPMS_ON) {
                /* store resume info for suspended displays */
                switch (dssdev->state) {
@@ -109,10 +102,6 @@ static void omap_connector_dpms(struct drm_connector 
*connector, int mode)
        } else {
                /* TODO */
        }
-
-       /* from on to off, do from connector to crtc */
-       if (mode > old_dpms)
-               drm_helper_connector_dpms(connector, mode);
 }
 
 enum drm_connector_status omap_connector_detect(
@@ -378,7 +367,7 @@ struct drm_encoder *omap_connector_attached_encoder(
 }
 
 static const struct drm_connector_funcs omap_connector_funcs = {
-       .dpms = omap_connector_dpms,
+       .dpms = drm_helper_connector_dpms,
        .detect = omap_connector_detect,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .destroy = omap_connector_destroy,
diff --git a/drivers/staging/omapdrm/omap_drv.h 
b/drivers/staging/omapdrm/omap_drv.h
index 263057a..8dd7d74 100644
--- a/drivers/staging/omapdrm/omap_drv.h
+++ b/drivers/staging/omapdrm/omap_drv.h
@@ -73,6 +73,7 @@ void omap_connector_mode_set(struct drm_connector *connector,
                struct drm_display_mode *mode);
 void omap_connector_flush(struct drm_connector *connector,
                int x, int y, int w, int h);
+void omap_connector_dpms(struct drm_connector *connector, int mode);
 
 struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
                struct drm_file *file, struct drm_mode_fb_cmd *mode_cmd);
diff --git a/drivers/staging/omapdrm/omap_encoder.c 
b/drivers/staging/omapdrm/omap_encoder.c
index 06c52cb..af39dc3 100644
--- a/drivers/staging/omapdrm/omap_encoder.c
+++ b/drivers/staging/omapdrm/omap_encoder.c
@@ -44,7 +44,23 @@ static void omap_encoder_destroy(struct drm_encoder *encoder)
 static void omap_encoder_dpms(struct drm_encoder *encoder, int mode)
 {
        struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
+       struct drm_device *dev = encoder->dev;
+       struct omap_drm_private *priv = dev->dev_private;
+       int i;
+
        DBG("%s: %d", omap_encoder->mgr->name, mode);
+
+       /* Note: the connector DPMS fxn is only called from userspace
+        * ioctl, and not at bootup.  But the encoder dpms function is.
+        * Ensure that our connector gets notified of the DPMS state
+        * change:
+        */
+       for (i = 0; i < priv->num_connectors; i++) {
+               struct drm_connector *connector = priv->connectors[i];
+               if (connector->encoder == encoder) {
+                       omap_connector_dpms(connector, mode);
+               }
+       }
 }
 
 static bool omap_encoder_mode_fixup(struct drm_encoder *encoder,
-- 
1.7.5.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to