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 };
77 
78 static const uint32_t mixer_formats[] = {
79 	DRM_FORMAT_XRGB4444,
80 	DRM_FORMAT_ARGB4444,
81 	DRM_FORMAT_XRGB1555,
82 	DRM_FORMAT_ARGB1555,
83 	DRM_FORMAT_RGB565,
84 	DRM_FORMAT_XRGB8888,
85 	DRM_FORMAT_ARGB8888,
86 };
87 
88 static const uint32_t vp_formats[] = {
89 	DRM_FORMAT_NV12,
90 	DRM_FORMAT_NV21,
91 };
92 
93 struct mixer_context {
94 	struct platform_device *pdev;
95 	struct device		*dev;
96 	struct drm_device	*drm_dev;
97 	struct exynos_drm_crtc	*crtc;
98 	struct exynos_drm_plane	planes[MIXER_WIN_NR];
99 	int			pipe;
100 	unsigned long		flags;
101 	bool			interlace;
102 	bool			vp_enabled;
103 	bool			has_sclk;
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 (ctx->vp_enabled)
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 = (ctx->interlace ? MXR_CFG_SCAN_INTERLACE :
361 				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 		break;
440 	case VP_DEFAULT_WIN:
441 		if (ctx->vp_enabled) {
442 			vp_reg_writemask(res, VP_ENABLE, val, VP_ENABLE_ON);
443 			mixer_reg_writemask(res, MXR_CFG, val,
444 				MXR_CFG_VP_ENABLE);
445 			mixer_reg_writemask(res, MXR_LAYER_CFG,
446 					    MXR_LAYER_CFG_VP_VAL(priority),
447 					    MXR_LAYER_CFG_VP_MASK);
448 		}
449 		break;
450 	}
451 }
452 
453 static void mixer_run(struct mixer_context *ctx)
454 {
455 	struct mixer_resources *res = &ctx->mixer_res;
456 
457 	mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_REG_RUN);
458 }
459 
460 static void mixer_stop(struct mixer_context *ctx)
461 {
462 	struct mixer_resources *res = &ctx->mixer_res;
463 	int timeout = 20;
464 
465 	mixer_reg_writemask(res, MXR_STATUS, 0, MXR_STATUS_REG_RUN);
466 
467 	while (!(mixer_reg_read(res, MXR_STATUS) & MXR_STATUS_REG_IDLE) &&
468 			--timeout)
469 		usleep_range(10000, 12000);
470 }
471 
472 static void vp_video_buffer(struct mixer_context *ctx,
473 			    struct exynos_drm_plane *plane)
474 {
475 	struct exynos_drm_plane_state *state =
476 				to_exynos_plane_state(plane->base.state);
477 	struct drm_display_mode *mode = &state->base.crtc->state->adjusted_mode;
478 	struct mixer_resources *res = &ctx->mixer_res;
479 	struct drm_framebuffer *fb = state->base.fb;
480 	unsigned int priority = state->base.normalized_zpos + 1;
481 	unsigned long flags;
482 	dma_addr_t luma_addr[2], chroma_addr[2];
483 	bool tiled_mode = false;
484 	bool crcb_mode = false;
485 	u32 val;
486 
487 	switch (fb->pixel_format) {
488 	case DRM_FORMAT_NV12:
489 		crcb_mode = false;
490 		break;
491 	case DRM_FORMAT_NV21:
492 		crcb_mode = true;
493 		break;
494 	default:
495 		DRM_ERROR("pixel format for vp is wrong [%d].\n",
496 				fb->pixel_format);
497 		return;
498 	}
499 
500 	luma_addr[0] = exynos_drm_fb_dma_addr(fb, 0);
501 	chroma_addr[0] = exynos_drm_fb_dma_addr(fb, 1);
502 
503 	if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
504 		ctx->interlace = true;
505 		if (tiled_mode) {
506 			luma_addr[1] = luma_addr[0] + 0x40;
507 			chroma_addr[1] = chroma_addr[0] + 0x40;
508 		} else {
509 			luma_addr[1] = luma_addr[0] + fb->pitches[0];
510 			chroma_addr[1] = chroma_addr[0] + fb->pitches[0];
511 		}
512 	} else {
513 		ctx->interlace = false;
514 		luma_addr[1] = 0;
515 		chroma_addr[1] = 0;
516 	}
517 
518 	spin_lock_irqsave(&res->reg_slock, flags);
519 
520 	/* interlace or progressive scan mode */
521 	val = (ctx->interlace ? ~0 : 0);
522 	vp_reg_writemask(res, VP_MODE, val, VP_MODE_LINE_SKIP);
523 
524 	/* setup format */
525 	val = (crcb_mode ? VP_MODE_NV21 : VP_MODE_NV12);
526 	val |= (tiled_mode ? VP_MODE_MEM_TILED : VP_MODE_MEM_LINEAR);
527 	vp_reg_writemask(res, VP_MODE, val, VP_MODE_FMT_MASK);
528 
529 	/* setting size of input image */
530 	vp_reg_write(res, VP_IMG_SIZE_Y, VP_IMG_HSIZE(fb->pitches[0]) |
531 		VP_IMG_VSIZE(fb->height));
532 	/* chroma height has to reduced by 2 to avoid chroma distorions */
533 	vp_reg_write(res, VP_IMG_SIZE_C, VP_IMG_HSIZE(fb->pitches[0]) |
534 		VP_IMG_VSIZE(fb->height / 2));
535 
536 	vp_reg_write(res, VP_SRC_WIDTH, state->src.w);
537 	vp_reg_write(res, VP_SRC_HEIGHT, state->src.h);
538 	vp_reg_write(res, VP_SRC_H_POSITION,
539 			VP_SRC_H_POSITION_VAL(state->src.x));
540 	vp_reg_write(res, VP_SRC_V_POSITION, state->src.y);
541 
542 	vp_reg_write(res, VP_DST_WIDTH, state->crtc.w);
543 	vp_reg_write(res, VP_DST_H_POSITION, state->crtc.x);
544 	if (ctx->interlace) {
545 		vp_reg_write(res, VP_DST_HEIGHT, state->crtc.h / 2);
546 		vp_reg_write(res, VP_DST_V_POSITION, state->crtc.y / 2);
547 	} else {
548 		vp_reg_write(res, VP_DST_HEIGHT, state->crtc.h);
549 		vp_reg_write(res, VP_DST_V_POSITION, state->crtc.y);
550 	}
551 
552 	vp_reg_write(res, VP_H_RATIO, state->h_ratio);
553 	vp_reg_write(res, VP_V_RATIO, state->v_ratio);
554 
555 	vp_reg_write(res, VP_ENDIAN_MODE, VP_ENDIAN_MODE_LITTLE);
556 
557 	/* set buffer address to vp */
558 	vp_reg_write(res, VP_TOP_Y_PTR, luma_addr[0]);
559 	vp_reg_write(res, VP_BOT_Y_PTR, luma_addr[1]);
560 	vp_reg_write(res, VP_TOP_C_PTR, chroma_addr[0]);
561 	vp_reg_write(res, VP_BOT_C_PTR, chroma_addr[1]);
562 
563 	mixer_cfg_scan(ctx, mode->vdisplay);
564 	mixer_cfg_rgb_fmt(ctx, mode->vdisplay);
565 	mixer_cfg_layer(ctx, plane->index, priority, true);
566 	mixer_cfg_vp_blend(ctx);
567 	mixer_run(ctx);
568 
569 	spin_unlock_irqrestore(&res->reg_slock, flags);
570 
571 	mixer_regs_dump(ctx);
572 	vp_regs_dump(ctx);
573 }
574 
575 static void mixer_layer_update(struct mixer_context *ctx)
576 {
577 	struct mixer_resources *res = &ctx->mixer_res;
578 
579 	mixer_reg_writemask(res, MXR_CFG, ~0, MXR_CFG_LAYER_UPDATE);
580 }
581 
582 static void mixer_graph_buffer(struct mixer_context *ctx,
583 			       struct exynos_drm_plane *plane)
584 {
585 	struct exynos_drm_plane_state *state =
586 				to_exynos_plane_state(plane->base.state);
587 	struct drm_display_mode *mode = &state->base.crtc->state->adjusted_mode;
588 	struct mixer_resources *res = &ctx->mixer_res;
589 	struct drm_framebuffer *fb = state->base.fb;
590 	unsigned int priority = state->base.normalized_zpos + 1;
591 	unsigned long flags;
592 	unsigned int win = plane->index;
593 	unsigned int x_ratio = 0, y_ratio = 0;
594 	unsigned int src_x_offset, src_y_offset, dst_x_offset, dst_y_offset;
595 	dma_addr_t dma_addr;
596 	unsigned int fmt;
597 	u32 val;
598 
599 	switch (fb->pixel_format) {
600 	case DRM_FORMAT_XRGB4444:
601 	case DRM_FORMAT_ARGB4444:
602 		fmt = MXR_FORMAT_ARGB4444;
603 		break;
604 
605 	case DRM_FORMAT_XRGB1555:
606 	case DRM_FORMAT_ARGB1555:
607 		fmt = MXR_FORMAT_ARGB1555;
608 		break;
609 
610 	case DRM_FORMAT_RGB565:
611 		fmt = MXR_FORMAT_RGB565;
612 		break;
613 
614 	case DRM_FORMAT_XRGB8888:
615 	case DRM_FORMAT_ARGB8888:
616 		fmt = MXR_FORMAT_ARGB8888;
617 		break;
618 
619 	default:
620 		DRM_DEBUG_KMS("pixelformat unsupported by mixer\n");
621 		return;
622 	}
623 
624 	/* ratio is already checked by common plane code */
625 	x_ratio = state->h_ratio == (1 << 15);
626 	y_ratio = state->v_ratio == (1 << 15);
627 
628 	dst_x_offset = state->crtc.x;
629 	dst_y_offset = state->crtc.y;
630 
631 	/* converting dma address base and source offset */
632 	dma_addr = exynos_drm_fb_dma_addr(fb, 0)
633 		+ (state->src.x * fb->bits_per_pixel >> 3)
634 		+ (state->src.y * fb->pitches[0]);
635 	src_x_offset = 0;
636 	src_y_offset = 0;
637 
638 	if (mode->flags & DRM_MODE_FLAG_INTERLACE)
639 		ctx->interlace = true;
640 	else
641 		ctx->interlace = false;
642 
643 	spin_lock_irqsave(&res->reg_slock, flags);
644 
645 	/* setup format */
646 	mixer_reg_writemask(res, MXR_GRAPHIC_CFG(win),
647 		MXR_GRP_CFG_FORMAT_VAL(fmt), MXR_GRP_CFG_FORMAT_MASK);
648 
649 	/* setup geometry */
650 	mixer_reg_write(res, MXR_GRAPHIC_SPAN(win),
651 			fb->pitches[0] / (fb->bits_per_pixel >> 3));
652 
653 	/* setup display size */
654 	if (ctx->mxr_ver == MXR_VER_128_0_0_184 &&
655 		win == DEFAULT_WIN) {
656 		val  = MXR_MXR_RES_HEIGHT(mode->vdisplay);
657 		val |= MXR_MXR_RES_WIDTH(mode->hdisplay);
658 		mixer_reg_write(res, MXR_RESOLUTION, val);
659 	}
660 
661 	val  = MXR_GRP_WH_WIDTH(state->src.w);
662 	val |= MXR_GRP_WH_HEIGHT(state->src.h);
663 	val |= MXR_GRP_WH_H_SCALE(x_ratio);
664 	val |= MXR_GRP_WH_V_SCALE(y_ratio);
665 	mixer_reg_write(res, MXR_GRAPHIC_WH(win), val);
666 
667 	/* setup offsets in source image */
668 	val  = MXR_GRP_SXY_SX(src_x_offset);
669 	val |= MXR_GRP_SXY_SY(src_y_offset);
670 	mixer_reg_write(res, MXR_GRAPHIC_SXY(win), val);
671 
672 	/* setup offsets in display image */
673 	val  = MXR_GRP_DXY_DX(dst_x_offset);
674 	val |= MXR_GRP_DXY_DY(dst_y_offset);
675 	mixer_reg_write(res, MXR_GRAPHIC_DXY(win), val);
676 
677 	/* set buffer address to mixer */
678 	mixer_reg_write(res, MXR_GRAPHIC_BASE(win), dma_addr);
679 
680 	mixer_cfg_scan(ctx, mode->vdisplay);
681 	mixer_cfg_rgb_fmt(ctx, mode->vdisplay);
682 	mixer_cfg_layer(ctx, win, priority, true);
683 	mixer_cfg_gfx_blend(ctx, win, is_alpha_format(fb->pixel_format));
684 
685 	/* layer update mandatory for mixer 16.0.33.0 */
686 	if (ctx->mxr_ver == MXR_VER_16_0_33_0 ||
687 		ctx->mxr_ver == MXR_VER_128_0_0_184)
688 		mixer_layer_update(ctx);
689 
690 	mixer_run(ctx);
691 
692 	spin_unlock_irqrestore(&res->reg_slock, flags);
693 
694 	mixer_regs_dump(ctx);
695 }
696 
697 static void vp_win_reset(struct mixer_context *ctx)
698 {
699 	struct mixer_resources *res = &ctx->mixer_res;
700 	int tries = 100;
701 
702 	vp_reg_write(res, VP_SRESET, VP_SRESET_PROCESSING);
703 	for (tries = 100; tries; --tries) {
704 		/* waiting until VP_SRESET_PROCESSING is 0 */
705 		if (~vp_reg_read(res, VP_SRESET) & VP_SRESET_PROCESSING)
706 			break;
707 		mdelay(10);
708 	}
709 	WARN(tries == 0, "failed to reset Video Processor\n");
710 }
711 
712 static void mixer_win_reset(struct mixer_context *ctx)
713 {
714 	struct mixer_resources *res = &ctx->mixer_res;
715 	unsigned long flags;
716 
717 	spin_lock_irqsave(&res->reg_slock, flags);
718 
719 	mixer_reg_writemask(res, MXR_CFG, MXR_CFG_DST_HDMI, MXR_CFG_DST_MASK);
720 
721 	/* set output in RGB888 mode */
722 	mixer_reg_writemask(res, MXR_CFG, MXR_CFG_OUT_RGB888, MXR_CFG_OUT_MASK);
723 
724 	/* 16 beat burst in DMA */
725 	mixer_reg_writemask(res, MXR_STATUS, MXR_STATUS_16_BURST,
726 		MXR_STATUS_BURST_MASK);
727 
728 	/* reset default layer priority */
729 	mixer_reg_write(res, MXR_LAYER_CFG, 0);
730 
731 	/* setting background color */
732 	mixer_reg_write(res, MXR_BG_COLOR0, 0x008080);
733 	mixer_reg_write(res, MXR_BG_COLOR1, 0x008080);
734 	mixer_reg_write(res, MXR_BG_COLOR2, 0x008080);
735 
736 	if (ctx->vp_enabled) {
737 		/* configuration of Video Processor Registers */
738 		vp_win_reset(ctx);
739 		vp_default_filter(res);
740 	}
741 
742 	/* disable all layers */
743 	mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_GRP0_ENABLE);
744 	mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_GRP1_ENABLE);
745 	if (ctx->vp_enabled)
746 		mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_VP_ENABLE);
747 
748 	spin_unlock_irqrestore(&res->reg_slock, flags);
749 }
750 
751 static irqreturn_t mixer_irq_handler(int irq, void *arg)
752 {
753 	struct mixer_context *ctx = arg;
754 	struct mixer_resources *res = &ctx->mixer_res;
755 	u32 val, base, shadow;
756 	int win;
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 (ctx->interlace) {
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 		for (win = 0 ; win < MIXER_WIN_NR ; win++) {
784 			struct exynos_drm_plane *plane = &ctx->planes[win];
785 
786 			if (!plane->pending_fb)
787 				continue;
788 
789 			exynos_drm_crtc_finish_update(ctx->crtc, plane);
790 		}
791 	}
792 
793 out:
794 	/* clear interrupts */
795 	mixer_reg_write(res, MXR_INT_STATUS, val);
796 
797 	spin_unlock(&res->reg_slock);
798 
799 	return IRQ_HANDLED;
800 }
801 
802 static int mixer_resources_init(struct mixer_context *mixer_ctx)
803 {
804 	struct device *dev = &mixer_ctx->pdev->dev;
805 	struct mixer_resources *mixer_res = &mixer_ctx->mixer_res;
806 	struct resource *res;
807 	int ret;
808 
809 	spin_lock_init(&mixer_res->reg_slock);
810 
811 	mixer_res->mixer = devm_clk_get(dev, "mixer");
812 	if (IS_ERR(mixer_res->mixer)) {
813 		dev_err(dev, "failed to get clock 'mixer'\n");
814 		return -ENODEV;
815 	}
816 
817 	mixer_res->hdmi = devm_clk_get(dev, "hdmi");
818 	if (IS_ERR(mixer_res->hdmi)) {
819 		dev_err(dev, "failed to get clock 'hdmi'\n");
820 		return PTR_ERR(mixer_res->hdmi);
821 	}
822 
823 	mixer_res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi");
824 	if (IS_ERR(mixer_res->sclk_hdmi)) {
825 		dev_err(dev, "failed to get clock 'sclk_hdmi'\n");
826 		return -ENODEV;
827 	}
828 	res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_MEM, 0);
829 	if (res == NULL) {
830 		dev_err(dev, "get memory resource failed.\n");
831 		return -ENXIO;
832 	}
833 
834 	mixer_res->mixer_regs = devm_ioremap(dev, res->start,
835 							resource_size(res));
836 	if (mixer_res->mixer_regs == NULL) {
837 		dev_err(dev, "register mapping failed.\n");
838 		return -ENXIO;
839 	}
840 
841 	res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_IRQ, 0);
842 	if (res == NULL) {
843 		dev_err(dev, "get interrupt resource failed.\n");
844 		return -ENXIO;
845 	}
846 
847 	ret = devm_request_irq(dev, res->start, mixer_irq_handler,
848 						0, "drm_mixer", mixer_ctx);
849 	if (ret) {
850 		dev_err(dev, "request interrupt failed.\n");
851 		return ret;
852 	}
853 	mixer_res->irq = res->start;
854 
855 	return 0;
856 }
857 
858 static int vp_resources_init(struct mixer_context *mixer_ctx)
859 {
860 	struct device *dev = &mixer_ctx->pdev->dev;
861 	struct mixer_resources *mixer_res = &mixer_ctx->mixer_res;
862 	struct resource *res;
863 
864 	mixer_res->vp = devm_clk_get(dev, "vp");
865 	if (IS_ERR(mixer_res->vp)) {
866 		dev_err(dev, "failed to get clock 'vp'\n");
867 		return -ENODEV;
868 	}
869 
870 	if (mixer_ctx->has_sclk) {
871 		mixer_res->sclk_mixer = devm_clk_get(dev, "sclk_mixer");
872 		if (IS_ERR(mixer_res->sclk_mixer)) {
873 			dev_err(dev, "failed to get clock 'sclk_mixer'\n");
874 			return -ENODEV;
875 		}
876 		mixer_res->mout_mixer = devm_clk_get(dev, "mout_mixer");
877 		if (IS_ERR(mixer_res->mout_mixer)) {
878 			dev_err(dev, "failed to get clock 'mout_mixer'\n");
879 			return -ENODEV;
880 		}
881 
882 		if (mixer_res->sclk_hdmi && mixer_res->mout_mixer)
883 			clk_set_parent(mixer_res->mout_mixer,
884 				       mixer_res->sclk_hdmi);
885 	}
886 
887 	res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_MEM, 1);
888 	if (res == NULL) {
889 		dev_err(dev, "get memory resource failed.\n");
890 		return -ENXIO;
891 	}
892 
893 	mixer_res->vp_regs = devm_ioremap(dev, res->start,
894 							resource_size(res));
895 	if (mixer_res->vp_regs == NULL) {
896 		dev_err(dev, "register mapping failed.\n");
897 		return -ENXIO;
898 	}
899 
900 	return 0;
901 }
902 
903 static int mixer_initialize(struct mixer_context *mixer_ctx,
904 			struct drm_device *drm_dev)
905 {
906 	int ret;
907 	struct exynos_drm_private *priv;
908 	priv = drm_dev->dev_private;
909 
910 	mixer_ctx->drm_dev = drm_dev;
911 	mixer_ctx->pipe = priv->pipe++;
912 
913 	/* acquire resources: regs, irqs, clocks */
914 	ret = mixer_resources_init(mixer_ctx);
915 	if (ret) {
916 		DRM_ERROR("mixer_resources_init failed ret=%d\n", ret);
917 		return ret;
918 	}
919 
920 	if (mixer_ctx->vp_enabled) {
921 		/* acquire vp resources: regs, irqs, clocks */
922 		ret = vp_resources_init(mixer_ctx);
923 		if (ret) {
924 			DRM_ERROR("vp_resources_init failed ret=%d\n", ret);
925 			return ret;
926 		}
927 	}
928 
929 	ret = drm_iommu_attach_device(drm_dev, mixer_ctx->dev);
930 	if (ret)
931 		priv->pipe--;
932 
933 	return ret;
934 }
935 
936 static void mixer_ctx_remove(struct mixer_context *mixer_ctx)
937 {
938 	drm_iommu_detach_device(mixer_ctx->drm_dev, mixer_ctx->dev);
939 }
940 
941 static int mixer_enable_vblank(struct exynos_drm_crtc *crtc)
942 {
943 	struct mixer_context *mixer_ctx = crtc->ctx;
944 	struct mixer_resources *res = &mixer_ctx->mixer_res;
945 
946 	__set_bit(MXR_BIT_VSYNC, &mixer_ctx->flags);
947 	if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
948 		return 0;
949 
950 	/* enable vsync interrupt */
951 	mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC);
952 	mixer_reg_writemask(res, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC);
953 
954 	return 0;
955 }
956 
957 static void mixer_disable_vblank(struct exynos_drm_crtc *crtc)
958 {
959 	struct mixer_context *mixer_ctx = crtc->ctx;
960 	struct mixer_resources *res = &mixer_ctx->mixer_res;
961 
962 	__clear_bit(MXR_BIT_VSYNC, &mixer_ctx->flags);
963 
964 	if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
965 		return;
966 
967 	/* disable vsync interrupt */
968 	mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC);
969 	mixer_reg_writemask(res, MXR_INT_EN, 0, MXR_INT_EN_VSYNC);
970 }
971 
972 static void mixer_atomic_begin(struct exynos_drm_crtc *crtc)
973 {
974 	struct mixer_context *mixer_ctx = crtc->ctx;
975 
976 	if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
977 		return;
978 
979 	mixer_vsync_set_update(mixer_ctx, false);
980 }
981 
982 static void mixer_update_plane(struct exynos_drm_crtc *crtc,
983 			       struct exynos_drm_plane *plane)
984 {
985 	struct mixer_context *mixer_ctx = crtc->ctx;
986 
987 	DRM_DEBUG_KMS("win: %d\n", plane->index);
988 
989 	if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
990 		return;
991 
992 	if (plane->index == VP_DEFAULT_WIN)
993 		vp_video_buffer(mixer_ctx, plane);
994 	else
995 		mixer_graph_buffer(mixer_ctx, plane);
996 }
997 
998 static void mixer_disable_plane(struct exynos_drm_crtc *crtc,
999 				struct exynos_drm_plane *plane)
1000 {
1001 	struct mixer_context *mixer_ctx = crtc->ctx;
1002 	struct mixer_resources *res = &mixer_ctx->mixer_res;
1003 	unsigned long flags;
1004 
1005 	DRM_DEBUG_KMS("win: %d\n", plane->index);
1006 
1007 	if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
1008 		return;
1009 
1010 	spin_lock_irqsave(&res->reg_slock, flags);
1011 	mixer_cfg_layer(mixer_ctx, plane->index, 0, false);
1012 	spin_unlock_irqrestore(&res->reg_slock, flags);
1013 }
1014 
1015 static void mixer_atomic_flush(struct exynos_drm_crtc *crtc)
1016 {
1017 	struct mixer_context *mixer_ctx = crtc->ctx;
1018 
1019 	if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags))
1020 		return;
1021 
1022 	mixer_vsync_set_update(mixer_ctx, true);
1023 }
1024 
1025 static void mixer_enable(struct exynos_drm_crtc *crtc)
1026 {
1027 	struct mixer_context *ctx = crtc->ctx;
1028 	struct mixer_resources *res = &ctx->mixer_res;
1029 
1030 	if (test_bit(MXR_BIT_POWERED, &ctx->flags))
1031 		return;
1032 
1033 	pm_runtime_get_sync(ctx->dev);
1034 
1035 	exynos_drm_pipe_clk_enable(crtc, true);
1036 
1037 	mixer_vsync_set_update(ctx, false);
1038 
1039 	mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_SOFT_RESET);
1040 
1041 	if (test_bit(MXR_BIT_VSYNC, &ctx->flags)) {
1042 		mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC);
1043 		mixer_reg_writemask(res, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC);
1044 	}
1045 	mixer_win_reset(ctx);
1046 
1047 	mixer_vsync_set_update(ctx, true);
1048 
1049 	set_bit(MXR_BIT_POWERED, &ctx->flags);
1050 }
1051 
1052 static void mixer_disable(struct exynos_drm_crtc *crtc)
1053 {
1054 	struct mixer_context *ctx = crtc->ctx;
1055 	int i;
1056 
1057 	if (!test_bit(MXR_BIT_POWERED, &ctx->flags))
1058 		return;
1059 
1060 	mixer_stop(ctx);
1061 	mixer_regs_dump(ctx);
1062 
1063 	for (i = 0; i < MIXER_WIN_NR; i++)
1064 		mixer_disable_plane(crtc, &ctx->planes[i]);
1065 
1066 	exynos_drm_pipe_clk_enable(crtc, false);
1067 
1068 	pm_runtime_put(ctx->dev);
1069 
1070 	clear_bit(MXR_BIT_POWERED, &ctx->flags);
1071 }
1072 
1073 /* Only valid for Mixer version 16.0.33.0 */
1074 static int mixer_atomic_check(struct exynos_drm_crtc *crtc,
1075 		       struct drm_crtc_state *state)
1076 {
1077 	struct drm_display_mode *mode = &state->adjusted_mode;
1078 	u32 w, h;
1079 
1080 	w = mode->hdisplay;
1081 	h = mode->vdisplay;
1082 
1083 	DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d\n",
1084 		mode->hdisplay, mode->vdisplay, mode->vrefresh,
1085 		(mode->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1086 
1087 	if ((w >= 464 && w <= 720 && h >= 261 && h <= 576) ||
1088 		(w >= 1024 && w <= 1280 && h >= 576 && h <= 720) ||
1089 		(w >= 1664 && w <= 1920 && h >= 936 && h <= 1080))
1090 		return 0;
1091 
1092 	return -EINVAL;
1093 }
1094 
1095 static const struct exynos_drm_crtc_ops mixer_crtc_ops = {
1096 	.enable			= mixer_enable,
1097 	.disable		= mixer_disable,
1098 	.enable_vblank		= mixer_enable_vblank,
1099 	.disable_vblank		= mixer_disable_vblank,
1100 	.atomic_begin		= mixer_atomic_begin,
1101 	.update_plane		= mixer_update_plane,
1102 	.disable_plane		= mixer_disable_plane,
1103 	.atomic_flush		= mixer_atomic_flush,
1104 	.atomic_check		= mixer_atomic_check,
1105 };
1106 
1107 static struct mixer_drv_data exynos5420_mxr_drv_data = {
1108 	.version = MXR_VER_128_0_0_184,
1109 	.is_vp_enabled = 0,
1110 };
1111 
1112 static struct mixer_drv_data exynos5250_mxr_drv_data = {
1113 	.version = MXR_VER_16_0_33_0,
1114 	.is_vp_enabled = 0,
1115 };
1116 
1117 static struct mixer_drv_data exynos4212_mxr_drv_data = {
1118 	.version = MXR_VER_0_0_0_16,
1119 	.is_vp_enabled = 1,
1120 };
1121 
1122 static struct mixer_drv_data exynos4210_mxr_drv_data = {
1123 	.version = MXR_VER_0_0_0_16,
1124 	.is_vp_enabled = 1,
1125 	.has_sclk = 1,
1126 };
1127 
1128 static struct of_device_id mixer_match_types[] = {
1129 	{
1130 		.compatible = "samsung,exynos4210-mixer",
1131 		.data	= &exynos4210_mxr_drv_data,
1132 	}, {
1133 		.compatible = "samsung,exynos4212-mixer",
1134 		.data	= &exynos4212_mxr_drv_data,
1135 	}, {
1136 		.compatible = "samsung,exynos5-mixer",
1137 		.data	= &exynos5250_mxr_drv_data,
1138 	}, {
1139 		.compatible = "samsung,exynos5250-mixer",
1140 		.data	= &exynos5250_mxr_drv_data,
1141 	}, {
1142 		.compatible = "samsung,exynos5420-mixer",
1143 		.data	= &exynos5420_mxr_drv_data,
1144 	}, {
1145 		/* end node */
1146 	}
1147 };
1148 MODULE_DEVICE_TABLE(of, mixer_match_types);
1149 
1150 static int mixer_bind(struct device *dev, struct device *manager, void *data)
1151 {
1152 	struct mixer_context *ctx = dev_get_drvdata(dev);
1153 	struct drm_device *drm_dev = data;
1154 	struct exynos_drm_plane *exynos_plane;
1155 	unsigned int i;
1156 	int ret;
1157 
1158 	ret = mixer_initialize(ctx, drm_dev);
1159 	if (ret)
1160 		return ret;
1161 
1162 	for (i = 0; i < MIXER_WIN_NR; i++) {
1163 		if (i == VP_DEFAULT_WIN && !ctx->vp_enabled)
1164 			continue;
1165 
1166 		ret = exynos_plane_init(drm_dev, &ctx->planes[i], i,
1167 					1 << ctx->pipe, &plane_configs[i]);
1168 		if (ret)
1169 			return ret;
1170 	}
1171 
1172 	exynos_plane = &ctx->planes[DEFAULT_WIN];
1173 	ctx->crtc = exynos_drm_crtc_create(drm_dev, &exynos_plane->base,
1174 					   ctx->pipe, EXYNOS_DISPLAY_TYPE_HDMI,
1175 					   &mixer_crtc_ops, ctx);
1176 	if (IS_ERR(ctx->crtc)) {
1177 		mixer_ctx_remove(ctx);
1178 		ret = PTR_ERR(ctx->crtc);
1179 		goto free_ctx;
1180 	}
1181 
1182 	return 0;
1183 
1184 free_ctx:
1185 	devm_kfree(dev, ctx);
1186 	return ret;
1187 }
1188 
1189 static void mixer_unbind(struct device *dev, struct device *master, void *data)
1190 {
1191 	struct mixer_context *ctx = dev_get_drvdata(dev);
1192 
1193 	mixer_ctx_remove(ctx);
1194 }
1195 
1196 static const struct component_ops mixer_component_ops = {
1197 	.bind	= mixer_bind,
1198 	.unbind	= mixer_unbind,
1199 };
1200 
1201 static int mixer_probe(struct platform_device *pdev)
1202 {
1203 	struct device *dev = &pdev->dev;
1204 	const struct mixer_drv_data *drv;
1205 	struct mixer_context *ctx;
1206 	int ret;
1207 
1208 	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
1209 	if (!ctx) {
1210 		DRM_ERROR("failed to alloc mixer context.\n");
1211 		return -ENOMEM;
1212 	}
1213 
1214 	drv = of_device_get_match_data(dev);
1215 
1216 	ctx->pdev = pdev;
1217 	ctx->dev = dev;
1218 	ctx->vp_enabled = drv->is_vp_enabled;
1219 	ctx->has_sclk = drv->has_sclk;
1220 	ctx->mxr_ver = drv->version;
1221 
1222 	platform_set_drvdata(pdev, ctx);
1223 
1224 	ret = component_add(&pdev->dev, &mixer_component_ops);
1225 	if (!ret)
1226 		pm_runtime_enable(dev);
1227 
1228 	return ret;
1229 }
1230 
1231 static int mixer_remove(struct platform_device *pdev)
1232 {
1233 	pm_runtime_disable(&pdev->dev);
1234 
1235 	component_del(&pdev->dev, &mixer_component_ops);
1236 
1237 	return 0;
1238 }
1239 
1240 static int __maybe_unused exynos_mixer_suspend(struct device *dev)
1241 {
1242 	struct mixer_context *ctx = dev_get_drvdata(dev);
1243 	struct mixer_resources *res = &ctx->mixer_res;
1244 
1245 	clk_disable_unprepare(res->hdmi);
1246 	clk_disable_unprepare(res->mixer);
1247 	if (ctx->vp_enabled) {
1248 		clk_disable_unprepare(res->vp);
1249 		if (ctx->has_sclk)
1250 			clk_disable_unprepare(res->sclk_mixer);
1251 	}
1252 
1253 	return 0;
1254 }
1255 
1256 static int __maybe_unused exynos_mixer_resume(struct device *dev)
1257 {
1258 	struct mixer_context *ctx = dev_get_drvdata(dev);
1259 	struct mixer_resources *res = &ctx->mixer_res;
1260 	int ret;
1261 
1262 	ret = clk_prepare_enable(res->mixer);
1263 	if (ret < 0) {
1264 		DRM_ERROR("Failed to prepare_enable the mixer clk [%d]\n", ret);
1265 		return ret;
1266 	}
1267 	ret = clk_prepare_enable(res->hdmi);
1268 	if (ret < 0) {
1269 		DRM_ERROR("Failed to prepare_enable the hdmi clk [%d]\n", ret);
1270 		return ret;
1271 	}
1272 	if (ctx->vp_enabled) {
1273 		ret = clk_prepare_enable(res->vp);
1274 		if (ret < 0) {
1275 			DRM_ERROR("Failed to prepare_enable the vp clk [%d]\n",
1276 				  ret);
1277 			return ret;
1278 		}
1279 		if (ctx->has_sclk) {
1280 			ret = clk_prepare_enable(res->sclk_mixer);
1281 			if (ret < 0) {
1282 				DRM_ERROR("Failed to prepare_enable the " \
1283 					   "sclk_mixer clk [%d]\n",
1284 					  ret);
1285 				return ret;
1286 			}
1287 		}
1288 	}
1289 
1290 	return 0;
1291 }
1292 
1293 static const struct dev_pm_ops exynos_mixer_pm_ops = {
1294 	SET_RUNTIME_PM_OPS(exynos_mixer_suspend, exynos_mixer_resume, NULL)
1295 };
1296 
1297 struct platform_driver mixer_driver = {
1298 	.driver = {
1299 		.name = "exynos-mixer",
1300 		.owner = THIS_MODULE,
1301 		.pm = &exynos_mixer_pm_ops,
1302 		.of_match_table = mixer_match_types,
1303 	},
1304 	.probe = mixer_probe,
1305 	.remove = mixer_remove,
1306 };
1307