return planes;
 }
 
+static void sun8i_mixer_mode_set(struct sunxi_engine *engine,
+                                const struct drm_display_mode *mode)
+{
+       struct sun8i_mixer *mixer = engine_to_sun8i_mixer(engine);
+       u32 bld_base, size, val;
+       bool interlaced;
+
+       bld_base = sun8i_blender_base(mixer);
+       interlaced = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
+       size = SUN8I_MIXER_SIZE(mode->hdisplay, mode->vdisplay);
+
+       DRM_DEBUG_DRIVER("Updating global size W: %u H: %u\n",
+                        mode->hdisplay, mode->vdisplay);
+
+       regmap_write(engine->regs, SUN8I_MIXER_GLOBAL_SIZE, size);
+       regmap_write(engine->regs, SUN8I_MIXER_BLEND_OUTSIZE(bld_base), size);
+
+       if (interlaced)
+               val = SUN8I_MIXER_BLEND_OUTCTL_INTERLACED;
+       else
+               val = 0;
+
+       regmap_update_bits(engine->regs, SUN8I_MIXER_BLEND_OUTCTL(bld_base),
+                          SUN8I_MIXER_BLEND_OUTCTL_INTERLACED, val);
+
+       DRM_DEBUG_DRIVER("Switching display mixer interlaced mode %s\n",
+                        interlaced ? "on" : "off");
+}
+
 static const struct sunxi_engine_ops sun8i_engine_ops = {
        .commit         = sun8i_mixer_commit,
        .layers_init    = sun8i_layers_init,
+       .mode_set       = sun8i_mixer_mode_set,
 };
 
 static const struct regmap_config sun8i_mixer_regmap_config = {
 
        insize = SUN8I_MIXER_SIZE(src_w, src_h);
        outsize = SUN8I_MIXER_SIZE(dst_w, dst_h);
 
-       if (plane->type == DRM_PLANE_TYPE_PRIMARY) {
-               bool interlaced = false;
-               u32 val;
-
-               DRM_DEBUG_DRIVER("Primary layer, updating global size W: %u H: %u\n",
-                                dst_w, dst_h);
-               regmap_write(mixer->engine.regs,
-                            SUN8I_MIXER_GLOBAL_SIZE,
-                            outsize);
-               regmap_write(mixer->engine.regs,
-                            SUN8I_MIXER_BLEND_OUTSIZE(bld_base), outsize);
-
-               if (state->crtc)
-                       interlaced = state->crtc->state->adjusted_mode.flags
-                               & DRM_MODE_FLAG_INTERLACE;
-
-               if (interlaced)
-                       val = SUN8I_MIXER_BLEND_OUTCTL_INTERLACED;
-               else
-                       val = 0;
-
-               regmap_update_bits(mixer->engine.regs,
-                                  SUN8I_MIXER_BLEND_OUTCTL(bld_base),
-                                  SUN8I_MIXER_BLEND_OUTCTL_INTERLACED,
-                                  val);
-
-               DRM_DEBUG_DRIVER("Switching display mixer interlaced mode %s\n",
-                                interlaced ? "on" : "off");
-       }
-
        /* Set height and width */
        DRM_DEBUG_DRIVER("Layer source offset X: %d Y: %d\n",
                         state->src.x1 >> 16, state->src.y1 >> 16);