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/hdmi_drv.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 #include <drm/drm_edid.h>
19 #include <drm/drm_crtc_helper.h>
20 
21 #include "regs-hdmi.h"
22 
23 #include <linux/kernel.h>
24 #include <linux/spinlock.h>
25 #include <linux/wait.h>
26 #include <linux/i2c.h>
27 #include <linux/module.h>
28 #include <linux/platform_device.h>
29 #include <linux/interrupt.h>
30 #include <linux/irq.h>
31 #include <linux/delay.h>
32 #include <linux/pm_runtime.h>
33 #include <linux/clk.h>
34 #include <linux/regulator/consumer.h>
35 #include <linux/io.h>
36 #include <linux/of_gpio.h>
37 
38 #include <drm/exynos_drm.h>
39 
40 #include "exynos_drm_drv.h"
41 #include "exynos_drm_hdmi.h"
42 
43 #include "exynos_hdmi.h"
44 
45 #include <linux/gpio.h>
46 #include <media/s5p_hdmi.h>
47 
48 #define MAX_WIDTH		1920
49 #define MAX_HEIGHT		1080
50 #define get_hdmi_context(dev)	platform_get_drvdata(to_platform_device(dev))
51 
52 /* AVI header and aspect ratio */
53 #define HDMI_AVI_VERSION		0x02
54 #define HDMI_AVI_LENGTH		0x0D
55 #define AVI_PIC_ASPECT_RATIO_16_9	(2 << 4)
56 #define AVI_SAME_AS_PIC_ASPECT_RATIO	8
57 
58 /* AUI header info */
59 #define HDMI_AUI_VERSION	0x01
60 #define HDMI_AUI_LENGTH	0x0A
61 
62 /* HDMI infoframe to configure HDMI out packet header, AUI and AVI */
63 enum HDMI_PACKET_TYPE {
64 	/* refer to Table 5-8 Packet Type in HDMI specification v1.4a */
65 	/* InfoFrame packet type */
66 	HDMI_PACKET_TYPE_INFOFRAME = 0x80,
67 	/* Vendor-Specific InfoFrame */
68 	HDMI_PACKET_TYPE_VSI = HDMI_PACKET_TYPE_INFOFRAME + 1,
69 	/* Auxiliary Video information InfoFrame */
70 	HDMI_PACKET_TYPE_AVI = HDMI_PACKET_TYPE_INFOFRAME + 2,
71 	/* Audio information InfoFrame */
72 	HDMI_PACKET_TYPE_AUI = HDMI_PACKET_TYPE_INFOFRAME + 4
73 };
74 
75 enum hdmi_type {
76 	HDMI_TYPE13,
77 	HDMI_TYPE14,
78 };
79 
80 struct hdmi_resources {
81 	struct clk			*hdmi;
82 	struct clk			*sclk_hdmi;
83 	struct clk			*sclk_pixel;
84 	struct clk			*sclk_hdmiphy;
85 	struct clk			*hdmiphy;
86 	struct regulator_bulk_data	*regul_bulk;
87 	int				regul_count;
88 };
89 
90 struct hdmi_tg_regs {
91 	u8 cmd[1];
92 	u8 h_fsz[2];
93 	u8 hact_st[2];
94 	u8 hact_sz[2];
95 	u8 v_fsz[2];
96 	u8 vsync[2];
97 	u8 vsync2[2];
98 	u8 vact_st[2];
99 	u8 vact_sz[2];
100 	u8 field_chg[2];
101 	u8 vact_st2[2];
102 	u8 vact_st3[2];
103 	u8 vact_st4[2];
104 	u8 vsync_top_hdmi[2];
105 	u8 vsync_bot_hdmi[2];
106 	u8 field_top_hdmi[2];
107 	u8 field_bot_hdmi[2];
108 	u8 tg_3d[1];
109 };
110 
111 struct hdmi_v13_core_regs {
112 	u8 h_blank[2];
113 	u8 v_blank[3];
114 	u8 h_v_line[3];
115 	u8 vsync_pol[1];
116 	u8 int_pro_mode[1];
117 	u8 v_blank_f[3];
118 	u8 h_sync_gen[3];
119 	u8 v_sync_gen1[3];
120 	u8 v_sync_gen2[3];
121 	u8 v_sync_gen3[3];
122 };
123 
124 struct hdmi_v14_core_regs {
125 	u8 h_blank[2];
126 	u8 v2_blank[2];
127 	u8 v1_blank[2];
128 	u8 v_line[2];
129 	u8 h_line[2];
130 	u8 hsync_pol[1];
131 	u8 vsync_pol[1];
132 	u8 int_pro_mode[1];
133 	u8 v_blank_f0[2];
134 	u8 v_blank_f1[2];
135 	u8 h_sync_start[2];
136 	u8 h_sync_end[2];
137 	u8 v_sync_line_bef_2[2];
138 	u8 v_sync_line_bef_1[2];
139 	u8 v_sync_line_aft_2[2];
140 	u8 v_sync_line_aft_1[2];
141 	u8 v_sync_line_aft_pxl_2[2];
142 	u8 v_sync_line_aft_pxl_1[2];
143 	u8 v_blank_f2[2]; /* for 3D mode */
144 	u8 v_blank_f3[2]; /* for 3D mode */
145 	u8 v_blank_f4[2]; /* for 3D mode */
146 	u8 v_blank_f5[2]; /* for 3D mode */
147 	u8 v_sync_line_aft_3[2];
148 	u8 v_sync_line_aft_4[2];
149 	u8 v_sync_line_aft_5[2];
150 	u8 v_sync_line_aft_6[2];
151 	u8 v_sync_line_aft_pxl_3[2];
152 	u8 v_sync_line_aft_pxl_4[2];
153 	u8 v_sync_line_aft_pxl_5[2];
154 	u8 v_sync_line_aft_pxl_6[2];
155 	u8 vact_space_1[2];
156 	u8 vact_space_2[2];
157 	u8 vact_space_3[2];
158 	u8 vact_space_4[2];
159 	u8 vact_space_5[2];
160 	u8 vact_space_6[2];
161 };
162 
163 struct hdmi_v13_conf {
164 	struct hdmi_v13_core_regs core;
165 	struct hdmi_tg_regs tg;
166 };
167 
168 struct hdmi_v14_conf {
169 	struct hdmi_v14_core_regs core;
170 	struct hdmi_tg_regs tg;
171 };
172 
173 struct hdmi_conf_regs {
174 	int pixel_clock;
175 	int cea_video_id;
176 	union {
177 		struct hdmi_v13_conf v13_conf;
178 		struct hdmi_v14_conf v14_conf;
179 	} conf;
180 };
181 
182 struct hdmi_context {
183 	struct device			*dev;
184 	struct drm_device		*drm_dev;
185 	bool				hpd;
186 	bool				powered;
187 	bool				dvi_mode;
188 	struct mutex			hdmi_mutex;
189 
190 	void __iomem			*regs;
191 	void				*parent_ctx;
192 	int				irq;
193 
194 	struct i2c_client		*ddc_port;
195 	struct i2c_client		*hdmiphy_port;
196 
197 	/* current hdmiphy conf regs */
198 	struct hdmi_conf_regs		mode_conf;
199 
200 	struct hdmi_resources		res;
201 
202 	int				hpd_gpio;
203 
204 	enum hdmi_type			type;
205 };
206 
207 struct hdmiphy_config {
208 	int pixel_clock;
209 	u8 conf[32];
210 };
211 
212 /* list of phy config settings */
213 static const struct hdmiphy_config hdmiphy_v13_configs[] = {
214 	{
215 		.pixel_clock = 27000000,
216 		.conf = {
217 			0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
218 			0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
219 			0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
220 			0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
221 		},
222 	},
223 	{
224 		.pixel_clock = 27027000,
225 		.conf = {
226 			0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
227 			0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
228 			0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
229 			0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
230 		},
231 	},
232 	{
233 		.pixel_clock = 74176000,
234 		.conf = {
235 			0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
236 			0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
237 			0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
238 			0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x00,
239 		},
240 	},
241 	{
242 		.pixel_clock = 74250000,
243 		.conf = {
244 			0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
245 			0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
246 			0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0,
247 			0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x00,
248 		},
249 	},
250 	{
251 		.pixel_clock = 148500000,
252 		.conf = {
253 			0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
254 			0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
255 			0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
256 			0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x00,
257 		},
258 	},
259 };
260 
261 static const struct hdmiphy_config hdmiphy_v14_configs[] = {
262 	{
263 		.pixel_clock = 25200000,
264 		.conf = {
265 			0x01, 0x51, 0x2A, 0x75, 0x40, 0x01, 0x00, 0x08,
266 			0x82, 0x80, 0xfc, 0xd8, 0x45, 0xa0, 0xac, 0x80,
267 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
268 			0x54, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
269 		},
270 	},
271 	{
272 		.pixel_clock = 27000000,
273 		.conf = {
274 			0x01, 0xd1, 0x22, 0x51, 0x40, 0x08, 0xfc, 0x20,
275 			0x98, 0xa0, 0xcb, 0xd8, 0x45, 0xa0, 0xac, 0x80,
276 			0x06, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
277 			0x54, 0xe4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
278 		},
279 	},
280 	{
281 		.pixel_clock = 27027000,
282 		.conf = {
283 			0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08,
284 			0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
285 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
286 			0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00,
287 		},
288 	},
289 	{
290 		.pixel_clock = 36000000,
291 		.conf = {
292 			0x01, 0x51, 0x2d, 0x55, 0x40, 0x01, 0x00, 0x08,
293 			0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
294 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
295 			0x54, 0xab, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
296 		},
297 	},
298 	{
299 		.pixel_clock = 40000000,
300 		.conf = {
301 			0x01, 0x51, 0x32, 0x55, 0x40, 0x01, 0x00, 0x08,
302 			0x82, 0x80, 0x2c, 0xd9, 0x45, 0xa0, 0xac, 0x80,
303 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
304 			0x54, 0x9a, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
305 		},
306 	},
307 	{
308 		.pixel_clock = 65000000,
309 		.conf = {
310 			0x01, 0xd1, 0x36, 0x34, 0x40, 0x1e, 0x0a, 0x08,
311 			0x82, 0xa0, 0x45, 0xd9, 0x45, 0xa0, 0xac, 0x80,
312 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
313 			0x54, 0xbd, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
314 		},
315 	},
316 	{
317 		.pixel_clock = 74176000,
318 		.conf = {
319 			0x01, 0xd1, 0x3e, 0x35, 0x40, 0x5b, 0xde, 0x08,
320 			0x82, 0xa0, 0x73, 0xd9, 0x45, 0xa0, 0xac, 0x80,
321 			0x56, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
322 			0x54, 0xa6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
323 		},
324 	},
325 	{
326 		.pixel_clock = 74250000,
327 		.conf = {
328 			0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08,
329 			0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
330 			0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
331 			0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00,
332 		},
333 	},
334 	{
335 		.pixel_clock = 83500000,
336 		.conf = {
337 			0x01, 0xd1, 0x23, 0x11, 0x40, 0x0c, 0xfb, 0x08,
338 			0x85, 0xa0, 0xd1, 0xd8, 0x45, 0xa0, 0xac, 0x80,
339 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
340 			0x54, 0x93, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
341 		},
342 	},
343 	{
344 		.pixel_clock = 106500000,
345 		.conf = {
346 			0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08,
347 			0x84, 0xa0, 0x0a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
348 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
349 			0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
350 		},
351 	},
352 	{
353 		.pixel_clock = 108000000,
354 		.conf = {
355 			0x01, 0x51, 0x2d, 0x15, 0x40, 0x01, 0x00, 0x08,
356 			0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
357 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
358 			0x54, 0xc7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
359 		},
360 	},
361 	{
362 		.pixel_clock = 146250000,
363 		.conf = {
364 			0x01, 0xd1, 0x3d, 0x15, 0x40, 0x18, 0xfd, 0x08,
365 			0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
366 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
367 			0x54, 0x50, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
368 		},
369 	},
370 	{
371 		.pixel_clock = 148500000,
372 		.conf = {
373 			0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08,
374 			0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
375 			0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
376 			0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x00,
377 		},
378 	},
379 };
380 
381 struct hdmi_infoframe {
382 	enum HDMI_PACKET_TYPE type;
383 	u8 ver;
384 	u8 len;
385 };
386 
387 static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id)
388 {
389 	return readl(hdata->regs + reg_id);
390 }
391 
392 static inline void hdmi_reg_writeb(struct hdmi_context *hdata,
393 				 u32 reg_id, u8 value)
394 {
395 	writeb(value, hdata->regs + reg_id);
396 }
397 
398 static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
399 				 u32 reg_id, u32 value, u32 mask)
400 {
401 	u32 old = readl(hdata->regs + reg_id);
402 	value = (value & mask) | (old & ~mask);
403 	writel(value, hdata->regs + reg_id);
404 }
405 
406 static void hdmi_v13_regs_dump(struct hdmi_context *hdata, char *prefix)
407 {
408 #define DUMPREG(reg_id) \
409 	DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
410 	readl(hdata->regs + reg_id))
411 	DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
412 	DUMPREG(HDMI_INTC_FLAG);
413 	DUMPREG(HDMI_INTC_CON);
414 	DUMPREG(HDMI_HPD_STATUS);
415 	DUMPREG(HDMI_V13_PHY_RSTOUT);
416 	DUMPREG(HDMI_V13_PHY_VPLL);
417 	DUMPREG(HDMI_V13_PHY_CMU);
418 	DUMPREG(HDMI_V13_CORE_RSTOUT);
419 
420 	DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
421 	DUMPREG(HDMI_CON_0);
422 	DUMPREG(HDMI_CON_1);
423 	DUMPREG(HDMI_CON_2);
424 	DUMPREG(HDMI_SYS_STATUS);
425 	DUMPREG(HDMI_V13_PHY_STATUS);
426 	DUMPREG(HDMI_STATUS_EN);
427 	DUMPREG(HDMI_HPD);
428 	DUMPREG(HDMI_MODE_SEL);
429 	DUMPREG(HDMI_V13_HPD_GEN);
430 	DUMPREG(HDMI_V13_DC_CONTROL);
431 	DUMPREG(HDMI_V13_VIDEO_PATTERN_GEN);
432 
433 	DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
434 	DUMPREG(HDMI_H_BLANK_0);
435 	DUMPREG(HDMI_H_BLANK_1);
436 	DUMPREG(HDMI_V13_V_BLANK_0);
437 	DUMPREG(HDMI_V13_V_BLANK_1);
438 	DUMPREG(HDMI_V13_V_BLANK_2);
439 	DUMPREG(HDMI_V13_H_V_LINE_0);
440 	DUMPREG(HDMI_V13_H_V_LINE_1);
441 	DUMPREG(HDMI_V13_H_V_LINE_2);
442 	DUMPREG(HDMI_VSYNC_POL);
443 	DUMPREG(HDMI_INT_PRO_MODE);
444 	DUMPREG(HDMI_V13_V_BLANK_F_0);
445 	DUMPREG(HDMI_V13_V_BLANK_F_1);
446 	DUMPREG(HDMI_V13_V_BLANK_F_2);
447 	DUMPREG(HDMI_V13_H_SYNC_GEN_0);
448 	DUMPREG(HDMI_V13_H_SYNC_GEN_1);
449 	DUMPREG(HDMI_V13_H_SYNC_GEN_2);
450 	DUMPREG(HDMI_V13_V_SYNC_GEN_1_0);
451 	DUMPREG(HDMI_V13_V_SYNC_GEN_1_1);
452 	DUMPREG(HDMI_V13_V_SYNC_GEN_1_2);
453 	DUMPREG(HDMI_V13_V_SYNC_GEN_2_0);
454 	DUMPREG(HDMI_V13_V_SYNC_GEN_2_1);
455 	DUMPREG(HDMI_V13_V_SYNC_GEN_2_2);
456 	DUMPREG(HDMI_V13_V_SYNC_GEN_3_0);
457 	DUMPREG(HDMI_V13_V_SYNC_GEN_3_1);
458 	DUMPREG(HDMI_V13_V_SYNC_GEN_3_2);
459 
460 	DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
461 	DUMPREG(HDMI_TG_CMD);
462 	DUMPREG(HDMI_TG_H_FSZ_L);
463 	DUMPREG(HDMI_TG_H_FSZ_H);
464 	DUMPREG(HDMI_TG_HACT_ST_L);
465 	DUMPREG(HDMI_TG_HACT_ST_H);
466 	DUMPREG(HDMI_TG_HACT_SZ_L);
467 	DUMPREG(HDMI_TG_HACT_SZ_H);
468 	DUMPREG(HDMI_TG_V_FSZ_L);
469 	DUMPREG(HDMI_TG_V_FSZ_H);
470 	DUMPREG(HDMI_TG_VSYNC_L);
471 	DUMPREG(HDMI_TG_VSYNC_H);
472 	DUMPREG(HDMI_TG_VSYNC2_L);
473 	DUMPREG(HDMI_TG_VSYNC2_H);
474 	DUMPREG(HDMI_TG_VACT_ST_L);
475 	DUMPREG(HDMI_TG_VACT_ST_H);
476 	DUMPREG(HDMI_TG_VACT_SZ_L);
477 	DUMPREG(HDMI_TG_VACT_SZ_H);
478 	DUMPREG(HDMI_TG_FIELD_CHG_L);
479 	DUMPREG(HDMI_TG_FIELD_CHG_H);
480 	DUMPREG(HDMI_TG_VACT_ST2_L);
481 	DUMPREG(HDMI_TG_VACT_ST2_H);
482 	DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
483 	DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
484 	DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
485 	DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
486 	DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
487 	DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
488 	DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
489 	DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
490 #undef DUMPREG
491 }
492 
493 static void hdmi_v14_regs_dump(struct hdmi_context *hdata, char *prefix)
494 {
495 	int i;
496 
497 #define DUMPREG(reg_id) \
498 	DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
499 	readl(hdata->regs + reg_id))
500 
501 	DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
502 	DUMPREG(HDMI_INTC_CON);
503 	DUMPREG(HDMI_INTC_FLAG);
504 	DUMPREG(HDMI_HPD_STATUS);
505 	DUMPREG(HDMI_INTC_CON_1);
506 	DUMPREG(HDMI_INTC_FLAG_1);
507 	DUMPREG(HDMI_PHY_STATUS_0);
508 	DUMPREG(HDMI_PHY_STATUS_PLL);
509 	DUMPREG(HDMI_PHY_CON_0);
510 	DUMPREG(HDMI_PHY_RSTOUT);
511 	DUMPREG(HDMI_PHY_VPLL);
512 	DUMPREG(HDMI_PHY_CMU);
513 	DUMPREG(HDMI_CORE_RSTOUT);
514 
515 	DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
516 	DUMPREG(HDMI_CON_0);
517 	DUMPREG(HDMI_CON_1);
518 	DUMPREG(HDMI_CON_2);
519 	DUMPREG(HDMI_SYS_STATUS);
520 	DUMPREG(HDMI_PHY_STATUS_0);
521 	DUMPREG(HDMI_STATUS_EN);
522 	DUMPREG(HDMI_HPD);
523 	DUMPREG(HDMI_MODE_SEL);
524 	DUMPREG(HDMI_ENC_EN);
525 	DUMPREG(HDMI_DC_CONTROL);
526 	DUMPREG(HDMI_VIDEO_PATTERN_GEN);
527 
528 	DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
529 	DUMPREG(HDMI_H_BLANK_0);
530 	DUMPREG(HDMI_H_BLANK_1);
531 	DUMPREG(HDMI_V2_BLANK_0);
532 	DUMPREG(HDMI_V2_BLANK_1);
533 	DUMPREG(HDMI_V1_BLANK_0);
534 	DUMPREG(HDMI_V1_BLANK_1);
535 	DUMPREG(HDMI_V_LINE_0);
536 	DUMPREG(HDMI_V_LINE_1);
537 	DUMPREG(HDMI_H_LINE_0);
538 	DUMPREG(HDMI_H_LINE_1);
539 	DUMPREG(HDMI_HSYNC_POL);
540 
541 	DUMPREG(HDMI_VSYNC_POL);
542 	DUMPREG(HDMI_INT_PRO_MODE);
543 	DUMPREG(HDMI_V_BLANK_F0_0);
544 	DUMPREG(HDMI_V_BLANK_F0_1);
545 	DUMPREG(HDMI_V_BLANK_F1_0);
546 	DUMPREG(HDMI_V_BLANK_F1_1);
547 
548 	DUMPREG(HDMI_H_SYNC_START_0);
549 	DUMPREG(HDMI_H_SYNC_START_1);
550 	DUMPREG(HDMI_H_SYNC_END_0);
551 	DUMPREG(HDMI_H_SYNC_END_1);
552 
553 	DUMPREG(HDMI_V_SYNC_LINE_BEF_2_0);
554 	DUMPREG(HDMI_V_SYNC_LINE_BEF_2_1);
555 	DUMPREG(HDMI_V_SYNC_LINE_BEF_1_0);
556 	DUMPREG(HDMI_V_SYNC_LINE_BEF_1_1);
557 
558 	DUMPREG(HDMI_V_SYNC_LINE_AFT_2_0);
559 	DUMPREG(HDMI_V_SYNC_LINE_AFT_2_1);
560 	DUMPREG(HDMI_V_SYNC_LINE_AFT_1_0);
561 	DUMPREG(HDMI_V_SYNC_LINE_AFT_1_1);
562 
563 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_0);
564 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_1);
565 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_0);
566 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_1);
567 
568 	DUMPREG(HDMI_V_BLANK_F2_0);
569 	DUMPREG(HDMI_V_BLANK_F2_1);
570 	DUMPREG(HDMI_V_BLANK_F3_0);
571 	DUMPREG(HDMI_V_BLANK_F3_1);
572 	DUMPREG(HDMI_V_BLANK_F4_0);
573 	DUMPREG(HDMI_V_BLANK_F4_1);
574 	DUMPREG(HDMI_V_BLANK_F5_0);
575 	DUMPREG(HDMI_V_BLANK_F5_1);
576 
577 	DUMPREG(HDMI_V_SYNC_LINE_AFT_3_0);
578 	DUMPREG(HDMI_V_SYNC_LINE_AFT_3_1);
579 	DUMPREG(HDMI_V_SYNC_LINE_AFT_4_0);
580 	DUMPREG(HDMI_V_SYNC_LINE_AFT_4_1);
581 	DUMPREG(HDMI_V_SYNC_LINE_AFT_5_0);
582 	DUMPREG(HDMI_V_SYNC_LINE_AFT_5_1);
583 	DUMPREG(HDMI_V_SYNC_LINE_AFT_6_0);
584 	DUMPREG(HDMI_V_SYNC_LINE_AFT_6_1);
585 
586 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_0);
587 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_1);
588 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_0);
589 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_1);
590 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_0);
591 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_1);
592 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_0);
593 	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_1);
594 
595 	DUMPREG(HDMI_VACT_SPACE_1_0);
596 	DUMPREG(HDMI_VACT_SPACE_1_1);
597 	DUMPREG(HDMI_VACT_SPACE_2_0);
598 	DUMPREG(HDMI_VACT_SPACE_2_1);
599 	DUMPREG(HDMI_VACT_SPACE_3_0);
600 	DUMPREG(HDMI_VACT_SPACE_3_1);
601 	DUMPREG(HDMI_VACT_SPACE_4_0);
602 	DUMPREG(HDMI_VACT_SPACE_4_1);
603 	DUMPREG(HDMI_VACT_SPACE_5_0);
604 	DUMPREG(HDMI_VACT_SPACE_5_1);
605 	DUMPREG(HDMI_VACT_SPACE_6_0);
606 	DUMPREG(HDMI_VACT_SPACE_6_1);
607 
608 	DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
609 	DUMPREG(HDMI_TG_CMD);
610 	DUMPREG(HDMI_TG_H_FSZ_L);
611 	DUMPREG(HDMI_TG_H_FSZ_H);
612 	DUMPREG(HDMI_TG_HACT_ST_L);
613 	DUMPREG(HDMI_TG_HACT_ST_H);
614 	DUMPREG(HDMI_TG_HACT_SZ_L);
615 	DUMPREG(HDMI_TG_HACT_SZ_H);
616 	DUMPREG(HDMI_TG_V_FSZ_L);
617 	DUMPREG(HDMI_TG_V_FSZ_H);
618 	DUMPREG(HDMI_TG_VSYNC_L);
619 	DUMPREG(HDMI_TG_VSYNC_H);
620 	DUMPREG(HDMI_TG_VSYNC2_L);
621 	DUMPREG(HDMI_TG_VSYNC2_H);
622 	DUMPREG(HDMI_TG_VACT_ST_L);
623 	DUMPREG(HDMI_TG_VACT_ST_H);
624 	DUMPREG(HDMI_TG_VACT_SZ_L);
625 	DUMPREG(HDMI_TG_VACT_SZ_H);
626 	DUMPREG(HDMI_TG_FIELD_CHG_L);
627 	DUMPREG(HDMI_TG_FIELD_CHG_H);
628 	DUMPREG(HDMI_TG_VACT_ST2_L);
629 	DUMPREG(HDMI_TG_VACT_ST2_H);
630 	DUMPREG(HDMI_TG_VACT_ST3_L);
631 	DUMPREG(HDMI_TG_VACT_ST3_H);
632 	DUMPREG(HDMI_TG_VACT_ST4_L);
633 	DUMPREG(HDMI_TG_VACT_ST4_H);
634 	DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
635 	DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
636 	DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
637 	DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
638 	DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
639 	DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
640 	DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
641 	DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
642 	DUMPREG(HDMI_TG_3D);
643 
644 	DRM_DEBUG_KMS("%s: ---- PACKET REGISTERS ----\n", prefix);
645 	DUMPREG(HDMI_AVI_CON);
646 	DUMPREG(HDMI_AVI_HEADER0);
647 	DUMPREG(HDMI_AVI_HEADER1);
648 	DUMPREG(HDMI_AVI_HEADER2);
649 	DUMPREG(HDMI_AVI_CHECK_SUM);
650 	DUMPREG(HDMI_VSI_CON);
651 	DUMPREG(HDMI_VSI_HEADER0);
652 	DUMPREG(HDMI_VSI_HEADER1);
653 	DUMPREG(HDMI_VSI_HEADER2);
654 	for (i = 0; i < 7; ++i)
655 		DUMPREG(HDMI_VSI_DATA(i));
656 
657 #undef DUMPREG
658 }
659 
660 static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
661 {
662 	if (hdata->type == HDMI_TYPE13)
663 		hdmi_v13_regs_dump(hdata, prefix);
664 	else
665 		hdmi_v14_regs_dump(hdata, prefix);
666 }
667 
668 static u8 hdmi_chksum(struct hdmi_context *hdata,
669 			u32 start, u8 len, u32 hdr_sum)
670 {
671 	int i;
672 
673 	/* hdr_sum : header0 + header1 + header2
674 	* start : start address of packet byte1
675 	* len : packet bytes - 1 */
676 	for (i = 0; i < len; ++i)
677 		hdr_sum += 0xff & hdmi_reg_read(hdata, start + i * 4);
678 
679 	/* return 2's complement of 8 bit hdr_sum */
680 	return (u8)(~(hdr_sum & 0xff) + 1);
681 }
682 
683 static void hdmi_reg_infoframe(struct hdmi_context *hdata,
684 			struct hdmi_infoframe *infoframe)
685 {
686 	u32 hdr_sum;
687 	u8 chksum;
688 	u32 aspect_ratio;
689 	u32 mod;
690 	u32 vic;
691 
692 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
693 
694 	mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
695 	if (hdata->dvi_mode) {
696 		hdmi_reg_writeb(hdata, HDMI_VSI_CON,
697 				HDMI_VSI_CON_DO_NOT_TRANSMIT);
698 		hdmi_reg_writeb(hdata, HDMI_AVI_CON,
699 				HDMI_AVI_CON_DO_NOT_TRANSMIT);
700 		hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN);
701 		return;
702 	}
703 
704 	switch (infoframe->type) {
705 	case HDMI_PACKET_TYPE_AVI:
706 		hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC);
707 		hdmi_reg_writeb(hdata, HDMI_AVI_HEADER0, infoframe->type);
708 		hdmi_reg_writeb(hdata, HDMI_AVI_HEADER1, infoframe->ver);
709 		hdmi_reg_writeb(hdata, HDMI_AVI_HEADER2, infoframe->len);
710 		hdr_sum = infoframe->type + infoframe->ver + infoframe->len;
711 
712 		/* Output format zero hardcoded ,RGB YBCR selection */
713 		hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 0 << 5 |
714 			AVI_ACTIVE_FORMAT_VALID |
715 			AVI_UNDERSCANNED_DISPLAY_VALID);
716 
717 		aspect_ratio = AVI_PIC_ASPECT_RATIO_16_9;
718 
719 		hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), aspect_ratio |
720 				AVI_SAME_AS_PIC_ASPECT_RATIO);
721 
722 		vic = hdata->mode_conf.cea_video_id;
723 		hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), vic);
724 
725 		chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1),
726 					infoframe->len, hdr_sum);
727 		DRM_DEBUG_KMS("AVI checksum = 0x%x\n", chksum);
728 		hdmi_reg_writeb(hdata, HDMI_AVI_CHECK_SUM, chksum);
729 		break;
730 	case HDMI_PACKET_TYPE_AUI:
731 		hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02);
732 		hdmi_reg_writeb(hdata, HDMI_AUI_HEADER0, infoframe->type);
733 		hdmi_reg_writeb(hdata, HDMI_AUI_HEADER1, infoframe->ver);
734 		hdmi_reg_writeb(hdata, HDMI_AUI_HEADER2, infoframe->len);
735 		hdr_sum = infoframe->type + infoframe->ver + infoframe->len;
736 		chksum = hdmi_chksum(hdata, HDMI_AUI_BYTE(1),
737 					infoframe->len, hdr_sum);
738 		DRM_DEBUG_KMS("AUI checksum = 0x%x\n", chksum);
739 		hdmi_reg_writeb(hdata, HDMI_AUI_CHECK_SUM, chksum);
740 		break;
741 	default:
742 		break;
743 	}
744 }
745 
746 static bool hdmi_is_connected(void *ctx)
747 {
748 	struct hdmi_context *hdata = ctx;
749 
750 	return hdata->hpd;
751 }
752 
753 static struct edid *hdmi_get_edid(void *ctx, struct drm_connector *connector)
754 {
755 	struct edid *raw_edid;
756 	struct hdmi_context *hdata = ctx;
757 
758 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
759 
760 	if (!hdata->ddc_port)
761 		return ERR_PTR(-ENODEV);
762 
763 	raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter);
764 	if (!raw_edid)
765 		return ERR_PTR(-ENODEV);
766 
767 	hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid);
768 	DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
769 		(hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
770 		raw_edid->width_cm, raw_edid->height_cm);
771 
772 	return raw_edid;
773 }
774 
775 static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
776 {
777 	const struct hdmiphy_config *confs;
778 	int count, i;
779 
780 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
781 
782 	if (hdata->type == HDMI_TYPE13) {
783 		confs = hdmiphy_v13_configs;
784 		count = ARRAY_SIZE(hdmiphy_v13_configs);
785 	} else if (hdata->type == HDMI_TYPE14) {
786 		confs = hdmiphy_v14_configs;
787 		count = ARRAY_SIZE(hdmiphy_v14_configs);
788 	} else
789 		return -EINVAL;
790 
791 	for (i = 0; i < count; i++)
792 		if (confs[i].pixel_clock == pixel_clock)
793 			return i;
794 
795 	DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
796 	return -EINVAL;
797 }
798 
799 static int hdmi_check_timing(void *ctx, struct fb_videomode *timing)
800 {
801 	struct hdmi_context *hdata = ctx;
802 	int ret;
803 
804 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
805 
806 	DRM_DEBUG_KMS("[%d]x[%d] [%d]Hz [%x]\n", timing->xres,
807 			timing->yres, timing->refresh,
808 			timing->vmode);
809 
810 	ret = hdmi_find_phy_conf(hdata, timing->pixclock);
811 	if (ret < 0)
812 		return ret;
813 	return 0;
814 }
815 
816 static void hdmi_set_acr(u32 freq, u8 *acr)
817 {
818 	u32 n, cts;
819 
820 	switch (freq) {
821 	case 32000:
822 		n = 4096;
823 		cts = 27000;
824 		break;
825 	case 44100:
826 		n = 6272;
827 		cts = 30000;
828 		break;
829 	case 88200:
830 		n = 12544;
831 		cts = 30000;
832 		break;
833 	case 176400:
834 		n = 25088;
835 		cts = 30000;
836 		break;
837 	case 48000:
838 		n = 6144;
839 		cts = 27000;
840 		break;
841 	case 96000:
842 		n = 12288;
843 		cts = 27000;
844 		break;
845 	case 192000:
846 		n = 24576;
847 		cts = 27000;
848 		break;
849 	default:
850 		n = 0;
851 		cts = 0;
852 		break;
853 	}
854 
855 	acr[1] = cts >> 16;
856 	acr[2] = cts >> 8 & 0xff;
857 	acr[3] = cts & 0xff;
858 
859 	acr[4] = n >> 16;
860 	acr[5] = n >> 8 & 0xff;
861 	acr[6] = n & 0xff;
862 }
863 
864 static void hdmi_reg_acr(struct hdmi_context *hdata, u8 *acr)
865 {
866 	hdmi_reg_writeb(hdata, HDMI_ACR_N0, acr[6]);
867 	hdmi_reg_writeb(hdata, HDMI_ACR_N1, acr[5]);
868 	hdmi_reg_writeb(hdata, HDMI_ACR_N2, acr[4]);
869 	hdmi_reg_writeb(hdata, HDMI_ACR_MCTS0, acr[3]);
870 	hdmi_reg_writeb(hdata, HDMI_ACR_MCTS1, acr[2]);
871 	hdmi_reg_writeb(hdata, HDMI_ACR_MCTS2, acr[1]);
872 	hdmi_reg_writeb(hdata, HDMI_ACR_CTS0, acr[3]);
873 	hdmi_reg_writeb(hdata, HDMI_ACR_CTS1, acr[2]);
874 	hdmi_reg_writeb(hdata, HDMI_ACR_CTS2, acr[1]);
875 
876 	if (hdata->type == HDMI_TYPE13)
877 		hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 4);
878 	else
879 		hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
880 }
881 
882 static void hdmi_audio_init(struct hdmi_context *hdata)
883 {
884 	u32 sample_rate, bits_per_sample, frame_size_code;
885 	u32 data_num, bit_ch, sample_frq;
886 	u32 val;
887 	u8 acr[7];
888 
889 	sample_rate = 44100;
890 	bits_per_sample = 16;
891 	frame_size_code = 0;
892 
893 	switch (bits_per_sample) {
894 	case 20:
895 		data_num = 2;
896 		bit_ch  = 1;
897 		break;
898 	case 24:
899 		data_num = 3;
900 		bit_ch  = 1;
901 		break;
902 	default:
903 		data_num = 1;
904 		bit_ch  = 0;
905 		break;
906 	}
907 
908 	hdmi_set_acr(sample_rate, acr);
909 	hdmi_reg_acr(hdata, acr);
910 
911 	hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
912 				| HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
913 				| HDMI_I2S_MUX_ENABLE);
914 
915 	hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
916 			| HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
917 
918 	hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
919 
920 	sample_frq = (sample_rate == 44100) ? 0 :
921 			(sample_rate == 48000) ? 2 :
922 			(sample_rate == 32000) ? 3 :
923 			(sample_rate == 96000) ? 0xa : 0x0;
924 
925 	hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
926 	hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
927 
928 	val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
929 	hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
930 
931 	/* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
932 	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
933 			| HDMI_I2S_SEL_LRCK(6));
934 	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(1)
935 			| HDMI_I2S_SEL_SDATA2(4));
936 	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
937 			| HDMI_I2S_SEL_SDATA2(2));
938 	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
939 
940 	/* I2S_CON_1 & 2 */
941 	hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
942 			| HDMI_I2S_L_CH_LOW_POL);
943 	hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
944 			| HDMI_I2S_SET_BIT_CH(bit_ch)
945 			| HDMI_I2S_SET_SDATA_BIT(data_num)
946 			| HDMI_I2S_BASIC_FORMAT);
947 
948 	/* Configure register related to CUV information */
949 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0
950 			| HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH
951 			| HDMI_I2S_COPYRIGHT
952 			| HDMI_I2S_LINEAR_PCM
953 			| HDMI_I2S_CONSUMER_FORMAT);
954 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER);
955 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0));
956 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2
957 			| HDMI_I2S_SET_SMP_FREQ(sample_frq));
958 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4,
959 			HDMI_I2S_ORG_SMP_FREQ_44_1
960 			| HDMI_I2S_WORD_LEN_MAX24_24BITS
961 			| HDMI_I2S_WORD_LEN_MAX_24BITS);
962 
963 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
964 }
965 
966 static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
967 {
968 	if (hdata->dvi_mode)
969 		return;
970 
971 	hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
972 	hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ?
973 			HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
974 }
975 
976 static void hdmi_conf_reset(struct hdmi_context *hdata)
977 {
978 	u32 reg;
979 
980 	if (hdata->type == HDMI_TYPE13)
981 		reg = HDMI_V13_CORE_RSTOUT;
982 	else
983 		reg = HDMI_CORE_RSTOUT;
984 
985 	/* resetting HDMI core */
986 	hdmi_reg_writemask(hdata, reg,  0, HDMI_CORE_SW_RSTOUT);
987 	usleep_range(10000, 12000);
988 	hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
989 	usleep_range(10000, 12000);
990 }
991 
992 static void hdmi_conf_init(struct hdmi_context *hdata)
993 {
994 	struct hdmi_infoframe infoframe;
995 
996 	/* disable HPD interrupts from HDMI IP block, use GPIO instead */
997 	hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
998 		HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
999 
1000 	/* choose HDMI mode */
1001 	hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1002 		HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
1003 	/* disable bluescreen */
1004 	hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
1005 
1006 	if (hdata->dvi_mode) {
1007 		/* choose DVI mode */
1008 		hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1009 				HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1010 		hdmi_reg_writeb(hdata, HDMI_CON_2,
1011 				HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1012 	}
1013 
1014 	if (hdata->type == HDMI_TYPE13) {
1015 		/* choose bluescreen (fecal) color */
1016 		hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
1017 		hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
1018 		hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1019 
1020 		/* enable AVI packet every vsync, fixes purple line problem */
1021 		hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1022 		/* force RGB, look to CEA-861-D, table 7 for more detail */
1023 		hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1024 		hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1025 
1026 		hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1027 		hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1028 		hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1029 	} else {
1030 		infoframe.type = HDMI_PACKET_TYPE_AVI;
1031 		infoframe.ver = HDMI_AVI_VERSION;
1032 		infoframe.len = HDMI_AVI_LENGTH;
1033 		hdmi_reg_infoframe(hdata, &infoframe);
1034 
1035 		infoframe.type = HDMI_PACKET_TYPE_AUI;
1036 		infoframe.ver = HDMI_AUI_VERSION;
1037 		infoframe.len = HDMI_AUI_LENGTH;
1038 		hdmi_reg_infoframe(hdata, &infoframe);
1039 
1040 		/* enable AVI packet every vsync, fixes purple line problem */
1041 		hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1042 	}
1043 }
1044 
1045 static void hdmi_v13_timing_apply(struct hdmi_context *hdata)
1046 {
1047 	const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg;
1048 	const struct hdmi_v13_core_regs *core =
1049 		&hdata->mode_conf.conf.v13_conf.core;
1050 	int tries;
1051 
1052 	/* setting core registers */
1053 	hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1054 	hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1055 	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_0, core->v_blank[0]);
1056 	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_1, core->v_blank[1]);
1057 	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_2, core->v_blank[2]);
1058 	hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_0, core->h_v_line[0]);
1059 	hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_1, core->h_v_line[1]);
1060 	hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_2, core->h_v_line[2]);
1061 	hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1062 	hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1063 	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_0, core->v_blank_f[0]);
1064 	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_1, core->v_blank_f[1]);
1065 	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_2, core->v_blank_f[2]);
1066 	hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_0, core->h_sync_gen[0]);
1067 	hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_1, core->h_sync_gen[1]);
1068 	hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_2, core->h_sync_gen[2]);
1069 	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_0, core->v_sync_gen1[0]);
1070 	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_1, core->v_sync_gen1[1]);
1071 	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_2, core->v_sync_gen1[2]);
1072 	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_0, core->v_sync_gen2[0]);
1073 	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_1, core->v_sync_gen2[1]);
1074 	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_2, core->v_sync_gen2[2]);
1075 	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_0, core->v_sync_gen3[0]);
1076 	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_1, core->v_sync_gen3[1]);
1077 	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_2, core->v_sync_gen3[2]);
1078 	/* Timing generator registers */
1079 	hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1080 	hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1081 	hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1082 	hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1083 	hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1084 	hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1085 	hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1086 	hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1087 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1088 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1089 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1090 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1091 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1092 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1093 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1094 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1095 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1096 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1097 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1098 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1099 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1100 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1101 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1102 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1103 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1104 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1105 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1106 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1107 
1108 	/* waiting for HDMIPHY's PLL to get to steady state */
1109 	for (tries = 100; tries; --tries) {
1110 		u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
1111 		if (val & HDMI_PHY_STATUS_READY)
1112 			break;
1113 		usleep_range(1000, 2000);
1114 	}
1115 	/* steady state not achieved */
1116 	if (tries == 0) {
1117 		DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1118 		hdmi_regs_dump(hdata, "timing apply");
1119 	}
1120 
1121 	clk_disable(hdata->res.sclk_hdmi);
1122 	clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_hdmiphy);
1123 	clk_enable(hdata->res.sclk_hdmi);
1124 
1125 	/* enable HDMI and timing generator */
1126 	hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
1127 	if (core->int_pro_mode[0])
1128 		hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
1129 				HDMI_FIELD_EN);
1130 	else
1131 		hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
1132 }
1133 
1134 static void hdmi_v14_timing_apply(struct hdmi_context *hdata)
1135 {
1136 	const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg;
1137 	const struct hdmi_v14_core_regs *core =
1138 		&hdata->mode_conf.conf.v14_conf.core;
1139 	int tries;
1140 
1141 	/* setting core registers */
1142 	hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1143 	hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1144 	hdmi_reg_writeb(hdata, HDMI_V2_BLANK_0, core->v2_blank[0]);
1145 	hdmi_reg_writeb(hdata, HDMI_V2_BLANK_1, core->v2_blank[1]);
1146 	hdmi_reg_writeb(hdata, HDMI_V1_BLANK_0, core->v1_blank[0]);
1147 	hdmi_reg_writeb(hdata, HDMI_V1_BLANK_1, core->v1_blank[1]);
1148 	hdmi_reg_writeb(hdata, HDMI_V_LINE_0, core->v_line[0]);
1149 	hdmi_reg_writeb(hdata, HDMI_V_LINE_1, core->v_line[1]);
1150 	hdmi_reg_writeb(hdata, HDMI_H_LINE_0, core->h_line[0]);
1151 	hdmi_reg_writeb(hdata, HDMI_H_LINE_1, core->h_line[1]);
1152 	hdmi_reg_writeb(hdata, HDMI_HSYNC_POL, core->hsync_pol[0]);
1153 	hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1154 	hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1155 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_0, core->v_blank_f0[0]);
1156 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_1, core->v_blank_f0[1]);
1157 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_0, core->v_blank_f1[0]);
1158 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_1, core->v_blank_f1[1]);
1159 	hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_0, core->h_sync_start[0]);
1160 	hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_1, core->h_sync_start[1]);
1161 	hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_0, core->h_sync_end[0]);
1162 	hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_1, core->h_sync_end[1]);
1163 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_0,
1164 			core->v_sync_line_bef_2[0]);
1165 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_1,
1166 			core->v_sync_line_bef_2[1]);
1167 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_0,
1168 			core->v_sync_line_bef_1[0]);
1169 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_1,
1170 			core->v_sync_line_bef_1[1]);
1171 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_0,
1172 			core->v_sync_line_aft_2[0]);
1173 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_1,
1174 			core->v_sync_line_aft_2[1]);
1175 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_0,
1176 			core->v_sync_line_aft_1[0]);
1177 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_1,
1178 			core->v_sync_line_aft_1[1]);
1179 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0,
1180 			core->v_sync_line_aft_pxl_2[0]);
1181 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_1,
1182 			core->v_sync_line_aft_pxl_2[1]);
1183 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0,
1184 			core->v_sync_line_aft_pxl_1[0]);
1185 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_1,
1186 			core->v_sync_line_aft_pxl_1[1]);
1187 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_0, core->v_blank_f2[0]);
1188 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_1, core->v_blank_f2[1]);
1189 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_0, core->v_blank_f3[0]);
1190 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_1, core->v_blank_f3[1]);
1191 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_0, core->v_blank_f4[0]);
1192 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_1, core->v_blank_f4[1]);
1193 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_0, core->v_blank_f5[0]);
1194 	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_1, core->v_blank_f5[1]);
1195 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_0,
1196 			core->v_sync_line_aft_3[0]);
1197 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_1,
1198 			core->v_sync_line_aft_3[1]);
1199 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_0,
1200 			core->v_sync_line_aft_4[0]);
1201 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_1,
1202 			core->v_sync_line_aft_4[1]);
1203 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_0,
1204 			core->v_sync_line_aft_5[0]);
1205 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_1,
1206 			core->v_sync_line_aft_5[1]);
1207 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_0,
1208 			core->v_sync_line_aft_6[0]);
1209 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_1,
1210 			core->v_sync_line_aft_6[1]);
1211 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0,
1212 			core->v_sync_line_aft_pxl_3[0]);
1213 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_1,
1214 			core->v_sync_line_aft_pxl_3[1]);
1215 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0,
1216 			core->v_sync_line_aft_pxl_4[0]);
1217 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_1,
1218 			core->v_sync_line_aft_pxl_4[1]);
1219 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0,
1220 			core->v_sync_line_aft_pxl_5[0]);
1221 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_1,
1222 			core->v_sync_line_aft_pxl_5[1]);
1223 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0,
1224 			core->v_sync_line_aft_pxl_6[0]);
1225 	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_1,
1226 			core->v_sync_line_aft_pxl_6[1]);
1227 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_0, core->vact_space_1[0]);
1228 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_1, core->vact_space_1[1]);
1229 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_0, core->vact_space_2[0]);
1230 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_1, core->vact_space_2[1]);
1231 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_0, core->vact_space_3[0]);
1232 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_1, core->vact_space_3[1]);
1233 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_0, core->vact_space_4[0]);
1234 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_1, core->vact_space_4[1]);
1235 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_0, core->vact_space_5[0]);
1236 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_1, core->vact_space_5[1]);
1237 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_0, core->vact_space_6[0]);
1238 	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_1, core->vact_space_6[1]);
1239 
1240 	/* Timing generator registers */
1241 	hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1242 	hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1243 	hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1244 	hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1245 	hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1246 	hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1247 	hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1248 	hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1249 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1250 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1251 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1252 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1253 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1254 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1255 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1256 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1257 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1258 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1259 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1260 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1261 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_L, tg->vact_st3[0]);
1262 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_H, tg->vact_st3[1]);
1263 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_L, tg->vact_st4[0]);
1264 	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_H, tg->vact_st4[1]);
1265 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1266 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1267 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1268 	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1269 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1270 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1271 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1272 	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1273 	hdmi_reg_writeb(hdata, HDMI_TG_3D, tg->tg_3d[0]);
1274 
1275 	/* waiting for HDMIPHY's PLL to get to steady state */
1276 	for (tries = 100; tries; --tries) {
1277 		u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
1278 		if (val & HDMI_PHY_STATUS_READY)
1279 			break;
1280 		usleep_range(1000, 2000);
1281 	}
1282 	/* steady state not achieved */
1283 	if (tries == 0) {
1284 		DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1285 		hdmi_regs_dump(hdata, "timing apply");
1286 	}
1287 
1288 	clk_disable(hdata->res.sclk_hdmi);
1289 	clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_hdmiphy);
1290 	clk_enable(hdata->res.sclk_hdmi);
1291 
1292 	/* enable HDMI and timing generator */
1293 	hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
1294 	if (core->int_pro_mode[0])
1295 		hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
1296 				HDMI_FIELD_EN);
1297 	else
1298 		hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
1299 }
1300 
1301 static void hdmi_timing_apply(struct hdmi_context *hdata)
1302 {
1303 	if (hdata->type == HDMI_TYPE13)
1304 		hdmi_v13_timing_apply(hdata);
1305 	else
1306 		hdmi_v14_timing_apply(hdata);
1307 }
1308 
1309 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1310 {
1311 	u8 buffer[2];
1312 	u32 reg;
1313 
1314 	clk_disable(hdata->res.sclk_hdmi);
1315 	clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_pixel);
1316 	clk_enable(hdata->res.sclk_hdmi);
1317 
1318 	/* operation mode */
1319 	buffer[0] = 0x1f;
1320 	buffer[1] = 0x00;
1321 
1322 	if (hdata->hdmiphy_port)
1323 		i2c_master_send(hdata->hdmiphy_port, buffer, 2);
1324 
1325 	if (hdata->type == HDMI_TYPE13)
1326 		reg = HDMI_V13_PHY_RSTOUT;
1327 	else
1328 		reg = HDMI_PHY_RSTOUT;
1329 
1330 	/* reset hdmiphy */
1331 	hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
1332 	usleep_range(10000, 12000);
1333 	hdmi_reg_writemask(hdata, reg,  0, HDMI_PHY_SW_RSTOUT);
1334 	usleep_range(10000, 12000);
1335 }
1336 
1337 static void hdmiphy_poweron(struct hdmi_context *hdata)
1338 {
1339 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1340 
1341 	if (hdata->type == HDMI_TYPE14)
1342 		hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, 0,
1343 			HDMI_PHY_POWER_OFF_EN);
1344 }
1345 
1346 static void hdmiphy_poweroff(struct hdmi_context *hdata)
1347 {
1348 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1349 
1350 	if (hdata->type == HDMI_TYPE14)
1351 		hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, ~0,
1352 			HDMI_PHY_POWER_OFF_EN);
1353 }
1354 
1355 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1356 {
1357 	const u8 *hdmiphy_data;
1358 	u8 buffer[32];
1359 	u8 operation[2];
1360 	u8 read_buffer[32] = {0, };
1361 	int ret;
1362 	int i;
1363 
1364 	if (!hdata->hdmiphy_port) {
1365 		DRM_ERROR("hdmiphy is not attached\n");
1366 		return;
1367 	}
1368 
1369 	/* pixel clock */
1370 	i = hdmi_find_phy_conf(hdata, hdata->mode_conf.pixel_clock);
1371 	if (i < 0) {
1372 		DRM_ERROR("failed to find hdmiphy conf\n");
1373 		return;
1374 	}
1375 
1376 	if (hdata->type == HDMI_TYPE13)
1377 		hdmiphy_data = hdmiphy_v13_configs[i].conf;
1378 	else
1379 		hdmiphy_data = hdmiphy_v14_configs[i].conf;
1380 
1381 	memcpy(buffer, hdmiphy_data, 32);
1382 	ret = i2c_master_send(hdata->hdmiphy_port, buffer, 32);
1383 	if (ret != 32) {
1384 		DRM_ERROR("failed to configure HDMIPHY via I2C\n");
1385 		return;
1386 	}
1387 
1388 	usleep_range(10000, 12000);
1389 
1390 	/* operation mode */
1391 	operation[0] = 0x1f;
1392 	operation[1] = 0x80;
1393 
1394 	ret = i2c_master_send(hdata->hdmiphy_port, operation, 2);
1395 	if (ret != 2) {
1396 		DRM_ERROR("failed to enable hdmiphy\n");
1397 		return;
1398 	}
1399 
1400 	ret = i2c_master_recv(hdata->hdmiphy_port, read_buffer, 32);
1401 	if (ret < 0) {
1402 		DRM_ERROR("failed to read hdmiphy config\n");
1403 		return;
1404 	}
1405 
1406 	for (i = 0; i < ret; i++)
1407 		DRM_DEBUG_KMS("hdmiphy[0x%02x] write[0x%02x] - "
1408 			"recv [0x%02x]\n", i, buffer[i], read_buffer[i]);
1409 }
1410 
1411 static void hdmi_conf_apply(struct hdmi_context *hdata)
1412 {
1413 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1414 
1415 	hdmiphy_conf_reset(hdata);
1416 	hdmiphy_conf_apply(hdata);
1417 
1418 	mutex_lock(&hdata->hdmi_mutex);
1419 	hdmi_conf_reset(hdata);
1420 	hdmi_conf_init(hdata);
1421 	mutex_unlock(&hdata->hdmi_mutex);
1422 
1423 	hdmi_audio_init(hdata);
1424 
1425 	/* setting core registers */
1426 	hdmi_timing_apply(hdata);
1427 	hdmi_audio_control(hdata, true);
1428 
1429 	hdmi_regs_dump(hdata, "start");
1430 }
1431 
1432 static void hdmi_set_reg(u8 *reg_pair, int num_bytes, u32 value)
1433 {
1434 	int i;
1435 	BUG_ON(num_bytes > 4);
1436 	for (i = 0; i < num_bytes; i++)
1437 		reg_pair[i] = (value >> (8 * i)) & 0xff;
1438 }
1439 
1440 static void hdmi_v13_mode_set(struct hdmi_context *hdata,
1441 			struct drm_display_mode *m)
1442 {
1443 	struct hdmi_v13_core_regs *core = &hdata->mode_conf.conf.v13_conf.core;
1444 	struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg;
1445 	unsigned int val;
1446 
1447 	hdata->mode_conf.cea_video_id =
1448 		drm_match_cea_mode((struct drm_display_mode *)m);
1449 	hdata->mode_conf.pixel_clock = m->clock * 1000;
1450 
1451 	hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1452 	hdmi_set_reg(core->h_v_line, 3, (m->htotal << 12) | m->vtotal);
1453 
1454 	val = (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0;
1455 	hdmi_set_reg(core->vsync_pol, 1, val);
1456 
1457 	val = (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0;
1458 	hdmi_set_reg(core->int_pro_mode, 1, val);
1459 
1460 	val = (m->hsync_start - m->hdisplay - 2);
1461 	val |= ((m->hsync_end - m->hdisplay - 2) << 10);
1462 	val |= ((m->flags & DRM_MODE_FLAG_NHSYNC)  ? 1 : 0)<<20;
1463 	hdmi_set_reg(core->h_sync_gen, 3, val);
1464 
1465 	/*
1466 	 * Quirk requirement for exynos HDMI IP design,
1467 	 * 2 pixels less than the actual calculation for hsync_start
1468 	 * and end.
1469 	 */
1470 
1471 	/* Following values & calculations differ for different type of modes */
1472 	if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1473 		/* Interlaced Mode */
1474 		val = ((m->vsync_end - m->vdisplay) / 2);
1475 		val |= ((m->vsync_start - m->vdisplay) / 2) << 12;
1476 		hdmi_set_reg(core->v_sync_gen1, 3, val);
1477 
1478 		val = m->vtotal / 2;
1479 		val |= ((m->vtotal - m->vdisplay) / 2) << 11;
1480 		hdmi_set_reg(core->v_blank, 3, val);
1481 
1482 		val = (m->vtotal +
1483 			((m->vsync_end - m->vsync_start) * 4) + 5) / 2;
1484 		val |= m->vtotal << 11;
1485 		hdmi_set_reg(core->v_blank_f, 3, val);
1486 
1487 		val = ((m->vtotal / 2) + 7);
1488 		val |= ((m->vtotal / 2) + 2) << 12;
1489 		hdmi_set_reg(core->v_sync_gen2, 3, val);
1490 
1491 		val = ((m->htotal / 2) + (m->hsync_start - m->hdisplay));
1492 		val |= ((m->htotal / 2) +
1493 			(m->hsync_start - m->hdisplay)) << 12;
1494 		hdmi_set_reg(core->v_sync_gen3, 3, val);
1495 
1496 		hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1497 		hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1498 
1499 		hdmi_set_reg(tg->vact_st2, 2, 0x249);/* Reset value + 1*/
1500 	} else {
1501 		/* Progressive Mode */
1502 
1503 		val = m->vtotal;
1504 		val |= (m->vtotal - m->vdisplay) << 11;
1505 		hdmi_set_reg(core->v_blank, 3, val);
1506 
1507 		hdmi_set_reg(core->v_blank_f, 3, 0);
1508 
1509 		val = (m->vsync_end - m->vdisplay);
1510 		val |= ((m->vsync_start - m->vdisplay) << 12);
1511 		hdmi_set_reg(core->v_sync_gen1, 3, val);
1512 
1513 		hdmi_set_reg(core->v_sync_gen2, 3, 0x1001);/* Reset value  */
1514 		hdmi_set_reg(core->v_sync_gen3, 3, 0x1001);/* Reset value  */
1515 		hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1516 		hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1517 		hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1518 	}
1519 
1520 	/* Timing generator registers */
1521 	hdmi_set_reg(tg->cmd, 1, 0x0);
1522 	hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1523 	hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1524 	hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1525 	hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1526 	hdmi_set_reg(tg->vsync, 2, 0x1);
1527 	hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1528 	hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1529 	hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1530 	hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1531 	hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1532 	hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1533 	hdmi_set_reg(tg->tg_3d, 1, 0x0); /* Not used */
1534 }
1535 
1536 static void hdmi_v14_mode_set(struct hdmi_context *hdata,
1537 			struct drm_display_mode *m)
1538 {
1539 	struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg;
1540 	struct hdmi_v14_core_regs *core =
1541 		&hdata->mode_conf.conf.v14_conf.core;
1542 
1543 	hdata->mode_conf.cea_video_id =
1544 		drm_match_cea_mode((struct drm_display_mode *)m);
1545 	hdata->mode_conf.pixel_clock = m->clock * 1000;
1546 
1547 	hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1548 	hdmi_set_reg(core->v_line, 2, m->vtotal);
1549 	hdmi_set_reg(core->h_line, 2, m->htotal);
1550 	hdmi_set_reg(core->hsync_pol, 1,
1551 			(m->flags & DRM_MODE_FLAG_NHSYNC)  ? 1 : 0);
1552 	hdmi_set_reg(core->vsync_pol, 1,
1553 			(m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1554 	hdmi_set_reg(core->int_pro_mode, 1,
1555 			(m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1556 
1557 	/*
1558 	 * Quirk requirement for exynos 5 HDMI IP design,
1559 	 * 2 pixels less than the actual calculation for hsync_start
1560 	 * and end.
1561 	 */
1562 
1563 	/* Following values & calculations differ for different type of modes */
1564 	if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1565 		/* Interlaced Mode */
1566 		hdmi_set_reg(core->v_sync_line_bef_2, 2,
1567 			(m->vsync_end - m->vdisplay) / 2);
1568 		hdmi_set_reg(core->v_sync_line_bef_1, 2,
1569 			(m->vsync_start - m->vdisplay) / 2);
1570 		hdmi_set_reg(core->v2_blank, 2, m->vtotal / 2);
1571 		hdmi_set_reg(core->v1_blank, 2, (m->vtotal - m->vdisplay) / 2);
1572 		hdmi_set_reg(core->v_blank_f0, 2, (m->vtotal +
1573 			((m->vsync_end - m->vsync_start) * 4) + 5) / 2);
1574 		hdmi_set_reg(core->v_blank_f1, 2, m->vtotal);
1575 		hdmi_set_reg(core->v_sync_line_aft_2, 2, (m->vtotal / 2) + 7);
1576 		hdmi_set_reg(core->v_sync_line_aft_1, 2, (m->vtotal / 2) + 2);
1577 		hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2,
1578 			(m->htotal / 2) + (m->hsync_start - m->hdisplay));
1579 		hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2,
1580 			(m->htotal / 2) + (m->hsync_start - m->hdisplay));
1581 		hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1582 		hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1583 		hdmi_set_reg(tg->vact_st2, 2, 0x249);/* Reset value + 1*/
1584 		hdmi_set_reg(tg->vact_st3, 2, 0x0);
1585 		hdmi_set_reg(tg->vact_st4, 2, 0x0);
1586 	} else {
1587 		/* Progressive Mode */
1588 		hdmi_set_reg(core->v_sync_line_bef_2, 2,
1589 			m->vsync_end - m->vdisplay);
1590 		hdmi_set_reg(core->v_sync_line_bef_1, 2,
1591 			m->vsync_start - m->vdisplay);
1592 		hdmi_set_reg(core->v2_blank, 2, m->vtotal);
1593 		hdmi_set_reg(core->v1_blank, 2, m->vtotal - m->vdisplay);
1594 		hdmi_set_reg(core->v_blank_f0, 2, 0xffff);
1595 		hdmi_set_reg(core->v_blank_f1, 2, 0xffff);
1596 		hdmi_set_reg(core->v_sync_line_aft_2, 2, 0xffff);
1597 		hdmi_set_reg(core->v_sync_line_aft_1, 2, 0xffff);
1598 		hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2, 0xffff);
1599 		hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2, 0xffff);
1600 		hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1601 		hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1602 		hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1603 		hdmi_set_reg(tg->vact_st3, 2, 0x47b); /* Reset value */
1604 		hdmi_set_reg(tg->vact_st4, 2, 0x6ae); /* Reset value */
1605 	}
1606 
1607 	/* Following values & calculations are same irrespective of mode type */
1608 	hdmi_set_reg(core->h_sync_start, 2, m->hsync_start - m->hdisplay - 2);
1609 	hdmi_set_reg(core->h_sync_end, 2, m->hsync_end - m->hdisplay - 2);
1610 	hdmi_set_reg(core->vact_space_1, 2, 0xffff);
1611 	hdmi_set_reg(core->vact_space_2, 2, 0xffff);
1612 	hdmi_set_reg(core->vact_space_3, 2, 0xffff);
1613 	hdmi_set_reg(core->vact_space_4, 2, 0xffff);
1614 	hdmi_set_reg(core->vact_space_5, 2, 0xffff);
1615 	hdmi_set_reg(core->vact_space_6, 2, 0xffff);
1616 	hdmi_set_reg(core->v_blank_f2, 2, 0xffff);
1617 	hdmi_set_reg(core->v_blank_f3, 2, 0xffff);
1618 	hdmi_set_reg(core->v_blank_f4, 2, 0xffff);
1619 	hdmi_set_reg(core->v_blank_f5, 2, 0xffff);
1620 	hdmi_set_reg(core->v_sync_line_aft_3, 2, 0xffff);
1621 	hdmi_set_reg(core->v_sync_line_aft_4, 2, 0xffff);
1622 	hdmi_set_reg(core->v_sync_line_aft_5, 2, 0xffff);
1623 	hdmi_set_reg(core->v_sync_line_aft_6, 2, 0xffff);
1624 	hdmi_set_reg(core->v_sync_line_aft_pxl_3, 2, 0xffff);
1625 	hdmi_set_reg(core->v_sync_line_aft_pxl_4, 2, 0xffff);
1626 	hdmi_set_reg(core->v_sync_line_aft_pxl_5, 2, 0xffff);
1627 	hdmi_set_reg(core->v_sync_line_aft_pxl_6, 2, 0xffff);
1628 
1629 	/* Timing generator registers */
1630 	hdmi_set_reg(tg->cmd, 1, 0x0);
1631 	hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1632 	hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1633 	hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1634 	hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1635 	hdmi_set_reg(tg->vsync, 2, 0x1);
1636 	hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1637 	hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1638 	hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1639 	hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1640 	hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1641 	hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1642 	hdmi_set_reg(tg->tg_3d, 1, 0x0);
1643 }
1644 
1645 static void hdmi_mode_set(void *ctx, void *mode)
1646 {
1647 	struct hdmi_context *hdata = ctx;
1648 	struct drm_display_mode *m = mode;
1649 
1650 	DRM_DEBUG_KMS("[%s]: xres=%d, yres=%d, refresh=%d, intl=%s\n",
1651 		__func__, m->hdisplay, m->vdisplay,
1652 		m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ?
1653 		"INTERLACED" : "PROGERESSIVE");
1654 
1655 	if (hdata->type == HDMI_TYPE13)
1656 		hdmi_v13_mode_set(hdata, mode);
1657 	else
1658 		hdmi_v14_mode_set(hdata, mode);
1659 }
1660 
1661 static void hdmi_get_max_resol(void *ctx, unsigned int *width,
1662 					unsigned int *height)
1663 {
1664 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1665 
1666 	*width = MAX_WIDTH;
1667 	*height = MAX_HEIGHT;
1668 }
1669 
1670 static void hdmi_commit(void *ctx)
1671 {
1672 	struct hdmi_context *hdata = ctx;
1673 
1674 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1675 
1676 	mutex_lock(&hdata->hdmi_mutex);
1677 	if (!hdata->powered) {
1678 		mutex_unlock(&hdata->hdmi_mutex);
1679 		return;
1680 	}
1681 	mutex_unlock(&hdata->hdmi_mutex);
1682 
1683 	hdmi_conf_apply(hdata);
1684 }
1685 
1686 static void hdmi_poweron(struct hdmi_context *hdata)
1687 {
1688 	struct hdmi_resources *res = &hdata->res;
1689 
1690 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1691 
1692 	mutex_lock(&hdata->hdmi_mutex);
1693 	if (hdata->powered) {
1694 		mutex_unlock(&hdata->hdmi_mutex);
1695 		return;
1696 	}
1697 
1698 	hdata->powered = true;
1699 
1700 	mutex_unlock(&hdata->hdmi_mutex);
1701 
1702 	regulator_bulk_enable(res->regul_count, res->regul_bulk);
1703 	clk_enable(res->hdmiphy);
1704 	clk_enable(res->hdmi);
1705 	clk_enable(res->sclk_hdmi);
1706 
1707 	hdmiphy_poweron(hdata);
1708 }
1709 
1710 static void hdmi_poweroff(struct hdmi_context *hdata)
1711 {
1712 	struct hdmi_resources *res = &hdata->res;
1713 
1714 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
1715 
1716 	mutex_lock(&hdata->hdmi_mutex);
1717 	if (!hdata->powered)
1718 		goto out;
1719 	mutex_unlock(&hdata->hdmi_mutex);
1720 
1721 	/*
1722 	 * The TV power domain needs any condition of hdmiphy to turn off and
1723 	 * its reset state seems to meet the condition.
1724 	 */
1725 	hdmiphy_conf_reset(hdata);
1726 	hdmiphy_poweroff(hdata);
1727 
1728 	clk_disable(res->sclk_hdmi);
1729 	clk_disable(res->hdmi);
1730 	clk_disable(res->hdmiphy);
1731 	regulator_bulk_disable(res->regul_count, res->regul_bulk);
1732 
1733 	mutex_lock(&hdata->hdmi_mutex);
1734 
1735 	hdata->powered = false;
1736 
1737 out:
1738 	mutex_unlock(&hdata->hdmi_mutex);
1739 }
1740 
1741 static void hdmi_dpms(void *ctx, int mode)
1742 {
1743 	struct hdmi_context *hdata = ctx;
1744 
1745 	DRM_DEBUG_KMS("[%d] %s mode %d\n", __LINE__, __func__, mode);
1746 
1747 	switch (mode) {
1748 	case DRM_MODE_DPMS_ON:
1749 		if (pm_runtime_suspended(hdata->dev))
1750 			pm_runtime_get_sync(hdata->dev);
1751 		break;
1752 	case DRM_MODE_DPMS_STANDBY:
1753 	case DRM_MODE_DPMS_SUSPEND:
1754 	case DRM_MODE_DPMS_OFF:
1755 		if (!pm_runtime_suspended(hdata->dev))
1756 			pm_runtime_put_sync(hdata->dev);
1757 		break;
1758 	default:
1759 		DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
1760 		break;
1761 	}
1762 }
1763 
1764 static struct exynos_hdmi_ops hdmi_ops = {
1765 	/* display */
1766 	.is_connected	= hdmi_is_connected,
1767 	.get_edid	= hdmi_get_edid,
1768 	.check_timing	= hdmi_check_timing,
1769 
1770 	/* manager */
1771 	.mode_set	= hdmi_mode_set,
1772 	.get_max_resol	= hdmi_get_max_resol,
1773 	.commit		= hdmi_commit,
1774 	.dpms		= hdmi_dpms,
1775 };
1776 
1777 static irqreturn_t hdmi_irq_thread(int irq, void *arg)
1778 {
1779 	struct exynos_drm_hdmi_context *ctx = arg;
1780 	struct hdmi_context *hdata = ctx->ctx;
1781 
1782 	mutex_lock(&hdata->hdmi_mutex);
1783 	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
1784 	mutex_unlock(&hdata->hdmi_mutex);
1785 
1786 	if (ctx->drm_dev)
1787 		drm_helper_hpd_irq_event(ctx->drm_dev);
1788 
1789 	return IRQ_HANDLED;
1790 }
1791 
1792 static int hdmi_resources_init(struct hdmi_context *hdata)
1793 {
1794 	struct device *dev = hdata->dev;
1795 	struct hdmi_resources *res = &hdata->res;
1796 	static char *supply[] = {
1797 		"hdmi-en",
1798 		"vdd",
1799 		"vdd_osc",
1800 		"vdd_pll",
1801 	};
1802 	int i, ret;
1803 
1804 	DRM_DEBUG_KMS("HDMI resource init\n");
1805 
1806 	memset(res, 0, sizeof(*res));
1807 
1808 	/* get clocks, power */
1809 	res->hdmi = devm_clk_get(dev, "hdmi");
1810 	if (IS_ERR(res->hdmi)) {
1811 		DRM_ERROR("failed to get clock 'hdmi'\n");
1812 		goto fail;
1813 	}
1814 	res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi");
1815 	if (IS_ERR(res->sclk_hdmi)) {
1816 		DRM_ERROR("failed to get clock 'sclk_hdmi'\n");
1817 		goto fail;
1818 	}
1819 	res->sclk_pixel = devm_clk_get(dev, "sclk_pixel");
1820 	if (IS_ERR(res->sclk_pixel)) {
1821 		DRM_ERROR("failed to get clock 'sclk_pixel'\n");
1822 		goto fail;
1823 	}
1824 	res->sclk_hdmiphy = devm_clk_get(dev, "sclk_hdmiphy");
1825 	if (IS_ERR(res->sclk_hdmiphy)) {
1826 		DRM_ERROR("failed to get clock 'sclk_hdmiphy'\n");
1827 		goto fail;
1828 	}
1829 	res->hdmiphy = devm_clk_get(dev, "hdmiphy");
1830 	if (IS_ERR(res->hdmiphy)) {
1831 		DRM_ERROR("failed to get clock 'hdmiphy'\n");
1832 		goto fail;
1833 	}
1834 
1835 	clk_set_parent(res->sclk_hdmi, res->sclk_pixel);
1836 
1837 	res->regul_bulk = devm_kzalloc(dev, ARRAY_SIZE(supply) *
1838 		sizeof(res->regul_bulk[0]), GFP_KERNEL);
1839 	if (!res->regul_bulk) {
1840 		DRM_ERROR("failed to get memory for regulators\n");
1841 		goto fail;
1842 	}
1843 	for (i = 0; i < ARRAY_SIZE(supply); ++i) {
1844 		res->regul_bulk[i].supply = supply[i];
1845 		res->regul_bulk[i].consumer = NULL;
1846 	}
1847 	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), res->regul_bulk);
1848 	if (ret) {
1849 		DRM_ERROR("failed to get regulators\n");
1850 		goto fail;
1851 	}
1852 	res->regul_count = ARRAY_SIZE(supply);
1853 
1854 	return 0;
1855 fail:
1856 	DRM_ERROR("HDMI resource init - failed\n");
1857 	return -ENODEV;
1858 }
1859 
1860 static struct i2c_client *hdmi_ddc, *hdmi_hdmiphy;
1861 
1862 void hdmi_attach_ddc_client(struct i2c_client *ddc)
1863 {
1864 	if (ddc)
1865 		hdmi_ddc = ddc;
1866 }
1867 
1868 void hdmi_attach_hdmiphy_client(struct i2c_client *hdmiphy)
1869 {
1870 	if (hdmiphy)
1871 		hdmi_hdmiphy = hdmiphy;
1872 }
1873 
1874 #ifdef CONFIG_OF
1875 static struct s5p_hdmi_platform_data *drm_hdmi_dt_parse_pdata
1876 					(struct device *dev)
1877 {
1878 	struct device_node *np = dev->of_node;
1879 	struct s5p_hdmi_platform_data *pd;
1880 	enum of_gpio_flags flags;
1881 	u32 value;
1882 
1883 	pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
1884 	if (!pd) {
1885 		DRM_ERROR("memory allocation for pdata failed\n");
1886 		goto err_data;
1887 	}
1888 
1889 	if (!of_find_property(np, "hpd-gpio", &value)) {
1890 		DRM_ERROR("no hpd gpio property found\n");
1891 		goto err_data;
1892 	}
1893 
1894 	pd->hpd_gpio = of_get_named_gpio_flags(np, "hpd-gpio", 0, &flags);
1895 
1896 	return pd;
1897 
1898 err_data:
1899 	return NULL;
1900 }
1901 #else
1902 static struct s5p_hdmi_platform_data *drm_hdmi_dt_parse_pdata
1903 					(struct device *dev)
1904 {
1905 	return NULL;
1906 }
1907 #endif
1908 
1909 static struct platform_device_id hdmi_driver_types[] = {
1910 	{
1911 		.name		= "s5pv210-hdmi",
1912 		.driver_data    = HDMI_TYPE13,
1913 	}, {
1914 		.name		= "exynos4-hdmi",
1915 		.driver_data    = HDMI_TYPE13,
1916 	}, {
1917 		.name		= "exynos4-hdmi14",
1918 		.driver_data	= HDMI_TYPE14,
1919 	}, {
1920 		.name		= "exynos5-hdmi",
1921 		.driver_data	= HDMI_TYPE14,
1922 	}, {
1923 		/* end node */
1924 	}
1925 };
1926 
1927 #ifdef CONFIG_OF
1928 static struct of_device_id hdmi_match_types[] = {
1929 	{
1930 		.compatible = "samsung,exynos5-hdmi",
1931 		.data	= (void	*)HDMI_TYPE14,
1932 	}, {
1933 		/* end node */
1934 	}
1935 };
1936 #endif
1937 
1938 static int hdmi_probe(struct platform_device *pdev)
1939 {
1940 	struct device *dev = &pdev->dev;
1941 	struct exynos_drm_hdmi_context *drm_hdmi_ctx;
1942 	struct hdmi_context *hdata;
1943 	struct s5p_hdmi_platform_data *pdata;
1944 	struct resource *res;
1945 	int ret;
1946 
1947 	DRM_DEBUG_KMS("[%d]\n", __LINE__);
1948 
1949 	if (dev->of_node) {
1950 		pdata = drm_hdmi_dt_parse_pdata(dev);
1951 		if (IS_ERR(pdata)) {
1952 			DRM_ERROR("failed to parse dt\n");
1953 			return PTR_ERR(pdata);
1954 		}
1955 	} else {
1956 		pdata = dev->platform_data;
1957 	}
1958 
1959 	if (!pdata) {
1960 		DRM_ERROR("no platform data specified\n");
1961 		return -EINVAL;
1962 	}
1963 
1964 	drm_hdmi_ctx = devm_kzalloc(dev, sizeof(*drm_hdmi_ctx),
1965 								GFP_KERNEL);
1966 	if (!drm_hdmi_ctx) {
1967 		DRM_ERROR("failed to allocate common hdmi context.\n");
1968 		return -ENOMEM;
1969 	}
1970 
1971 	hdata = devm_kzalloc(dev, sizeof(struct hdmi_context),
1972 								GFP_KERNEL);
1973 	if (!hdata) {
1974 		DRM_ERROR("out of memory\n");
1975 		return -ENOMEM;
1976 	}
1977 
1978 	mutex_init(&hdata->hdmi_mutex);
1979 
1980 	drm_hdmi_ctx->ctx = (void *)hdata;
1981 	hdata->parent_ctx = (void *)drm_hdmi_ctx;
1982 
1983 	platform_set_drvdata(pdev, drm_hdmi_ctx);
1984 
1985 	if (dev->of_node) {
1986 		const struct of_device_id *match;
1987 		match = of_match_node(of_match_ptr(hdmi_match_types),
1988 					dev->of_node);
1989 		if (match == NULL)
1990 			return -ENODEV;
1991 		hdata->type = (enum hdmi_type)match->data;
1992 	} else {
1993 		hdata->type = (enum hdmi_type)platform_get_device_id
1994 					(pdev)->driver_data;
1995 	}
1996 
1997 	hdata->hpd_gpio = pdata->hpd_gpio;
1998 	hdata->dev = dev;
1999 
2000 	ret = hdmi_resources_init(hdata);
2001 
2002 	if (ret) {
2003 		DRM_ERROR("hdmi_resources_init failed\n");
2004 		return -EINVAL;
2005 	}
2006 
2007 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2008 	hdata->regs = devm_ioremap_resource(dev, res);
2009 	if (IS_ERR(hdata->regs))
2010 		return PTR_ERR(hdata->regs);
2011 
2012 	ret = devm_gpio_request(dev, hdata->hpd_gpio, "HPD");
2013 	if (ret) {
2014 		DRM_ERROR("failed to request HPD gpio\n");
2015 		return ret;
2016 	}
2017 
2018 	/* DDC i2c driver */
2019 	if (i2c_add_driver(&ddc_driver)) {
2020 		DRM_ERROR("failed to register ddc i2c driver\n");
2021 		return -ENOENT;
2022 	}
2023 
2024 	hdata->ddc_port = hdmi_ddc;
2025 
2026 	/* hdmiphy i2c driver */
2027 	if (i2c_add_driver(&hdmiphy_driver)) {
2028 		DRM_ERROR("failed to register hdmiphy i2c driver\n");
2029 		ret = -ENOENT;
2030 		goto err_ddc;
2031 	}
2032 
2033 	hdata->hdmiphy_port = hdmi_hdmiphy;
2034 
2035 	hdata->irq = gpio_to_irq(hdata->hpd_gpio);
2036 	if (hdata->irq < 0) {
2037 		DRM_ERROR("failed to get GPIO irq\n");
2038 		ret = hdata->irq;
2039 		goto err_hdmiphy;
2040 	}
2041 
2042 	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
2043 
2044 	ret = devm_request_threaded_irq(dev, hdata->irq, NULL,
2045 			hdmi_irq_thread, IRQF_TRIGGER_RISING |
2046 			IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
2047 			"hdmi", drm_hdmi_ctx);
2048 	if (ret) {
2049 		DRM_ERROR("failed to register hdmi interrupt\n");
2050 		goto err_hdmiphy;
2051 	}
2052 
2053 	/* Attach HDMI Driver to common hdmi. */
2054 	exynos_hdmi_drv_attach(drm_hdmi_ctx);
2055 
2056 	/* register specific callbacks to common hdmi. */
2057 	exynos_hdmi_ops_register(&hdmi_ops);
2058 
2059 	pm_runtime_enable(dev);
2060 
2061 	return 0;
2062 
2063 err_hdmiphy:
2064 	i2c_del_driver(&hdmiphy_driver);
2065 err_ddc:
2066 	i2c_del_driver(&ddc_driver);
2067 	return ret;
2068 }
2069 
2070 static int hdmi_remove(struct platform_device *pdev)
2071 {
2072 	struct device *dev = &pdev->dev;
2073 
2074 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
2075 
2076 	pm_runtime_disable(dev);
2077 
2078 	/* hdmiphy i2c driver */
2079 	i2c_del_driver(&hdmiphy_driver);
2080 	/* DDC i2c driver */
2081 	i2c_del_driver(&ddc_driver);
2082 
2083 	return 0;
2084 }
2085 
2086 #ifdef CONFIG_PM_SLEEP
2087 static int hdmi_suspend(struct device *dev)
2088 {
2089 	struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2090 	struct hdmi_context *hdata = ctx->ctx;
2091 
2092 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
2093 
2094 	disable_irq(hdata->irq);
2095 
2096 	hdata->hpd = false;
2097 	if (ctx->drm_dev)
2098 		drm_helper_hpd_irq_event(ctx->drm_dev);
2099 
2100 	if (pm_runtime_suspended(dev)) {
2101 		DRM_DEBUG_KMS("%s : Already suspended\n", __func__);
2102 		return 0;
2103 	}
2104 
2105 	hdmi_poweroff(hdata);
2106 
2107 	return 0;
2108 }
2109 
2110 static int hdmi_resume(struct device *dev)
2111 {
2112 	struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2113 	struct hdmi_context *hdata = ctx->ctx;
2114 
2115 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
2116 
2117 	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
2118 
2119 	enable_irq(hdata->irq);
2120 
2121 	if (!pm_runtime_suspended(dev)) {
2122 		DRM_DEBUG_KMS("%s : Already resumed\n", __func__);
2123 		return 0;
2124 	}
2125 
2126 	hdmi_poweron(hdata);
2127 
2128 	return 0;
2129 }
2130 #endif
2131 
2132 #ifdef CONFIG_PM_RUNTIME
2133 static int hdmi_runtime_suspend(struct device *dev)
2134 {
2135 	struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2136 	struct hdmi_context *hdata = ctx->ctx;
2137 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
2138 
2139 	hdmi_poweroff(hdata);
2140 
2141 	return 0;
2142 }
2143 
2144 static int hdmi_runtime_resume(struct device *dev)
2145 {
2146 	struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2147 	struct hdmi_context *hdata = ctx->ctx;
2148 	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
2149 
2150 	hdmi_poweron(hdata);
2151 
2152 	return 0;
2153 }
2154 #endif
2155 
2156 static const struct dev_pm_ops hdmi_pm_ops = {
2157 	SET_SYSTEM_SLEEP_PM_OPS(hdmi_suspend, hdmi_resume)
2158 	SET_RUNTIME_PM_OPS(hdmi_runtime_suspend, hdmi_runtime_resume, NULL)
2159 };
2160 
2161 struct platform_driver hdmi_driver = {
2162 	.probe		= hdmi_probe,
2163 	.remove		= hdmi_remove,
2164 	.id_table = hdmi_driver_types,
2165 	.driver		= {
2166 		.name	= "exynos-hdmi",
2167 		.owner	= THIS_MODULE,
2168 		.pm	= &hdmi_pm_ops,
2169 		.of_match_table = of_match_ptr(hdmi_match_types),
2170 	},
2171 };
2172