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