const char *name;
        enum omap_channel channel;
-       struct drm_encoder *current_encoder;
 
        /*
         * Temporary: eventually this will go away, but it is needed
        return dispc_mgr_get_vsync_irq(omap_crtc->channel);
 }
 
-const struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc)
+struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc)
 {
        struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
        return &omap_crtc->timings;
 {
 }
 
-/* Called only from omap_crtc_encoder_setup and suspend/resume handlers. */
+/* Called only from the encoder enable/disable and suspend/resume handlers. */
 static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
 {
        struct drm_device *dev = crtc->dev;
        return 0;
 }
 
-static void omap_crtc_encoder_setup(struct drm_crtc *crtc, bool enable)
-{
-       struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
-       struct omap_drm_private *priv = crtc->dev->dev_private;
-       struct drm_encoder *encoder = NULL;
-       unsigned int i;
-
-       DBG("%s: enable=%d", omap_crtc->name, enable);
-
-       for (i = 0; i < priv->num_encoders; i++) {
-               if (priv->encoders[i]->crtc == crtc) {
-                       encoder = priv->encoders[i];
-                       break;
-               }
-       }
-
-       if (omap_crtc->current_encoder && encoder != omap_crtc->current_encoder)
-               omap_encoder_set_enabled(omap_crtc->current_encoder, false);
-
-       omap_crtc->current_encoder = encoder;
-
-       if (encoder) {
-               omap_encoder_set_enabled(encoder, false);
-               if (enable) {
-                       omap_encoder_update(encoder, omap_crtc->mgr,
-                                           &omap_crtc->timings);
-                       omap_encoder_set_enabled(encoder, true);
-               }
-       }
-}
-
 /* -----------------------------------------------------------------------------
  * CRTC Functions
  */
                        WARN_ON(omap_plane_setup(plane));
        }
 
-       omap_crtc_encoder_setup(crtc, true);
        omap_crtc_flush(crtc);
 
        drm_crtc_vblank_on(crtc);
                        WARN_ON(omap_plane_setup(plane));
        }
 
-       omap_crtc_encoder_setup(crtc, false);
        omap_crtc_flush(crtc);
 }
 
 
 struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev);
 void omap_fbdev_free(struct drm_device *dev);
 
-const struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc);
+struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc);
 enum omap_channel omap_crtc_channel(struct drm_crtc *crtc);
 void omap_crtc_pre_init(void);
 void omap_crtc_pre_uninit(void);
 
 struct drm_encoder *omap_encoder_init(struct drm_device *dev,
                struct omap_dss_device *dssdev);
-int omap_encoder_set_enabled(struct drm_encoder *encoder, bool enabled);
-int omap_encoder_update(struct drm_encoder *encoder,
-               struct omap_overlay_manager *mgr,
-               struct omap_video_timings *timings);
 
 struct drm_connector *omap_connector_init(struct drm_device *dev,
                int connector_type, struct omap_dss_device *dssdev,
 
 {
        struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
 
-       omap_encoder_set_enabled(encoder, false);
-
        drm_encoder_cleanup(encoder);
        kfree(omap_encoder);
 }
        }
 }
 
-/*
- * The CRTC drm_crtc_helper_set_mode() didn't really give us the right order.
- * The easiest way to work around this was to make all the encoder-helper's
- * no-op's and have the omap_crtc code take care of the sequencing and call
- * us in the right points.
- *
- * FIXME: Revisit this after switching to atomic updates completely.
- */
-
 static void omap_encoder_disable(struct drm_encoder *encoder)
-{
-}
-
-static void omap_encoder_enable(struct drm_encoder *encoder)
-{
-}
-
-static int omap_encoder_atomic_check(struct drm_encoder *encoder,
-                                    struct drm_crtc_state *crtc_state,
-                                    struct drm_connector_state *conn_state)
-{
-       return 0;
-}
-
-static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
-       .mode_set = omap_encoder_mode_set,
-       .disable = omap_encoder_disable,
-       .enable = omap_encoder_enable,
-       .atomic_check = omap_encoder_atomic_check,
-};
-
-/*
- * Instead of relying on the helpers for modeset, the omap_crtc code
- * calls these functions in the proper sequence.
- */
-
-int omap_encoder_set_enabled(struct drm_encoder *encoder, bool enabled)
 {
        struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
        struct omap_dss_device *dssdev = omap_encoder->dssdev;
        struct omap_dss_driver *dssdrv = dssdev->driver;
 
-       if (enabled) {
-               return dssdrv->enable(dssdev);
-       } else {
-               dssdrv->disable(dssdev);
-               return 0;
-       }
+       dssdrv->disable(dssdev);
 }
 
-int omap_encoder_update(struct drm_encoder *encoder,
-               struct omap_overlay_manager *mgr,
-               struct omap_video_timings *timings)
+static int omap_encoder_update(struct drm_encoder *encoder,
+                              enum omap_channel channel,
+                              struct omap_video_timings *timings)
 {
        struct drm_device *dev = encoder->dev;
        struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
        struct omap_dss_driver *dssdrv = dssdev->driver;
        int ret;
 
-       dssdev->src->manager = mgr;
+       dssdev->src->manager = omap_dss_get_overlay_manager(channel);
 
        if (dssdrv->check_timings) {
                ret = dssdrv->check_timings(dssdev, timings);
        return 0;
 }
 
+static void omap_encoder_enable(struct drm_encoder *encoder)
+{
+       struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
+       struct omap_dss_device *dssdev = omap_encoder->dssdev;
+       struct omap_dss_driver *dssdrv = dssdev->driver;
+
+       omap_encoder_update(encoder, omap_crtc_channel(encoder->crtc),
+                           omap_crtc_timings(encoder->crtc));
+
+       dssdrv->enable(dssdev);
+}
+
+static int omap_encoder_atomic_check(struct drm_encoder *encoder,
+                                    struct drm_crtc_state *crtc_state,
+                                    struct drm_connector_state *conn_state)
+{
+       return 0;
+}
+
+static const struct drm_encoder_helper_funcs omap_encoder_helper_funcs = {
+       .mode_set = omap_encoder_mode_set,
+       .disable = omap_encoder_disable,
+       .enable = omap_encoder_enable,
+       .atomic_check = omap_encoder_atomic_check,
+};
+
 /* initialize encoder */
 struct drm_encoder *omap_encoder_init(struct drm_device *dev,
                struct omap_dss_device *dssdev)