xref: /linux/drivers/gpu/drm/exynos/exynos_mixer.c (revision e58e871becec2d3b04ed91c0c16fe8deac9c9dfa)
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->format->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->format->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->format->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->format->cpp[0])
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->format->cpp[0]);
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->format->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 	exynos_crtc_handle_event(crtc);
1016 }
1017 
1018 static void mixer_enable(struct exynos_drm_crtc *crtc)
1019 {
1020 	struct mixer_context *ctx = crtc->ctx;
1021 	struct mixer_resources *res = &ctx->mixer_res;
1022 
1023 	if (test_bit(MXR_BIT_POWERED, &ctx->flags))
1024 		return;
1025 
1026 	pm_runtime_get_sync(ctx->dev);
1027 
1028 	exynos_drm_pipe_clk_enable(crtc, true);
1029 
1030 	mixer_vsync_set_update(ctx, false);
1031 
1032 	mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_SOFT_RESET);
1033 
1034 	if (test_bit(MXR_BIT_VSYNC, &ctx->flags)) {
1035 		mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC);
1036 		mixer_reg_writemask(res, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC);
1037 	}
1038 	mixer_win_reset(ctx);
1039 
1040 	mixer_vsync_set_update(ctx, true);
1041 
1042 	set_bit(MXR_BIT_POWERED, &ctx->flags);
1043 }
1044 
1045 static void mixer_disable(struct exynos_drm_crtc *crtc)
1046 {
1047 	struct mixer_context *ctx = crtc->ctx;
1048 	int i;
1049 
1050 	if (!test_bit(MXR_BIT_POWERED, &ctx->flags))
1051 		return;
1052 
1053 	mixer_stop(ctx);
1054 	mixer_regs_dump(ctx);
1055 
1056 	for (i = 0; i < MIXER_WIN_NR; i++)
1057 		mixer_disable_plane(crtc, &ctx->planes[i]);
1058 
1059 	exynos_drm_pipe_clk_enable(crtc, false);
1060 
1061 	pm_runtime_put(ctx->dev);
1062 
1063 	clear_bit(MXR_BIT_POWERED, &ctx->flags);
1064 }
1065 
1066 /* Only valid for Mixer version 16.0.33.0 */
1067 static int mixer_atomic_check(struct exynos_drm_crtc *crtc,
1068 		       struct drm_crtc_state *state)
1069 {
1070 	struct drm_display_mode *mode = &state->adjusted_mode;
1071 	u32 w, h;
1072 
1073 	w = mode->hdisplay;
1074 	h = mode->vdisplay;
1075 
1076 	DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d\n",
1077 		mode->hdisplay, mode->vdisplay, mode->vrefresh,
1078 		(mode->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1079 
1080 	if ((w >= 464 && w <= 720 && h >= 261 && h <= 576) ||
1081 		(w >= 1024 && w <= 1280 && h >= 576 && h <= 720) ||
1082 		(w >= 1664 && w <= 1920 && h >= 936 && h <= 1080))
1083 		return 0;
1084 
1085 	return -EINVAL;
1086 }
1087 
1088 static const struct exynos_drm_crtc_ops mixer_crtc_ops = {
1089 	.enable			= mixer_enable,
1090 	.disable		= mixer_disable,
1091 	.enable_vblank		= mixer_enable_vblank,
1092 	.disable_vblank		= mixer_disable_vblank,
1093 	.atomic_begin		= mixer_atomic_begin,
1094 	.update_plane		= mixer_update_plane,
1095 	.disable_plane		= mixer_disable_plane,
1096 	.atomic_flush		= mixer_atomic_flush,
1097 	.atomic_check		= mixer_atomic_check,
1098 };
1099 
1100 static struct mixer_drv_data exynos5420_mxr_drv_data = {
1101 	.version = MXR_VER_128_0_0_184,
1102 	.is_vp_enabled = 0,
1103 };
1104 
1105 static struct mixer_drv_data exynos5250_mxr_drv_data = {
1106 	.version = MXR_VER_16_0_33_0,
1107 	.is_vp_enabled = 0,
1108 };
1109 
1110 static struct mixer_drv_data exynos4212_mxr_drv_data = {
1111 	.version = MXR_VER_0_0_0_16,
1112 	.is_vp_enabled = 1,
1113 };
1114 
1115 static struct mixer_drv_data exynos4210_mxr_drv_data = {
1116 	.version = MXR_VER_0_0_0_16,
1117 	.is_vp_enabled = 1,
1118 	.has_sclk = 1,
1119 };
1120 
1121 static struct of_device_id mixer_match_types[] = {
1122 	{
1123 		.compatible = "samsung,exynos4210-mixer",
1124 		.data	= &exynos4210_mxr_drv_data,
1125 	}, {
1126 		.compatible = "samsung,exynos4212-mixer",
1127 		.data	= &exynos4212_mxr_drv_data,
1128 	}, {
1129 		.compatible = "samsung,exynos5-mixer",
1130 		.data	= &exynos5250_mxr_drv_data,
1131 	}, {
1132 		.compatible = "samsung,exynos5250-mixer",
1133 		.data	= &exynos5250_mxr_drv_data,
1134 	}, {
1135 		.compatible = "samsung,exynos5420-mixer",
1136 		.data	= &exynos5420_mxr_drv_data,
1137 	}, {
1138 		/* end node */
1139 	}
1140 };
1141 MODULE_DEVICE_TABLE(of, mixer_match_types);
1142 
1143 static int mixer_bind(struct device *dev, struct device *manager, void *data)
1144 {
1145 	struct mixer_context *ctx = dev_get_drvdata(dev);
1146 	struct drm_device *drm_dev = data;
1147 	struct exynos_drm_plane *exynos_plane;
1148 	unsigned int i;
1149 	int ret;
1150 
1151 	ret = mixer_initialize(ctx, drm_dev);
1152 	if (ret)
1153 		return ret;
1154 
1155 	for (i = 0; i < MIXER_WIN_NR; i++) {
1156 		if (i == VP_DEFAULT_WIN && !test_bit(MXR_BIT_VP_ENABLED,
1157 						     &ctx->flags))
1158 			continue;
1159 
1160 		ret = exynos_plane_init(drm_dev, &ctx->planes[i], i,
1161 					1 << ctx->pipe, &plane_configs[i]);
1162 		if (ret)
1163 			return ret;
1164 	}
1165 
1166 	exynos_plane = &ctx->planes[DEFAULT_WIN];
1167 	ctx->crtc = exynos_drm_crtc_create(drm_dev, &exynos_plane->base,
1168 					   ctx->pipe, EXYNOS_DISPLAY_TYPE_HDMI,
1169 					   &mixer_crtc_ops, ctx);
1170 	if (IS_ERR(ctx->crtc)) {
1171 		mixer_ctx_remove(ctx);
1172 		ret = PTR_ERR(ctx->crtc);
1173 		goto free_ctx;
1174 	}
1175 
1176 	return 0;
1177 
1178 free_ctx:
1179 	devm_kfree(dev, ctx);
1180 	return ret;
1181 }
1182 
1183 static void mixer_unbind(struct device *dev, struct device *master, void *data)
1184 {
1185 	struct mixer_context *ctx = dev_get_drvdata(dev);
1186 
1187 	mixer_ctx_remove(ctx);
1188 }
1189 
1190 static const struct component_ops mixer_component_ops = {
1191 	.bind	= mixer_bind,
1192 	.unbind	= mixer_unbind,
1193 };
1194 
1195 static int mixer_probe(struct platform_device *pdev)
1196 {
1197 	struct device *dev = &pdev->dev;
1198 	const struct mixer_drv_data *drv;
1199 	struct mixer_context *ctx;
1200 	int ret;
1201 
1202 	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
1203 	if (!ctx) {
1204 		DRM_ERROR("failed to alloc mixer context.\n");
1205 		return -ENOMEM;
1206 	}
1207 
1208 	drv = of_device_get_match_data(dev);
1209 
1210 	ctx->pdev = pdev;
1211 	ctx->dev = dev;
1212 	ctx->mxr_ver = drv->version;
1213 
1214 	if (drv->is_vp_enabled)
1215 		__set_bit(MXR_BIT_VP_ENABLED, &ctx->flags);
1216 	if (drv->has_sclk)
1217 		__set_bit(MXR_BIT_HAS_SCLK, &ctx->flags);
1218 
1219 	platform_set_drvdata(pdev, ctx);
1220 
1221 	ret = component_add(&pdev->dev, &mixer_component_ops);
1222 	if (!ret)
1223 		pm_runtime_enable(dev);
1224 
1225 	return ret;
1226 }
1227 
1228 static int mixer_remove(struct platform_device *pdev)
1229 {
1230 	pm_runtime_disable(&pdev->dev);
1231 
1232 	component_del(&pdev->dev, &mixer_component_ops);
1233 
1234 	return 0;
1235 }
1236 
1237 static int __maybe_unused exynos_mixer_suspend(struct device *dev)
1238 {
1239 	struct mixer_context *ctx = dev_get_drvdata(dev);
1240 	struct mixer_resources *res = &ctx->mixer_res;
1241 
1242 	clk_disable_unprepare(res->hdmi);
1243 	clk_disable_unprepare(res->mixer);
1244 	if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) {
1245 		clk_disable_unprepare(res->vp);
1246 		if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags))
1247 			clk_disable_unprepare(res->sclk_mixer);
1248 	}
1249 
1250 	return 0;
1251 }
1252 
1253 static int __maybe_unused exynos_mixer_resume(struct device *dev)
1254 {
1255 	struct mixer_context *ctx = dev_get_drvdata(dev);
1256 	struct mixer_resources *res = &ctx->mixer_res;
1257 	int ret;
1258 
1259 	ret = clk_prepare_enable(res->mixer);
1260 	if (ret < 0) {
1261 		DRM_ERROR("Failed to prepare_enable the mixer clk [%d]\n", ret);
1262 		return ret;
1263 	}
1264 	ret = clk_prepare_enable(res->hdmi);
1265 	if (ret < 0) {
1266 		DRM_ERROR("Failed to prepare_enable the hdmi clk [%d]\n", ret);
1267 		return ret;
1268 	}
1269 	if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) {
1270 		ret = clk_prepare_enable(res->vp);
1271 		if (ret < 0) {
1272 			DRM_ERROR("Failed to prepare_enable the vp clk [%d]\n",
1273 				  ret);
1274 			return ret;
1275 		}
1276 		if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags)) {
1277 			ret = clk_prepare_enable(res->sclk_mixer);
1278 			if (ret < 0) {
1279 				DRM_ERROR("Failed to prepare_enable the " \
1280 					   "sclk_mixer clk [%d]\n",
1281 					  ret);
1282 				return ret;
1283 			}
1284 		}
1285 	}
1286 
1287 	return 0;
1288 }
1289 
1290 static const struct dev_pm_ops exynos_mixer_pm_ops = {
1291 	SET_RUNTIME_PM_OPS(exynos_mixer_suspend, exynos_mixer_resume, NULL)
1292 };
1293 
1294 struct platform_driver mixer_driver = {
1295 	.driver = {
1296 		.name = "exynos-mixer",
1297 		.owner = THIS_MODULE,
1298 		.pm = &exynos_mixer_pm_ops,
1299 		.of_match_table = mixer_match_types,
1300 	},
1301 	.probe = mixer_probe,
1302 	.remove = mixer_remove,
1303 };
1304