GNU Linux-libre 4.9.311-gnu1
[releases.git] / drivers / gpu / drm / exynos / exynos_mixer.c
1 /*
2  * Copyright (C) 2011 Samsung Electronics Co.Ltd
3  * Authors:
4  * Seung-Woo Kim <sw0312.kim@samsung.com>
5  *      Inki Dae <inki.dae@samsung.com>
6  *      Joonyoung Shim <jy0922.shim@samsung.com>
7  *
8  * Based on drivers/media/video/s5p-tv/mixer_reg.c
9  *
10  * This program is free software; you can redistribute  it and/or modify it
11  * under  the terms of  the GNU General  Public License as published by the
12  * Free Software Foundation;  either version 2 of the  License, or (at your
13  * option) any later version.
14  *
15  */
16
17 #include <drm/drmP.h>
18
19 #include "regs-mixer.h"
20 #include "regs-vp.h"
21
22 #include <linux/kernel.h>
23 #include <linux/spinlock.h>
24 #include <linux/wait.h>
25 #include <linux/i2c.h>
26 #include <linux/platform_device.h>
27 #include <linux/interrupt.h>
28 #include <linux/irq.h>
29 #include <linux/delay.h>
30 #include <linux/pm_runtime.h>
31 #include <linux/clk.h>
32 #include <linux/regulator/consumer.h>
33 #include <linux/of.h>
34 #include <linux/of_device.h>
35 #include <linux/component.h>
36
37 #include <drm/exynos_drm.h>
38
39 #include "exynos_drm_drv.h"
40 #include "exynos_drm_crtc.h"
41 #include "exynos_drm_fb.h"
42 #include "exynos_drm_plane.h"
43 #include "exynos_drm_iommu.h"
44
45 #define MIXER_WIN_NR            3
46 #define VP_DEFAULT_WIN          2
47
48 /* The pixelformats that are natively supported by the mixer. */
49 #define MXR_FORMAT_RGB565       4
50 #define MXR_FORMAT_ARGB1555     5
51 #define MXR_FORMAT_ARGB4444     6
52 #define MXR_FORMAT_ARGB8888     7
53
54 struct mixer_resources {
55         int                     irq;
56         void __iomem            *mixer_regs;
57         void __iomem            *vp_regs;
58         spinlock_t              reg_slock;
59         struct clk              *mixer;
60         struct clk              *vp;
61         struct clk              *hdmi;
62         struct clk              *sclk_mixer;
63         struct clk              *sclk_hdmi;
64         struct clk              *mout_mixer;
65 };
66
67 enum mixer_version_id {
68         MXR_VER_0_0_0_16,
69         MXR_VER_16_0_33_0,
70         MXR_VER_128_0_0_184,
71 };
72
73 enum mixer_flag_bits {
74         MXR_BIT_POWERED,
75         MXR_BIT_VSYNC,
76         MXR_BIT_INTERLACE,
77         MXR_BIT_VP_ENABLED,
78         MXR_BIT_HAS_SCLK,
79 };
80
81 static const uint32_t mixer_formats[] = {
82         DRM_FORMAT_XRGB4444,
83         DRM_FORMAT_ARGB4444,
84         DRM_FORMAT_XRGB1555,
85         DRM_FORMAT_ARGB1555,
86         DRM_FORMAT_RGB565,
87         DRM_FORMAT_XRGB8888,
88         DRM_FORMAT_ARGB8888,
89 };
90
91 static const uint32_t vp_formats[] = {
92         DRM_FORMAT_NV12,
93         DRM_FORMAT_NV21,
94 };
95
96 struct mixer_context {
97         struct platform_device *pdev;
98         struct device           *dev;
99         struct drm_device       *drm_dev;
100         struct exynos_drm_crtc  *crtc;
101         struct exynos_drm_plane planes[MIXER_WIN_NR];
102         int                     pipe;
103         unsigned long           flags;
104
105         struct mixer_resources  mixer_res;
106         enum mixer_version_id   mxr_ver;
107 };
108
109 struct mixer_drv_data {
110         enum mixer_version_id   version;
111         bool                                    is_vp_enabled;
112         bool                                    has_sclk;
113 };
114
115 static const struct exynos_drm_plane_config plane_configs[MIXER_WIN_NR] = {
116         {
117                 .zpos = 0,
118                 .type = DRM_PLANE_TYPE_PRIMARY,
119                 .pixel_formats = mixer_formats,
120                 .num_pixel_formats = ARRAY_SIZE(mixer_formats),
121                 .capabilities = EXYNOS_DRM_PLANE_CAP_DOUBLE |
122                                 EXYNOS_DRM_PLANE_CAP_ZPOS,
123         }, {
124                 .zpos = 1,
125                 .type = DRM_PLANE_TYPE_CURSOR,
126                 .pixel_formats = mixer_formats,
127                 .num_pixel_formats = ARRAY_SIZE(mixer_formats),
128                 .capabilities = EXYNOS_DRM_PLANE_CAP_DOUBLE |
129                                 EXYNOS_DRM_PLANE_CAP_ZPOS,
130         }, {
131                 .zpos = 2,
132                 .type = DRM_PLANE_TYPE_OVERLAY,
133                 .pixel_formats = vp_formats,
134                 .num_pixel_formats = ARRAY_SIZE(vp_formats),
135                 .capabilities = EXYNOS_DRM_PLANE_CAP_SCALE |
136                                 EXYNOS_DRM_PLANE_CAP_ZPOS,
137         },
138 };
139
140 static const u8 filter_y_horiz_tap8[] = {
141         0,      -1,     -1,     -1,     -1,     -1,     -1,     -1,
142         -1,     -1,     -1,     -1,     -1,     0,      0,      0,
143         0,      2,      4,      5,      6,      6,      6,      6,
144         6,      5,      5,      4,      3,      2,      1,      1,
145         0,      -6,     -12,    -16,    -18,    -20,    -21,    -20,
146         -20,    -18,    -16,    -13,    -10,    -8,     -5,     -2,
147         127,    126,    125,    121,    114,    107,    99,     89,
148         79,     68,     57,     46,     35,     25,     16,     8,
149 };
150
151 static const u8 filter_y_vert_tap4[] = {
152         0,      -3,     -6,     -8,     -8,     -8,     -8,     -7,
153         -6,     -5,     -4,     -3,     -2,     -1,     -1,     0,
154         127,    126,    124,    118,    111,    102,    92,     81,
155         70,     59,     48,     37,     27,     19,     11,     5,
156         0,      5,      11,     19,     27,     37,     48,     59,
157         70,     81,     92,     102,    111,    118,    124,    126,
158         0,      0,      -1,     -1,     -2,     -3,     -4,     -5,
159         -6,     -7,     -8,     -8,     -8,     -8,     -6,     -3,
160 };
161
162 static const u8 filter_cr_horiz_tap4[] = {
163         0,      -3,     -6,     -8,     -8,     -8,     -8,     -7,
164         -6,     -5,     -4,     -3,     -2,     -1,     -1,     0,
165         127,    126,    124,    118,    111,    102,    92,     81,
166         70,     59,     48,     37,     27,     19,     11,     5,
167 };
168
169 static inline bool is_alpha_format(unsigned int pixel_format)
170 {
171         switch (pixel_format) {
172         case DRM_FORMAT_ARGB8888:
173         case DRM_FORMAT_ARGB1555:
174         case DRM_FORMAT_ARGB4444:
175                 return true;
176         default:
177                 return false;
178         }
179 }
180
181 static inline u32 vp_reg_read(struct mixer_resources *res, u32 reg_id)
182 {
183         return readl(res->vp_regs + reg_id);
184 }
185
186 static inline void vp_reg_write(struct mixer_resources *res, u32 reg_id,
187                                  u32 val)
188 {
189         writel(val, res->vp_regs + reg_id);
190 }
191
192 static inline void vp_reg_writemask(struct mixer_resources *res, u32 reg_id,
193                                  u32 val, u32 mask)
194 {
195         u32 old = vp_reg_read(res, reg_id);
196
197         val = (val & mask) | (old & ~mask);
198         writel(val, res->vp_regs + reg_id);
199 }
200
201 static inline u32 mixer_reg_read(struct mixer_resources *res, u32 reg_id)
202 {
203         return readl(res->mixer_regs + reg_id);
204 }
205
206 static inline void mixer_reg_write(struct mixer_resources *res, u32 reg_id,
207                                  u32 val)
208 {
209         writel(val, res->mixer_regs + reg_id);
210 }
211
212 static inline void mixer_reg_writemask(struct mixer_resources *res,
213                                  u32 reg_id, u32 val, u32 mask)
214 {
215         u32 old = mixer_reg_read(res, reg_id);
216
217         val = (val & mask) | (old & ~mask);
218         writel(val, res->mixer_regs + reg_id);
219 }
220
221 static void mixer_regs_dump(struct mixer_context *ctx)
222 {
223 #define DUMPREG(reg_id) \
224 do { \
225         DRM_DEBUG_KMS(#reg_id " = %08x\n", \
226                 (u32)readl(ctx->mixer_res.mixer_regs + reg_id)); \
227 } while (0)
228
229         DUMPREG(MXR_STATUS);
230         DUMPREG(MXR_CFG);
231         DUMPREG(MXR_INT_EN);
232         DUMPREG(MXR_INT_STATUS);
233
234         DUMPREG(MXR_LAYER_CFG);
235         DUMPREG(MXR_VIDEO_CFG);
236
237         DUMPREG(MXR_GRAPHIC0_CFG);
238         DUMPREG(MXR_GRAPHIC0_BASE);
239         DUMPREG(MXR_GRAPHIC0_SPAN);
240         DUMPREG(MXR_GRAPHIC0_WH);
241         DUMPREG(MXR_GRAPHIC0_SXY);
242         DUMPREG(MXR_GRAPHIC0_DXY);
243
244         DUMPREG(MXR_GRAPHIC1_CFG);
245         DUMPREG(MXR_GRAPHIC1_BASE);
246         DUMPREG(MXR_GRAPHIC1_SPAN);
247         DUMPREG(MXR_GRAPHIC1_WH);
248         DUMPREG(MXR_GRAPHIC1_SXY);
249         DUMPREG(MXR_GRAPHIC1_DXY);
250 #undef DUMPREG
251 }
252
253 static void vp_regs_dump(struct mixer_context *ctx)
254 {
255 #define DUMPREG(reg_id) \
256 do { \
257         DRM_DEBUG_KMS(#reg_id " = %08x\n", \
258                 (u32) readl(ctx->mixer_res.vp_regs + reg_id)); \
259 } while (0)
260
261         DUMPREG(VP_ENABLE);
262         DUMPREG(VP_SRESET);
263         DUMPREG(VP_SHADOW_UPDATE);
264         DUMPREG(VP_FIELD_ID);
265         DUMPREG(VP_MODE);
266         DUMPREG(VP_IMG_SIZE_Y);
267         DUMPREG(VP_IMG_SIZE_C);
268         DUMPREG(VP_PER_RATE_CTRL);
269         DUMPREG(VP_TOP_Y_PTR);
270         DUMPREG(VP_BOT_Y_PTR);
271         DUMPREG(VP_TOP_C_PTR);
272         DUMPREG(VP_BOT_C_PTR);
273         DUMPREG(VP_ENDIAN_MODE);
274         DUMPREG(VP_SRC_H_POSITION);
275         DUMPREG(VP_SRC_V_POSITION);
276         DUMPREG(VP_SRC_WIDTH);
277         DUMPREG(VP_SRC_HEIGHT);
278         DUMPREG(VP_DST_H_POSITION);
279         DUMPREG(VP_DST_V_POSITION);
280         DUMPREG(VP_DST_WIDTH);
281         DUMPREG(VP_DST_HEIGHT);
282         DUMPREG(VP_H_RATIO);
283         DUMPREG(VP_V_RATIO);
284
285 #undef DUMPREG
286 }
287
288 static inline void vp_filter_set(struct mixer_resources *res,
289                 int reg_id, const u8 *data, unsigned int size)
290 {
291         /* assure 4-byte align */
292         BUG_ON(size & 3);
293         for (; size; size -= 4, reg_id += 4, data += 4) {
294                 u32 val = (data[0] << 24) |  (data[1] << 16) |
295                         (data[2] << 8) | data[3];
296                 vp_reg_write(res, reg_id, val);
297         }
298 }
299
300 static void vp_default_filter(struct mixer_resources *res)
301 {
302         vp_filter_set(res, VP_POLY8_Y0_LL,
303                 filter_y_horiz_tap8, sizeof(filter_y_horiz_tap8));
304         vp_filter_set(res, VP_POLY4_Y0_LL,
305                 filter_y_vert_tap4, sizeof(filter_y_vert_tap4));
306         vp_filter_set(res, VP_POLY4_C0_LL,
307                 filter_cr_horiz_tap4, sizeof(filter_cr_horiz_tap4));
308 }
309
310 static void mixer_cfg_gfx_blend(struct mixer_context *ctx, unsigned int win,
311                                 bool alpha)
312 {
313         struct mixer_resources *res = &ctx->mixer_res;
314         u32 val;
315
316         val  = MXR_GRP_CFG_COLOR_KEY_DISABLE; /* no blank key */
317         if (alpha) {
318                 /* blending based on pixel alpha */
319                 val |= MXR_GRP_CFG_BLEND_PRE_MUL;
320                 val |= MXR_GRP_CFG_PIXEL_BLEND_EN;
321         }
322         mixer_reg_writemask(res, MXR_GRAPHIC_CFG(win),
323                             val, MXR_GRP_CFG_MISC_MASK);
324 }
325
326 static void mixer_cfg_vp_blend(struct mixer_context *ctx)
327 {
328         struct mixer_resources *res = &ctx->mixer_res;
329         u32 val;
330
331         /*
332          * No blending at the moment since the NV12/NV21 pixelformats don't
333          * have an alpha channel. However the mixer supports a global alpha
334          * value for a layer. Once this functionality is exposed, we can
335          * support blending of the video layer through this.
336          */
337         val = 0;
338         mixer_reg_write(res, MXR_VIDEO_CFG, val);
339 }
340
341 static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable)
342 {
343         struct mixer_resources *res = &ctx->mixer_res;
344
345         /* block update on vsync */
346         mixer_reg_writemask(res, MXR_STATUS, enable ?
347                         MXR_STATUS_SYNC_ENABLE : 0, MXR_STATUS_SYNC_ENABLE);
348
349         if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags))
350                 vp_reg_write(res, VP_SHADOW_UPDATE, enable ?
351                         VP_SHADOW_UPDATE_ENABLE : 0);
352 }
353
354 static void mixer_cfg_scan(struct mixer_context *ctx, unsigned int height)
355 {
356         struct mixer_resources *res = &ctx->mixer_res;
357         u32 val;
358
359         /* choosing between interlace and progressive mode */
360         val = test_bit(MXR_BIT_INTERLACE, &ctx->flags) ?
361                 MXR_CFG_SCAN_INTERLACE : MXR_CFG_SCAN_PROGRESSIVE;
362
363         if (ctx->mxr_ver != MXR_VER_128_0_0_184) {
364                 /* choosing between proper HD and SD mode */
365                 if (height <= 480)
366                         val |= MXR_CFG_SCAN_NTSC | MXR_CFG_SCAN_SD;
367                 else if (height <= 576)
368                         val |= MXR_CFG_SCAN_PAL | MXR_CFG_SCAN_SD;
369                 else if (height <= 720)
370                         val |= MXR_CFG_SCAN_HD_720 | MXR_CFG_SCAN_HD;
371                 else if (height <= 1080)
372                         val |= MXR_CFG_SCAN_HD_1080 | MXR_CFG_SCAN_HD;
373                 else
374                         val |= MXR_CFG_SCAN_HD_720 | MXR_CFG_SCAN_HD;
375         }
376
377         mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_SCAN_MASK);
378 }
379
380 static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height)
381 {
382         struct mixer_resources *res = &ctx->mixer_res;
383         u32 val;
384
385         if (height == 480) {
386                 val = MXR_CFG_RGB601_0_255;
387         } else if (height == 576) {
388                 val = MXR_CFG_RGB601_0_255;
389         } else if (height == 720) {
390                 val = MXR_CFG_RGB709_16_235;
391                 mixer_reg_write(res, MXR_CM_COEFF_Y,
392                                 (1 << 30) | (94 << 20) | (314 << 10) |
393                                 (32 << 0));
394                 mixer_reg_write(res, MXR_CM_COEFF_CB,
395                                 (972 << 20) | (851 << 10) | (225 << 0));
396                 mixer_reg_write(res, MXR_CM_COEFF_CR,
397                                 (225 << 20) | (820 << 10) | (1004 << 0));
398         } else if (height == 1080) {
399                 val = MXR_CFG_RGB709_16_235;
400                 mixer_reg_write(res, MXR_CM_COEFF_Y,
401                                 (1 << 30) | (94 << 20) | (314 << 10) |
402                                 (32 << 0));
403                 mixer_reg_write(res, MXR_CM_COEFF_CB,
404                                 (972 << 20) | (851 << 10) | (225 << 0));
405                 mixer_reg_write(res, MXR_CM_COEFF_CR,
406                                 (225 << 20) | (820 << 10) | (1004 << 0));
407         } else {
408                 val = MXR_CFG_RGB709_16_235;
409                 mixer_reg_write(res, MXR_CM_COEFF_Y,
410                                 (1 << 30) | (94 << 20) | (314 << 10) |
411                                 (32 << 0));
412                 mixer_reg_write(res, MXR_CM_COEFF_CB,
413                                 (972 << 20) | (851 << 10) | (225 << 0));
414                 mixer_reg_write(res, MXR_CM_COEFF_CR,
415                                 (225 << 20) | (820 << 10) | (1004 << 0));
416         }
417
418         mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_RGB_FMT_MASK);
419 }
420
421 static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win,
422                             unsigned int priority, bool enable)
423 {
424         struct mixer_resources *res = &ctx->mixer_res;
425         u32 val = enable ? ~0 : 0;
426
427         switch (win) {
428         case 0:
429                 mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_GRP0_ENABLE);
430                 mixer_reg_writemask(res, MXR_LAYER_CFG,
431                                     MXR_LAYER_CFG_GRP0_VAL(priority),
432                                     MXR_LAYER_CFG_GRP0_MASK);
433                 break;
434         case 1:
435                 mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_GRP1_ENABLE);
436                 mixer_reg_writemask(res, MXR_LAYER_CFG,
437                                     MXR_LAYER_CFG_GRP1_VAL(priority),
438                                     MXR_LAYER_CFG_GRP1_MASK);
439
440                 break;
441         case VP_DEFAULT_WIN:
442                 if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) {
443                         vp_reg_writemask(res, VP_ENABLE, val, VP_ENABLE_ON);
444                         mixer_reg_writemask(res, MXR_CFG, val,
445                                 MXR_CFG_VP_ENABLE);
446                         mixer_reg_writemask(res, MXR_LAYER_CFG,
447                                             MXR_LAYER_CFG_VP_VAL(priority),
448                                             MXR_LAYER_CFG_VP_MASK);
449                 }
450                 break;
451         }
452 }
453
454 static void mixer_run(struct mixer_context *ctx)
455 {
456         struct mixer_resources *res = &ctx->mixer_res;
457
458         mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_REG_RUN);
459 }
460
461 static void mixer_stop(struct mixer_context *ctx)
462 {
463         struct mixer_resources *res = &ctx->mixer_res;
464         int timeout = 20;
465
466         mixer_reg_writemask(res, MXR_STATUS, 0, MXR_STATUS_REG_RUN);
467
468         while (!(mixer_reg_read(res, MXR_STATUS) & MXR_STATUS_REG_IDLE) &&
469                         --timeout)
470                 usleep_range(10000, 12000);
471 }
472
473 static void vp_video_buffer(struct mixer_context *ctx,
474                             struct exynos_drm_plane *plane)
475 {
476         struct exynos_drm_plane_state *state =
477                                 to_exynos_plane_state(plane->base.state);
478         struct drm_display_mode *mode = &state->base.crtc->state->adjusted_mode;
479         struct mixer_resources *res = &ctx->mixer_res;
480         struct drm_framebuffer *fb = state->base.fb;
481         unsigned int priority = state->base.normalized_zpos + 1;
482         unsigned long flags;
483         dma_addr_t luma_addr[2], chroma_addr[2];
484         bool tiled_mode = false;
485         bool crcb_mode = false;
486         u32 val;
487
488         switch (fb->pixel_format) {
489         case DRM_FORMAT_NV12:
490                 crcb_mode = false;
491                 break;
492         case DRM_FORMAT_NV21:
493                 crcb_mode = true;
494                 break;
495         default:
496                 DRM_ERROR("pixel format for vp is wrong [%d].\n",
497                                 fb->pixel_format);
498                 return;
499         }
500
501         luma_addr[0] = exynos_drm_fb_dma_addr(fb, 0);
502         chroma_addr[0] = exynos_drm_fb_dma_addr(fb, 1);
503
504         if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
505                 __set_bit(MXR_BIT_INTERLACE, &ctx->flags);
506                 if (tiled_mode) {
507                         luma_addr[1] = luma_addr[0] + 0x40;
508                         chroma_addr[1] = chroma_addr[0] + 0x40;
509                 } else {
510                         luma_addr[1] = luma_addr[0] + fb->pitches[0];
511                         chroma_addr[1] = chroma_addr[0] + fb->pitches[0];
512                 }
513         } else {
514                 __clear_bit(MXR_BIT_INTERLACE, &ctx->flags);
515                 luma_addr[1] = 0;
516                 chroma_addr[1] = 0;
517         }
518
519         spin_lock_irqsave(&res->reg_slock, flags);
520
521         /* interlace or progressive scan mode */
522         val = (test_bit(MXR_BIT_INTERLACE, &ctx->flags) ? ~0 : 0);
523         vp_reg_writemask(res, VP_MODE, val, VP_MODE_LINE_SKIP);
524
525         /* setup format */
526         val = (crcb_mode ? VP_MODE_NV21 : VP_MODE_NV12);
527         val |= (tiled_mode ? VP_MODE_MEM_TILED : VP_MODE_MEM_LINEAR);
528         vp_reg_writemask(res, VP_MODE, val, VP_MODE_FMT_MASK);
529
530         /* setting size of input image */
531         vp_reg_write(res, VP_IMG_SIZE_Y, VP_IMG_HSIZE(fb->pitches[0]) |
532                 VP_IMG_VSIZE(fb->height));
533         /* chroma height has to reduced by 2 to avoid chroma distorions */
534         vp_reg_write(res, VP_IMG_SIZE_C, VP_IMG_HSIZE(fb->pitches[0]) |
535                 VP_IMG_VSIZE(fb->height / 2));
536
537         vp_reg_write(res, VP_SRC_WIDTH, state->src.w);
538         vp_reg_write(res, VP_SRC_HEIGHT, state->src.h);
539         vp_reg_write(res, VP_SRC_H_POSITION,
540                         VP_SRC_H_POSITION_VAL(state->src.x));
541         vp_reg_write(res, VP_SRC_V_POSITION, state->src.y);
542
543         vp_reg_write(res, VP_DST_WIDTH, state->crtc.w);
544         vp_reg_write(res, VP_DST_H_POSITION, state->crtc.x);
545         if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) {
546                 vp_reg_write(res, VP_DST_HEIGHT, state->crtc.h / 2);
547                 vp_reg_write(res, VP_DST_V_POSITION, state->crtc.y / 2);
548         } else {
549                 vp_reg_write(res, VP_DST_HEIGHT, state->crtc.h);
550                 vp_reg_write(res, VP_DST_V_POSITION, state->crtc.y);
551         }
552
553         vp_reg_write(res, VP_H_RATIO, state->h_ratio);
554         vp_reg_write(res, VP_V_RATIO, state->v_ratio);
555
556         vp_reg_write(res, VP_ENDIAN_MODE, VP_ENDIAN_MODE_LITTLE);
557
558         /* set buffer address to vp */
559         vp_reg_write(res, VP_TOP_Y_PTR, luma_addr[0]);
560         vp_reg_write(res, VP_BOT_Y_PTR, luma_addr[1]);
561         vp_reg_write(res, VP_TOP_C_PTR, chroma_addr[0]);
562         vp_reg_write(res, VP_BOT_C_PTR, chroma_addr[1]);
563
564         mixer_cfg_scan(ctx, mode->vdisplay);
565         mixer_cfg_rgb_fmt(ctx, mode->vdisplay);
566         mixer_cfg_layer(ctx, plane->index, priority, true);
567         mixer_cfg_vp_blend(ctx);
568         mixer_run(ctx);
569
570         spin_unlock_irqrestore(&res->reg_slock, flags);
571
572         mixer_regs_dump(ctx);
573         vp_regs_dump(ctx);
574 }
575
576 static void mixer_layer_update(struct mixer_context *ctx)
577 {
578         struct mixer_resources *res = &ctx->mixer_res;
579
580         mixer_reg_writemask(res, MXR_CFG, ~0, MXR_CFG_LAYER_UPDATE);
581 }
582
583 static void mixer_graph_buffer(struct mixer_context *ctx,
584                                struct exynos_drm_plane *plane)
585 {
586         struct exynos_drm_plane_state *state =
587                                 to_exynos_plane_state(plane->base.state);
588         struct drm_display_mode *mode = &state->base.crtc->state->adjusted_mode;
589         struct mixer_resources *res = &ctx->mixer_res;
590         struct drm_framebuffer *fb = state->base.fb;
591         unsigned int priority = state->base.normalized_zpos + 1;
592         unsigned long flags;
593         unsigned int win = plane->index;
594         unsigned int x_ratio = 0, y_ratio = 0;
595         unsigned int src_x_offset, src_y_offset, dst_x_offset, dst_y_offset;
596         dma_addr_t dma_addr;
597         unsigned int fmt;
598         u32 val;
599
600         switch (fb->pixel_format) {
601         case DRM_FORMAT_XRGB4444:
602         case DRM_FORMAT_ARGB4444:
603                 fmt = MXR_FORMAT_ARGB4444;
604                 break;
605
606         case DRM_FORMAT_XRGB1555:
607         case DRM_FORMAT_ARGB1555:
608                 fmt = MXR_FORMAT_ARGB1555;
609                 break;
610
611         case DRM_FORMAT_RGB565:
612                 fmt = MXR_FORMAT_RGB565;
613                 break;
614
615         case DRM_FORMAT_XRGB8888:
616         case DRM_FORMAT_ARGB8888:
617                 fmt = MXR_FORMAT_ARGB8888;
618                 break;
619
620         default:
621                 DRM_DEBUG_KMS("pixelformat unsupported by mixer\n");
622                 return;
623         }
624
625         /* ratio is already checked by common plane code */
626         x_ratio = state->h_ratio == (1 << 15);
627         y_ratio = state->v_ratio == (1 << 15);
628
629         dst_x_offset = state->crtc.x;
630         dst_y_offset = state->crtc.y;
631
632         /* converting dma address base and source offset */
633         dma_addr = exynos_drm_fb_dma_addr(fb, 0)
634                 + (state->src.x * fb->bits_per_pixel >> 3)
635                 + (state->src.y * fb->pitches[0]);
636         src_x_offset = 0;
637         src_y_offset = 0;
638
639         if (mode->flags & DRM_MODE_FLAG_INTERLACE)
640                 __set_bit(MXR_BIT_INTERLACE, &ctx->flags);
641         else
642                 __clear_bit(MXR_BIT_INTERLACE, &ctx->flags);
643
644         spin_lock_irqsave(&res->reg_slock, flags);
645
646         /* setup format */
647         mixer_reg_writemask(res, MXR_GRAPHIC_CFG(win),
648                 MXR_GRP_CFG_FORMAT_VAL(fmt), MXR_GRP_CFG_FORMAT_MASK);
649
650         /* setup geometry */
651         mixer_reg_write(res, MXR_GRAPHIC_SPAN(win),
652                         fb->pitches[0] / (fb->bits_per_pixel >> 3));
653
654         /* setup display size */
655         if (ctx->mxr_ver == MXR_VER_128_0_0_184 &&
656                 win == DEFAULT_WIN) {
657                 val  = MXR_MXR_RES_HEIGHT(mode->vdisplay);
658                 val |= MXR_MXR_RES_WIDTH(mode->hdisplay);
659                 mixer_reg_write(res, MXR_RESOLUTION, val);
660         }
661
662         val  = MXR_GRP_WH_WIDTH(state->src.w);
663         val |= MXR_GRP_WH_HEIGHT(state->src.h);
664         val |= MXR_GRP_WH_H_SCALE(x_ratio);
665         val |= MXR_GRP_WH_V_SCALE(y_ratio);
666         mixer_reg_write(res, MXR_GRAPHIC_WH(win), val);
667
668         /* setup offsets in source image */
669         val  = MXR_GRP_SXY_SX(src_x_offset);
670         val |= MXR_GRP_SXY_SY(src_y_offset);
671         mixer_reg_write(res, MXR_GRAPHIC_SXY(win), val);
672
673         /* setup offsets in display image */
674         val  = MXR_GRP_DXY_DX(dst_x_offset);
675         val |= MXR_GRP_DXY_DY(dst_y_offset);
676         mixer_reg_write(res, MXR_GRAPHIC_DXY(win), val);
677
678         /* set buffer address to mixer */
679         mixer_reg_write(res, MXR_GRAPHIC_BASE(win), dma_addr);
680
681         mixer_cfg_scan(ctx, mode->vdisplay);
682         mixer_cfg_rgb_fmt(ctx, mode->vdisplay);
683         mixer_cfg_layer(ctx, win, priority, true);
684         mixer_cfg_gfx_blend(ctx, win, is_alpha_format(fb->pixel_format));
685
686         /* layer update mandatory for mixer 16.0.33.0 */
687         if (ctx->mxr_ver == MXR_VER_16_0_33_0 ||
688                 ctx->mxr_ver == MXR_VER_128_0_0_184)
689                 mixer_layer_update(ctx);
690
691         mixer_run(ctx);
692
693         spin_unlock_irqrestore(&res->reg_slock, flags);
694
695         mixer_regs_dump(ctx);
696 }
697
698 static void vp_win_reset(struct mixer_context *ctx)
699 {
700         struct mixer_resources *res = &ctx->mixer_res;
701         unsigned int tries = 100;
702
703         vp_reg_write(res, VP_SRESET, VP_SRESET_PROCESSING);
704         while (tries--) {
705                 /* waiting until VP_SRESET_PROCESSING is 0 */
706                 if (~vp_reg_read(res, VP_SRESET) & VP_SRESET_PROCESSING)
707                         break;
708                 mdelay(10);
709         }
710         WARN(tries == 0, "failed to reset Video Processor\n");
711 }
712
713 static void mixer_win_reset(struct mixer_context *ctx)
714 {
715         struct mixer_resources *res = &ctx->mixer_res;
716         unsigned long flags;
717
718         spin_lock_irqsave(&res->reg_slock, flags);
719
720         mixer_reg_writemask(res, MXR_CFG, MXR_CFG_DST_HDMI, MXR_CFG_DST_MASK);
721
722         /* set output in RGB888 mode */
723         mixer_reg_writemask(res, MXR_CFG, MXR_CFG_OUT_RGB888, MXR_CFG_OUT_MASK);
724
725         /* 16 beat burst in DMA */
726         mixer_reg_writemask(res, MXR_STATUS, MXR_STATUS_16_BURST,
727                 MXR_STATUS_BURST_MASK);
728
729         /* reset default layer priority */
730         mixer_reg_write(res, MXR_LAYER_CFG, 0);
731
732         /* setting background color */
733         mixer_reg_write(res, MXR_BG_COLOR0, 0x008080);
734         mixer_reg_write(res, MXR_BG_COLOR1, 0x008080);
735         mixer_reg_write(res, MXR_BG_COLOR2, 0x008080);
736
737         if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) {
738                 /* configuration of Video Processor Registers */
739                 vp_win_reset(ctx);
740                 vp_default_filter(res);
741         }
742
743         /* disable all layers */
744         mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_GRP0_ENABLE);
745         mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_GRP1_ENABLE);
746         if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags))
747                 mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_VP_ENABLE);
748
749         spin_unlock_irqrestore(&res->reg_slock, flags);
750 }
751
752 static irqreturn_t mixer_irq_handler(int irq, void *arg)
753 {
754         struct mixer_context *ctx = arg;
755         struct mixer_resources *res = &ctx->mixer_res;
756         u32 val, base, shadow;
757
758         spin_lock(&res->reg_slock);
759
760         /* read interrupt status for handling and clearing flags for VSYNC */
761         val = mixer_reg_read(res, MXR_INT_STATUS);
762
763         /* handling VSYNC */
764         if (val & MXR_INT_STATUS_VSYNC) {
765                 /* vsync interrupt use different bit for read and clear */
766                 val |= MXR_INT_CLEAR_VSYNC;
767                 val &= ~MXR_INT_STATUS_VSYNC;
768
769                 /* interlace scan need to check shadow register */
770                 if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) {
771                         base = mixer_reg_read(res, MXR_GRAPHIC_BASE(0));
772                         shadow = mixer_reg_read(res, MXR_GRAPHIC_BASE_S(0));
773                         if (base != shadow)
774                                 goto out;
775
776                         base = mixer_reg_read(res, MXR_GRAPHIC_BASE(1));
777                         shadow = mixer_reg_read(res, MXR_GRAPHIC_BASE_S(1));
778                         if (base != shadow)
779                                 goto out;
780                 }
781
782                 drm_crtc_handle_vblank(&ctx->crtc->base);
783         }
784
785 out:
786         /* clear interrupts */
787         mixer_reg_write(res, MXR_INT_STATUS, val);
788
789         spin_unlock(&res->reg_slock);
790
791         return IRQ_HANDLED;
792 }
793
794 static int mixer_resources_init(struct mixer_context *mixer_ctx)
795 {
796         struct device *dev = &mixer_ctx->pdev->dev;
797         struct mixer_resources *mixer_res = &mixer_ctx->mixer_res;
798         struct resource *res;
799         int ret;
800
801         spin_lock_init(&mixer_res->reg_slock);
802
803         mixer_res->mixer = devm_clk_get(dev, "mixer");
804         if (IS_ERR(mixer_res->mixer)) {
805                 dev_err(dev, "failed to get clock 'mixer'\n");
806                 return -ENODEV;
807         }
808
809         mixer_res->hdmi = devm_clk_get(dev, "hdmi");
810         if (IS_ERR(mixer_res->hdmi)) {
811                 dev_err(dev, "failed to get clock 'hdmi'\n");
812                 return PTR_ERR(mixer_res->hdmi);
813         }
814
815         mixer_res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi");
816         if (IS_ERR(mixer_res->sclk_hdmi)) {
817                 dev_err(dev, "failed to get clock 'sclk_hdmi'\n");
818                 return -ENODEV;
819         }
820         res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_MEM, 0);
821         if (res == NULL) {
822                 dev_err(dev, "get memory resource failed.\n");
823                 return -ENXIO;
824         }
825
826         mixer_res->mixer_regs = devm_ioremap(dev, res->start,
827                                                         resource_size(res));
828         if (mixer_res->mixer_regs == NULL) {
829                 dev_err(dev, "register mapping failed.\n");
830                 return -ENXIO;
831         }
832
833         res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_IRQ, 0);
834         if (res == NULL) {
835                 dev_err(dev, "get interrupt resource failed.\n");
836                 return -ENXIO;
837         }
838
839         ret = devm_request_irq(dev, res->start, mixer_irq_handler,
840                                                 0, "drm_mixer", mixer_ctx);
841         if (ret) {
842                 dev_err(dev, "request interrupt failed.\n");
843                 return ret;
844         }
845         mixer_res->irq = res->start;
846
847         return 0;
848 }
849
850 static int vp_resources_init(struct mixer_context *mixer_ctx)
851 {
852         struct device *dev = &mixer_ctx->pdev->dev;
853         struct mixer_resources *mixer_res = &mixer_ctx->mixer_res;
854         struct resource *res;
855
856         mixer_res->vp = devm_clk_get(dev, "vp");
857         if (IS_ERR(mixer_res->vp)) {
858                 dev_err(dev, "failed to get clock 'vp'\n");
859                 return -ENODEV;
860         }
861
862         if (test_bit(MXR_BIT_HAS_SCLK, &mixer_ctx->flags)) {
863                 mixer_res->sclk_mixer = devm_clk_get(dev, "sclk_mixer");
864                 if (IS_ERR(mixer_res->sclk_mixer)) {
865                         dev_err(dev, "failed to get clock 'sclk_mixer'\n");
866                         return -ENODEV;
867                 }
868                 mixer_res->mout_mixer = devm_clk_get(dev, "mout_mixer");
869                 if (IS_ERR(mixer_res->mout_mixer)) {
870                         dev_err(dev, "failed to get clock 'mout_mixer'\n");
871                         return -ENODEV;
872                 }
873
874                 if (mixer_res->sclk_hdmi && mixer_res->mout_mixer)
875                         clk_set_parent(mixer_res->mout_mixer,
876                                        mixer_res->sclk_hdmi);
877         }
878
879         res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_MEM, 1);
880         if (res == NULL) {
881                 dev_err(dev, "get memory resource failed.\n");
882                 return -ENXIO;
883         }
884
885         mixer_res->vp_regs = devm_ioremap(dev, res->start,
886                                                         resource_size(res));
887         if (mixer_res->vp_regs == NULL) {
888                 dev_err(dev, "register mapping failed.\n");
889                 return -ENXIO;
890         }
891
892         return 0;
893 }
894
895 static int mixer_initialize(struct mixer_context *mixer_ctx,
896                         struct drm_device *drm_dev)
897 {
898         int ret;
899         struct exynos_drm_private *priv;
900         priv = drm_dev->dev_private;
901
902         mixer_ctx->drm_dev = drm_dev;
903         mixer_ctx->pipe = priv->pipe++;
904
905         /* acquire resources: regs, irqs, clocks */
906         ret = mixer_resources_init(mixer_ctx);
907         if (ret) {
908                 DRM_ERROR("mixer_resources_init failed ret=%d\n", ret);
909                 return ret;
910         }
911
912         if (test_bit(MXR_BIT_VP_ENABLED, &mixer_ctx->flags)) {
913                 /* acquire vp resources: regs, irqs, clocks */
914                 ret = vp_resources_init(mixer_ctx);
915                 if (ret) {
916                         DRM_ERROR("vp_resources_init failed ret=%d\n", ret);
917                         return ret;
918                 }
919         }
920
921         ret = drm_iommu_attach_device(drm_dev, mixer_ctx->dev);
922         if (ret)
923                 priv->pipe--;
924
925         return ret;
926 }
927
928 static void mixer_ctx_remove(struct mixer_context *mixer_ctx)
929 {
930         drm_iommu_detach_device(mixer_ctx->drm_dev, mixer_ctx->dev);
931 }
932
933 static int mixer_enable_vblank(struct exynos_drm_crtc *crtc)
934 {
935         struct mixer_context *mixer_ctx = crtc->ctx;
936         struct mixer_resources *res = &mixer_ctx->mixer_res;
937
938         __set_bit(MXR_BIT_VSYNC, &mixer_ctx->flags);
939         if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
940                 return 0;
941
942         /* enable vsync interrupt */
943         mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC);
944         mixer_reg_writemask(res, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC);
945
946         return 0;
947 }
948
949 static void mixer_disable_vblank(struct exynos_drm_crtc *crtc)
950 {
951         struct mixer_context *mixer_ctx = crtc->ctx;
952         struct mixer_resources *res = &mixer_ctx->mixer_res;
953
954         __clear_bit(MXR_BIT_VSYNC, &mixer_ctx->flags);
955
956         if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
957                 return;
958
959         /* disable vsync interrupt */
960         mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC);
961         mixer_reg_writemask(res, MXR_INT_EN, 0, MXR_INT_EN_VSYNC);
962 }
963
964 static void mixer_atomic_begin(struct exynos_drm_crtc *crtc)
965 {
966         struct mixer_context *mixer_ctx = crtc->ctx;
967
968         if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
969                 return;
970
971         mixer_vsync_set_update(mixer_ctx, false);
972 }
973
974 static void mixer_update_plane(struct exynos_drm_crtc *crtc,
975                                struct exynos_drm_plane *plane)
976 {
977         struct mixer_context *mixer_ctx = crtc->ctx;
978
979         DRM_DEBUG_KMS("win: %d\n", plane->index);
980
981         if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
982                 return;
983
984         if (plane->index == VP_DEFAULT_WIN)
985                 vp_video_buffer(mixer_ctx, plane);
986         else
987                 mixer_graph_buffer(mixer_ctx, plane);
988 }
989
990 static void mixer_disable_plane(struct exynos_drm_crtc *crtc,
991                                 struct exynos_drm_plane *plane)
992 {
993         struct mixer_context *mixer_ctx = crtc->ctx;
994         struct mixer_resources *res = &mixer_ctx->mixer_res;
995         unsigned long flags;
996
997         DRM_DEBUG_KMS("win: %d\n", plane->index);
998
999         if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
1000                 return;
1001
1002         spin_lock_irqsave(&res->reg_slock, flags);
1003         mixer_cfg_layer(mixer_ctx, plane->index, 0, false);
1004         spin_unlock_irqrestore(&res->reg_slock, flags);
1005 }
1006
1007 static void mixer_atomic_flush(struct exynos_drm_crtc *crtc)
1008 {
1009         struct mixer_context *mixer_ctx = crtc->ctx;
1010
1011         if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
1012                 return;
1013
1014         mixer_vsync_set_update(mixer_ctx, true);
1015 }
1016
1017 static void mixer_enable(struct exynos_drm_crtc *crtc)
1018 {
1019         struct mixer_context *ctx = crtc->ctx;
1020         struct mixer_resources *res = &ctx->mixer_res;
1021
1022         if (test_bit(MXR_BIT_POWERED, &ctx->flags))
1023                 return;
1024
1025         pm_runtime_get_sync(ctx->dev);
1026
1027         exynos_drm_pipe_clk_enable(crtc, true);
1028
1029         mixer_vsync_set_update(ctx, false);
1030
1031         mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_SOFT_RESET);
1032
1033         if (test_bit(MXR_BIT_VSYNC, &ctx->flags)) {
1034                 mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC);
1035                 mixer_reg_writemask(res, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC);
1036         }
1037         mixer_win_reset(ctx);
1038
1039         mixer_vsync_set_update(ctx, true);
1040
1041         set_bit(MXR_BIT_POWERED, &ctx->flags);
1042 }
1043
1044 static void mixer_disable(struct exynos_drm_crtc *crtc)
1045 {
1046         struct mixer_context *ctx = crtc->ctx;
1047         int i;
1048
1049         if (!test_bit(MXR_BIT_POWERED, &ctx->flags))
1050                 return;
1051
1052         mixer_stop(ctx);
1053         mixer_regs_dump(ctx);
1054
1055         for (i = 0; i < MIXER_WIN_NR; i++)
1056                 mixer_disable_plane(crtc, &ctx->planes[i]);
1057
1058         exynos_drm_pipe_clk_enable(crtc, false);
1059
1060         pm_runtime_put(ctx->dev);
1061
1062         clear_bit(MXR_BIT_POWERED, &ctx->flags);
1063 }
1064
1065 /* Only valid for Mixer version 16.0.33.0 */
1066 static int mixer_atomic_check(struct exynos_drm_crtc *crtc,
1067                        struct drm_crtc_state *state)
1068 {
1069         struct drm_display_mode *mode = &state->adjusted_mode;
1070         u32 w, h;
1071
1072         w = mode->hdisplay;
1073         h = mode->vdisplay;
1074
1075         DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d\n",
1076                 mode->hdisplay, mode->vdisplay, mode->vrefresh,
1077                 (mode->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1078
1079         if ((w >= 464 && w <= 720 && h >= 261 && h <= 576) ||
1080                 (w >= 1024 && w <= 1280 && h >= 576 && h <= 720) ||
1081                 (w >= 1664 && w <= 1920 && h >= 936 && h <= 1080))
1082                 return 0;
1083
1084         return -EINVAL;
1085 }
1086
1087 static const struct exynos_drm_crtc_ops mixer_crtc_ops = {
1088         .enable                 = mixer_enable,
1089         .disable                = mixer_disable,
1090         .enable_vblank          = mixer_enable_vblank,
1091         .disable_vblank         = mixer_disable_vblank,
1092         .atomic_begin           = mixer_atomic_begin,
1093         .update_plane           = mixer_update_plane,
1094         .disable_plane          = mixer_disable_plane,
1095         .atomic_flush           = mixer_atomic_flush,
1096         .atomic_check           = mixer_atomic_check,
1097 };
1098
1099 static struct mixer_drv_data exynos5420_mxr_drv_data = {
1100         .version = MXR_VER_128_0_0_184,
1101         .is_vp_enabled = 0,
1102 };
1103
1104 static struct mixer_drv_data exynos5250_mxr_drv_data = {
1105         .version = MXR_VER_16_0_33_0,
1106         .is_vp_enabled = 0,
1107 };
1108
1109 static struct mixer_drv_data exynos4212_mxr_drv_data = {
1110         .version = MXR_VER_0_0_0_16,
1111         .is_vp_enabled = 1,
1112 };
1113
1114 static struct mixer_drv_data exynos4210_mxr_drv_data = {
1115         .version = MXR_VER_0_0_0_16,
1116         .is_vp_enabled = 1,
1117         .has_sclk = 1,
1118 };
1119
1120 static struct of_device_id mixer_match_types[] = {
1121         {
1122                 .compatible = "samsung,exynos4210-mixer",
1123                 .data   = &exynos4210_mxr_drv_data,
1124         }, {
1125                 .compatible = "samsung,exynos4212-mixer",
1126                 .data   = &exynos4212_mxr_drv_data,
1127         }, {
1128                 .compatible = "samsung,exynos5-mixer",
1129                 .data   = &exynos5250_mxr_drv_data,
1130         }, {
1131                 .compatible = "samsung,exynos5250-mixer",
1132                 .data   = &exynos5250_mxr_drv_data,
1133         }, {
1134                 .compatible = "samsung,exynos5420-mixer",
1135                 .data   = &exynos5420_mxr_drv_data,
1136         }, {
1137                 /* end node */
1138         }
1139 };
1140 MODULE_DEVICE_TABLE(of, mixer_match_types);
1141
1142 static int mixer_bind(struct device *dev, struct device *manager, void *data)
1143 {
1144         struct mixer_context *ctx = dev_get_drvdata(dev);
1145         struct drm_device *drm_dev = data;
1146         struct exynos_drm_plane *exynos_plane;
1147         unsigned int i;
1148         int ret;
1149
1150         ret = mixer_initialize(ctx, drm_dev);
1151         if (ret)
1152                 return ret;
1153
1154         for (i = 0; i < MIXER_WIN_NR; i++) {
1155                 if (i == VP_DEFAULT_WIN && !test_bit(MXR_BIT_VP_ENABLED,
1156                                                      &ctx->flags))
1157                         continue;
1158
1159                 ret = exynos_plane_init(drm_dev, &ctx->planes[i], i,
1160                                         1 << ctx->pipe, &plane_configs[i]);
1161                 if (ret)
1162                         return ret;
1163         }
1164
1165         exynos_plane = &ctx->planes[DEFAULT_WIN];
1166         ctx->crtc = exynos_drm_crtc_create(drm_dev, &exynos_plane->base,
1167                                            ctx->pipe, EXYNOS_DISPLAY_TYPE_HDMI,
1168                                            &mixer_crtc_ops, ctx);
1169         if (IS_ERR(ctx->crtc)) {
1170                 mixer_ctx_remove(ctx);
1171                 ret = PTR_ERR(ctx->crtc);
1172                 goto free_ctx;
1173         }
1174
1175         return 0;
1176
1177 free_ctx:
1178         devm_kfree(dev, ctx);
1179         return ret;
1180 }
1181
1182 static void mixer_unbind(struct device *dev, struct device *master, void *data)
1183 {
1184         struct mixer_context *ctx = dev_get_drvdata(dev);
1185
1186         mixer_ctx_remove(ctx);
1187 }
1188
1189 static const struct component_ops mixer_component_ops = {
1190         .bind   = mixer_bind,
1191         .unbind = mixer_unbind,
1192 };
1193
1194 static int mixer_probe(struct platform_device *pdev)
1195 {
1196         struct device *dev = &pdev->dev;
1197         const struct mixer_drv_data *drv;
1198         struct mixer_context *ctx;
1199         int ret;
1200
1201         ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
1202         if (!ctx) {
1203                 DRM_ERROR("failed to alloc mixer context.\n");
1204                 return -ENOMEM;
1205         }
1206
1207         drv = of_device_get_match_data(dev);
1208
1209         ctx->pdev = pdev;
1210         ctx->dev = dev;
1211         ctx->mxr_ver = drv->version;
1212
1213         if (drv->is_vp_enabled)
1214                 __set_bit(MXR_BIT_VP_ENABLED, &ctx->flags);
1215         if (drv->has_sclk)
1216                 __set_bit(MXR_BIT_HAS_SCLK, &ctx->flags);
1217
1218         platform_set_drvdata(pdev, ctx);
1219
1220         ret = component_add(&pdev->dev, &mixer_component_ops);
1221         if (!ret)
1222                 pm_runtime_enable(dev);
1223
1224         return ret;
1225 }
1226
1227 static int mixer_remove(struct platform_device *pdev)
1228 {
1229         pm_runtime_disable(&pdev->dev);
1230
1231         component_del(&pdev->dev, &mixer_component_ops);
1232
1233         return 0;
1234 }
1235
1236 static int __maybe_unused exynos_mixer_suspend(struct device *dev)
1237 {
1238         struct mixer_context *ctx = dev_get_drvdata(dev);
1239         struct mixer_resources *res = &ctx->mixer_res;
1240
1241         clk_disable_unprepare(res->hdmi);
1242         clk_disable_unprepare(res->mixer);
1243         if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) {
1244                 clk_disable_unprepare(res->vp);
1245                 if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags))
1246                         clk_disable_unprepare(res->sclk_mixer);
1247         }
1248
1249         return 0;
1250 }
1251
1252 static int __maybe_unused exynos_mixer_resume(struct device *dev)
1253 {
1254         struct mixer_context *ctx = dev_get_drvdata(dev);
1255         struct mixer_resources *res = &ctx->mixer_res;
1256         int ret;
1257
1258         ret = clk_prepare_enable(res->mixer);
1259         if (ret < 0) {
1260                 DRM_ERROR("Failed to prepare_enable the mixer clk [%d]\n", ret);
1261                 return ret;
1262         }
1263         ret = clk_prepare_enable(res->hdmi);
1264         if (ret < 0) {
1265                 DRM_ERROR("Failed to prepare_enable the hdmi clk [%d]\n", ret);
1266                 return ret;
1267         }
1268         if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) {
1269                 ret = clk_prepare_enable(res->vp);
1270                 if (ret < 0) {
1271                         DRM_ERROR("Failed to prepare_enable the vp clk [%d]\n",
1272                                   ret);
1273                         return ret;
1274                 }
1275                 if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags)) {
1276                         ret = clk_prepare_enable(res->sclk_mixer);
1277                         if (ret < 0) {
1278                                 DRM_ERROR("Failed to prepare_enable the " \
1279                                            "sclk_mixer clk [%d]\n",
1280                                           ret);
1281                                 return ret;
1282                         }
1283                 }
1284         }
1285
1286         return 0;
1287 }
1288
1289 static const struct dev_pm_ops exynos_mixer_pm_ops = {
1290         SET_RUNTIME_PM_OPS(exynos_mixer_suspend, exynos_mixer_resume, NULL)
1291 };
1292
1293 struct platform_driver mixer_driver = {
1294         .driver = {
1295                 .name = "exynos-mixer",
1296                 .owner = THIS_MODULE,
1297                 .pm = &exynos_mixer_pm_ops,
1298                 .of_match_table = mixer_match_types,
1299         },
1300         .probe = mixer_probe,
1301         .remove = mixer_remove,
1302 };