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