.type = DRM_PLANE_TYPE_PRIMARY,
                .pixel_formats = mixer_formats,
                .num_pixel_formats = ARRAY_SIZE(mixer_formats),
-               .capabilities = EXYNOS_DRM_PLANE_CAP_DOUBLE,
+               .capabilities = EXYNOS_DRM_PLANE_CAP_DOUBLE |
+                               EXYNOS_DRM_PLANE_CAP_ZPOS,
        }, {
                .zpos = 1,
                .type = DRM_PLANE_TYPE_CURSOR,
                .pixel_formats = mixer_formats,
                .num_pixel_formats = ARRAY_SIZE(mixer_formats),
-               .capabilities = EXYNOS_DRM_PLANE_CAP_DOUBLE,
+               .capabilities = EXYNOS_DRM_PLANE_CAP_DOUBLE |
+                               EXYNOS_DRM_PLANE_CAP_ZPOS,
        }, {
                .zpos = 2,
                .type = DRM_PLANE_TYPE_OVERLAY,
                .pixel_formats = vp_formats,
                .num_pixel_formats = ARRAY_SIZE(vp_formats),
-               .capabilities = EXYNOS_DRM_PLANE_CAP_SCALE,
+               .capabilities = EXYNOS_DRM_PLANE_CAP_SCALE |
+                               EXYNOS_DRM_PLANE_CAP_ZPOS,
        },
 };
 
 }
 
 static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win,
-                               bool enable)
+                           unsigned int priority, bool enable)
 {
        struct mixer_resources *res = &ctx->mixer_res;
        u32 val = enable ? ~0 : 0;
        switch (win) {
        case 0:
                mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_GRP0_ENABLE);
+               mixer_reg_writemask(res, MXR_LAYER_CFG,
+                                   MXR_LAYER_CFG_GRP0_VAL(priority),
+                                   MXR_LAYER_CFG_GRP0_MASK);
                break;
        case 1:
                mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_GRP1_ENABLE);
+               mixer_reg_writemask(res, MXR_LAYER_CFG,
+                                   MXR_LAYER_CFG_GRP1_VAL(priority),
+                                   MXR_LAYER_CFG_GRP1_MASK);
                break;
        case 2:
                if (ctx->vp_enabled) {
                        vp_reg_writemask(res, VP_ENABLE, val, VP_ENABLE_ON);
                        mixer_reg_writemask(res, MXR_CFG, val,
                                MXR_CFG_VP_ENABLE);
+                       mixer_reg_writemask(res, MXR_LAYER_CFG,
+                                           MXR_LAYER_CFG_VP_VAL(priority),
+                                           MXR_LAYER_CFG_VP_MASK);
 
                        /* control blending of graphic layer 0 */
                        mixer_reg_writemask(res, MXR_GRAPHIC_CFG(0), val,
 
        mixer_cfg_scan(ctx, mode->vdisplay);
        mixer_cfg_rgb_fmt(ctx, mode->vdisplay);
-       mixer_cfg_layer(ctx, plane->index, true);
+       mixer_cfg_layer(ctx, plane->index, state->zpos + 1, true);
        mixer_run(ctx);
 
        mixer_vsync_set_update(ctx, true);
 
        mixer_cfg_scan(ctx, mode->vdisplay);
        mixer_cfg_rgb_fmt(ctx, mode->vdisplay);
-       mixer_cfg_layer(ctx, win, true);
+       mixer_cfg_layer(ctx, win, state->zpos + 1, true);
 
        /* layer update mandatory for mixer 16.0.33.0 */
        if (ctx->mxr_ver == MXR_VER_16_0_33_0 ||
        mixer_reg_writemask(res, MXR_STATUS, MXR_STATUS_16_BURST,
                MXR_STATUS_BURST_MASK);
 
-       /* setting default layer priority: layer1 > layer0 > video
-        * because typical usage scenario would be
-        * layer1 - OSD
-        * layer0 - framebuffer
-        * video - video overlay
-        */
-       val = MXR_LAYER_CFG_GRP1_VAL(3);
-       val |= MXR_LAYER_CFG_GRP0_VAL(2);
-       if (ctx->vp_enabled)
-               val |= MXR_LAYER_CFG_VP_VAL(1);
-       mixer_reg_write(res, MXR_LAYER_CFG, val);
+       /* reset default layer priority */
+       mixer_reg_write(res, MXR_LAYER_CFG, 0);
 
        /* setting background color */
        mixer_reg_write(res, MXR_BG_COLOR0, 0x008080);
        spin_lock_irqsave(&res->reg_slock, flags);
        mixer_vsync_set_update(mixer_ctx, false);
 
-       mixer_cfg_layer(mixer_ctx, plane->index, false);
+       mixer_cfg_layer(mixer_ctx, plane->index, 0, false);
 
        mixer_vsync_set_update(mixer_ctx, true);
        spin_unlock_irqrestore(&res->reg_slock, flags);