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 #include <drm/drm_atomic_helper.h>
21 
22 #include "regs-hdmi.h"
23 
24 #include <linux/kernel.h>
25 #include <linux/wait.h>
26 #include <linux/i2c.h>
27 #include <linux/platform_device.h>
28 #include <linux/interrupt.h>
29 #include <linux/irq.h>
30 #include <linux/delay.h>
31 #include <linux/pm_runtime.h>
32 #include <linux/clk.h>
33 #include <linux/gpio/consumer.h>
34 #include <linux/regulator/consumer.h>
35 #include <linux/io.h>
36 #include <linux/of_address.h>
37 #include <linux/of_device.h>
38 #include <linux/hdmi.h>
39 #include <linux/component.h>
40 #include <linux/mfd/syscon.h>
41 #include <linux/regmap.h>
42 
43 #include <drm/exynos_drm.h>
44 
45 #include "exynos_drm_drv.h"
46 #include "exynos_drm_crtc.h"
47 
48 #define HOTPLUG_DEBOUNCE_MS		1100
49 
50 /* AVI header and aspect ratio */
51 #define HDMI_AVI_VERSION		0x02
52 #define HDMI_AVI_LENGTH			0x0d
53 
54 /* AUI header info */
55 #define HDMI_AUI_VERSION		0x01
56 #define HDMI_AUI_LENGTH			0x0a
57 
58 /* AVI active format aspect ratio */
59 #define AVI_SAME_AS_PIC_ASPECT_RATIO	0x08
60 #define AVI_4_3_CENTER_RATIO		0x09
61 #define AVI_16_9_CENTER_RATIO		0x0a
62 
63 enum hdmi_type {
64 	HDMI_TYPE13,
65 	HDMI_TYPE14,
66 	HDMI_TYPE_COUNT
67 };
68 
69 #define HDMI_MAPPED_BASE 0xffff0000
70 
71 enum hdmi_mapped_regs {
72 	HDMI_PHY_STATUS = HDMI_MAPPED_BASE,
73 	HDMI_PHY_RSTOUT,
74 	HDMI_ACR_CON,
75 	HDMI_ACR_MCTS0,
76 	HDMI_ACR_CTS0,
77 	HDMI_ACR_N0
78 };
79 
80 static const u32 hdmi_reg_map[][HDMI_TYPE_COUNT] = {
81 	{ HDMI_V13_PHY_STATUS, HDMI_PHY_STATUS_0 },
82 	{ HDMI_V13_PHY_RSTOUT, HDMI_V14_PHY_RSTOUT },
83 	{ HDMI_V13_ACR_CON, HDMI_V14_ACR_CON },
84 	{ HDMI_V13_ACR_MCTS0, HDMI_V14_ACR_MCTS0 },
85 	{ HDMI_V13_ACR_CTS0, HDMI_V14_ACR_CTS0 },
86 	{ HDMI_V13_ACR_N0, HDMI_V14_ACR_N0 },
87 };
88 
89 static const char * const supply[] = {
90 	"vdd",
91 	"vdd_osc",
92 	"vdd_pll",
93 };
94 
95 struct hdmiphy_config {
96 	int pixel_clock;
97 	u8 conf[32];
98 };
99 
100 struct hdmiphy_configs {
101 	int count;
102 	const struct hdmiphy_config *data;
103 };
104 
105 struct string_array_spec {
106 	int count;
107 	const char * const *data;
108 };
109 
110 #define INIT_ARRAY_SPEC(a) { .count = ARRAY_SIZE(a), .data = a }
111 
112 struct hdmi_driver_data {
113 	unsigned int type;
114 	unsigned int is_apb_phy:1;
115 	unsigned int has_sysreg:1;
116 	struct hdmiphy_configs phy_confs;
117 	struct string_array_spec clk_gates;
118 	/*
119 	 * Array of triplets (p_off, p_on, clock), where p_off and p_on are
120 	 * required parents of clock when HDMI-PHY is respectively off or on.
121 	 */
122 	struct string_array_spec clk_muxes;
123 };
124 
125 struct hdmi_context {
126 	struct drm_encoder		encoder;
127 	struct device			*dev;
128 	struct drm_device		*drm_dev;
129 	struct drm_connector		connector;
130 	bool				powered;
131 	bool				dvi_mode;
132 	struct delayed_work		hotplug_work;
133 	struct drm_display_mode		current_mode;
134 	u8				cea_video_id;
135 	const struct hdmi_driver_data	*drv_data;
136 
137 	void __iomem			*regs;
138 	void __iomem			*regs_hdmiphy;
139 	struct i2c_client		*hdmiphy_port;
140 	struct i2c_adapter		*ddc_adpt;
141 	struct gpio_desc		*hpd_gpio;
142 	int				irq;
143 	struct regmap			*pmureg;
144 	struct regmap			*sysreg;
145 	struct clk			**clk_gates;
146 	struct clk			**clk_muxes;
147 	struct regulator_bulk_data	regul_bulk[ARRAY_SIZE(supply)];
148 	struct regulator		*reg_hdmi_en;
149 	struct exynos_drm_clk		phy_clk;
150 };
151 
152 static inline struct hdmi_context *encoder_to_hdmi(struct drm_encoder *e)
153 {
154 	return container_of(e, struct hdmi_context, encoder);
155 }
156 
157 static inline struct hdmi_context *connector_to_hdmi(struct drm_connector *c)
158 {
159 	return container_of(c, struct hdmi_context, connector);
160 }
161 
162 static const struct hdmiphy_config hdmiphy_v13_configs[] = {
163 	{
164 		.pixel_clock = 27000000,
165 		.conf = {
166 			0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
167 			0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
168 			0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
169 			0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x80,
170 		},
171 	},
172 	{
173 		.pixel_clock = 27027000,
174 		.conf = {
175 			0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
176 			0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
177 			0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
178 			0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x80,
179 		},
180 	},
181 	{
182 		.pixel_clock = 74176000,
183 		.conf = {
184 			0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
185 			0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
186 			0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
187 			0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x80,
188 		},
189 	},
190 	{
191 		.pixel_clock = 74250000,
192 		.conf = {
193 			0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
194 			0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
195 			0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0,
196 			0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x80,
197 		},
198 	},
199 	{
200 		.pixel_clock = 148500000,
201 		.conf = {
202 			0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
203 			0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
204 			0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
205 			0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x80,
206 		},
207 	},
208 };
209 
210 static const struct hdmiphy_config hdmiphy_v14_configs[] = {
211 	{
212 		.pixel_clock = 25200000,
213 		.conf = {
214 			0x01, 0x51, 0x2A, 0x75, 0x40, 0x01, 0x00, 0x08,
215 			0x82, 0x80, 0xfc, 0xd8, 0x45, 0xa0, 0xac, 0x80,
216 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
217 			0x54, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
218 		},
219 	},
220 	{
221 		.pixel_clock = 27000000,
222 		.conf = {
223 			0x01, 0xd1, 0x22, 0x51, 0x40, 0x08, 0xfc, 0x20,
224 			0x98, 0xa0, 0xcb, 0xd8, 0x45, 0xa0, 0xac, 0x80,
225 			0x06, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
226 			0x54, 0xe4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
227 		},
228 	},
229 	{
230 		.pixel_clock = 27027000,
231 		.conf = {
232 			0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08,
233 			0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
234 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
235 			0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
236 		},
237 	},
238 	{
239 		.pixel_clock = 36000000,
240 		.conf = {
241 			0x01, 0x51, 0x2d, 0x55, 0x40, 0x01, 0x00, 0x08,
242 			0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
243 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
244 			0x54, 0xab, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
245 		},
246 	},
247 	{
248 		.pixel_clock = 40000000,
249 		.conf = {
250 			0x01, 0x51, 0x32, 0x55, 0x40, 0x01, 0x00, 0x08,
251 			0x82, 0x80, 0x2c, 0xd9, 0x45, 0xa0, 0xac, 0x80,
252 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
253 			0x54, 0x9a, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
254 		},
255 	},
256 	{
257 		.pixel_clock = 65000000,
258 		.conf = {
259 			0x01, 0xd1, 0x36, 0x34, 0x40, 0x1e, 0x0a, 0x08,
260 			0x82, 0xa0, 0x45, 0xd9, 0x45, 0xa0, 0xac, 0x80,
261 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
262 			0x54, 0xbd, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
263 		},
264 	},
265 	{
266 		.pixel_clock = 71000000,
267 		.conf = {
268 			0x01, 0xd1, 0x3b, 0x35, 0x40, 0x0c, 0x04, 0x08,
269 			0x85, 0xa0, 0x63, 0xd9, 0x45, 0xa0, 0xac, 0x80,
270 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
271 			0x54, 0xad, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
272 		},
273 	},
274 	{
275 		.pixel_clock = 73250000,
276 		.conf = {
277 			0x01, 0xd1, 0x3d, 0x35, 0x40, 0x18, 0x02, 0x08,
278 			0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
279 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
280 			0x54, 0xa8, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
281 		},
282 	},
283 	{
284 		.pixel_clock = 74176000,
285 		.conf = {
286 			0x01, 0xd1, 0x3e, 0x35, 0x40, 0x5b, 0xde, 0x08,
287 			0x82, 0xa0, 0x73, 0xd9, 0x45, 0xa0, 0xac, 0x80,
288 			0x56, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
289 			0x54, 0xa6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
290 		},
291 	},
292 	{
293 		.pixel_clock = 74250000,
294 		.conf = {
295 			0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08,
296 			0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
297 			0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
298 			0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
299 		},
300 	},
301 	{
302 		.pixel_clock = 83500000,
303 		.conf = {
304 			0x01, 0xd1, 0x23, 0x11, 0x40, 0x0c, 0xfb, 0x08,
305 			0x85, 0xa0, 0xd1, 0xd8, 0x45, 0xa0, 0xac, 0x80,
306 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
307 			0x54, 0x93, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
308 		},
309 	},
310 	{
311 		.pixel_clock = 106500000,
312 		.conf = {
313 			0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08,
314 			0x84, 0xa0, 0x0a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
315 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
316 			0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
317 		},
318 	},
319 	{
320 		.pixel_clock = 108000000,
321 		.conf = {
322 			0x01, 0x51, 0x2d, 0x15, 0x40, 0x01, 0x00, 0x08,
323 			0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
324 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
325 			0x54, 0xc7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
326 		},
327 	},
328 	{
329 		.pixel_clock = 115500000,
330 		.conf = {
331 			0x01, 0xd1, 0x30, 0x12, 0x40, 0x40, 0x10, 0x08,
332 			0x80, 0x80, 0x21, 0xd9, 0x45, 0xa0, 0xac, 0x80,
333 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
334 			0x54, 0xaa, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
335 		},
336 	},
337 	{
338 		.pixel_clock = 119000000,
339 		.conf = {
340 			0x01, 0xd1, 0x32, 0x1a, 0x40, 0x30, 0xd8, 0x08,
341 			0x04, 0xa0, 0x2a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
342 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
343 			0x54, 0x9d, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
344 		},
345 	},
346 	{
347 		.pixel_clock = 146250000,
348 		.conf = {
349 			0x01, 0xd1, 0x3d, 0x15, 0x40, 0x18, 0xfd, 0x08,
350 			0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
351 			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
352 			0x54, 0x50, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
353 		},
354 	},
355 	{
356 		.pixel_clock = 148500000,
357 		.conf = {
358 			0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08,
359 			0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
360 			0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
361 			0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
362 		},
363 	},
364 };
365 
366 static const struct hdmiphy_config hdmiphy_5420_configs[] = {
367 	{
368 		.pixel_clock = 25200000,
369 		.conf = {
370 			0x01, 0x52, 0x3F, 0x55, 0x40, 0x01, 0x00, 0xC8,
371 			0x82, 0xC8, 0xBD, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
372 			0x06, 0x80, 0x01, 0x84, 0x05, 0x02, 0x24, 0x66,
373 			0x54, 0xF4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
374 		},
375 	},
376 	{
377 		.pixel_clock = 27000000,
378 		.conf = {
379 			0x01, 0xD1, 0x22, 0x51, 0x40, 0x08, 0xFC, 0xE0,
380 			0x98, 0xE8, 0xCB, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
381 			0x06, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
382 			0x54, 0xE4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
383 		},
384 	},
385 	{
386 		.pixel_clock = 27027000,
387 		.conf = {
388 			0x01, 0xD1, 0x2D, 0x72, 0x40, 0x64, 0x12, 0xC8,
389 			0x43, 0xE8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
390 			0x26, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
391 			0x54, 0xE3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
392 		},
393 	},
394 	{
395 		.pixel_clock = 36000000,
396 		.conf = {
397 			0x01, 0x51, 0x2D, 0x55, 0x40, 0x40, 0x00, 0xC8,
398 			0x02, 0xC8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
399 			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
400 			0x54, 0xAB, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
401 		},
402 	},
403 	{
404 		.pixel_clock = 40000000,
405 		.conf = {
406 			0x01, 0xD1, 0x21, 0x31, 0x40, 0x3C, 0x28, 0xC8,
407 			0x87, 0xE8, 0xC8, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
408 			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
409 			0x54, 0x9A, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
410 		},
411 	},
412 	{
413 		.pixel_clock = 65000000,
414 		.conf = {
415 			0x01, 0xD1, 0x36, 0x34, 0x40, 0x0C, 0x04, 0xC8,
416 			0x82, 0xE8, 0x45, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
417 			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
418 			0x54, 0xBD, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
419 		},
420 	},
421 	{
422 		.pixel_clock = 71000000,
423 		.conf = {
424 			0x01, 0xD1, 0x3B, 0x35, 0x40, 0x0C, 0x04, 0xC8,
425 			0x85, 0xE8, 0x63, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
426 			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
427 			0x54, 0x57, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
428 		},
429 	},
430 	{
431 		.pixel_clock = 73250000,
432 		.conf = {
433 			0x01, 0xD1, 0x1F, 0x10, 0x40, 0x78, 0x8D, 0xC8,
434 			0x81, 0xE8, 0xB7, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
435 			0x56, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
436 			0x54, 0xA8, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
437 		},
438 	},
439 	{
440 		.pixel_clock = 74176000,
441 		.conf = {
442 			0x01, 0xD1, 0x1F, 0x10, 0x40, 0x5B, 0xEF, 0xC8,
443 			0x81, 0xE8, 0xB9, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
444 			0x56, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
445 			0x54, 0xA6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
446 		},
447 	},
448 	{
449 		.pixel_clock = 74250000,
450 		.conf = {
451 			0x01, 0xD1, 0x1F, 0x10, 0x40, 0x40, 0xF8, 0x08,
452 			0x81, 0xE8, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
453 			0x26, 0x80, 0x09, 0x84, 0x05, 0x22, 0x24, 0x66,
454 			0x54, 0xA5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
455 		},
456 	},
457 	{
458 		.pixel_clock = 83500000,
459 		.conf = {
460 			0x01, 0xD1, 0x23, 0x11, 0x40, 0x0C, 0xFB, 0xC8,
461 			0x85, 0xE8, 0xD1, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
462 			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
463 			0x54, 0x4A, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
464 		},
465 	},
466 	{
467 		.pixel_clock = 88750000,
468 		.conf = {
469 			0x01, 0xD1, 0x25, 0x11, 0x40, 0x18, 0xFF, 0xC8,
470 			0x83, 0xE8, 0xDE, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
471 			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
472 			0x54, 0x45, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
473 		},
474 	},
475 	{
476 		.pixel_clock = 106500000,
477 		.conf = {
478 			0x01, 0xD1, 0x2C, 0x12, 0x40, 0x0C, 0x09, 0xC8,
479 			0x84, 0xE8, 0x0A, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
480 			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
481 			0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
482 		},
483 	},
484 	{
485 		.pixel_clock = 108000000,
486 		.conf = {
487 			0x01, 0x51, 0x2D, 0x15, 0x40, 0x01, 0x00, 0xC8,
488 			0x82, 0xC8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
489 			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
490 			0x54, 0xC7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
491 		},
492 	},
493 	{
494 		.pixel_clock = 115500000,
495 		.conf = {
496 			0x01, 0xD1, 0x30, 0x14, 0x40, 0x0C, 0x03, 0xC8,
497 			0x88, 0xE8, 0x21, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
498 			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
499 			0x54, 0x6A, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
500 		},
501 	},
502 	{
503 		.pixel_clock = 146250000,
504 		.conf = {
505 			0x01, 0xD1, 0x3D, 0x15, 0x40, 0x18, 0xFD, 0xC8,
506 			0x83, 0xE8, 0x6E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
507 			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
508 			0x54, 0x54, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
509 		},
510 	},
511 	{
512 		.pixel_clock = 148500000,
513 		.conf = {
514 			0x01, 0xD1, 0x1F, 0x00, 0x40, 0x40, 0xF8, 0x08,
515 			0x81, 0xE8, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
516 			0x26, 0x80, 0x09, 0x84, 0x05, 0x22, 0x24, 0x66,
517 			0x54, 0x4B, 0x25, 0x03, 0x00, 0x80, 0x01, 0x80,
518 		},
519 	},
520 };
521 
522 static const struct hdmiphy_config hdmiphy_5433_configs[] = {
523 	{
524 		.pixel_clock = 27000000,
525 		.conf = {
526 			0x01, 0x51, 0x22, 0x51, 0x08, 0xfc, 0x88, 0x46,
527 			0x72, 0x50, 0x24, 0x0c, 0x24, 0x0f, 0x7c, 0xa5,
528 			0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30,
529 			0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
530 		},
531 	},
532 	{
533 		.pixel_clock = 27027000,
534 		.conf = {
535 			0x01, 0x51, 0x2d, 0x72, 0x64, 0x09, 0x88, 0xc3,
536 			0x71, 0x50, 0x24, 0x14, 0x24, 0x0f, 0x7c, 0xa5,
537 			0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30,
538 			0x28, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
539 		},
540 	},
541 	{
542 		.pixel_clock = 40000000,
543 		.conf = {
544 			0x01, 0x51, 0x32, 0x55, 0x01, 0x00, 0x88, 0x02,
545 			0x4d, 0x50, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
546 			0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
547 			0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
548 		},
549 	},
550 	{
551 		.pixel_clock = 50000000,
552 		.conf = {
553 			0x01, 0x51, 0x34, 0x40, 0x64, 0x09, 0x88, 0xc3,
554 			0x3d, 0x50, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
555 			0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
556 			0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
557 		},
558 	},
559 	{
560 		.pixel_clock = 65000000,
561 		.conf = {
562 			0x01, 0x51, 0x36, 0x31, 0x40, 0x10, 0x04, 0xc6,
563 			0x2e, 0xe8, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
564 			0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
565 			0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
566 		},
567 	},
568 	{
569 		.pixel_clock = 74176000,
570 		.conf = {
571 			0x01, 0x51, 0x3E, 0x35, 0x5B, 0xDE, 0x88, 0x42,
572 			0x53, 0x51, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
573 			0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
574 			0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
575 		},
576 	},
577 	{
578 		.pixel_clock = 74250000,
579 		.conf = {
580 			0x01, 0x51, 0x3E, 0x35, 0x40, 0xF0, 0x88, 0xC2,
581 			0x52, 0x51, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
582 			0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
583 			0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
584 		},
585 	},
586 	{
587 		.pixel_clock = 108000000,
588 		.conf = {
589 			0x01, 0x51, 0x2d, 0x15, 0x01, 0x00, 0x88, 0x02,
590 			0x72, 0x52, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
591 			0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
592 			0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
593 		},
594 	},
595 	{
596 		.pixel_clock = 148500000,
597 		.conf = {
598 			0x01, 0x51, 0x1f, 0x00, 0x40, 0xf8, 0x88, 0xc1,
599 			0x52, 0x52, 0x24, 0x0c, 0x24, 0x0f, 0x7c, 0xa5,
600 			0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30,
601 			0x08, 0x10, 0x01, 0x01, 0x48, 0x4a, 0x00, 0x40,
602 		},
603 	},
604 };
605 
606 static const char * const hdmi_clk_gates4[] = {
607 	"hdmi", "sclk_hdmi"
608 };
609 
610 static const char * const hdmi_clk_muxes4[] = {
611 	"sclk_pixel", "sclk_hdmiphy", "mout_hdmi"
612 };
613 
614 static const char * const hdmi_clk_gates5433[] = {
615 	"hdmi_pclk", "hdmi_i_pclk", "i_tmds_clk", "i_pixel_clk", "i_spdif_clk"
616 };
617 
618 static const char * const hdmi_clk_muxes5433[] = {
619 	"oscclk", "tmds_clko", "tmds_clko_user",
620 	"oscclk", "pixel_clko", "pixel_clko_user"
621 };
622 
623 static const struct hdmi_driver_data exynos4210_hdmi_driver_data = {
624 	.type		= HDMI_TYPE13,
625 	.phy_confs	= INIT_ARRAY_SPEC(hdmiphy_v13_configs),
626 	.clk_gates	= INIT_ARRAY_SPEC(hdmi_clk_gates4),
627 	.clk_muxes	= INIT_ARRAY_SPEC(hdmi_clk_muxes4),
628 };
629 
630 static const struct hdmi_driver_data exynos4212_hdmi_driver_data = {
631 	.type		= HDMI_TYPE14,
632 	.phy_confs	= INIT_ARRAY_SPEC(hdmiphy_v14_configs),
633 	.clk_gates	= INIT_ARRAY_SPEC(hdmi_clk_gates4),
634 	.clk_muxes	= INIT_ARRAY_SPEC(hdmi_clk_muxes4),
635 };
636 
637 static const struct hdmi_driver_data exynos5420_hdmi_driver_data = {
638 	.type		= HDMI_TYPE14,
639 	.is_apb_phy	= 1,
640 	.phy_confs	= INIT_ARRAY_SPEC(hdmiphy_5420_configs),
641 	.clk_gates	= INIT_ARRAY_SPEC(hdmi_clk_gates4),
642 	.clk_muxes	= INIT_ARRAY_SPEC(hdmi_clk_muxes4),
643 };
644 
645 static const struct hdmi_driver_data exynos5433_hdmi_driver_data = {
646 	.type		= HDMI_TYPE14,
647 	.is_apb_phy	= 1,
648 	.has_sysreg     = 1,
649 	.phy_confs	= INIT_ARRAY_SPEC(hdmiphy_5433_configs),
650 	.clk_gates	= INIT_ARRAY_SPEC(hdmi_clk_gates5433),
651 	.clk_muxes	= INIT_ARRAY_SPEC(hdmi_clk_muxes5433),
652 };
653 
654 static inline u32 hdmi_map_reg(struct hdmi_context *hdata, u32 reg_id)
655 {
656 	if ((reg_id & 0xffff0000) == HDMI_MAPPED_BASE)
657 		return hdmi_reg_map[reg_id & 0xffff][hdata->drv_data->type];
658 	return reg_id;
659 }
660 
661 static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id)
662 {
663 	return readl(hdata->regs + hdmi_map_reg(hdata, reg_id));
664 }
665 
666 static inline void hdmi_reg_writeb(struct hdmi_context *hdata,
667 				 u32 reg_id, u8 value)
668 {
669 	writel(value, hdata->regs + hdmi_map_reg(hdata, reg_id));
670 }
671 
672 static inline void hdmi_reg_writev(struct hdmi_context *hdata, u32 reg_id,
673 				   int bytes, u32 val)
674 {
675 	reg_id = hdmi_map_reg(hdata, reg_id);
676 
677 	while (--bytes >= 0) {
678 		writel(val & 0xff, hdata->regs + reg_id);
679 		val >>= 8;
680 		reg_id += 4;
681 	}
682 }
683 
684 static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
685 				 u32 reg_id, u32 value, u32 mask)
686 {
687 	u32 old;
688 
689 	reg_id = hdmi_map_reg(hdata, reg_id);
690 	old = readl(hdata->regs + reg_id);
691 	value = (value & mask) | (old & ~mask);
692 	writel(value, hdata->regs + reg_id);
693 }
694 
695 static int hdmiphy_reg_write_buf(struct hdmi_context *hdata,
696 			u32 reg_offset, const u8 *buf, u32 len)
697 {
698 	if ((reg_offset + len) > 32)
699 		return -EINVAL;
700 
701 	if (hdata->hdmiphy_port) {
702 		int ret;
703 
704 		ret = i2c_master_send(hdata->hdmiphy_port, buf, len);
705 		if (ret == len)
706 			return 0;
707 		return ret;
708 	} else {
709 		int i;
710 		for (i = 0; i < len; i++)
711 			writel(buf[i], hdata->regs_hdmiphy +
712 				((reg_offset + i)<<2));
713 		return 0;
714 	}
715 }
716 
717 static int hdmi_clk_enable_gates(struct hdmi_context *hdata)
718 {
719 	int i, ret;
720 
721 	for (i = 0; i < hdata->drv_data->clk_gates.count; ++i) {
722 		ret = clk_prepare_enable(hdata->clk_gates[i]);
723 		if (!ret)
724 			continue;
725 
726 		dev_err(hdata->dev, "Cannot enable clock '%s', %d\n",
727 			hdata->drv_data->clk_gates.data[i], ret);
728 		while (i--)
729 			clk_disable_unprepare(hdata->clk_gates[i]);
730 		return ret;
731 	}
732 
733 	return 0;
734 }
735 
736 static void hdmi_clk_disable_gates(struct hdmi_context *hdata)
737 {
738 	int i = hdata->drv_data->clk_gates.count;
739 
740 	while (i--)
741 		clk_disable_unprepare(hdata->clk_gates[i]);
742 }
743 
744 static int hdmi_clk_set_parents(struct hdmi_context *hdata, bool to_phy)
745 {
746 	struct device *dev = hdata->dev;
747 	int ret = 0;
748 	int i;
749 
750 	for (i = 0; i < hdata->drv_data->clk_muxes.count; i += 3) {
751 		struct clk **c = &hdata->clk_muxes[i];
752 
753 		ret = clk_set_parent(c[2], c[to_phy]);
754 		if (!ret)
755 			continue;
756 
757 		dev_err(dev, "Cannot set clock parent of '%s' to '%s', %d\n",
758 			hdata->drv_data->clk_muxes.data[i + 2],
759 			hdata->drv_data->clk_muxes.data[i + to_phy], ret);
760 	}
761 
762 	return ret;
763 }
764 
765 static u8 hdmi_chksum(struct hdmi_context *hdata,
766 			u32 start, u8 len, u32 hdr_sum)
767 {
768 	int i;
769 
770 	/* hdr_sum : header0 + header1 + header2
771 	* start : start address of packet byte1
772 	* len : packet bytes - 1 */
773 	for (i = 0; i < len; ++i)
774 		hdr_sum += 0xff & hdmi_reg_read(hdata, start + i * 4);
775 
776 	/* return 2's complement of 8 bit hdr_sum */
777 	return (u8)(~(hdr_sum & 0xff) + 1);
778 }
779 
780 static void hdmi_reg_infoframe(struct hdmi_context *hdata,
781 			union hdmi_infoframe *infoframe)
782 {
783 	u32 hdr_sum;
784 	u8 chksum;
785 	u8 ar;
786 
787 	if (hdata->dvi_mode) {
788 		hdmi_reg_writeb(hdata, HDMI_VSI_CON,
789 				HDMI_VSI_CON_DO_NOT_TRANSMIT);
790 		hdmi_reg_writeb(hdata, HDMI_AVI_CON,
791 				HDMI_AVI_CON_DO_NOT_TRANSMIT);
792 		hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN);
793 		return;
794 	}
795 
796 	switch (infoframe->any.type) {
797 	case HDMI_INFOFRAME_TYPE_AVI:
798 		hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC);
799 		hdmi_reg_writeb(hdata, HDMI_AVI_HEADER0, infoframe->any.type);
800 		hdmi_reg_writeb(hdata, HDMI_AVI_HEADER1,
801 				infoframe->any.version);
802 		hdmi_reg_writeb(hdata, HDMI_AVI_HEADER2, infoframe->any.length);
803 		hdr_sum = infoframe->any.type + infoframe->any.version +
804 			  infoframe->any.length;
805 
806 		/* Output format zero hardcoded ,RGB YBCR selection */
807 		hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 0 << 5 |
808 			AVI_ACTIVE_FORMAT_VALID |
809 			AVI_UNDERSCANNED_DISPLAY_VALID);
810 
811 		/*
812 		 * Set the aspect ratio as per the mode, mentioned in
813 		 * Table 9 AVI InfoFrame Data Byte 2 of CEA-861-D Standard
814 		 */
815 		ar = hdata->current_mode.picture_aspect_ratio;
816 		switch (ar) {
817 		case HDMI_PICTURE_ASPECT_4_3:
818 			ar |= AVI_4_3_CENTER_RATIO;
819 			break;
820 		case HDMI_PICTURE_ASPECT_16_9:
821 			ar |= AVI_16_9_CENTER_RATIO;
822 			break;
823 		case HDMI_PICTURE_ASPECT_NONE:
824 		default:
825 			ar |= AVI_SAME_AS_PIC_ASPECT_RATIO;
826 			break;
827 		}
828 		hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), ar);
829 
830 		hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), hdata->cea_video_id);
831 
832 		chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1),
833 					infoframe->any.length, hdr_sum);
834 		DRM_DEBUG_KMS("AVI checksum = 0x%x\n", chksum);
835 		hdmi_reg_writeb(hdata, HDMI_AVI_CHECK_SUM, chksum);
836 		break;
837 	case HDMI_INFOFRAME_TYPE_AUDIO:
838 		hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02);
839 		hdmi_reg_writeb(hdata, HDMI_AUI_HEADER0, infoframe->any.type);
840 		hdmi_reg_writeb(hdata, HDMI_AUI_HEADER1,
841 				infoframe->any.version);
842 		hdmi_reg_writeb(hdata, HDMI_AUI_HEADER2, infoframe->any.length);
843 		hdr_sum = infoframe->any.type + infoframe->any.version +
844 			  infoframe->any.length;
845 		chksum = hdmi_chksum(hdata, HDMI_AUI_BYTE(1),
846 					infoframe->any.length, hdr_sum);
847 		DRM_DEBUG_KMS("AUI checksum = 0x%x\n", chksum);
848 		hdmi_reg_writeb(hdata, HDMI_AUI_CHECK_SUM, chksum);
849 		break;
850 	default:
851 		break;
852 	}
853 }
854 
855 static enum drm_connector_status hdmi_detect(struct drm_connector *connector,
856 				bool force)
857 {
858 	struct hdmi_context *hdata = connector_to_hdmi(connector);
859 
860 	if (gpiod_get_value(hdata->hpd_gpio))
861 		return connector_status_connected;
862 
863 	return connector_status_disconnected;
864 }
865 
866 static void hdmi_connector_destroy(struct drm_connector *connector)
867 {
868 	drm_connector_unregister(connector);
869 	drm_connector_cleanup(connector);
870 }
871 
872 static const struct drm_connector_funcs hdmi_connector_funcs = {
873 	.dpms = drm_atomic_helper_connector_dpms,
874 	.fill_modes = drm_helper_probe_single_connector_modes,
875 	.detect = hdmi_detect,
876 	.destroy = hdmi_connector_destroy,
877 	.reset = drm_atomic_helper_connector_reset,
878 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
879 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
880 };
881 
882 static int hdmi_get_modes(struct drm_connector *connector)
883 {
884 	struct hdmi_context *hdata = connector_to_hdmi(connector);
885 	struct edid *edid;
886 	int ret;
887 
888 	if (!hdata->ddc_adpt)
889 		return -ENODEV;
890 
891 	edid = drm_get_edid(connector, hdata->ddc_adpt);
892 	if (!edid)
893 		return -ENODEV;
894 
895 	hdata->dvi_mode = !drm_detect_hdmi_monitor(edid);
896 	DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
897 		(hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
898 		edid->width_cm, edid->height_cm);
899 
900 	drm_mode_connector_update_edid_property(connector, edid);
901 
902 	ret = drm_add_edid_modes(connector, edid);
903 
904 	kfree(edid);
905 
906 	return ret;
907 }
908 
909 static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
910 {
911 	const struct hdmiphy_configs *confs = &hdata->drv_data->phy_confs;
912 	int i;
913 
914 	for (i = 0; i < confs->count; i++)
915 		if (confs->data[i].pixel_clock == pixel_clock)
916 			return i;
917 
918 	DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
919 	return -EINVAL;
920 }
921 
922 static int hdmi_mode_valid(struct drm_connector *connector,
923 			struct drm_display_mode *mode)
924 {
925 	struct hdmi_context *hdata = connector_to_hdmi(connector);
926 	int ret;
927 
928 	DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d clock=%d\n",
929 		mode->hdisplay, mode->vdisplay, mode->vrefresh,
930 		(mode->flags & DRM_MODE_FLAG_INTERLACE) ? true :
931 		false, mode->clock * 1000);
932 
933 	ret = hdmi_find_phy_conf(hdata, mode->clock * 1000);
934 	if (ret < 0)
935 		return MODE_BAD;
936 
937 	return MODE_OK;
938 }
939 
940 static struct drm_encoder *hdmi_best_encoder(struct drm_connector *connector)
941 {
942 	struct hdmi_context *hdata = connector_to_hdmi(connector);
943 
944 	return &hdata->encoder;
945 }
946 
947 static const struct drm_connector_helper_funcs hdmi_connector_helper_funcs = {
948 	.get_modes = hdmi_get_modes,
949 	.mode_valid = hdmi_mode_valid,
950 	.best_encoder = hdmi_best_encoder,
951 };
952 
953 static int hdmi_create_connector(struct drm_encoder *encoder)
954 {
955 	struct hdmi_context *hdata = encoder_to_hdmi(encoder);
956 	struct drm_connector *connector = &hdata->connector;
957 	int ret;
958 
959 	connector->interlace_allowed = true;
960 	connector->polled = DRM_CONNECTOR_POLL_HPD;
961 
962 	ret = drm_connector_init(hdata->drm_dev, connector,
963 			&hdmi_connector_funcs, DRM_MODE_CONNECTOR_HDMIA);
964 	if (ret) {
965 		DRM_ERROR("Failed to initialize connector with drm\n");
966 		return ret;
967 	}
968 
969 	drm_connector_helper_add(connector, &hdmi_connector_helper_funcs);
970 	drm_connector_register(connector);
971 	drm_mode_connector_attach_encoder(connector, encoder);
972 
973 	return 0;
974 }
975 
976 static bool hdmi_mode_fixup(struct drm_encoder *encoder,
977 			    const struct drm_display_mode *mode,
978 			    struct drm_display_mode *adjusted_mode)
979 {
980 	struct drm_device *dev = encoder->dev;
981 	struct drm_connector *connector;
982 	struct drm_display_mode *m;
983 	int mode_ok;
984 
985 	drm_mode_set_crtcinfo(adjusted_mode, 0);
986 
987 	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
988 		if (connector->encoder == encoder)
989 			break;
990 	}
991 
992 	if (connector->encoder != encoder)
993 		return true;
994 
995 	mode_ok = hdmi_mode_valid(connector, adjusted_mode);
996 
997 	if (mode_ok == MODE_OK)
998 		return true;
999 
1000 	/*
1001 	 * Find the most suitable mode and copy it to adjusted_mode.
1002 	 */
1003 	list_for_each_entry(m, &connector->modes, head) {
1004 		mode_ok = hdmi_mode_valid(connector, m);
1005 
1006 		if (mode_ok == MODE_OK) {
1007 			DRM_INFO("desired mode doesn't exist so\n");
1008 			DRM_INFO("use the most suitable mode among modes.\n");
1009 
1010 			DRM_DEBUG_KMS("Adjusted Mode: [%d]x[%d] [%d]Hz\n",
1011 				m->hdisplay, m->vdisplay, m->vrefresh);
1012 
1013 			drm_mode_copy(adjusted_mode, m);
1014 			break;
1015 		}
1016 	}
1017 
1018 	return true;
1019 }
1020 
1021 static void hdmi_reg_acr(struct hdmi_context *hdata, u32 freq)
1022 {
1023 	u32 n, cts;
1024 
1025 	cts = (freq % 9) ? 27000 : 30000;
1026 	n = 128 * freq / (27000000 / cts);
1027 
1028 	hdmi_reg_writev(hdata, HDMI_ACR_N0, 3, n);
1029 	hdmi_reg_writev(hdata, HDMI_ACR_MCTS0, 3, cts);
1030 	hdmi_reg_writev(hdata, HDMI_ACR_CTS0, 3, cts);
1031 	hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
1032 }
1033 
1034 static void hdmi_audio_init(struct hdmi_context *hdata)
1035 {
1036 	u32 sample_rate, bits_per_sample;
1037 	u32 data_num, bit_ch, sample_frq;
1038 	u32 val;
1039 
1040 	sample_rate = 44100;
1041 	bits_per_sample = 16;
1042 
1043 	switch (bits_per_sample) {
1044 	case 20:
1045 		data_num = 2;
1046 		bit_ch = 1;
1047 		break;
1048 	case 24:
1049 		data_num = 3;
1050 		bit_ch = 1;
1051 		break;
1052 	default:
1053 		data_num = 1;
1054 		bit_ch = 0;
1055 		break;
1056 	}
1057 
1058 	hdmi_reg_acr(hdata, sample_rate);
1059 
1060 	hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
1061 				| HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
1062 				| HDMI_I2S_MUX_ENABLE);
1063 
1064 	hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
1065 			| HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
1066 
1067 	hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
1068 
1069 	sample_frq = (sample_rate == 44100) ? 0 :
1070 			(sample_rate == 48000) ? 2 :
1071 			(sample_rate == 32000) ? 3 :
1072 			(sample_rate == 96000) ? 0xa : 0x0;
1073 
1074 	hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
1075 	hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
1076 
1077 	val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
1078 	hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
1079 
1080 	/* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
1081 	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
1082 			| HDMI_I2S_SEL_LRCK(6));
1083 	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(1)
1084 			| HDMI_I2S_SEL_SDATA2(4));
1085 	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
1086 			| HDMI_I2S_SEL_SDATA2(2));
1087 	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
1088 
1089 	/* I2S_CON_1 & 2 */
1090 	hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
1091 			| HDMI_I2S_L_CH_LOW_POL);
1092 	hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
1093 			| HDMI_I2S_SET_BIT_CH(bit_ch)
1094 			| HDMI_I2S_SET_SDATA_BIT(data_num)
1095 			| HDMI_I2S_BASIC_FORMAT);
1096 
1097 	/* Configure register related to CUV information */
1098 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0
1099 			| HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH
1100 			| HDMI_I2S_COPYRIGHT
1101 			| HDMI_I2S_LINEAR_PCM
1102 			| HDMI_I2S_CONSUMER_FORMAT);
1103 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER);
1104 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0));
1105 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2
1106 			| HDMI_I2S_SET_SMP_FREQ(sample_frq));
1107 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4,
1108 			HDMI_I2S_ORG_SMP_FREQ_44_1
1109 			| HDMI_I2S_WORD_LEN_MAX24_24BITS
1110 			| HDMI_I2S_WORD_LEN_MAX_24BITS);
1111 
1112 	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
1113 }
1114 
1115 static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
1116 {
1117 	if (hdata->dvi_mode)
1118 		return;
1119 
1120 	hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
1121 	hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ?
1122 			HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
1123 }
1124 
1125 static void hdmi_start(struct hdmi_context *hdata, bool start)
1126 {
1127 	u32 val = start ? HDMI_TG_EN : 0;
1128 
1129 	if (hdata->current_mode.flags & DRM_MODE_FLAG_INTERLACE)
1130 		val |= HDMI_FIELD_EN;
1131 
1132 	hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN);
1133 	hdmi_reg_writemask(hdata, HDMI_TG_CMD, val, HDMI_TG_EN | HDMI_FIELD_EN);
1134 }
1135 
1136 static void hdmi_conf_init(struct hdmi_context *hdata)
1137 {
1138 	union hdmi_infoframe infoframe;
1139 
1140 	/* disable HPD interrupts from HDMI IP block, use GPIO instead */
1141 	hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
1142 		HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
1143 
1144 	/* choose HDMI mode */
1145 	hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1146 		HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
1147 	/* apply video pre-amble and guard band in HDMI mode only */
1148 	hdmi_reg_writeb(hdata, HDMI_CON_2, 0);
1149 	/* disable bluescreen */
1150 	hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
1151 
1152 	if (hdata->dvi_mode) {
1153 		hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1154 				HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1155 		hdmi_reg_writeb(hdata, HDMI_CON_2,
1156 				HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1157 	}
1158 
1159 	if (hdata->drv_data->type == HDMI_TYPE13) {
1160 		/* choose bluescreen (fecal) color */
1161 		hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
1162 		hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
1163 		hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1164 
1165 		/* enable AVI packet every vsync, fixes purple line problem */
1166 		hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1167 		/* force RGB, look to CEA-861-D, table 7 for more detail */
1168 		hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1169 		hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1170 
1171 		hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1172 		hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1173 		hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1174 	} else {
1175 		infoframe.any.type = HDMI_INFOFRAME_TYPE_AVI;
1176 		infoframe.any.version = HDMI_AVI_VERSION;
1177 		infoframe.any.length = HDMI_AVI_LENGTH;
1178 		hdmi_reg_infoframe(hdata, &infoframe);
1179 
1180 		infoframe.any.type = HDMI_INFOFRAME_TYPE_AUDIO;
1181 		infoframe.any.version = HDMI_AUI_VERSION;
1182 		infoframe.any.length = HDMI_AUI_LENGTH;
1183 		hdmi_reg_infoframe(hdata, &infoframe);
1184 
1185 		/* enable AVI packet every vsync, fixes purple line problem */
1186 		hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1187 	}
1188 }
1189 
1190 static void hdmiphy_wait_for_pll(struct hdmi_context *hdata)
1191 {
1192 	int tries;
1193 
1194 	for (tries = 0; tries < 10; ++tries) {
1195 		u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS);
1196 
1197 		if (val & HDMI_PHY_STATUS_READY) {
1198 			DRM_DEBUG_KMS("PLL stabilized after %d tries\n", tries);
1199 			return;
1200 		}
1201 		usleep_range(10, 20);
1202 	}
1203 
1204 	DRM_ERROR("PLL could not reach steady state\n");
1205 }
1206 
1207 static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
1208 {
1209 	struct drm_display_mode *m = &hdata->current_mode;
1210 	unsigned int val;
1211 
1212 	hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay);
1213 	hdmi_reg_writev(hdata, HDMI_V13_H_V_LINE_0, 3,
1214 			(m->htotal << 12) | m->vtotal);
1215 
1216 	val = (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0;
1217 	hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1, val);
1218 
1219 	val = (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0;
1220 	hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1, val);
1221 
1222 	val = (m->hsync_start - m->hdisplay - 2);
1223 	val |= ((m->hsync_end - m->hdisplay - 2) << 10);
1224 	val |= ((m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0)<<20;
1225 	hdmi_reg_writev(hdata, HDMI_V13_H_SYNC_GEN_0, 3, val);
1226 
1227 	/*
1228 	 * Quirk requirement for exynos HDMI IP design,
1229 	 * 2 pixels less than the actual calculation for hsync_start
1230 	 * and end.
1231 	 */
1232 
1233 	/* Following values & calculations differ for different type of modes */
1234 	if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1235 		val = ((m->vsync_end - m->vdisplay) / 2);
1236 		val |= ((m->vsync_start - m->vdisplay) / 2) << 12;
1237 		hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val);
1238 
1239 		val = m->vtotal / 2;
1240 		val |= ((m->vtotal - m->vdisplay) / 2) << 11;
1241 		hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val);
1242 
1243 		val = (m->vtotal +
1244 			((m->vsync_end - m->vsync_start) * 4) + 5) / 2;
1245 		val |= m->vtotal << 11;
1246 		hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_F_0, 3, val);
1247 
1248 		val = ((m->vtotal / 2) + 7);
1249 		val |= ((m->vtotal / 2) + 2) << 12;
1250 		hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_2_0, 3, val);
1251 
1252 		val = ((m->htotal / 2) + (m->hsync_start - m->hdisplay));
1253 		val |= ((m->htotal / 2) +
1254 			(m->hsync_start - m->hdisplay)) << 12;
1255 		hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_3_0, 3, val);
1256 
1257 		hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1258 				(m->vtotal - m->vdisplay) / 2);
1259 		hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay / 2);
1260 
1261 		hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2, 0x249);
1262 	} else {
1263 		val = m->vtotal;
1264 		val |= (m->vtotal - m->vdisplay) << 11;
1265 		hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val);
1266 
1267 		hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_F_0, 3, 0);
1268 
1269 		val = (m->vsync_end - m->vdisplay);
1270 		val |= ((m->vsync_start - m->vdisplay) << 12);
1271 		hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val);
1272 
1273 		hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_2_0, 3, 0x1001);
1274 		hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_3_0, 3, 0x1001);
1275 		hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1276 				m->vtotal - m->vdisplay);
1277 		hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay);
1278 	}
1279 
1280 	hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal);
1281 	hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay);
1282 	hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay);
1283 	hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal);
1284 }
1285 
1286 static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
1287 {
1288 	struct drm_display_mode *m = &hdata->current_mode;
1289 
1290 	hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay);
1291 	hdmi_reg_writev(hdata, HDMI_V_LINE_0, 2, m->vtotal);
1292 	hdmi_reg_writev(hdata, HDMI_H_LINE_0, 2, m->htotal);
1293 	hdmi_reg_writev(hdata, HDMI_HSYNC_POL, 1,
1294 			(m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0);
1295 	hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1,
1296 			(m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1297 	hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1,
1298 			(m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1299 
1300 	/*
1301 	 * Quirk requirement for exynos 5 HDMI IP design,
1302 	 * 2 pixels less than the actual calculation for hsync_start
1303 	 * and end.
1304 	 */
1305 
1306 	/* Following values & calculations differ for different type of modes */
1307 	if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1308 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2,
1309 			(m->vsync_end - m->vdisplay) / 2);
1310 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2,
1311 			(m->vsync_start - m->vdisplay) / 2);
1312 		hdmi_reg_writev(hdata, HDMI_V2_BLANK_0, 2, m->vtotal / 2);
1313 		hdmi_reg_writev(hdata, HDMI_V1_BLANK_0, 2,
1314 				(m->vtotal - m->vdisplay) / 2);
1315 		hdmi_reg_writev(hdata, HDMI_V_BLANK_F0_0, 2,
1316 				m->vtotal - m->vdisplay / 2);
1317 		hdmi_reg_writev(hdata, HDMI_V_BLANK_F1_0, 2, m->vtotal);
1318 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_2_0, 2,
1319 				(m->vtotal / 2) + 7);
1320 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_1_0, 2,
1321 				(m->vtotal / 2) + 2);
1322 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0, 2,
1323 			(m->htotal / 2) + (m->hsync_start - m->hdisplay));
1324 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0, 2,
1325 			(m->htotal / 2) + (m->hsync_start - m->hdisplay));
1326 		hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1327 				(m->vtotal - m->vdisplay) / 2);
1328 		hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay / 2);
1329 		hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2,
1330 				m->vtotal - m->vdisplay / 2);
1331 		hdmi_reg_writev(hdata, HDMI_TG_VSYNC2_L, 2,
1332 				(m->vtotal / 2) + 1);
1333 		hdmi_reg_writev(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, 2,
1334 				(m->vtotal / 2) + 1);
1335 		hdmi_reg_writev(hdata, HDMI_TG_FIELD_BOT_HDMI_L, 2,
1336 				(m->vtotal / 2) + 1);
1337 		hdmi_reg_writev(hdata, HDMI_TG_VACT_ST3_L, 2, 0x0);
1338 		hdmi_reg_writev(hdata, HDMI_TG_VACT_ST4_L, 2, 0x0);
1339 	} else {
1340 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2,
1341 			m->vsync_end - m->vdisplay);
1342 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2,
1343 			m->vsync_start - m->vdisplay);
1344 		hdmi_reg_writev(hdata, HDMI_V2_BLANK_0, 2, m->vtotal);
1345 		hdmi_reg_writev(hdata, HDMI_V1_BLANK_0, 2,
1346 				m->vtotal - m->vdisplay);
1347 		hdmi_reg_writev(hdata, HDMI_V_BLANK_F0_0, 2, 0xffff);
1348 		hdmi_reg_writev(hdata, HDMI_V_BLANK_F1_0, 2, 0xffff);
1349 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_2_0, 2, 0xffff);
1350 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_1_0, 2, 0xffff);
1351 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0, 2, 0xffff);
1352 		hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0, 2, 0xffff);
1353 		hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1354 				m->vtotal - m->vdisplay);
1355 		hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay);
1356 	}
1357 
1358 	hdmi_reg_writev(hdata, HDMI_H_SYNC_START_0, 2,
1359 			m->hsync_start - m->hdisplay - 2);
1360 	hdmi_reg_writev(hdata, HDMI_H_SYNC_END_0, 2,
1361 			m->hsync_end - m->hdisplay - 2);
1362 	hdmi_reg_writev(hdata, HDMI_VACT_SPACE_1_0, 2, 0xffff);
1363 	hdmi_reg_writev(hdata, HDMI_VACT_SPACE_2_0, 2, 0xffff);
1364 	hdmi_reg_writev(hdata, HDMI_VACT_SPACE_3_0, 2, 0xffff);
1365 	hdmi_reg_writev(hdata, HDMI_VACT_SPACE_4_0, 2, 0xffff);
1366 	hdmi_reg_writev(hdata, HDMI_VACT_SPACE_5_0, 2, 0xffff);
1367 	hdmi_reg_writev(hdata, HDMI_VACT_SPACE_6_0, 2, 0xffff);
1368 	hdmi_reg_writev(hdata, HDMI_V_BLANK_F2_0, 2, 0xffff);
1369 	hdmi_reg_writev(hdata, HDMI_V_BLANK_F3_0, 2, 0xffff);
1370 	hdmi_reg_writev(hdata, HDMI_V_BLANK_F4_0, 2, 0xffff);
1371 	hdmi_reg_writev(hdata, HDMI_V_BLANK_F5_0, 2, 0xffff);
1372 	hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_3_0, 2, 0xffff);
1373 	hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_4_0, 2, 0xffff);
1374 	hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_5_0, 2, 0xffff);
1375 	hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_6_0, 2, 0xffff);
1376 	hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0, 2, 0xffff);
1377 	hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0, 2, 0xffff);
1378 	hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0, 2, 0xffff);
1379 	hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0, 2, 0xffff);
1380 
1381 	hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal);
1382 	hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay);
1383 	hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay);
1384 	hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal);
1385 	if (hdata->drv_data == &exynos5433_hdmi_driver_data)
1386 		hdmi_reg_writeb(hdata, HDMI_TG_DECON_EN, 1);
1387 }
1388 
1389 static void hdmi_mode_apply(struct hdmi_context *hdata)
1390 {
1391 	if (hdata->drv_data->type == HDMI_TYPE13)
1392 		hdmi_v13_mode_apply(hdata);
1393 	else
1394 		hdmi_v14_mode_apply(hdata);
1395 
1396 	hdmi_start(hdata, true);
1397 }
1398 
1399 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1400 {
1401 	hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, 0, 1);
1402 	usleep_range(10000, 12000);
1403 	hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, ~0, 1);
1404 	usleep_range(10000, 12000);
1405 	hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, ~0, HDMI_PHY_SW_RSTOUT);
1406 	usleep_range(10000, 12000);
1407 	hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, 0, HDMI_PHY_SW_RSTOUT);
1408 	usleep_range(10000, 12000);
1409 }
1410 
1411 static void hdmiphy_enable_mode_set(struct hdmi_context *hdata, bool enable)
1412 {
1413 	u8 v = enable ? HDMI_PHY_ENABLE_MODE_SET : HDMI_PHY_DISABLE_MODE_SET;
1414 
1415 	if (hdata->drv_data == &exynos5433_hdmi_driver_data)
1416 		writel(v, hdata->regs_hdmiphy + HDMIPHY5433_MODE_SET_DONE);
1417 }
1418 
1419 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1420 {
1421 	int ret;
1422 	const u8 *phy_conf;
1423 
1424 	ret = hdmi_find_phy_conf(hdata, hdata->current_mode.clock * 1000);
1425 	if (ret < 0) {
1426 		DRM_ERROR("failed to find hdmiphy conf\n");
1427 		return;
1428 	}
1429 	phy_conf = hdata->drv_data->phy_confs.data[ret].conf;
1430 
1431 	hdmi_clk_set_parents(hdata, false);
1432 
1433 	hdmiphy_conf_reset(hdata);
1434 
1435 	hdmiphy_enable_mode_set(hdata, true);
1436 	ret = hdmiphy_reg_write_buf(hdata, 0, phy_conf, 32);
1437 	if (ret) {
1438 		DRM_ERROR("failed to configure hdmiphy\n");
1439 		return;
1440 	}
1441 	hdmiphy_enable_mode_set(hdata, false);
1442 	hdmi_clk_set_parents(hdata, true);
1443 	usleep_range(10000, 12000);
1444 	hdmiphy_wait_for_pll(hdata);
1445 }
1446 
1447 static void hdmi_conf_apply(struct hdmi_context *hdata)
1448 {
1449 	hdmi_start(hdata, false);
1450 	hdmi_conf_init(hdata);
1451 	hdmi_audio_init(hdata);
1452 	hdmi_mode_apply(hdata);
1453 	hdmi_audio_control(hdata, true);
1454 }
1455 
1456 static void hdmi_mode_set(struct drm_encoder *encoder,
1457 			  struct drm_display_mode *mode,
1458 			  struct drm_display_mode *adjusted_mode)
1459 {
1460 	struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1461 	struct drm_display_mode *m = adjusted_mode;
1462 
1463 	DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%s\n",
1464 		m->hdisplay, m->vdisplay,
1465 		m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ?
1466 		"INTERLACED" : "PROGRESSIVE");
1467 
1468 	drm_mode_copy(&hdata->current_mode, m);
1469 	hdata->cea_video_id = drm_match_cea_mode(mode);
1470 }
1471 
1472 static void hdmi_set_refclk(struct hdmi_context *hdata, bool on)
1473 {
1474 	if (!hdata->sysreg)
1475 		return;
1476 
1477 	regmap_update_bits(hdata->sysreg, EXYNOS5433_SYSREG_DISP_HDMI_PHY,
1478 			   SYSREG_HDMI_REFCLK_INT_CLK, on ? ~0 : 0);
1479 }
1480 
1481 static void hdmiphy_enable(struct hdmi_context *hdata)
1482 {
1483 	if (hdata->powered)
1484 		return;
1485 
1486 	pm_runtime_get_sync(hdata->dev);
1487 
1488 	if (regulator_bulk_enable(ARRAY_SIZE(supply), hdata->regul_bulk))
1489 		DRM_DEBUG_KMS("failed to enable regulator bulk\n");
1490 
1491 	regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
1492 			PMU_HDMI_PHY_ENABLE_BIT, 1);
1493 
1494 	hdmi_set_refclk(hdata, true);
1495 
1496 	hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, 0, HDMI_PHY_POWER_OFF_EN);
1497 
1498 	hdmiphy_conf_apply(hdata);
1499 
1500 	hdata->powered = true;
1501 }
1502 
1503 static void hdmiphy_disable(struct hdmi_context *hdata)
1504 {
1505 	if (!hdata->powered)
1506 		return;
1507 
1508 	hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN);
1509 
1510 	hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, ~0, HDMI_PHY_POWER_OFF_EN);
1511 
1512 	hdmi_set_refclk(hdata, false);
1513 
1514 	regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
1515 			PMU_HDMI_PHY_ENABLE_BIT, 0);
1516 
1517 	regulator_bulk_disable(ARRAY_SIZE(supply), hdata->regul_bulk);
1518 
1519 	pm_runtime_put_sync(hdata->dev);
1520 
1521 	hdata->powered = false;
1522 }
1523 
1524 static void hdmi_enable(struct drm_encoder *encoder)
1525 {
1526 	struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1527 
1528 	hdmiphy_enable(hdata);
1529 	hdmi_conf_apply(hdata);
1530 }
1531 
1532 static void hdmi_disable(struct drm_encoder *encoder)
1533 {
1534 	struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1535 	struct drm_crtc *crtc = encoder->crtc;
1536 	const struct drm_crtc_helper_funcs *funcs = NULL;
1537 
1538 	if (!hdata->powered)
1539 		return;
1540 
1541 	/*
1542 	 * The SFRs of VP and Mixer are updated by Vertical Sync of
1543 	 * Timing generator which is a part of HDMI so the sequence
1544 	 * to disable TV Subsystem should be as following,
1545 	 *	VP -> Mixer -> HDMI
1546 	 *
1547 	 * Below codes will try to disable Mixer and VP(if used)
1548 	 * prior to disabling HDMI.
1549 	 */
1550 	if (crtc)
1551 		funcs = crtc->helper_private;
1552 	if (funcs && funcs->disable)
1553 		(*funcs->disable)(crtc);
1554 
1555 	cancel_delayed_work(&hdata->hotplug_work);
1556 
1557 	hdmiphy_disable(hdata);
1558 }
1559 
1560 static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = {
1561 	.mode_fixup	= hdmi_mode_fixup,
1562 	.mode_set	= hdmi_mode_set,
1563 	.enable		= hdmi_enable,
1564 	.disable	= hdmi_disable,
1565 };
1566 
1567 static const struct drm_encoder_funcs exynos_hdmi_encoder_funcs = {
1568 	.destroy = drm_encoder_cleanup,
1569 };
1570 
1571 static void hdmi_hotplug_work_func(struct work_struct *work)
1572 {
1573 	struct hdmi_context *hdata;
1574 
1575 	hdata = container_of(work, struct hdmi_context, hotplug_work.work);
1576 
1577 	if (hdata->drm_dev)
1578 		drm_helper_hpd_irq_event(hdata->drm_dev);
1579 }
1580 
1581 static irqreturn_t hdmi_irq_thread(int irq, void *arg)
1582 {
1583 	struct hdmi_context *hdata = arg;
1584 
1585 	mod_delayed_work(system_wq, &hdata->hotplug_work,
1586 			msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS));
1587 
1588 	return IRQ_HANDLED;
1589 }
1590 
1591 static int hdmi_clks_get(struct hdmi_context *hdata,
1592 			 const struct string_array_spec *names,
1593 			 struct clk **clks)
1594 {
1595 	struct device *dev = hdata->dev;
1596 	int i;
1597 
1598 	for (i = 0; i < names->count; ++i) {
1599 		struct clk *clk = devm_clk_get(dev, names->data[i]);
1600 
1601 		if (IS_ERR(clk)) {
1602 			int ret = PTR_ERR(clk);
1603 
1604 			dev_err(dev, "Cannot get clock %s, %d\n",
1605 				names->data[i], ret);
1606 
1607 			return ret;
1608 		}
1609 
1610 		clks[i] = clk;
1611 	}
1612 
1613 	return 0;
1614 }
1615 
1616 static int hdmi_clk_init(struct hdmi_context *hdata)
1617 {
1618 	const struct hdmi_driver_data *drv_data = hdata->drv_data;
1619 	int count = drv_data->clk_gates.count + drv_data->clk_muxes.count;
1620 	struct device *dev = hdata->dev;
1621 	struct clk **clks;
1622 	int ret;
1623 
1624 	if (!count)
1625 		return 0;
1626 
1627 	clks = devm_kzalloc(dev, sizeof(*clks) * count, GFP_KERNEL);
1628 	if (!clks)
1629 		return -ENOMEM;
1630 
1631 	hdata->clk_gates = clks;
1632 	hdata->clk_muxes = clks + drv_data->clk_gates.count;
1633 
1634 	ret = hdmi_clks_get(hdata, &drv_data->clk_gates, hdata->clk_gates);
1635 	if (ret)
1636 		return ret;
1637 
1638 	return hdmi_clks_get(hdata, &drv_data->clk_muxes, hdata->clk_muxes);
1639 }
1640 
1641 
1642 static void hdmiphy_clk_enable(struct exynos_drm_clk *clk, bool enable)
1643 {
1644 	struct hdmi_context *hdata = container_of(clk, struct hdmi_context,
1645 						  phy_clk);
1646 
1647 	if (enable)
1648 		hdmiphy_enable(hdata);
1649 	else
1650 		hdmiphy_disable(hdata);
1651 }
1652 
1653 static int hdmi_resources_init(struct hdmi_context *hdata)
1654 {
1655 	struct device *dev = hdata->dev;
1656 	int i, ret;
1657 
1658 	DRM_DEBUG_KMS("HDMI resource init\n");
1659 
1660 	hdata->hpd_gpio = devm_gpiod_get(dev, "hpd", GPIOD_IN);
1661 	if (IS_ERR(hdata->hpd_gpio)) {
1662 		DRM_ERROR("cannot get hpd gpio property\n");
1663 		return PTR_ERR(hdata->hpd_gpio);
1664 	}
1665 
1666 	hdata->irq = gpiod_to_irq(hdata->hpd_gpio);
1667 	if (hdata->irq < 0) {
1668 		DRM_ERROR("failed to get GPIO irq\n");
1669 		return  hdata->irq;
1670 	}
1671 
1672 	ret = hdmi_clk_init(hdata);
1673 	if (ret)
1674 		return ret;
1675 
1676 	ret = hdmi_clk_set_parents(hdata, false);
1677 	if (ret)
1678 		return ret;
1679 
1680 	for (i = 0; i < ARRAY_SIZE(supply); ++i) {
1681 		hdata->regul_bulk[i].supply = supply[i];
1682 		hdata->regul_bulk[i].consumer = NULL;
1683 	}
1684 	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), hdata->regul_bulk);
1685 	if (ret) {
1686 		if (ret != -EPROBE_DEFER)
1687 			DRM_ERROR("failed to get regulators\n");
1688 		return ret;
1689 	}
1690 
1691 	hdata->reg_hdmi_en = devm_regulator_get_optional(dev, "hdmi-en");
1692 
1693 	if (PTR_ERR(hdata->reg_hdmi_en) == -ENODEV)
1694 		return 0;
1695 
1696 	if (IS_ERR(hdata->reg_hdmi_en))
1697 		return PTR_ERR(hdata->reg_hdmi_en);
1698 
1699 	ret = regulator_enable(hdata->reg_hdmi_en);
1700 	if (ret)
1701 		DRM_ERROR("failed to enable hdmi-en regulator\n");
1702 
1703 	return ret;
1704 }
1705 
1706 static struct of_device_id hdmi_match_types[] = {
1707 	{
1708 		.compatible = "samsung,exynos4210-hdmi",
1709 		.data = &exynos4210_hdmi_driver_data,
1710 	}, {
1711 		.compatible = "samsung,exynos4212-hdmi",
1712 		.data = &exynos4212_hdmi_driver_data,
1713 	}, {
1714 		.compatible = "samsung,exynos5420-hdmi",
1715 		.data = &exynos5420_hdmi_driver_data,
1716 	}, {
1717 		.compatible = "samsung,exynos5433-hdmi",
1718 		.data = &exynos5433_hdmi_driver_data,
1719 	}, {
1720 		/* end node */
1721 	}
1722 };
1723 MODULE_DEVICE_TABLE (of, hdmi_match_types);
1724 
1725 static int hdmi_bind(struct device *dev, struct device *master, void *data)
1726 {
1727 	struct drm_device *drm_dev = data;
1728 	struct hdmi_context *hdata = dev_get_drvdata(dev);
1729 	struct drm_encoder *encoder = &hdata->encoder;
1730 	int ret, pipe;
1731 
1732 	hdata->drm_dev = drm_dev;
1733 
1734 	pipe = exynos_drm_crtc_get_pipe_from_type(drm_dev,
1735 						  EXYNOS_DISPLAY_TYPE_HDMI);
1736 	if (pipe < 0)
1737 		return pipe;
1738 
1739 	hdata->phy_clk.enable = hdmiphy_clk_enable;
1740 
1741 	exynos_drm_crtc_from_pipe(drm_dev, pipe)->pipe_clk = &hdata->phy_clk;
1742 
1743 	encoder->possible_crtcs = 1 << pipe;
1744 
1745 	DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
1746 
1747 	drm_encoder_init(drm_dev, encoder, &exynos_hdmi_encoder_funcs,
1748 			 DRM_MODE_ENCODER_TMDS, NULL);
1749 
1750 	drm_encoder_helper_add(encoder, &exynos_hdmi_encoder_helper_funcs);
1751 
1752 	ret = hdmi_create_connector(encoder);
1753 	if (ret) {
1754 		DRM_ERROR("failed to create connector ret = %d\n", ret);
1755 		drm_encoder_cleanup(encoder);
1756 		return ret;
1757 	}
1758 
1759 	return 0;
1760 }
1761 
1762 static void hdmi_unbind(struct device *dev, struct device *master, void *data)
1763 {
1764 }
1765 
1766 static const struct component_ops hdmi_component_ops = {
1767 	.bind	= hdmi_bind,
1768 	.unbind = hdmi_unbind,
1769 };
1770 
1771 static struct device_node *hdmi_legacy_ddc_dt_binding(struct device *dev)
1772 {
1773 	const char *compatible_str = "samsung,exynos4210-hdmiddc";
1774 	struct device_node *np;
1775 
1776 	np = of_find_compatible_node(NULL, NULL, compatible_str);
1777 	if (np)
1778 		return of_get_next_parent(np);
1779 
1780 	return NULL;
1781 }
1782 
1783 static struct device_node *hdmi_legacy_phy_dt_binding(struct device *dev)
1784 {
1785 	const char *compatible_str = "samsung,exynos4212-hdmiphy";
1786 
1787 	return of_find_compatible_node(NULL, NULL, compatible_str);
1788 }
1789 
1790 static int hdmi_probe(struct platform_device *pdev)
1791 {
1792 	struct device_node *ddc_node, *phy_node;
1793 	struct device *dev = &pdev->dev;
1794 	struct hdmi_context *hdata;
1795 	struct resource *res;
1796 	int ret;
1797 
1798 	hdata = devm_kzalloc(dev, sizeof(struct hdmi_context), GFP_KERNEL);
1799 	if (!hdata)
1800 		return -ENOMEM;
1801 
1802 	hdata->drv_data = of_device_get_match_data(dev);
1803 
1804 	platform_set_drvdata(pdev, hdata);
1805 
1806 	hdata->dev = dev;
1807 
1808 	ret = hdmi_resources_init(hdata);
1809 	if (ret) {
1810 		if (ret != -EPROBE_DEFER)
1811 			DRM_ERROR("hdmi_resources_init failed\n");
1812 		return ret;
1813 	}
1814 
1815 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1816 	hdata->regs = devm_ioremap_resource(dev, res);
1817 	if (IS_ERR(hdata->regs)) {
1818 		ret = PTR_ERR(hdata->regs);
1819 		return ret;
1820 	}
1821 
1822 	ddc_node = hdmi_legacy_ddc_dt_binding(dev);
1823 	if (ddc_node)
1824 		goto out_get_ddc_adpt;
1825 
1826 	ddc_node = of_parse_phandle(dev->of_node, "ddc", 0);
1827 	if (!ddc_node) {
1828 		DRM_ERROR("Failed to find ddc node in device tree\n");
1829 		return -ENODEV;
1830 	}
1831 
1832 out_get_ddc_adpt:
1833 	hdata->ddc_adpt = of_find_i2c_adapter_by_node(ddc_node);
1834 	if (!hdata->ddc_adpt) {
1835 		DRM_ERROR("Failed to get ddc i2c adapter by node\n");
1836 		return -EPROBE_DEFER;
1837 	}
1838 
1839 	phy_node = hdmi_legacy_phy_dt_binding(dev);
1840 	if (phy_node)
1841 		goto out_get_phy_port;
1842 
1843 	phy_node = of_parse_phandle(dev->of_node, "phy", 0);
1844 	if (!phy_node) {
1845 		DRM_ERROR("Failed to find hdmiphy node in device tree\n");
1846 		ret = -ENODEV;
1847 		goto err_ddc;
1848 	}
1849 
1850 out_get_phy_port:
1851 	if (hdata->drv_data->is_apb_phy) {
1852 		hdata->regs_hdmiphy = of_iomap(phy_node, 0);
1853 		if (!hdata->regs_hdmiphy) {
1854 			DRM_ERROR("failed to ioremap hdmi phy\n");
1855 			ret = -ENOMEM;
1856 			goto err_ddc;
1857 		}
1858 	} else {
1859 		hdata->hdmiphy_port = of_find_i2c_device_by_node(phy_node);
1860 		if (!hdata->hdmiphy_port) {
1861 			DRM_ERROR("Failed to get hdmi phy i2c client\n");
1862 			ret = -EPROBE_DEFER;
1863 			goto err_ddc;
1864 		}
1865 	}
1866 
1867 	INIT_DELAYED_WORK(&hdata->hotplug_work, hdmi_hotplug_work_func);
1868 
1869 	ret = devm_request_threaded_irq(dev, hdata->irq, NULL,
1870 			hdmi_irq_thread, IRQF_TRIGGER_RISING |
1871 			IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1872 			"hdmi", hdata);
1873 	if (ret) {
1874 		DRM_ERROR("failed to register hdmi interrupt\n");
1875 		goto err_hdmiphy;
1876 	}
1877 
1878 	hdata->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node,
1879 			"samsung,syscon-phandle");
1880 	if (IS_ERR(hdata->pmureg)) {
1881 		DRM_ERROR("syscon regmap lookup failed.\n");
1882 		ret = -EPROBE_DEFER;
1883 		goto err_hdmiphy;
1884 	}
1885 
1886 	if (hdata->drv_data->has_sysreg) {
1887 		hdata->sysreg = syscon_regmap_lookup_by_phandle(dev->of_node,
1888 				"samsung,sysreg-phandle");
1889 		if (IS_ERR(hdata->sysreg)) {
1890 			DRM_ERROR("sysreg regmap lookup failed.\n");
1891 			ret = -EPROBE_DEFER;
1892 			goto err_hdmiphy;
1893 		}
1894 	}
1895 
1896 	pm_runtime_enable(dev);
1897 
1898 	ret = component_add(&pdev->dev, &hdmi_component_ops);
1899 	if (ret)
1900 		goto err_disable_pm_runtime;
1901 
1902 	return ret;
1903 
1904 err_disable_pm_runtime:
1905 	pm_runtime_disable(dev);
1906 
1907 err_hdmiphy:
1908 	if (hdata->hdmiphy_port)
1909 		put_device(&hdata->hdmiphy_port->dev);
1910 err_ddc:
1911 	put_device(&hdata->ddc_adpt->dev);
1912 
1913 	return ret;
1914 }
1915 
1916 static int hdmi_remove(struct platform_device *pdev)
1917 {
1918 	struct hdmi_context *hdata = platform_get_drvdata(pdev);
1919 
1920 	cancel_delayed_work_sync(&hdata->hotplug_work);
1921 
1922 	component_del(&pdev->dev, &hdmi_component_ops);
1923 
1924 	pm_runtime_disable(&pdev->dev);
1925 
1926 	if (!IS_ERR(hdata->reg_hdmi_en))
1927 		regulator_disable(hdata->reg_hdmi_en);
1928 
1929 	if (hdata->hdmiphy_port)
1930 		put_device(&hdata->hdmiphy_port->dev);
1931 
1932 	put_device(&hdata->ddc_adpt->dev);
1933 
1934 	return 0;
1935 }
1936 
1937 #ifdef CONFIG_PM
1938 static int exynos_hdmi_suspend(struct device *dev)
1939 {
1940 	struct hdmi_context *hdata = dev_get_drvdata(dev);
1941 
1942 	hdmi_clk_disable_gates(hdata);
1943 
1944 	return 0;
1945 }
1946 
1947 static int exynos_hdmi_resume(struct device *dev)
1948 {
1949 	struct hdmi_context *hdata = dev_get_drvdata(dev);
1950 	int ret;
1951 
1952 	ret = hdmi_clk_enable_gates(hdata);
1953 	if (ret < 0)
1954 		return ret;
1955 
1956 	return 0;
1957 }
1958 #endif
1959 
1960 static const struct dev_pm_ops exynos_hdmi_pm_ops = {
1961 	SET_RUNTIME_PM_OPS(exynos_hdmi_suspend, exynos_hdmi_resume, NULL)
1962 };
1963 
1964 struct platform_driver hdmi_driver = {
1965 	.probe		= hdmi_probe,
1966 	.remove		= hdmi_remove,
1967 	.driver		= {
1968 		.name	= "exynos-hdmi",
1969 		.owner	= THIS_MODULE,
1970 		.pm	= &exynos_hdmi_pm_ops,
1971 		.of_match_table = hdmi_match_types,
1972 	},
1973 };
1974