clk_set_rate(arcpgu->clk, m->crtc_clock * 1000);
 }
 
-static void arc_pgu_crtc_enable(struct drm_crtc *crtc)
+static void arc_pgu_crtc_atomic_enable(struct drm_crtc *crtc,
+                                      struct drm_crtc_state *old_state)
 {
        struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc);
 
        .mode_set       = drm_helper_crtc_mode_set,
        .mode_set_base  = drm_helper_crtc_mode_set_base,
        .mode_set_nofb  = arc_pgu_crtc_mode_set_nofb,
-       .enable         = arc_pgu_crtc_enable,
        .disable        = arc_pgu_crtc_disable,
        .atomic_begin   = arc_pgu_crtc_atomic_begin,
+       .atomic_enable  = arc_pgu_crtc_atomic_enable,
 };
 
 static void arc_pgu_plane_atomic_update(struct drm_plane *plane,
 
        clk_set_rate(hdlcd->clk, m->crtc_clock * 1000);
 }
 
-static void hdlcd_crtc_enable(struct drm_crtc *crtc)
+static void hdlcd_crtc_atomic_enable(struct drm_crtc *crtc,
+                                    struct drm_crtc_state *old_state)
 {
        struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc);
 
 }
 
 static const struct drm_crtc_helper_funcs hdlcd_crtc_helper_funcs = {
-       .enable         = hdlcd_crtc_enable,
        .disable        = hdlcd_crtc_disable,
        .atomic_check   = hdlcd_crtc_atomic_check,
        .atomic_begin   = hdlcd_crtc_atomic_begin,
+       .atomic_enable  = hdlcd_crtc_atomic_enable,
 };
 
 static int hdlcd_plane_atomic_check(struct drm_plane *plane,
 
        return MODE_OK;
 }
 
-static void malidp_crtc_enable(struct drm_crtc *crtc)
+static void malidp_crtc_atomic_enable(struct drm_crtc *crtc,
+                                     struct drm_crtc_state *old_state)
 {
        struct malidp_drm *malidp = crtc_to_malidp_device(crtc);
        struct malidp_hw_device *hwdev = malidp->dev;
 
 static const struct drm_crtc_helper_funcs malidp_crtc_helper_funcs = {
        .mode_valid = malidp_crtc_mode_valid,
-       .enable = malidp_crtc_enable,
        .disable = malidp_crtc_disable,
        .atomic_check = malidp_crtc_atomic_check,
+       .atomic_enable = malidp_crtc_atomic_enable,
 };
 
 static struct drm_crtc_state *malidp_crtc_duplicate_state(struct drm_crtc *crtc)
 
        pm_runtime_put_sync(dev->dev);
 }
 
-static void atmel_hlcdc_crtc_enable(struct drm_crtc *c)
+static void atmel_hlcdc_crtc_atomic_enable(struct drm_crtc *c,
+                                          struct drm_crtc_state *old_state)
 {
        struct drm_device *dev = c->dev;
        struct atmel_hlcdc_crtc *crtc = drm_crtc_to_atmel_hlcdc_crtc(c);
        .mode_set_nofb = atmel_hlcdc_crtc_mode_set_nofb,
        .mode_set_base = drm_helper_crtc_mode_set_base,
        .disable = atmel_hlcdc_crtc_disable,
-       .enable = atmel_hlcdc_crtc_enable,
        .atomic_check = atmel_hlcdc_crtc_atomic_check,
        .atomic_begin = atmel_hlcdc_crtc_atomic_begin,
        .atomic_flush = atmel_hlcdc_crtc_atomic_flush,
+       .atomic_enable = atmel_hlcdc_crtc_atomic_enable,
 };
 
 static void atmel_hlcdc_crtc_destroy(struct drm_crtc *c)
 
                                              struct drm_atomic_state *old_state)
 {
        struct drm_crtc *crtc;
+       struct drm_crtc_state *old_crtc_state;
        struct drm_crtc_state *new_crtc_state;
        struct drm_connector *connector;
        struct drm_connector_state *new_conn_state;
        int i;
 
-       for_each_new_crtc_in_state(old_state, crtc, new_crtc_state, i) {
+       for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) {
                const struct drm_crtc_helper_funcs *funcs;
 
                /* Need to filter out CRTCs where only planes change. */
                        DRM_DEBUG_ATOMIC("enabling [CRTC:%d:%s]\n",
                                         crtc->base.id, crtc->name);
 
-                       if (funcs->enable)
-                               funcs->enable(crtc);
+                       if (funcs->atomic_enable)
+                               funcs->atomic_enable(crtc, old_crtc_state);
                        else
                                funcs->commit(crtc);
                }
 
        return drm_atomic_add_affected_planes(state->state, crtc);
 }
 
-static void drm_simple_kms_crtc_enable(struct drm_crtc *crtc)
+static void drm_simple_kms_crtc_enable(struct drm_crtc *crtc,
+                                      struct drm_crtc_state *old_state)
 {
        struct drm_simple_display_pipe *pipe;
 
 
 static const struct drm_crtc_helper_funcs drm_simple_kms_crtc_helper_funcs = {
        .atomic_check = drm_simple_kms_crtc_check,
+       .atomic_enable = drm_simple_kms_crtc_enable,
        .disable = drm_simple_kms_crtc_disable,
-       .enable = drm_simple_kms_crtc_enable,
 };
 
 static const struct drm_crtc_funcs drm_simple_kms_crtc_funcs = {
 
 #include "exynos_drm_drv.h"
 #include "exynos_drm_plane.h"
 
-static void exynos_drm_crtc_enable(struct drm_crtc *crtc)
+static void exynos_drm_crtc_atomic_enable(struct drm_crtc *crtc,
+                                         struct drm_crtc_state *old_state)
 {
        struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
 
 }
 
 static const struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = {
-       .enable         = exynos_drm_crtc_enable,
        .disable        = exynos_drm_crtc_disable,
        .atomic_check   = exynos_crtc_atomic_check,
        .atomic_begin   = exynos_crtc_atomic_begin,
        .atomic_flush   = exynos_crtc_atomic_flush,
+       .atomic_enable  = exynos_drm_crtc_atomic_enable,
 };
 
 void exynos_crtc_handle_event(struct exynos_drm_crtc *exynos_crtc)
 
        clk_disable_unprepare(fsl_dev->pix_clk);
 }
 
-static void fsl_dcu_drm_crtc_enable(struct drm_crtc *crtc)
+static void fsl_dcu_drm_crtc_atomic_enable(struct drm_crtc *crtc,
+                                          struct drm_crtc_state *old_state)
 {
        struct drm_device *dev = crtc->dev;
        struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
 static const struct drm_crtc_helper_funcs fsl_dcu_drm_crtc_helper_funcs = {
        .atomic_disable = fsl_dcu_drm_crtc_atomic_disable,
        .atomic_flush = fsl_dcu_drm_crtc_atomic_flush,
-       .enable = fsl_dcu_drm_crtc_enable,
+       .atomic_enable = fsl_dcu_drm_crtc_atomic_enable,
        .mode_set_nofb = fsl_dcu_drm_crtc_mode_set_nofb,
 };
 
 
        return plane;
 }
 
-static void hibmc_crtc_enable(struct drm_crtc *crtc)
+static void hibmc_crtc_atomic_enable(struct drm_crtc *crtc,
+                                    struct drm_crtc_state *old_state)
 {
        unsigned int reg;
        struct hibmc_drm_private *priv = crtc->dev->dev_private;
 };
 
 static const struct drm_crtc_helper_funcs hibmc_crtc_helper_funcs = {
-       .enable         = hibmc_crtc_enable,
        .disable        = hibmc_crtc_disable,
        .mode_set_nofb  = hibmc_crtc_mode_set_nofb,
        .atomic_begin   = hibmc_crtc_atomic_begin,
        .atomic_flush   = hibmc_crtc_atomic_flush,
+       .atomic_enable  = hibmc_crtc_atomic_enable,
 };
 
 int hibmc_de_init(struct hibmc_drm_private *priv)
 
 static void ade_dump_regs(void __iomem *base) { }
 #endif
 
-static void ade_crtc_enable(struct drm_crtc *crtc)
+static void ade_crtc_atomic_enable(struct drm_crtc *crtc,
+                                  struct drm_crtc_state *old_state)
 {
        struct ade_crtc *acrtc = to_ade_crtc(crtc);
        struct ade_hw_ctx *ctx = acrtc->ctx;
 }
 
 static const struct drm_crtc_helper_funcs ade_crtc_helper_funcs = {
-       .enable         = ade_crtc_enable,
        .disable        = ade_crtc_disable,
        .mode_set_nofb  = ade_crtc_mode_set_nofb,
        .atomic_begin   = ade_crtc_atomic_begin,
        .atomic_flush   = ade_crtc_atomic_flush,
+       .atomic_enable  = ade_crtc_atomic_enable,
 };
 
 static const struct drm_crtc_funcs ade_crtc_funcs = {
 
        return container_of(crtc, struct ipu_crtc, base);
 }
 
-static void ipu_crtc_enable(struct drm_crtc *crtc)
+static void ipu_crtc_atomic_enable(struct drm_crtc *crtc,
+                                  struct drm_crtc_state *old_state)
 {
        struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
        struct ipu_soc *ipu = dev_get_drvdata(ipu_crtc->dev->parent);
        .atomic_check = ipu_crtc_atomic_check,
        .atomic_begin = ipu_crtc_atomic_begin,
        .atomic_disable = ipu_crtc_atomic_disable,
-       .enable = ipu_crtc_enable,
+       .atomic_enable = ipu_crtc_atomic_enable,
 };
 
 static void ipu_put_resources(struct ipu_crtc *ipu_crtc)
 
        }
 }
 
-static void mtk_drm_crtc_enable(struct drm_crtc *crtc)
+static void mtk_drm_crtc_atomic_enable(struct drm_crtc *crtc,
+                                      struct drm_crtc_state *old_state)
 {
        struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
        struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0];
 static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = {
        .mode_fixup     = mtk_drm_crtc_mode_fixup,
        .mode_set_nofb  = mtk_drm_crtc_mode_set_nofb,
-       .enable         = mtk_drm_crtc_enable,
        .disable        = mtk_drm_crtc_disable,
        .atomic_begin   = mtk_drm_crtc_atomic_begin,
        .atomic_flush   = mtk_drm_crtc_atomic_flush,
+       .atomic_enable  = mtk_drm_crtc_atomic_enable,
 };
 
 static int mtk_drm_crtc_init(struct drm_device *drm,
 
 
 };
 
-static void meson_crtc_enable(struct drm_crtc *crtc)
+static void meson_crtc_atomic_enable(struct drm_crtc *crtc,
+                                    struct drm_crtc_state *old_state)
 {
        struct meson_crtc *meson_crtc = to_meson_crtc(crtc);
        struct drm_crtc_state *crtc_state = crtc->state;
 }
 
 static const struct drm_crtc_helper_funcs meson_crtc_helper_funcs = {
-       .enable         = meson_crtc_enable,
        .disable        = meson_crtc_disable,
        .atomic_begin   = meson_crtc_atomic_begin,
        .atomic_flush   = meson_crtc_atomic_flush,
+       .atomic_enable  = meson_crtc_atomic_enable,
 };
 
 void meson_crtc_irq(struct meson_drm *priv)
 
        mdp4_crtc->enabled = false;
 }
 
-static void mdp4_crtc_enable(struct drm_crtc *crtc)
+static void mdp4_crtc_atomic_enable(struct drm_crtc *crtc,
+                                   struct drm_crtc_state *old_state)
 {
        struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc);
        struct mdp4_kms *mdp4_kms = get_kms(crtc);
 static const struct drm_crtc_helper_funcs mdp4_crtc_helper_funcs = {
        .mode_set_nofb = mdp4_crtc_mode_set_nofb,
        .disable = mdp4_crtc_disable,
-       .enable = mdp4_crtc_enable,
        .atomic_check = mdp4_crtc_atomic_check,
        .atomic_begin = mdp4_crtc_atomic_begin,
        .atomic_flush = mdp4_crtc_atomic_flush,
+       .atomic_enable = mdp4_crtc_atomic_enable,
 };
 
 static void mdp4_crtc_vblank_irq(struct mdp_irq *irq, uint32_t irqstatus)
 
        mdp5_crtc->enabled = false;
 }
 
-static void mdp5_crtc_enable(struct drm_crtc *crtc)
+static void mdp5_crtc_atomic_enable(struct drm_crtc *crtc,
+                                   struct drm_crtc_state *old_state)
 {
        struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc);
        struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state);
 static const struct drm_crtc_helper_funcs mdp5_crtc_helper_funcs = {
        .mode_set_nofb = mdp5_crtc_mode_set_nofb,
        .disable = mdp5_crtc_disable,
-       .enable = mdp5_crtc_enable,
        .atomic_check = mdp5_crtc_atomic_check,
        .atomic_begin = mdp5_crtc_atomic_begin,
        .atomic_flush = mdp5_crtc_atomic_flush,
+       .atomic_enable = mdp5_crtc_atomic_enable,
 };
 
 static void mdp5_crtc_vblank_irq(struct mdp_irq *irq, uint32_t irqstatus)
 
        }
 }
 
-static void omap_crtc_enable(struct drm_crtc *crtc)
+static void omap_crtc_atomic_enable(struct drm_crtc *crtc,
+                                   struct drm_crtc_state *old_state)
 {
        struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
        int ret;
 static const struct drm_crtc_helper_funcs omap_crtc_helper_funcs = {
        .mode_set_nofb = omap_crtc_mode_set_nofb,
        .disable = omap_crtc_disable,
-       .enable = omap_crtc_enable,
        .atomic_check = omap_crtc_atomic_check,
        .atomic_begin = omap_crtc_atomic_begin,
        .atomic_flush = omap_crtc_atomic_flush,
+       .atomic_enable = omap_crtc_atomic_enable,
 };
 
 /* -----------------------------------------------------------------------------
 
 
 }
 
-static void qxl_crtc_enable(struct drm_crtc *crtc)
+static void qxl_crtc_atomic_enable(struct drm_crtc *crtc,
+                                  struct drm_crtc_state *old_state)
 {
        DRM_DEBUG("\n");
 }
        .disable = qxl_crtc_disable,
        .mode_fixup = qxl_crtc_mode_fixup,
        .mode_set_nofb = qxl_mode_set_nofb,
-       .enable = qxl_crtc_enable,
        .atomic_flush = qxl_crtc_atomic_flush,
+       .atomic_enable = qxl_crtc_atomic_enable,
 };
 
 static int qxl_primary_atomic_check(struct drm_plane *plane,
 
  * CRTC Functions
  */
 
-static void rcar_du_crtc_enable(struct drm_crtc *crtc)
+static void rcar_du_crtc_atomic_enable(struct drm_crtc *crtc,
+                                      struct drm_crtc_state *old_state)
 {
        struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc);
 
 
 static const struct drm_crtc_helper_funcs crtc_helper_funcs = {
        .disable = rcar_du_crtc_disable,
-       .enable = rcar_du_crtc_enable,
        .atomic_begin = rcar_du_crtc_atomic_begin,
        .atomic_flush = rcar_du_crtc_atomic_flush,
+       .atomic_enable = rcar_du_crtc_atomic_enable,
 };
 
 static int rcar_du_crtc_enable_vblank(struct drm_crtc *crtc)
 
        return true;
 }
 
-static void vop_crtc_enable(struct drm_crtc *crtc)
+static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
+                                  struct drm_crtc_state *old_state)
 {
        struct vop *vop = to_vop(crtc);
        const struct vop_data *vop_data = vop->data;
 }
 
 static const struct drm_crtc_helper_funcs vop_crtc_helper_funcs = {
-       .enable = vop_crtc_enable,
        .disable = vop_crtc_disable,
        .mode_fixup = vop_crtc_mode_fixup,
        .atomic_flush = vop_crtc_atomic_flush,
        .atomic_begin = vop_crtc_atomic_begin,
+       .atomic_enable = vop_crtc_atomic_enable,
 };
 
 static void vop_crtc_destroy(struct drm_crtc *crtc)
 
 #include "sti_vid.h"
 #include "sti_vtg.h"
 
-static void sti_crtc_enable(struct drm_crtc *crtc)
+static void sti_crtc_atomic_enable(struct drm_crtc *crtc,
+                                  struct drm_crtc_state *old_state)
 {
        struct sti_mixer *mixer = to_sti_mixer(crtc);
 
 }
 
 static const struct drm_crtc_helper_funcs sti_crtc_helper_funcs = {
-       .enable = sti_crtc_enable,
        .disable = sti_crtc_disabling,
        .mode_set_nofb = sti_crtc_mode_set_nofb,
        .atomic_flush = sti_crtc_atomic_flush,
+       .atomic_enable = sti_crtc_atomic_enable,
 };
 
 static void sti_crtc_destroy(struct drm_crtc *crtc)
 
                                  ldev->clut[i]);
 }
 
-static void ltdc_crtc_enable(struct drm_crtc *crtc)
+static void ltdc_crtc_atomic_enable(struct drm_crtc *crtc,
+                                   struct drm_crtc_state *old_state)
 {
        struct ltdc_device *ldev = crtc_to_ltdc(crtc);
 
 
 static struct drm_crtc_helper_funcs ltdc_crtc_helper_funcs = {
        .load_lut = ltdc_crtc_load_lut,
-       .enable = ltdc_crtc_enable,
        .disable = ltdc_crtc_disable,
        .mode_set_nofb = ltdc_crtc_mode_set_nofb,
        .atomic_flush = ltdc_crtc_atomic_flush,
+       .atomic_enable = ltdc_crtc_atomic_enable,
 };
 
 int ltdc_crtc_enable_vblank(struct drm_device *ddev, unsigned int pipe)
 
        }
 }
 
-static void sun4i_crtc_enable(struct drm_crtc *crtc)
+static void sun4i_crtc_atomic_enable(struct drm_crtc *crtc,
+                                    struct drm_crtc_state *old_state)
 {
        struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc);
 
 static const struct drm_crtc_helper_funcs sun4i_crtc_helper_funcs = {
        .atomic_begin   = sun4i_crtc_atomic_begin,
        .atomic_flush   = sun4i_crtc_atomic_flush,
+       .atomic_enable  = sun4i_crtc_atomic_enable,
        .disable        = sun4i_crtc_disable,
-       .enable         = sun4i_crtc_enable,
 };
 
 static int sun4i_crtc_enable_vblank(struct drm_crtc *crtc)
 
        pm_runtime_put_sync(dc->dev);
 }
 
-static void tegra_crtc_enable(struct drm_crtc *crtc)
+static void tegra_crtc_atomic_enable(struct drm_crtc *crtc,
+                                    struct drm_crtc_state *old_state)
 {
        struct drm_display_mode *mode = &crtc->state->adjusted_mode;
        struct tegra_dc_state *state = to_dc_state(crtc->state);
 
 static const struct drm_crtc_helper_funcs tegra_crtc_helper_funcs = {
        .disable = tegra_crtc_disable,
-       .enable = tegra_crtc_enable,
        .atomic_check = tegra_crtc_atomic_check,
        .atomic_begin = tegra_crtc_atomic_begin,
        .atomic_flush = tegra_crtc_atomic_flush,
+       .atomic_enable = tegra_crtc_atomic_enable,
 };
 
 static irqreturn_t tegra_dc_irq(int irq, void *data)
 
        mutex_unlock(&tilcdc_crtc->enable_lock);
 }
 
+static void tilcdc_crtc_atomic_enable(struct drm_crtc *crtc,
+                                     struct drm_crtc_state *old_state)
+{
+       tilcdc_crtc_enable(crtc);
+}
+
 static void tilcdc_crtc_off(struct drm_crtc *crtc, bool shutdown)
 {
        struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
 
 static const struct drm_crtc_helper_funcs tilcdc_crtc_helper_funcs = {
                .mode_fixup     = tilcdc_crtc_mode_fixup,
-               .enable         = tilcdc_crtc_enable,
                .disable        = tilcdc_crtc_disable,
                .atomic_check   = tilcdc_crtc_atomic_check,
+               .atomic_enable  = tilcdc_crtc_atomic_enable,
 };
 
 int tilcdc_crtc_max_width(struct drm_crtc *crtc)
 
        }
 }
 
-static void vc4_crtc_enable(struct drm_crtc *crtc)
+static void vc4_crtc_atomic_enable(struct drm_crtc *crtc,
+                                  struct drm_crtc_state *old_state)
 {
        struct drm_device *dev = crtc->dev;
        struct vc4_dev *vc4 = to_vc4_dev(dev);
 static const struct drm_crtc_helper_funcs vc4_crtc_helper_funcs = {
        .mode_set_nofb = vc4_crtc_mode_set_nofb,
        .disable = vc4_crtc_disable,
-       .enable = vc4_crtc_enable,
        .mode_valid = vc4_crtc_mode_valid,
        .atomic_check = vc4_crtc_atomic_check,
        .atomic_flush = vc4_crtc_atomic_flush,
+       .atomic_enable = vc4_crtc_atomic_enable,
 };
 
 static const struct vc4_crtc_data pv0_data = {
 
                                   crtc->mode.vdisplay, 0, 0);
 }
 
-static void virtio_gpu_crtc_enable(struct drm_crtc *crtc)
+static void virtio_gpu_crtc_atomic_enable(struct drm_crtc *crtc,
+                                         struct drm_crtc_state *old_state)
 {
 }
 
 }
 
 static const struct drm_crtc_helper_funcs virtio_gpu_crtc_helper_funcs = {
-       .enable        = virtio_gpu_crtc_enable,
        .disable       = virtio_gpu_crtc_disable,
        .mode_set_nofb = virtio_gpu_crtc_mode_set_nofb,
        .atomic_check  = virtio_gpu_crtc_atomic_check,
        .atomic_flush  = virtio_gpu_crtc_atomic_flush,
+       .atomic_enable = virtio_gpu_crtc_atomic_enable,
 };
 
 static void virtio_gpu_enc_mode_set(struct drm_encoder *encoder,
 
 }
 
 /**
- * vmw_ldu_crtc_helper_enable - Noop
+ * vmw_ldu_crtc_atomic_enable - Noop
  *
  * @crtc: CRTC associated with the new screen
  *
  * but since for LDU the display plane is closely tied to the
  * CRTC, it makes more sense to do those at plane update time.
  */
-static void vmw_ldu_crtc_helper_enable(struct drm_crtc *crtc)
+static void vmw_ldu_crtc_atomic_enable(struct drm_crtc *crtc,
+                                      struct drm_crtc_state *old_state)
 {
 }
 
 };
 
 static const struct drm_crtc_helper_funcs vmw_ldu_crtc_helper_funcs = {
-       .enable = vmw_ldu_crtc_helper_enable,
        .disable = vmw_ldu_crtc_helper_disable,
        .mode_set_nofb = vmw_ldu_crtc_mode_set_nofb,
        .atomic_check = vmw_du_crtc_atomic_check,
        .atomic_begin = vmw_du_crtc_atomic_begin,
        .atomic_flush = vmw_du_crtc_atomic_flush,
+       .atomic_enable = vmw_ldu_crtc_atomic_enable,
 };
 
 
 
 }
 
 /**
- * vmw_sou_crtc_helper_enable - Noop
+ * vmw_sou_crtc_atomic_enable - Noop
  *
  * @crtc: CRTC associated with the new screen
  *
  * This is called after a mode set has been completed.
  */
-static void vmw_sou_crtc_helper_enable(struct drm_crtc *crtc)
+static void vmw_sou_crtc_atomic_enable(struct drm_crtc *crtc,
+                                      struct drm_crtc_state *old_state)
 {
 }
 
 
 static const struct drm_crtc_helper_funcs vmw_sou_crtc_helper_funcs = {
        .prepare = vmw_sou_crtc_helper_prepare,
-       .enable = vmw_sou_crtc_helper_enable,
        .disable = vmw_sou_crtc_helper_disable,
        .mode_set_nofb = vmw_sou_crtc_mode_set_nofb,
        .atomic_check = vmw_du_crtc_atomic_check,
        .atomic_begin = vmw_du_crtc_atomic_begin,
        .atomic_flush = vmw_du_crtc_atomic_flush,
+       .atomic_enable = vmw_sou_crtc_atomic_enable,
 };
 
 
 
 }
 
 
-static void vmw_stdu_crtc_helper_enable(struct drm_crtc *crtc)
+static void vmw_stdu_crtc_atomic_enable(struct drm_crtc *crtc,
+                                       struct drm_crtc_state *old_state)
 {
        struct vmw_private *dev_priv;
        struct vmw_screen_target_display_unit *stdu;
 
 static const struct drm_crtc_helper_funcs vmw_stdu_crtc_helper_funcs = {
        .prepare = vmw_stdu_crtc_helper_prepare,
-       .enable = vmw_stdu_crtc_helper_enable,
        .disable = vmw_stdu_crtc_helper_disable,
        .mode_set_nofb = vmw_stdu_crtc_mode_set_nofb,
        .atomic_check = vmw_du_crtc_atomic_check,
        .atomic_begin = vmw_du_crtc_atomic_begin,
        .atomic_flush = vmw_du_crtc_atomic_flush,
+       .atomic_enable = vmw_stdu_crtc_atomic_enable,
 };
 
 
 
        zx_writel(zcrtc->chnreg + CHN_UPDATE, 1);
 }
 
-static void zx_crtc_enable(struct drm_crtc *crtc)
+static void zx_crtc_atomic_enable(struct drm_crtc *crtc,
+                                 struct drm_crtc_state *old_state)
 {
        struct drm_display_mode *mode = &crtc->state->adjusted_mode;
        bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
 }
 
 static const struct drm_crtc_helper_funcs zx_crtc_helper_funcs = {
-       .enable = zx_crtc_enable,
        .disable = zx_crtc_disable,
        .atomic_flush = zx_crtc_atomic_flush,
+       .atomic_enable = zx_crtc_atomic_enable,
 };
 
 static int zx_vou_enable_vblank(struct drm_crtc *crtc)
 
         * This callback is used by the legacy CRTC helpers.  Atomic helpers
         * also support using this hook for enabling and disabling a CRTC to
         * facilitate transitions to atomic, but it is deprecated. Instead
-        * @enable and @disable should be used.
+        * @atomic_enable and @atomic_disable should be used.
         */
        void (*dpms)(struct drm_crtc *crtc, int mode);
 
         *
         * This callback is used by the legacy CRTC helpers.  Atomic helpers
         * also support using this hook for disabling a CRTC to facilitate
-        * transitions to atomic, but it is deprecated. Instead @disable should
-        * be used.
+        * transitions to atomic, but it is deprecated. Instead @atomic_disable
+        * should be used.
         */
        void (*prepare)(struct drm_crtc *crtc);
 
         *
         * This callback is used by the legacy CRTC helpers.  Atomic helpers
         * also support using this hook for enabling a CRTC to facilitate
-        * transitions to atomic, but it is deprecated. Instead @enable should
-        * be used.
+        * transitions to atomic, but it is deprecated. Instead @atomic_enable
+        * should be used.
         */
        void (*commit)(struct drm_crtc *crtc);
 
         * pipeline is suspended using either DPMS or the new "ACTIVE" property.
         * Which means register values set in this callback might get reset when
         * the CRTC is suspended, but not restored.  Such drivers should instead
-        * move all their CRTC setup into the @enable callback.
+        * move all their CRTC setup into the @atomic_enable callback.
         *
         * This callback is optional.
         */
         * Atomic drivers don't need to implement it if there's no need to
         * disable anything at the CRTC level. To ensure that runtime PM
         * handling (using either DPMS or the new "ACTIVE" property) works
-        * @disable must be the inverse of @enable for atomic drivers.
+        * @disable must be the inverse of @atomic_enable for atomic drivers.
         * Atomic drivers should consider to use @atomic_disable instead of
         * this one.
         *
         */
        void (*disable)(struct drm_crtc *crtc);
 
-       /**
-        * @enable:
-        *
-        * This callback should be used to enable the CRTC. With the atomic
-        * drivers it is called before all encoders connected to this CRTC are
-        * enabled through the encoder's own &drm_encoder_helper_funcs.enable
-        * hook.  If that sequence is too simple drivers can just add their own
-        * hooks and call it from this CRTC callback here by looping over all
-        * encoders connected to it using for_each_encoder_on_crtc().
-        *
-        * This hook is used only by atomic helpers, for symmetry with @disable.
-        * Atomic drivers don't need to implement it if there's no need to
-        * enable anything at the CRTC level. To ensure that runtime PM handling
-        * (using either DPMS or the new "ACTIVE" property) works
-        * @enable must be the inverse of @disable for atomic drivers.
-        */
-       void (*enable)(struct drm_crtc *crtc);
-
        /**
         * @atomic_check:
         *
        void (*atomic_flush)(struct drm_crtc *crtc,
                             struct drm_crtc_state *old_crtc_state);
 
+       /**
+        * @atomic_enable:
+        *
+        * This callback should be used to enable the CRTC. With the atomic
+        * drivers it is called before all encoders connected to this CRTC are
+        * enabled through the encoder's own &drm_encoder_helper_funcs.enable
+        * hook.  If that sequence is too simple drivers can just add their own
+        * hooks and call it from this CRTC callback here by looping over all
+        * encoders connected to it using for_each_encoder_on_crtc().
+        *
+        * This hook is used only by atomic helpers, for symmetry with
+        * @atomic_disable. Atomic drivers don't need to implement it if there's
+        * no need to enable anything at the CRTC level. To ensure that runtime
+        * PM handling (using either DPMS or the new "ACTIVE" property) works
+        * @atomic_enable must be the inverse of @atomic_disable for atomic
+        * drivers.
+        *
+        * Drivers can use the @old_crtc_state input parameter if the operations
+        * needed to enable the CRTC don't depend solely on the new state but
+        * also on the transition between the old state and the new state.
+        */
+       void (*atomic_enable)(struct drm_crtc *crtc,
+                             struct drm_crtc_state *old_crtc_state);
+
        /**
         * @atomic_disable:
         *