@@ -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,
@@ -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);
@@ -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,