Hi,

On 02/04/2015 04:14 AM, Gustavo Padovan wrote:
> From: Gustavo Padovan <gustavo.padovan at collabora.co.uk>
> 
> struct {fimd,mixer,vidi}_win_data was just keeping the same data
> as struct exynos_drm_plane thus get ride of it and use exynos_drm_plane
> directly.
> 
> It changes how planes are created and remove .win_mode_set() callback
> that was only filling all *_win_data structs.
> 

I commented already on prior patch.

Thanks.

> Signed-off-by: Gustavo Padovan <gustavo.padovan at collabora.co.uk>
> ---
>  drivers/gpu/drm/exynos/exynos_drm_crtc.c  |   9 +-
>  drivers/gpu/drm/exynos/exynos_drm_crtc.h  |   1 +
>  drivers/gpu/drm/exynos/exynos_drm_drv.c   |  14 --
>  drivers/gpu/drm/exynos/exynos_drm_drv.h   |   5 +-
>  drivers/gpu/drm/exynos/exynos_drm_fimd.c  | 182 ++++++++++---------------
>  drivers/gpu/drm/exynos/exynos_drm_plane.c |  20 +--
>  drivers/gpu/drm/exynos/exynos_drm_plane.h |   6 +-
>  drivers/gpu/drm/exynos/exynos_drm_vidi.c  | 123 +++++------------
>  drivers/gpu/drm/exynos/exynos_mixer.c     | 212 
> +++++++++++-------------------
>  9 files changed, 183 insertions(+), 389 deletions(-)
> 
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c 
> b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> index ad675fb..d504f0b 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
> @@ -296,13 +296,13 @@ static void exynos_drm_crtc_attach_mode_property(struct 
> drm_crtc *crtc)
>  }
>  
>  struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev,
> +                                            struct drm_plane *plane,
>                                              int pipe,
>                                              enum exynos_drm_output_type type,
>                                              struct exynos_drm_crtc_ops *ops,
>                                              void *ctx)
>  {
>       struct exynos_drm_crtc *exynos_crtc;
> -     struct drm_plane *plane;
>       struct exynos_drm_private *private = drm_dev->dev_private;
>       struct drm_crtc *crtc;
>       int ret;
> @@ -318,12 +318,6 @@ struct exynos_drm_crtc *exynos_drm_crtc_create(struct 
> drm_device *drm_dev,
>       exynos_crtc->type = type;
>       exynos_crtc->ops = ops;
>       exynos_crtc->ctx = ctx;
> -     plane = exynos_plane_init(drm_dev, 1 << pipe,
> -                               DRM_PLANE_TYPE_PRIMARY);
> -     if (IS_ERR(plane)) {
> -             ret = PTR_ERR(plane);
> -             goto err_plane;
> -     }
>  
>       crtc = &exynos_crtc->base;
>  
> @@ -342,7 +336,6 @@ struct exynos_drm_crtc *exynos_drm_crtc_create(struct 
> drm_device *drm_dev,
>  
>  err_crtc:
>       plane->funcs->destroy(plane);
> -err_plane:
>       kfree(exynos_crtc);
>       return ERR_PTR(ret);
>  }
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.h 
> b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
> index 628b787..0ecd8fc 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.h
> @@ -18,6 +18,7 @@
>  #include "exynos_drm_drv.h"
>  
>  struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev,
> +                                            struct drm_plane *plane,
>                                              int pipe,
>                                              enum exynos_drm_output_type type,
>                                              struct exynos_drm_crtc_ops *ops,
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c 
> b/drivers/gpu/drm/exynos/exynos_drm_drv.c
> index 737164d..778c91e 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
> @@ -55,7 +55,6 @@ static int exynos_drm_load(struct drm_device *dev, unsigned 
> long flags)
>  {
>       struct exynos_drm_private *private;
>       int ret;
> -     int nr;
>  
>       private = kzalloc(sizeof(struct exynos_drm_private), GFP_KERNEL);
>       if (!private)
> @@ -80,19 +79,6 @@ static int exynos_drm_load(struct drm_device *dev, 
> unsigned long flags)
>  
>       exynos_drm_mode_config_init(dev);
>  
> -     for (nr = 0; nr < MAX_PLANE; nr++) {
> -             struct drm_plane *plane;
> -             unsigned long possible_crtcs = (1 << MAX_CRTC) - 1;
> -
> -             plane = exynos_plane_init(dev, possible_crtcs,
> -                                       DRM_PLANE_TYPE_OVERLAY);
> -             if (!IS_ERR(plane))
> -                     continue;
> -
> -             ret = PTR_ERR(plane);
> -             goto err_mode_config_cleanup;
> -     }
> -
>       /* setup possible_clones. */
>       exynos_drm_encoder_setup(dev);
>  
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h 
> b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> index 7411af2..cad54e7 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> @@ -78,6 +78,7 @@ enum exynos_drm_output_type {
>   * @transparency: transparency on or off.
>   * @activated: activated or not.
>   * @enabled: enabled or not.
> + * @resume: to resume or not.
>   *
>   * this structure is common to exynos SoC and its contents would be copied
>   * to hardware specific overlay info.
> @@ -112,6 +113,7 @@ struct exynos_drm_plane {
>       bool transparency:1;
>       bool activated:1;
>       bool enabled:1;
> +     bool resume:1;
>  };
>  
>  /*
> @@ -172,7 +174,6 @@ struct exynos_drm_display {
>   * @disable_vblank: specific driver callback for disabling vblank interrupt.
>   * @wait_for_vblank: wait for vblank interrupt to make sure that
>   *   hardware overlay is updated.
> - * @win_mode_set: copy drm overlay info to hw specific overlay info.
>   * @win_commit: apply hardware specific overlay data to registers.
>   * @win_enable: enable hardware specific overlay.
>   * @win_disable: disable hardware specific overlay.
> @@ -189,8 +190,6 @@ struct exynos_drm_crtc_ops {
>       int (*enable_vblank)(struct exynos_drm_crtc *crtc);
>       void (*disable_vblank)(struct exynos_drm_crtc *crtc);
>       void (*wait_for_vblank)(struct exynos_drm_crtc *crtc);
> -     void (*win_mode_set)(struct exynos_drm_crtc *crtc,
> -                             struct exynos_drm_plane *plane);
>       void (*win_commit)(struct exynos_drm_crtc *crtc, int zpos);
>       void (*win_enable)(struct exynos_drm_crtc *crtc, int zpos);
>       void (*win_disable)(struct exynos_drm_crtc *crtc, int zpos);
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
> b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> index 925fc69..ebb4cdc 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> @@ -31,6 +31,7 @@
>  #include "exynos_drm_drv.h"
>  #include "exynos_drm_fbdev.h"
>  #include "exynos_drm_crtc.h"
> +#include "exynos_drm_plane.h"
>  #include "exynos_drm_iommu.h"
>  
>  /*
> @@ -140,31 +141,15 @@ static struct fimd_driver_data exynos5_fimd_driver_data 
> = {
>       .has_vtsel = 1,
>  };
>  
> -struct fimd_win_data {
> -     unsigned int            offset_x;
> -     unsigned int            offset_y;
> -     unsigned int            ovl_width;
> -     unsigned int            ovl_height;
> -     unsigned int            fb_width;
> -     unsigned int            fb_height;
> -     unsigned int            bpp;
> -     unsigned int            pixel_format;
> -     dma_addr_t              dma_addr;
> -     unsigned int            buf_offsize;
> -     unsigned int            line_size;      /* bytes */
> -     bool                    enabled;
> -     bool                    resume;
> -};
> -
>  struct fimd_context {
>       struct device                   *dev;
>       struct drm_device               *drm_dev;
>       struct exynos_drm_crtc          *crtc;
> +     struct exynos_drm_plane         planes[WINDOWS_NR];
>       struct clk                      *bus_clk;
>       struct clk                      *lcd_clk;
>       void __iomem                    *regs;
>       struct regmap                   *sysreg;
> -     struct fimd_win_data            win_data[WINDOWS_NR];
>       unsigned int                    default_win;
>       unsigned long                   irq_flags;
>       u32                             vidcon0;
> @@ -506,58 +491,9 @@ static void fimd_disable_vblank(struct exynos_drm_crtc 
> *crtc)
>       }
>  }
>  
> -static void fimd_win_mode_set(struct exynos_drm_crtc *crtc,
> -                     struct exynos_drm_plane *plane)
> -{
> -     struct fimd_context *ctx = crtc->ctx;
> -     struct fimd_win_data *win_data;
> -     int win;
> -     unsigned long offset;
> -
> -     if (!plane) {
> -             DRM_ERROR("plane is NULL\n");
> -             return;
> -     }
> -
> -     win = plane->zpos;
> -     if (win == DEFAULT_ZPOS)
> -             win = ctx->default_win;
> -
> -     if (win < 0 || win >= WINDOWS_NR)
> -             return;
> -
> -     offset = plane->fb_x * (plane->bpp >> 3);
> -     offset += plane->fb_y * plane->pitch;
> -
> -     DRM_DEBUG_KMS("offset = 0x%lx, pitch = %x\n", offset, plane->pitch);
> -
> -     win_data = &ctx->win_data[win];
> -
> -     win_data->offset_x = plane->crtc_x;
> -     win_data->offset_y = plane->crtc_y;
> -     win_data->ovl_width = plane->crtc_width;
> -     win_data->ovl_height = plane->crtc_height;
> -     win_data->fb_width = plane->fb_width;
> -     win_data->fb_height = plane->fb_height;
> -     win_data->dma_addr = plane->dma_addr[0] + offset;
> -     win_data->bpp = plane->bpp;
> -     win_data->pixel_format = plane->pixel_format;
> -     win_data->buf_offsize = (plane->fb_width - plane->crtc_width) *
> -                             (plane->bpp >> 3);
> -     win_data->line_size = plane->crtc_width * (plane->bpp >> 3);
> -
> -     DRM_DEBUG_KMS("offset_x = %d, offset_y = %d\n",
> -                     win_data->offset_x, win_data->offset_y);
> -     DRM_DEBUG_KMS("ovl_width = %d, ovl_height = %d\n",
> -                     win_data->ovl_width, win_data->ovl_height);
> -     DRM_DEBUG_KMS("paddr = 0x%lx\n", (unsigned long)win_data->dma_addr);
> -     DRM_DEBUG_KMS("fb_width = %d, crtc_width = %d\n",
> -                     plane->fb_width, plane->crtc_width);
> -}
> -
>  static void fimd_win_set_pixfmt(struct fimd_context *ctx, unsigned int win)
>  {
> -     struct fimd_win_data *win_data = &ctx->win_data[win];
> +     struct exynos_drm_plane *plane = &ctx->planes[win];
>       unsigned long val;
>  
>       val = WINCONx_ENWIN;
> @@ -567,11 +503,11 @@ static void fimd_win_set_pixfmt(struct fimd_context 
> *ctx, unsigned int win)
>        * So the request format is ARGB8888 then change it to XRGB8888.
>        */
>       if (ctx->driver_data->has_limited_fmt && !win) {
> -             if (win_data->pixel_format == DRM_FORMAT_ARGB8888)
> -                     win_data->pixel_format = DRM_FORMAT_XRGB8888;
> +             if (plane->pixel_format == DRM_FORMAT_ARGB8888)
> +                     plane->pixel_format = DRM_FORMAT_XRGB8888;
>       }
>  
> -     switch (win_data->pixel_format) {
> +     switch (plane->pixel_format) {
>       case DRM_FORMAT_C8:
>               val |= WINCON0_BPPMODE_8BPP_PALETTE;
>               val |= WINCONx_BURSTLEN_8WORD;
> @@ -607,7 +543,7 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, 
> unsigned int win)
>               break;
>       }
>  
> -     DRM_DEBUG_KMS("bpp = %d\n", win_data->bpp);
> +     DRM_DEBUG_KMS("bpp = %d\n", plane->bpp);
>  
>       /*
>        * In case of exynos, setting dma-burst to 16Word causes permanent
> @@ -617,7 +553,7 @@ static void fimd_win_set_pixfmt(struct fimd_context *ctx, 
> unsigned int win)
>        * movement causes unstable DMA which results into iommu crash/tear.
>        */
>  
> -     if (win_data->fb_width < MIN_FB_WIDTH_FOR_16WORD_BURST) {
> +     if (plane->fb_width < MIN_FB_WIDTH_FOR_16WORD_BURST) {
>               val &= ~WINCONx_BURSTLEN_MASK;
>               val |= WINCONx_BURSTLEN_4WORD;
>       }
> @@ -668,11 +604,11 @@ static void fimd_shadow_protect_win(struct fimd_context 
> *ctx,
>  static void fimd_win_commit(struct exynos_drm_crtc *crtc, int zpos)
>  {
>       struct fimd_context *ctx = crtc->ctx;
> -     struct fimd_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       int win = zpos;
> -     unsigned long val, alpha, size;
> -     unsigned int last_x;
> -     unsigned int last_y;
> +     dma_addr_t dma_addr;
> +     unsigned long val, alpha, size, offset;
> +     unsigned int last_x, last_y, buf_offsize, line_size;
>  
>       if (ctx->suspended)
>               return;
> @@ -683,11 +619,11 @@ static void fimd_win_commit(struct exynos_drm_crtc 
> *crtc, int zpos)
>       if (win < 0 || win >= WINDOWS_NR)
>               return;
>  
> -     win_data = &ctx->win_data[win];
> +     plane = &ctx->planes[win];
>  
>       /* If suspended, enable this on resume */
>       if (ctx->suspended) {
> -             win_data->resume = true;
> +             plane->resume = true;
>               return;
>       }
>  
> @@ -704,38 +640,45 @@ static void fimd_win_commit(struct exynos_drm_crtc 
> *crtc, int zpos)
>       /* protect windows */
>       fimd_shadow_protect_win(ctx, win, true);
>  
> +
> +     offset = plane->fb_x * (plane->bpp >> 3);
> +     offset += plane->fb_y * plane->pitch;
> +
>       /* buffer start address */
> -     val = (unsigned long)win_data->dma_addr;
> +     dma_addr = plane->dma_addr[0] + offset;
> +     val = (unsigned long)dma_addr;
>       writel(val, ctx->regs + VIDWx_BUF_START(win, 0));
>  
>       /* buffer end address */
> -     size = win_data->fb_width * win_data->ovl_height * (win_data->bpp >> 3);
> -     val = (unsigned long)(win_data->dma_addr + size);
> +     size = plane->fb_width * plane->crtc_height * (plane->bpp >> 3);
> +     val = (unsigned long)(dma_addr + size);
>       writel(val, ctx->regs + VIDWx_BUF_END(win, 0));
>  
>       DRM_DEBUG_KMS("start addr = 0x%lx, end addr = 0x%lx, size = 0x%lx\n",
> -                     (unsigned long)win_data->dma_addr, val, size);
> +                     (unsigned long)dma_addr, val, size);
>       DRM_DEBUG_KMS("ovl_width = %d, ovl_height = %d\n",
> -                     win_data->ovl_width, win_data->ovl_height);
> +                     plane->crtc_width, plane->crtc_height);
>  
>       /* buffer size */
> -     val = VIDW_BUF_SIZE_OFFSET(win_data->buf_offsize) |
> -             VIDW_BUF_SIZE_PAGEWIDTH(win_data->line_size) |
> -             VIDW_BUF_SIZE_OFFSET_E(win_data->buf_offsize) |
> -             VIDW_BUF_SIZE_PAGEWIDTH_E(win_data->line_size);
> +     buf_offsize = (plane->fb_width - plane->crtc_width) * (plane->bpp >> 3);
> +     line_size = plane->crtc_width * (plane->bpp >> 3);
> +     val = VIDW_BUF_SIZE_OFFSET(buf_offsize) |
> +             VIDW_BUF_SIZE_PAGEWIDTH(line_size) |
> +             VIDW_BUF_SIZE_OFFSET_E(buf_offsize) |
> +             VIDW_BUF_SIZE_PAGEWIDTH_E(line_size);
>       writel(val, ctx->regs + VIDWx_BUF_SIZE(win, 0));
>  
>       /* OSD position */
> -     val = VIDOSDxA_TOPLEFT_X(win_data->offset_x) |
> -             VIDOSDxA_TOPLEFT_Y(win_data->offset_y) |
> -             VIDOSDxA_TOPLEFT_X_E(win_data->offset_x) |
> -             VIDOSDxA_TOPLEFT_Y_E(win_data->offset_y);
> +     val = VIDOSDxA_TOPLEFT_X(plane->crtc_x) |
> +             VIDOSDxA_TOPLEFT_Y(plane->crtc_y) |
> +             VIDOSDxA_TOPLEFT_X_E(plane->crtc_x) |
> +             VIDOSDxA_TOPLEFT_Y_E(plane->crtc_y);
>       writel(val, ctx->regs + VIDOSD_A(win));
>  
> -     last_x = win_data->offset_x + win_data->ovl_width;
> +     last_x = plane->crtc_x + plane->crtc_width;
>       if (last_x)
>               last_x--;
> -     last_y = win_data->offset_y + win_data->ovl_height;
> +     last_y = plane->crtc_y + plane->crtc_height;
>       if (last_y)
>               last_y--;
>  
> @@ -745,7 +688,7 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, 
> int zpos)
>       writel(val, ctx->regs + VIDOSD_B(win));
>  
>       DRM_DEBUG_KMS("osd pos: tx = %d, ty = %d, bx = %d, by = %d\n",
> -                     win_data->offset_x, win_data->offset_y, last_x, last_y);
> +                     plane->crtc_x, plane->crtc_y, last_x, last_y);
>  
>       /* hardware window 0 doesn't support alpha channel. */
>       if (win != 0) {
> @@ -762,7 +705,7 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, 
> int zpos)
>               u32 offset = VIDOSD_D(win);
>               if (win == 0)
>                       offset = VIDOSD_C(win);
> -             val = win_data->ovl_width * win_data->ovl_height;
> +             val = plane->crtc_width * plane->crtc_height;
>               writel(val, ctx->regs + offset);
>  
>               DRM_DEBUG_KMS("osd size = 0x%x\n", (unsigned int)val);
> @@ -782,7 +725,7 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, 
> int zpos)
>       /* Enable DMA channel and unprotect windows */
>       fimd_shadow_protect_win(ctx, win, false);
>  
> -     win_data->enabled = true;
> +     plane->enabled = true;
>  
>       if (ctx->i80_if)
>               atomic_set(&ctx->win_updated, 1);
> @@ -791,7 +734,7 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, 
> int zpos)
>  static void fimd_win_disable(struct exynos_drm_crtc *crtc, int zpos)
>  {
>       struct fimd_context *ctx = crtc->ctx;
> -     struct fimd_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       int win = zpos;
>  
>       if (win == DEFAULT_ZPOS)
> @@ -800,11 +743,11 @@ static void fimd_win_disable(struct exynos_drm_crtc 
> *crtc, int zpos)
>       if (win < 0 || win >= WINDOWS_NR)
>               return;
>  
> -     win_data = &ctx->win_data[win];
> +     plane = &ctx->planes[win];
>  
>       if (ctx->suspended) {
>               /* do not resume this window*/
> -             win_data->resume = false;
> +             plane->resume = false;
>               return;
>       }
>  
> @@ -819,42 +762,42 @@ static void fimd_win_disable(struct exynos_drm_crtc 
> *crtc, int zpos)
>       /* unprotect windows */
>       fimd_shadow_protect_win(ctx, win, false);
>  
> -     win_data->enabled = false;
> +     plane->enabled = false;
>  }
>  
>  static void fimd_window_suspend(struct fimd_context *ctx)
>  {
> -     struct fimd_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       int i;
>  
>       for (i = 0; i < WINDOWS_NR; i++) {
> -             win_data = &ctx->win_data[i];
> -             win_data->resume = win_data->enabled;
> -             if (win_data->enabled)
> +             plane = &ctx->planes[i];
> +             plane->resume = plane->enabled;
> +             if (plane->enabled)
>                       fimd_win_disable(ctx->crtc, i);
>       }
>  }
>  
>  static void fimd_window_resume(struct fimd_context *ctx)
>  {
> -     struct fimd_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       int i;
>  
>       for (i = 0; i < WINDOWS_NR; i++) {
> -             win_data = &ctx->win_data[i];
> -             win_data->enabled = win_data->resume;
> -             win_data->resume = false;
> +             plane = &ctx->planes[i];
> +             plane->enabled = plane->resume;
> +             plane->resume = false;
>       }
>  }
>  
>  static void fimd_apply(struct fimd_context *ctx)
>  {
> -     struct fimd_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       int i;
>  
>       for (i = 0; i < WINDOWS_NR; i++) {
> -             win_data = &ctx->win_data[i];
> -             if (win_data->enabled)
> +             plane = &ctx->planes[i];
> +             if (plane->enabled)
>                       fimd_win_commit(ctx->crtc, i);
>               else
>                       fimd_win_disable(ctx->crtc, i);
> @@ -1011,7 +954,6 @@ static struct exynos_drm_crtc_ops fimd_crtc_ops = {
>       .enable_vblank = fimd_enable_vblank,
>       .disable_vblank = fimd_disable_vblank,
>       .wait_for_vblank = fimd_wait_for_vblank,
> -     .win_mode_set = fimd_win_mode_set,
>       .win_commit = fimd_win_commit,
>       .win_disable = fimd_win_disable,
>       .te_handler = fimd_te_handler,
> @@ -1056,7 +998,16 @@ static int fimd_bind(struct device *dev, struct device 
> *master, void *data)
>  {
>       struct fimd_context *ctx = dev_get_drvdata(dev);
>       struct drm_device *drm_dev = data;
> -     int ret;
> +     struct exynos_drm_plane *exynos_plane;
> +     enum drm_plane_type type;
> +     int i, ret;
> +
> +     for (i = 0; i < WINDOWS_NR; i++) {
> +             type = (i == ctx->default_win) ? DRM_PLANE_TYPE_PRIMARY :
> +                                             DRM_PLANE_TYPE_OVERLAY;
> +             exynos_plane_init(drm_dev, &ctx->planes[i], 1 << ctx->pipe,
> +                               type);
> +     }
>  
>       ret = fimd_ctx_initialize(ctx, drm_dev);
>       if (ret) {
> @@ -1064,8 +1015,9 @@ static int fimd_bind(struct device *dev, struct device 
> *master, void *data)
>               return ret;
>       }
>  
> -     ctx->crtc = exynos_drm_crtc_create(drm_dev, ctx->pipe,
> -                                        EXYNOS_DISPLAY_TYPE_LCD,
> +     exynos_plane = &ctx->planes[ctx->default_win];
> +     ctx->crtc = exynos_drm_crtc_create(drm_dev, &exynos_plane->base,
> +                                        ctx->pipe, EXYNOS_DISPLAY_TYPE_LCD,
>                                          &fimd_crtc_ops, ctx);
>       if (IS_ERR(ctx->crtc)) {
>               fimd_ctx_remove(ctx);
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c 
> b/drivers/gpu/drm/exynos/exynos_drm_plane.c
> index 358cff6..dc13621 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_plane.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c
> @@ -93,7 +93,6 @@ void exynos_plane_mode_set(struct drm_plane *plane, struct 
> drm_crtc *crtc,
>                         uint32_t src_w, uint32_t src_h)
>  {
>       struct exynos_drm_plane *exynos_plane = to_exynos_plane(plane);
> -     struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
>       unsigned int actual_w;
>       unsigned int actual_h;
>  
> @@ -140,9 +139,6 @@ void exynos_plane_mode_set(struct drm_plane *plane, 
> struct drm_crtc *crtc,
>                       exynos_plane->crtc_width, exynos_plane->crtc_height);
>  
>       plane->crtc = crtc;
> -
> -     if (exynos_crtc->ops->win_mode_set)
> -             exynos_crtc->ops->win_mode_set(exynos_crtc, exynos_plane);
>  }
>  
>  void exynos_plane_dpms(struct drm_plane *plane, int mode)
> @@ -255,24 +251,18 @@ static void exynos_plane_attach_zpos_property(struct 
> drm_plane *plane)
>       drm_object_attach_property(&plane->base, prop, 0);
>  }
>  
> -struct drm_plane *exynos_plane_init(struct drm_device *dev,
> -                                 unsigned long possible_crtcs,
> -                                 enum drm_plane_type type)
> +int exynos_plane_init(struct drm_device *dev,
> +                   struct exynos_drm_plane *exynos_plane,
> +                   unsigned long possible_crtcs, enum drm_plane_type type)
>  {
> -     struct exynos_drm_plane *exynos_plane;
>       int err;
>  
> -     exynos_plane = kzalloc(sizeof(struct exynos_drm_plane), GFP_KERNEL);
> -     if (!exynos_plane)
> -             return ERR_PTR(-ENOMEM);
> -
>       err = drm_universal_plane_init(dev, &exynos_plane->base, possible_crtcs,
>                                      &exynos_plane_funcs, formats,
>                                      ARRAY_SIZE(formats), type);
>       if (err) {
>               DRM_ERROR("failed to initialize plane\n");
> -             kfree(exynos_plane);
> -             return ERR_PTR(err);
> +             return err;
>       }
>  
>       if (type == DRM_PLANE_TYPE_PRIMARY)
> @@ -280,5 +270,5 @@ struct drm_plane *exynos_plane_init(struct drm_device 
> *dev,
>       else
>               exynos_plane_attach_zpos_property(&exynos_plane->base);
>  
> -     return &exynos_plane->base;
> +     return 0;
>  }
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.h 
> b/drivers/gpu/drm/exynos/exynos_drm_plane.h
> index 59d4075..100ca5e 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_plane.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.h
> @@ -21,6 +21,6 @@ int exynos_update_plane(struct drm_plane *plane, struct 
> drm_crtc *crtc,
>                       uint32_t src_x, uint32_t src_y,
>                       uint32_t src_w, uint32_t src_h);
>  void exynos_plane_dpms(struct drm_plane *plane, int mode);
> -struct drm_plane *exynos_plane_init(struct drm_device *dev,
> -                                 unsigned long possible_crtcs,
> -                                 enum drm_plane_type type);
> +int exynos_plane_init(struct drm_device *dev,
> +                   struct exynos_drm_plane *exynos_plane,
> +                   unsigned long possible_crtcs, enum drm_plane_type type);
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c 
> b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> index b886972..08c7a1e 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
> @@ -23,6 +23,7 @@
>  
>  #include "exynos_drm_drv.h"
>  #include "exynos_drm_crtc.h"
> +#include "exynos_drm_plane.h"
>  #include "exynos_drm_encoder.h"
>  #include "exynos_drm_vidi.h"
>  
> @@ -32,20 +33,6 @@
>  #define ctx_from_connector(c)        container_of(c, struct vidi_context, \
>                                       connector)
>  
> -struct vidi_win_data {
> -     unsigned int            offset_x;
> -     unsigned int            offset_y;
> -     unsigned int            ovl_width;
> -     unsigned int            ovl_height;
> -     unsigned int            fb_width;
> -     unsigned int            fb_height;
> -     unsigned int            bpp;
> -     dma_addr_t              dma_addr;
> -     unsigned int            buf_offsize;
> -     unsigned int            line_size;      /* bytes */
> -     bool                    enabled;
> -};
> -
>  struct vidi_context {
>       struct exynos_drm_display       display;
>       struct platform_device          *pdev;
> @@ -53,7 +40,7 @@ struct vidi_context {
>       struct exynos_drm_crtc          *crtc;
>       struct drm_encoder              *encoder;
>       struct drm_connector            connector;
> -     struct vidi_win_data            win_data[WINDOWS_NR];
> +     struct exynos_drm_plane         planes[WINDOWS_NR];
>       struct edid                     *raw_edid;
>       unsigned int                    clkdiv;
>       unsigned int                    default_win;
> @@ -97,19 +84,6 @@ static const char fake_edid_info[] = {
>       0x00, 0x00, 0x00, 0x06
>  };
>  
> -static void vidi_apply(struct vidi_context *ctx)
> -{
> -     struct exynos_drm_crtc_ops *crtc_ops = ctx->crtc->ops;
> -     struct vidi_win_data *win_data;
> -     int i;
> -
> -     for (i = 0; i < WINDOWS_NR; i++) {
> -             win_data = &ctx->win_data[i];
> -             if (win_data->enabled && (crtc_ops && crtc_ops->win_commit))
> -                     crtc_ops->win_commit(ctx->crtc, i);
> -     }
> -}
> -
>  static int vidi_enable_vblank(struct exynos_drm_crtc *crtc)
>  {
>       struct vidi_context *ctx = crtc->ctx;
> @@ -143,63 +117,10 @@ static void vidi_disable_vblank(struct exynos_drm_crtc 
> *crtc)
>               ctx->vblank_on = false;
>  }
>  
> -static void vidi_win_mode_set(struct exynos_drm_crtc *crtc,
> -                     struct exynos_drm_plane *plane)
> -{
> -     struct vidi_context *ctx = crtc->ctx;
> -     struct vidi_win_data *win_data;
> -     int win;
> -     unsigned long offset;
> -
> -     if (!plane) {
> -             DRM_ERROR("plane is NULL\n");
> -             return;
> -     }
> -
> -     win = plane->zpos;
> -     if (win == DEFAULT_ZPOS)
> -             win = ctx->default_win;
> -
> -     if (win < 0 || win >= WINDOWS_NR)
> -             return;
> -
> -     offset = plane->fb_x * (plane->bpp >> 3);
> -     offset += plane->fb_y * plane->pitch;
> -
> -     DRM_DEBUG_KMS("offset = 0x%lx, pitch = %x\n", offset, plane->pitch);
> -
> -     win_data = &ctx->win_data[win];
> -
> -     win_data->offset_x = plane->crtc_x;
> -     win_data->offset_y = plane->crtc_y;
> -     win_data->ovl_width = plane->crtc_width;
> -     win_data->ovl_height = plane->crtc_height;
> -     win_data->fb_width = plane->fb_width;
> -     win_data->fb_height = plane->fb_height;
> -     win_data->dma_addr = plane->dma_addr[0] + offset;
> -     win_data->bpp = plane->bpp;
> -     win_data->buf_offsize = (plane->fb_width - plane->crtc_width) *
> -                             (plane->bpp >> 3);
> -     win_data->line_size = plane->crtc_width * (plane->bpp >> 3);
> -
> -     /*
> -      * some parts of win_data should be transferred to user side
> -      * through specific ioctl.
> -      */
> -
> -     DRM_DEBUG_KMS("offset_x = %d, offset_y = %d\n",
> -                     win_data->offset_x, win_data->offset_y);
> -     DRM_DEBUG_KMS("ovl_width = %d, ovl_height = %d\n",
> -                     win_data->ovl_width, win_data->ovl_height);
> -     DRM_DEBUG_KMS("paddr = 0x%lx\n", (unsigned long)win_data->dma_addr);
> -     DRM_DEBUG_KMS("fb_width = %d, crtc_width = %d\n",
> -                     plane->fb_width, plane->crtc_width);
> -}
> -
>  static void vidi_win_commit(struct exynos_drm_crtc *crtc, int zpos)
>  {
>       struct vidi_context *ctx = crtc->ctx;
> -     struct vidi_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       int win = zpos;
>  
>       if (ctx->suspended)
> @@ -211,11 +132,11 @@ static void vidi_win_commit(struct exynos_drm_crtc 
> *crtc, int zpos)
>       if (win < 0 || win >= WINDOWS_NR)
>               return;
>  
> -     win_data = &ctx->win_data[win];
> +     plane = &ctx->planes[win];
>  
> -     win_data->enabled = true;
> +     plane->enabled = true;
>  
> -     DRM_DEBUG_KMS("dma_addr = %pad\n", &win_data->dma_addr);
> +     DRM_DEBUG_KMS("dma_addr = %pad\n", plane->dma_addr);
>  
>       if (ctx->vblank_on)
>               schedule_work(&ctx->work);
> @@ -224,7 +145,7 @@ static void vidi_win_commit(struct exynos_drm_crtc *crtc, 
> int zpos)
>  static void vidi_win_disable(struct exynos_drm_crtc *crtc, int zpos)
>  {
>       struct vidi_context *ctx = crtc->ctx;
> -     struct vidi_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       int win = zpos;
>  
>       if (win == DEFAULT_ZPOS)
> @@ -233,14 +154,17 @@ static void vidi_win_disable(struct exynos_drm_crtc 
> *crtc, int zpos)
>       if (win < 0 || win >= WINDOWS_NR)
>               return;
>  
> -     win_data = &ctx->win_data[win];
> -     win_data->enabled = false;
> +     plane = &ctx->planes[win];
> +     plane->enabled = false;
>  
>       /* TODO. */
>  }
>  
>  static int vidi_power_on(struct vidi_context *ctx, bool enable)
>  {
> +     struct exynos_drm_plane *plane;
> +     int i;
> +
>       DRM_DEBUG_KMS("%s\n", __FILE__);
>  
>       if (enable != false && enable != true)
> @@ -253,7 +177,11 @@ static int vidi_power_on(struct vidi_context *ctx, bool 
> enable)
>               if (test_and_clear_bit(0, &ctx->irq_flags))
>                       vidi_enable_vblank(ctx->crtc);
>  
> -             vidi_apply(ctx);
> +             for (i = 0; i < WINDOWS_NR; i++) {
> +                     plane = &ctx->planes[i];
> +                     if (plane->enabled)
> +                             vidi_win_commit(ctx->crtc, i);
> +             }
>       } else {
>               ctx->suspended = true;
>       }
> @@ -301,7 +229,6 @@ static struct exynos_drm_crtc_ops vidi_crtc_ops = {
>       .dpms = vidi_dpms,
>       .enable_vblank = vidi_enable_vblank,
>       .disable_vblank = vidi_disable_vblank,
> -     .win_mode_set = vidi_win_mode_set,
>       .win_commit = vidi_win_commit,
>       .win_disable = vidi_win_disable,
>  };
> @@ -543,12 +470,22 @@ static int vidi_bind(struct device *dev, struct device 
> *master, void *data)
>  {
>       struct vidi_context *ctx = dev_get_drvdata(dev);
>       struct drm_device *drm_dev = data;
> -     int ret;
> +     struct exynos_drm_plane *exynos_plane;
> +     enum drm_plane_type type;
> +     int i, ret;
> +
> +     for (i = 0; i < WINDOWS_NR; i++) {
> +             type = (i == ctx->default_win) ? DRM_PLANE_TYPE_PRIMARY :
> +                                             DRM_PLANE_TYPE_OVERLAY;
> +             exynos_plane_init(drm_dev, &ctx->planes[i], 1 << ctx->pipe,
> +                               type);
> +     }
>  
>       vidi_ctx_initialize(ctx, drm_dev);
>  
> -     ctx->crtc = exynos_drm_crtc_create(drm_dev, ctx->pipe,
> -                                        EXYNOS_DISPLAY_TYPE_VIDI,
> +     exynos_plane = &ctx->planes[ctx->default_win];
> +     ctx->crtc = exynos_drm_crtc_create(drm_dev, &exynos_plane->base,
> +                                        ctx->pipe, EXYNOS_DISPLAY_TYPE_VIDI,
>                                          &vidi_crtc_ops, ctx);
>       if (IS_ERR(ctx->crtc)) {
>               DRM_ERROR("failed to create crtc.\n");
> diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c 
> b/drivers/gpu/drm/exynos/exynos_mixer.c
> index 736269a..d6864e6 100644
> --- a/drivers/gpu/drm/exynos/exynos_mixer.c
> +++ b/drivers/gpu/drm/exynos/exynos_mixer.c
> @@ -37,34 +37,13 @@
>  
>  #include "exynos_drm_drv.h"
>  #include "exynos_drm_crtc.h"
> +#include "exynos_drm_plane.h"
>  #include "exynos_drm_iommu.h"
>  #include "exynos_mixer.h"
>  
>  #define MIXER_WIN_NR         3
>  #define MIXER_DEFAULT_WIN    0
>  
> -struct hdmi_win_data {
> -     dma_addr_t              dma_addr;
> -     dma_addr_t              chroma_dma_addr;
> -     uint32_t                pixel_format;
> -     unsigned int            bpp;
> -     unsigned int            crtc_x;
> -     unsigned int            crtc_y;
> -     unsigned int            crtc_width;
> -     unsigned int            crtc_height;
> -     unsigned int            fb_x;
> -     unsigned int            fb_y;
> -     unsigned int            fb_width;
> -     unsigned int            fb_height;
> -     unsigned int            src_width;
> -     unsigned int            src_height;
> -     unsigned int            mode_width;
> -     unsigned int            mode_height;
> -     unsigned int            scan_flags;
> -     bool                    enabled;
> -     bool                    resume;
> -};
> -
>  struct mixer_resources {
>       int                     irq;
>       void __iomem            *mixer_regs;
> @@ -88,6 +67,7 @@ struct mixer_context {
>       struct device           *dev;
>       struct drm_device       *drm_dev;
>       struct exynos_drm_crtc  *crtc;
> +     struct exynos_drm_plane planes[MIXER_WIN_NR];
>       int                     pipe;
>       bool                    interlace;
>       bool                    powered;
> @@ -97,7 +77,6 @@ struct mixer_context {
>  
>       struct mutex            mixer_mutex;
>       struct mixer_resources  mixer_res;
> -     struct hdmi_win_data    win_data[MIXER_WIN_NR];
>       enum mixer_version_id   mxr_ver;
>       wait_queue_head_t       wait_vsync_queue;
>       atomic_t                wait_vsync_event;
> @@ -401,7 +380,7 @@ static void vp_video_buffer(struct mixer_context *ctx, 
> int win)
>  {
>       struct mixer_resources *res = &ctx->mixer_res;
>       unsigned long flags;
> -     struct hdmi_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       unsigned int x_ratio, y_ratio;
>       unsigned int buf_num = 1;
>       dma_addr_t luma_addr[2], chroma_addr[2];
> @@ -409,9 +388,9 @@ static void vp_video_buffer(struct mixer_context *ctx, 
> int win)
>       bool crcb_mode = false;
>       u32 val;
>  
> -     win_data = &ctx->win_data[win];
> +     plane = &ctx->planes[win];
>  
> -     switch (win_data->pixel_format) {
> +     switch (plane->pixel_format) {
>       case DRM_FORMAT_NV12MT:
>               tiled_mode = true;
>       case DRM_FORMAT_NV12:
> @@ -421,35 +400,35 @@ static void vp_video_buffer(struct mixer_context *ctx, 
> int win)
>       /* TODO: single buffer format NV12, NV21 */
>       default:
>               /* ignore pixel format at disable time */
> -             if (!win_data->dma_addr)
> +             if (!plane->dma_addr[0])
>                       break;
>  
>               DRM_ERROR("pixel format for vp is wrong [%d].\n",
> -                             win_data->pixel_format);
> +                             plane->pixel_format);
>               return;
>       }
>  
>       /* scaling feature: (src << 16) / dst */
> -     x_ratio = (win_data->src_width << 16) / win_data->crtc_width;
> -     y_ratio = (win_data->src_height << 16) / win_data->crtc_height;
> +     x_ratio = (plane->src_width << 16) / plane->crtc_width;
> +     y_ratio = (plane->src_height << 16) / plane->crtc_height;
>  
>       if (buf_num == 2) {
> -             luma_addr[0] = win_data->dma_addr;
> -             chroma_addr[0] = win_data->chroma_dma_addr;
> +             luma_addr[0] = plane->dma_addr[0];
> +             chroma_addr[0] = plane->dma_addr[1];
>       } else {
> -             luma_addr[0] = win_data->dma_addr;
> -             chroma_addr[0] = win_data->dma_addr
> -                     + (win_data->fb_width * win_data->fb_height);
> +             luma_addr[0] = plane->dma_addr[0];
> +             chroma_addr[0] = plane->dma_addr[0]
> +                     + (plane->fb_width * plane->fb_height);
>       }
>  
> -     if (win_data->scan_flags & DRM_MODE_FLAG_INTERLACE) {
> +     if (plane->scan_flag & DRM_MODE_FLAG_INTERLACE) {
>               ctx->interlace = true;
>               if (tiled_mode) {
>                       luma_addr[1] = luma_addr[0] + 0x40;
>                       chroma_addr[1] = chroma_addr[0] + 0x40;
>               } else {
> -                     luma_addr[1] = luma_addr[0] + win_data->fb_width;
> -                     chroma_addr[1] = chroma_addr[0] + win_data->fb_width;
> +                     luma_addr[1] = luma_addr[0] + plane->fb_width;
> +                     chroma_addr[1] = chroma_addr[0] + plane->fb_width;
>               }
>       } else {
>               ctx->interlace = false;
> @@ -470,26 +449,26 @@ static void vp_video_buffer(struct mixer_context *ctx, 
> int win)
>       vp_reg_writemask(res, VP_MODE, val, VP_MODE_FMT_MASK);
>  
>       /* setting size of input image */
> -     vp_reg_write(res, VP_IMG_SIZE_Y, VP_IMG_HSIZE(win_data->fb_width) |
> -             VP_IMG_VSIZE(win_data->fb_height));
> +     vp_reg_write(res, VP_IMG_SIZE_Y, VP_IMG_HSIZE(plane->fb_width) |
> +             VP_IMG_VSIZE(plane->fb_height));
>       /* chroma height has to reduced by 2 to avoid chroma distorions */
> -     vp_reg_write(res, VP_IMG_SIZE_C, VP_IMG_HSIZE(win_data->fb_width) |
> -             VP_IMG_VSIZE(win_data->fb_height / 2));
> +     vp_reg_write(res, VP_IMG_SIZE_C, VP_IMG_HSIZE(plane->fb_width) |
> +             VP_IMG_VSIZE(plane->fb_height / 2));
>  
> -     vp_reg_write(res, VP_SRC_WIDTH, win_data->src_width);
> -     vp_reg_write(res, VP_SRC_HEIGHT, win_data->src_height);
> +     vp_reg_write(res, VP_SRC_WIDTH, plane->src_width);
> +     vp_reg_write(res, VP_SRC_HEIGHT, plane->src_height);
>       vp_reg_write(res, VP_SRC_H_POSITION,
> -                     VP_SRC_H_POSITION_VAL(win_data->fb_x));
> -     vp_reg_write(res, VP_SRC_V_POSITION, win_data->fb_y);
> +                     VP_SRC_H_POSITION_VAL(plane->fb_x));
> +     vp_reg_write(res, VP_SRC_V_POSITION, plane->fb_y);
>  
> -     vp_reg_write(res, VP_DST_WIDTH, win_data->crtc_width);
> -     vp_reg_write(res, VP_DST_H_POSITION, win_data->crtc_x);
> +     vp_reg_write(res, VP_DST_WIDTH, plane->crtc_width);
> +     vp_reg_write(res, VP_DST_H_POSITION, plane->crtc_x);
>       if (ctx->interlace) {
> -             vp_reg_write(res, VP_DST_HEIGHT, win_data->crtc_height / 2);
> -             vp_reg_write(res, VP_DST_V_POSITION, win_data->crtc_y / 2);
> +             vp_reg_write(res, VP_DST_HEIGHT, plane->crtc_height / 2);
> +             vp_reg_write(res, VP_DST_V_POSITION, plane->crtc_y / 2);
>       } else {
> -             vp_reg_write(res, VP_DST_HEIGHT, win_data->crtc_height);
> -             vp_reg_write(res, VP_DST_V_POSITION, win_data->crtc_y);
> +             vp_reg_write(res, VP_DST_HEIGHT, plane->crtc_height);
> +             vp_reg_write(res, VP_DST_V_POSITION, plane->crtc_y);
>       }
>  
>       vp_reg_write(res, VP_H_RATIO, x_ratio);
> @@ -503,8 +482,8 @@ static void vp_video_buffer(struct mixer_context *ctx, 
> int win)
>       vp_reg_write(res, VP_TOP_C_PTR, chroma_addr[0]);
>       vp_reg_write(res, VP_BOT_C_PTR, chroma_addr[1]);
>  
> -     mixer_cfg_scan(ctx, win_data->mode_height);
> -     mixer_cfg_rgb_fmt(ctx, win_data->mode_height);
> +     mixer_cfg_scan(ctx, plane->mode_height);
> +     mixer_cfg_rgb_fmt(ctx, plane->mode_height);
>       mixer_cfg_layer(ctx, win, true);
>       mixer_run(ctx);
>  
> @@ -525,21 +504,21 @@ static void mixer_graph_buffer(struct mixer_context 
> *ctx, int win)
>  {
>       struct mixer_resources *res = &ctx->mixer_res;
>       unsigned long flags;
> -     struct hdmi_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       unsigned int x_ratio, y_ratio;
>       unsigned int src_x_offset, src_y_offset, dst_x_offset, dst_y_offset;
>       dma_addr_t dma_addr;
>       unsigned int fmt;
>       u32 val;
>  
> -     win_data = &ctx->win_data[win];
> +     plane = &ctx->planes[win];
>  
>       #define RGB565 4
>       #define ARGB1555 5
>       #define ARGB4444 6
>       #define ARGB8888 7
>  
> -     switch (win_data->bpp) {
> +     switch (plane->bpp) {
>       case 16:
>               fmt = ARGB4444;
>               break;
> @@ -554,17 +533,17 @@ static void mixer_graph_buffer(struct mixer_context 
> *ctx, int win)
>       x_ratio = 0;
>       y_ratio = 0;
>  
> -     dst_x_offset = win_data->crtc_x;
> -     dst_y_offset = win_data->crtc_y;
> +     dst_x_offset = plane->crtc_x;
> +     dst_y_offset = plane->crtc_y;
>  
>       /* converting dma address base and source offset */
> -     dma_addr = win_data->dma_addr
> -             + (win_data->fb_x * win_data->bpp >> 3)
> -             + (win_data->fb_y * win_data->fb_width * win_data->bpp >> 3);
> +     dma_addr = plane->dma_addr[0]
> +             + (plane->fb_x * plane->bpp >> 3)
> +             + (plane->fb_y * plane->fb_width * plane->bpp >> 3);
>       src_x_offset = 0;
>       src_y_offset = 0;
>  
> -     if (win_data->scan_flags & DRM_MODE_FLAG_INTERLACE)
> +     if (plane->scan_flag & DRM_MODE_FLAG_INTERLACE)
>               ctx->interlace = true;
>       else
>               ctx->interlace = false;
> @@ -577,18 +556,18 @@ static void mixer_graph_buffer(struct mixer_context 
> *ctx, int win)
>               MXR_GRP_CFG_FORMAT_VAL(fmt), MXR_GRP_CFG_FORMAT_MASK);
>  
>       /* setup geometry */
> -     mixer_reg_write(res, MXR_GRAPHIC_SPAN(win), win_data->fb_width);
> +     mixer_reg_write(res, MXR_GRAPHIC_SPAN(win), plane->fb_width);
>  
>       /* setup display size */
>       if (ctx->mxr_ver == MXR_VER_128_0_0_184 &&
>               win == MIXER_DEFAULT_WIN) {
> -             val  = MXR_MXR_RES_HEIGHT(win_data->fb_height);
> -             val |= MXR_MXR_RES_WIDTH(win_data->fb_width);
> +             val  = MXR_MXR_RES_HEIGHT(plane->fb_height);
> +             val |= MXR_MXR_RES_WIDTH(plane->fb_width);
>               mixer_reg_write(res, MXR_RESOLUTION, val);
>       }
>  
> -     val  = MXR_GRP_WH_WIDTH(win_data->crtc_width);
> -     val |= MXR_GRP_WH_HEIGHT(win_data->crtc_height);
> +     val  = MXR_GRP_WH_WIDTH(plane->crtc_width);
> +     val |= MXR_GRP_WH_HEIGHT(plane->crtc_height);
>       val |= MXR_GRP_WH_H_SCALE(x_ratio);
>       val |= MXR_GRP_WH_V_SCALE(y_ratio);
>       mixer_reg_write(res, MXR_GRAPHIC_WH(win), val);
> @@ -606,8 +585,8 @@ static void mixer_graph_buffer(struct mixer_context *ctx, 
> int win)
>       /* set buffer address to mixer */
>       mixer_reg_write(res, MXR_GRAPHIC_BASE(win), dma_addr);
>  
> -     mixer_cfg_scan(ctx, win_data->mode_height);
> -     mixer_cfg_rgb_fmt(ctx, win_data->mode_height);
> +     mixer_cfg_scan(ctx, plane->mode_height);
> +     mixer_cfg_rgb_fmt(ctx, plane->mode_height);
>       mixer_cfg_layer(ctx, win, true);
>  
>       /* layer update mandatory for mixer 16.0.33.0 */
> @@ -913,58 +892,6 @@ static void mixer_disable_vblank(struct exynos_drm_crtc 
> *crtc)
>       mixer_reg_writemask(res, MXR_INT_EN, 0, MXR_INT_EN_VSYNC);
>  }
>  
> -static void mixer_win_mode_set(struct exynos_drm_crtc *crtc,
> -                     struct exynos_drm_plane *plane)
> -{
> -     struct mixer_context *mixer_ctx = crtc->ctx;
> -     struct hdmi_win_data *win_data;
> -     int win;
> -
> -     if (!plane) {
> -             DRM_ERROR("plane is NULL\n");
> -             return;
> -     }
> -
> -     DRM_DEBUG_KMS("set [%d]x[%d] at (%d,%d) to [%d]x[%d] at (%d,%d)\n",
> -                              plane->fb_width, plane->fb_height,
> -                              plane->fb_x, plane->fb_y,
> -                              plane->crtc_width, plane->crtc_height,
> -                              plane->crtc_x, plane->crtc_y);
> -
> -     win = plane->zpos;
> -     if (win == DEFAULT_ZPOS)
> -             win = MIXER_DEFAULT_WIN;
> -
> -     if (win < 0 || win >= MIXER_WIN_NR) {
> -             DRM_ERROR("mixer window[%d] is wrong\n", win);
> -             return;
> -     }
> -
> -     win_data = &mixer_ctx->win_data[win];
> -
> -     win_data->dma_addr = plane->dma_addr[0];
> -     win_data->chroma_dma_addr = plane->dma_addr[1];
> -     win_data->pixel_format = plane->pixel_format;
> -     win_data->bpp = plane->bpp;
> -
> -     win_data->crtc_x = plane->crtc_x;
> -     win_data->crtc_y = plane->crtc_y;
> -     win_data->crtc_width = plane->crtc_width;
> -     win_data->crtc_height = plane->crtc_height;
> -
> -     win_data->fb_x = plane->fb_x;
> -     win_data->fb_y = plane->fb_y;
> -     win_data->fb_width = plane->fb_width;
> -     win_data->fb_height = plane->fb_height;
> -     win_data->src_width = plane->src_width;
> -     win_data->src_height = plane->src_height;
> -
> -     win_data->mode_width = plane->mode_width;
> -     win_data->mode_height = plane->mode_height;
> -
> -     win_data->scan_flags = plane->scan_flag;
> -}
> -
>  static void mixer_win_commit(struct exynos_drm_crtc *crtc, int zpos)
>  {
>       struct mixer_context *mixer_ctx = crtc->ctx;
> @@ -984,7 +911,7 @@ static void mixer_win_commit(struct exynos_drm_crtc 
> *crtc, int zpos)
>       else
>               mixer_graph_buffer(mixer_ctx, win);
>  
> -     mixer_ctx->win_data[win].enabled = true;
> +     mixer_ctx->planes[win].enabled = true;
>  }
>  
>  static void mixer_win_disable(struct exynos_drm_crtc *crtc, int zpos)
> @@ -999,7 +926,7 @@ static void mixer_win_disable(struct exynos_drm_crtc 
> *crtc, int zpos)
>       mutex_lock(&mixer_ctx->mixer_mutex);
>       if (!mixer_ctx->powered) {
>               mutex_unlock(&mixer_ctx->mixer_mutex);
> -             mixer_ctx->win_data[win].resume = false;
> +             mixer_ctx->planes[win].resume = false;
>               return;
>       }
>       mutex_unlock(&mixer_ctx->mixer_mutex);
> @@ -1012,7 +939,7 @@ static void mixer_win_disable(struct exynos_drm_crtc 
> *crtc, int zpos)
>       mixer_vsync_set_update(mixer_ctx, true);
>       spin_unlock_irqrestore(&res->reg_slock, flags);
>  
> -     mixer_ctx->win_data[win].enabled = false;
> +     mixer_ctx->planes[win].enabled = false;
>  }
>  
>  static void mixer_wait_for_vblank(struct exynos_drm_crtc *crtc)
> @@ -1049,12 +976,12 @@ static void mixer_wait_for_vblank(struct 
> exynos_drm_crtc *crtc)
>  
>  static void mixer_window_suspend(struct mixer_context *ctx)
>  {
> -     struct hdmi_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       int i;
>  
>       for (i = 0; i < MIXER_WIN_NR; i++) {
> -             win_data = &ctx->win_data[i];
> -             win_data->resume = win_data->enabled;
> +             plane = &ctx->planes[i];
> +             plane->resume = plane->enabled;
>               mixer_win_disable(ctx->crtc, i);
>       }
>       mixer_wait_for_vblank(ctx->crtc);
> @@ -1062,14 +989,14 @@ static void mixer_window_suspend(struct mixer_context 
> *ctx)
>  
>  static void mixer_window_resume(struct mixer_context *ctx)
>  {
> -     struct hdmi_win_data *win_data;
> +     struct exynos_drm_plane *plane;
>       int i;
>  
>       for (i = 0; i < MIXER_WIN_NR; i++) {
> -             win_data = &ctx->win_data[i];
> -             win_data->enabled = win_data->resume;
> -             win_data->resume = false;
> -             if (win_data->enabled)
> +             plane = &ctx->planes[i];
> +             plane->enabled = plane->resume;
> +             plane->resume = false;
> +             if (plane->enabled)
>                       mixer_win_commit(ctx->crtc, i);
>       }
>  }
> @@ -1179,7 +1106,6 @@ static struct exynos_drm_crtc_ops mixer_crtc_ops = {
>       .enable_vblank          = mixer_enable_vblank,
>       .disable_vblank         = mixer_disable_vblank,
>       .wait_for_vblank        = mixer_wait_for_vblank,
> -     .win_mode_set           = mixer_win_mode_set,
>       .win_commit             = mixer_win_commit,
>       .win_disable            = mixer_win_disable,
>  };
> @@ -1243,15 +1169,25 @@ static int mixer_bind(struct device *dev, struct 
> device *manager, void *data)
>  {
>       struct mixer_context *ctx = dev_get_drvdata(dev);
>       struct drm_device *drm_dev = data;
> -     int ret;
> +     struct exynos_drm_plane *exynos_plane;
> +     enum drm_plane_type type;
> +     int i, ret;
> +
> +     for (i = 0; i < MIXER_WIN_NR; i++) {
> +             type = (i == MIXER_DEFAULT_WIN) ? DRM_PLANE_TYPE_PRIMARY :
> +                                             DRM_PLANE_TYPE_OVERLAY;
> +             exynos_plane_init(drm_dev, &ctx->planes[i], 1 << ctx->pipe,
> +                               type);
> +     }
>  
>       ret = mixer_initialize(ctx, drm_dev);
>       if (ret)
>               return ret;
>  
> -     ctx->crtc = exynos_drm_crtc_create(drm_dev, ctx->pipe,
> -                                  EXYNOS_DISPLAY_TYPE_HDMI,
> -                                  &mixer_crtc_ops, ctx);
> +     exynos_plane = &ctx->planes[MIXER_DEFAULT_WIN];
> +     ctx->crtc = exynos_drm_crtc_create(drm_dev, &exynos_plane->base,
> +                                        ctx->pipe, EXYNOS_DISPLAY_TYPE_HDMI,
> +                                        &mixer_crtc_ops, ctx);
>       if (IS_ERR(ctx->crtc)) {
>               mixer_ctx_remove(ctx);
>               ret = PTR_ERR(ctx->crtc);
> 

Reply via email to