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