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