[go: nahoru, domu]

1/*
2 * Copyright (C) 2011 Samsung Electronics Co.Ltd
3 * Authors:
4 * Seung-Woo Kim <sw0312.kim@samsung.com>
5 *	Inki Dae <inki.dae@samsung.com>
6 *	Joonyoung Shim <jy0922.shim@samsung.com>
7 *
8 * Based on drivers/media/video/s5p-tv/hdmi_drv.c
9 *
10 * This program is free software; you can redistribute  it and/or modify it
11 * under  the terms of  the GNU General  Public License as published by the
12 * Free Software Foundation;  either version 2 of the  License, or (at your
13 * option) any later version.
14 *
15 */
16
17#include <drm/drmP.h>
18#include <drm/drm_edid.h>
19#include <drm/drm_crtc_helper.h>
20
21#include "regs-hdmi.h"
22
23#include <linux/kernel.h>
24#include <linux/spinlock.h>
25#include <linux/wait.h>
26#include <linux/i2c.h>
27#include <linux/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/regulator/consumer.h>
34#include <linux/io.h>
35#include <linux/of.h>
36#include <linux/of_address.h>
37#include <linux/of_gpio.h>
38#include <linux/hdmi.h>
39#include <linux/component.h>
40#include <linux/mfd/syscon.h>
41#include <linux/regmap.h>
42
43#include <drm/exynos_drm.h>
44
45#include "exynos_drm_drv.h"
46#include "exynos_drm_crtc.h"
47#include "exynos_mixer.h"
48
49#include <linux/gpio.h>
50#include <media/s5p_hdmi.h>
51
52#define get_hdmi_display(dev)	platform_get_drvdata(to_platform_device(dev))
53#define ctx_from_connector(c)	container_of(c, struct hdmi_context, connector)
54
55#define HOTPLUG_DEBOUNCE_MS		1100
56
57/* AVI header and aspect ratio */
58#define HDMI_AVI_VERSION		0x02
59#define HDMI_AVI_LENGTH		0x0D
60
61/* AUI header info */
62#define HDMI_AUI_VERSION	0x01
63#define HDMI_AUI_LENGTH	0x0A
64#define AVI_SAME_AS_PIC_ASPECT_RATIO 0x8
65#define AVI_4_3_CENTER_RATIO	0x9
66#define AVI_16_9_CENTER_RATIO	0xa
67
68enum hdmi_type {
69	HDMI_TYPE13,
70	HDMI_TYPE14,
71};
72
73struct hdmi_driver_data {
74	unsigned int type;
75	const struct hdmiphy_config *phy_confs;
76	unsigned int phy_conf_count;
77	unsigned int is_apb_phy:1;
78};
79
80struct hdmi_resources {
81	struct clk			*hdmi;
82	struct clk			*sclk_hdmi;
83	struct clk			*sclk_pixel;
84	struct clk			*sclk_hdmiphy;
85	struct clk			*mout_hdmi;
86	struct regulator_bulk_data	*regul_bulk;
87	struct regulator		*reg_hdmi_en;
88	int				regul_count;
89};
90
91struct hdmi_tg_regs {
92	u8 cmd[1];
93	u8 h_fsz[2];
94	u8 hact_st[2];
95	u8 hact_sz[2];
96	u8 v_fsz[2];
97	u8 vsync[2];
98	u8 vsync2[2];
99	u8 vact_st[2];
100	u8 vact_sz[2];
101	u8 field_chg[2];
102	u8 vact_st2[2];
103	u8 vact_st3[2];
104	u8 vact_st4[2];
105	u8 vsync_top_hdmi[2];
106	u8 vsync_bot_hdmi[2];
107	u8 field_top_hdmi[2];
108	u8 field_bot_hdmi[2];
109	u8 tg_3d[1];
110};
111
112struct hdmi_v13_core_regs {
113	u8 h_blank[2];
114	u8 v_blank[3];
115	u8 h_v_line[3];
116	u8 vsync_pol[1];
117	u8 int_pro_mode[1];
118	u8 v_blank_f[3];
119	u8 h_sync_gen[3];
120	u8 v_sync_gen1[3];
121	u8 v_sync_gen2[3];
122	u8 v_sync_gen3[3];
123};
124
125struct hdmi_v14_core_regs {
126	u8 h_blank[2];
127	u8 v2_blank[2];
128	u8 v1_blank[2];
129	u8 v_line[2];
130	u8 h_line[2];
131	u8 hsync_pol[1];
132	u8 vsync_pol[1];
133	u8 int_pro_mode[1];
134	u8 v_blank_f0[2];
135	u8 v_blank_f1[2];
136	u8 h_sync_start[2];
137	u8 h_sync_end[2];
138	u8 v_sync_line_bef_2[2];
139	u8 v_sync_line_bef_1[2];
140	u8 v_sync_line_aft_2[2];
141	u8 v_sync_line_aft_1[2];
142	u8 v_sync_line_aft_pxl_2[2];
143	u8 v_sync_line_aft_pxl_1[2];
144	u8 v_blank_f2[2]; /* for 3D mode */
145	u8 v_blank_f3[2]; /* for 3D mode */
146	u8 v_blank_f4[2]; /* for 3D mode */
147	u8 v_blank_f5[2]; /* for 3D mode */
148	u8 v_sync_line_aft_3[2];
149	u8 v_sync_line_aft_4[2];
150	u8 v_sync_line_aft_5[2];
151	u8 v_sync_line_aft_6[2];
152	u8 v_sync_line_aft_pxl_3[2];
153	u8 v_sync_line_aft_pxl_4[2];
154	u8 v_sync_line_aft_pxl_5[2];
155	u8 v_sync_line_aft_pxl_6[2];
156	u8 vact_space_1[2];
157	u8 vact_space_2[2];
158	u8 vact_space_3[2];
159	u8 vact_space_4[2];
160	u8 vact_space_5[2];
161	u8 vact_space_6[2];
162};
163
164struct hdmi_v13_conf {
165	struct hdmi_v13_core_regs core;
166	struct hdmi_tg_regs tg;
167};
168
169struct hdmi_v14_conf {
170	struct hdmi_v14_core_regs core;
171	struct hdmi_tg_regs tg;
172};
173
174struct hdmi_conf_regs {
175	int pixel_clock;
176	int cea_video_id;
177	enum hdmi_picture_aspect aspect_ratio;
178	union {
179		struct hdmi_v13_conf v13_conf;
180		struct hdmi_v14_conf v14_conf;
181	} conf;
182};
183
184struct hdmi_context {
185	struct device			*dev;
186	struct drm_device		*drm_dev;
187	struct drm_connector		connector;
188	struct drm_encoder		*encoder;
189	bool				hpd;
190	bool				powered;
191	bool				dvi_mode;
192	struct mutex			hdmi_mutex;
193
194	void __iomem			*regs;
195	int				irq;
196	struct delayed_work		hotplug_work;
197
198	struct i2c_adapter		*ddc_adpt;
199	struct i2c_client		*hdmiphy_port;
200
201	/* current hdmiphy conf regs */
202	struct drm_display_mode		current_mode;
203	struct hdmi_conf_regs		mode_conf;
204
205	struct hdmi_resources		res;
206
207	int				hpd_gpio;
208	void __iomem			*regs_hdmiphy;
209	const struct hdmiphy_config		*phy_confs;
210	unsigned int			phy_conf_count;
211
212	struct regmap			*pmureg;
213	enum hdmi_type			type;
214};
215
216struct hdmiphy_config {
217	int pixel_clock;
218	u8 conf[32];
219};
220
221/* list of phy config settings */
222static const struct hdmiphy_config hdmiphy_v13_configs[] = {
223	{
224		.pixel_clock = 27000000,
225		.conf = {
226			0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
227			0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
228			0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
229			0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
230		},
231	},
232	{
233		.pixel_clock = 27027000,
234		.conf = {
235			0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
236			0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
237			0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
238			0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
239		},
240	},
241	{
242		.pixel_clock = 74176000,
243		.conf = {
244			0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
245			0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
246			0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
247			0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x00,
248		},
249	},
250	{
251		.pixel_clock = 74250000,
252		.conf = {
253			0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
254			0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
255			0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0,
256			0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x00,
257		},
258	},
259	{
260		.pixel_clock = 148500000,
261		.conf = {
262			0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
263			0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
264			0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
265			0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x00,
266		},
267	},
268};
269
270static const struct hdmiphy_config hdmiphy_v14_configs[] = {
271	{
272		.pixel_clock = 25200000,
273		.conf = {
274			0x01, 0x51, 0x2A, 0x75, 0x40, 0x01, 0x00, 0x08,
275			0x82, 0x80, 0xfc, 0xd8, 0x45, 0xa0, 0xac, 0x80,
276			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
277			0x54, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
278		},
279	},
280	{
281		.pixel_clock = 27000000,
282		.conf = {
283			0x01, 0xd1, 0x22, 0x51, 0x40, 0x08, 0xfc, 0x20,
284			0x98, 0xa0, 0xcb, 0xd8, 0x45, 0xa0, 0xac, 0x80,
285			0x06, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
286			0x54, 0xe4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
287		},
288	},
289	{
290		.pixel_clock = 27027000,
291		.conf = {
292			0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08,
293			0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
294			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
295			0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00,
296		},
297	},
298	{
299		.pixel_clock = 36000000,
300		.conf = {
301			0x01, 0x51, 0x2d, 0x55, 0x40, 0x01, 0x00, 0x08,
302			0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
303			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
304			0x54, 0xab, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
305		},
306	},
307	{
308		.pixel_clock = 40000000,
309		.conf = {
310			0x01, 0x51, 0x32, 0x55, 0x40, 0x01, 0x00, 0x08,
311			0x82, 0x80, 0x2c, 0xd9, 0x45, 0xa0, 0xac, 0x80,
312			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
313			0x54, 0x9a, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
314		},
315	},
316	{
317		.pixel_clock = 65000000,
318		.conf = {
319			0x01, 0xd1, 0x36, 0x34, 0x40, 0x1e, 0x0a, 0x08,
320			0x82, 0xa0, 0x45, 0xd9, 0x45, 0xa0, 0xac, 0x80,
321			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
322			0x54, 0xbd, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
323		},
324	},
325	{
326		.pixel_clock = 71000000,
327		.conf = {
328			0x01, 0xd1, 0x3b, 0x35, 0x40, 0x0c, 0x04, 0x08,
329			0x85, 0xa0, 0x63, 0xd9, 0x45, 0xa0, 0xac, 0x80,
330			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
331			0x54, 0xad, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
332		},
333	},
334	{
335		.pixel_clock = 73250000,
336		.conf = {
337			0x01, 0xd1, 0x3d, 0x35, 0x40, 0x18, 0x02, 0x08,
338			0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
339			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
340			0x54, 0xa8, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
341		},
342	},
343	{
344		.pixel_clock = 74176000,
345		.conf = {
346			0x01, 0xd1, 0x3e, 0x35, 0x40, 0x5b, 0xde, 0x08,
347			0x82, 0xa0, 0x73, 0xd9, 0x45, 0xa0, 0xac, 0x80,
348			0x56, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
349			0x54, 0xa6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
350		},
351	},
352	{
353		.pixel_clock = 74250000,
354		.conf = {
355			0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08,
356			0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
357			0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
358			0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00,
359		},
360	},
361	{
362		.pixel_clock = 83500000,
363		.conf = {
364			0x01, 0xd1, 0x23, 0x11, 0x40, 0x0c, 0xfb, 0x08,
365			0x85, 0xa0, 0xd1, 0xd8, 0x45, 0xa0, 0xac, 0x80,
366			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
367			0x54, 0x93, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
368		},
369	},
370	{
371		.pixel_clock = 106500000,
372		.conf = {
373			0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08,
374			0x84, 0xa0, 0x0a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
375			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
376			0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
377		},
378	},
379	{
380		.pixel_clock = 108000000,
381		.conf = {
382			0x01, 0x51, 0x2d, 0x15, 0x40, 0x01, 0x00, 0x08,
383			0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
384			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
385			0x54, 0xc7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
386		},
387	},
388	{
389		.pixel_clock = 115500000,
390		.conf = {
391			0x01, 0xd1, 0x30, 0x12, 0x40, 0x40, 0x10, 0x08,
392			0x80, 0x80, 0x21, 0xd9, 0x45, 0xa0, 0xac, 0x80,
393			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
394			0x54, 0xaa, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
395		},
396	},
397	{
398		.pixel_clock = 119000000,
399		.conf = {
400			0x01, 0xd1, 0x32, 0x1a, 0x40, 0x30, 0xd8, 0x08,
401			0x04, 0xa0, 0x2a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
402			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
403			0x54, 0x9d, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
404		},
405	},
406	{
407		.pixel_clock = 146250000,
408		.conf = {
409			0x01, 0xd1, 0x3d, 0x15, 0x40, 0x18, 0xfd, 0x08,
410			0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
411			0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
412			0x54, 0x50, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
413		},
414	},
415	{
416		.pixel_clock = 148500000,
417		.conf = {
418			0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08,
419			0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
420			0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
421			0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x00,
422		},
423	},
424};
425
426static const struct hdmiphy_config hdmiphy_5420_configs[] = {
427	{
428		.pixel_clock = 25200000,
429		.conf = {
430			0x01, 0x52, 0x3F, 0x55, 0x40, 0x01, 0x00, 0xC8,
431			0x82, 0xC8, 0xBD, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
432			0x06, 0x80, 0x01, 0x84, 0x05, 0x02, 0x24, 0x66,
433			0x54, 0xF4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
434		},
435	},
436	{
437		.pixel_clock = 27000000,
438		.conf = {
439			0x01, 0xD1, 0x22, 0x51, 0x40, 0x08, 0xFC, 0xE0,
440			0x98, 0xE8, 0xCB, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
441			0x06, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
442			0x54, 0xE4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
443		},
444	},
445	{
446		.pixel_clock = 27027000,
447		.conf = {
448			0x01, 0xD1, 0x2D, 0x72, 0x40, 0x64, 0x12, 0xC8,
449			0x43, 0xE8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
450			0x26, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
451			0x54, 0xE3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
452		},
453	},
454	{
455		.pixel_clock = 36000000,
456		.conf = {
457			0x01, 0x51, 0x2D, 0x55, 0x40, 0x40, 0x00, 0xC8,
458			0x02, 0xC8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
459			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
460			0x54, 0xAB, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
461		},
462	},
463	{
464		.pixel_clock = 40000000,
465		.conf = {
466			0x01, 0xD1, 0x21, 0x31, 0x40, 0x3C, 0x28, 0xC8,
467			0x87, 0xE8, 0xC8, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
468			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
469			0x54, 0x9A, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
470		},
471	},
472	{
473		.pixel_clock = 65000000,
474		.conf = {
475			0x01, 0xD1, 0x36, 0x34, 0x40, 0x0C, 0x04, 0xC8,
476			0x82, 0xE8, 0x45, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
477			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
478			0x54, 0xBD, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
479		},
480	},
481	{
482		.pixel_clock = 71000000,
483		.conf = {
484			0x01, 0xD1, 0x3B, 0x35, 0x40, 0x0C, 0x04, 0xC8,
485			0x85, 0xE8, 0x63, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
486			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
487			0x54, 0x57, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
488		},
489	},
490	{
491		.pixel_clock = 73250000,
492		.conf = {
493			0x01, 0xD1, 0x1F, 0x10, 0x40, 0x78, 0x8D, 0xC8,
494			0x81, 0xE8, 0xB7, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
495			0x56, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
496			0x54, 0xA8, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
497		},
498	},
499	{
500		.pixel_clock = 74176000,
501		.conf = {
502			0x01, 0xD1, 0x1F, 0x10, 0x40, 0x5B, 0xEF, 0xC8,
503			0x81, 0xE8, 0xB9, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
504			0x56, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
505			0x54, 0xA6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
506		},
507	},
508	{
509		.pixel_clock = 74250000,
510		.conf = {
511			0x01, 0xD1, 0x1F, 0x10, 0x40, 0x40, 0xF8, 0x08,
512			0x81, 0xE8, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
513			0x26, 0x80, 0x09, 0x84, 0x05, 0x22, 0x24, 0x66,
514			0x54, 0xA5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
515		},
516	},
517	{
518		.pixel_clock = 83500000,
519		.conf = {
520			0x01, 0xD1, 0x23, 0x11, 0x40, 0x0C, 0xFB, 0xC8,
521			0x85, 0xE8, 0xD1, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
522			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
523			0x54, 0x4A, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
524		},
525	},
526	{
527		.pixel_clock = 88750000,
528		.conf = {
529			0x01, 0xD1, 0x25, 0x11, 0x40, 0x18, 0xFF, 0xC8,
530			0x83, 0xE8, 0xDE, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
531			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
532			0x54, 0x45, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
533		},
534	},
535	{
536		.pixel_clock = 106500000,
537		.conf = {
538			0x01, 0xD1, 0x2C, 0x12, 0x40, 0x0C, 0x09, 0xC8,
539			0x84, 0xE8, 0x0A, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
540			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
541			0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
542		},
543	},
544	{
545		.pixel_clock = 108000000,
546		.conf = {
547			0x01, 0x51, 0x2D, 0x15, 0x40, 0x01, 0x00, 0xC8,
548			0x82, 0xC8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
549			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
550			0x54, 0xC7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
551		},
552	},
553	{
554		.pixel_clock = 115500000,
555		.conf = {
556			0x01, 0xD1, 0x30, 0x14, 0x40, 0x0C, 0x03, 0xC8,
557			0x88, 0xE8, 0x21, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
558			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
559			0x54, 0x6A, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
560		},
561	},
562	{
563		.pixel_clock = 146250000,
564		.conf = {
565			0x01, 0xD1, 0x3D, 0x15, 0x40, 0x18, 0xFD, 0xC8,
566			0x83, 0xE8, 0x6E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
567			0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
568			0x54, 0x54, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
569		},
570	},
571	{
572		.pixel_clock = 148500000,
573		.conf = {
574			0x01, 0xD1, 0x1F, 0x00, 0x40, 0x40, 0xF8, 0x08,
575			0x81, 0xE8, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
576			0x26, 0x80, 0x09, 0x84, 0x05, 0x22, 0x24, 0x66,
577			0x54, 0x4B, 0x25, 0x03, 0x00, 0x80, 0x01, 0x80,
578		},
579	},
580};
581
582static struct hdmi_driver_data exynos5420_hdmi_driver_data = {
583	.type		= HDMI_TYPE14,
584	.phy_confs	= hdmiphy_5420_configs,
585	.phy_conf_count	= ARRAY_SIZE(hdmiphy_5420_configs),
586	.is_apb_phy	= 1,
587};
588
589static struct hdmi_driver_data exynos4212_hdmi_driver_data = {
590	.type		= HDMI_TYPE14,
591	.phy_confs	= hdmiphy_v14_configs,
592	.phy_conf_count	= ARRAY_SIZE(hdmiphy_v14_configs),
593	.is_apb_phy	= 0,
594};
595
596static struct hdmi_driver_data exynos4210_hdmi_driver_data = {
597	.type		= HDMI_TYPE13,
598	.phy_confs	= hdmiphy_v13_configs,
599	.phy_conf_count	= ARRAY_SIZE(hdmiphy_v13_configs),
600	.is_apb_phy	= 0,
601};
602
603static struct hdmi_driver_data exynos5_hdmi_driver_data = {
604	.type		= HDMI_TYPE14,
605	.phy_confs	= hdmiphy_v13_configs,
606	.phy_conf_count	= ARRAY_SIZE(hdmiphy_v13_configs),
607	.is_apb_phy	= 0,
608};
609
610static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id)
611{
612	return readl(hdata->regs + reg_id);
613}
614
615static inline void hdmi_reg_writeb(struct hdmi_context *hdata,
616				 u32 reg_id, u8 value)
617{
618	writeb(value, hdata->regs + reg_id);
619}
620
621static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
622				 u32 reg_id, u32 value, u32 mask)
623{
624	u32 old = readl(hdata->regs + reg_id);
625	value = (value & mask) | (old & ~mask);
626	writel(value, hdata->regs + reg_id);
627}
628
629static int hdmiphy_reg_writeb(struct hdmi_context *hdata,
630			u32 reg_offset, u8 value)
631{
632	if (hdata->hdmiphy_port) {
633		u8 buffer[2];
634		int ret;
635
636		buffer[0] = reg_offset;
637		buffer[1] = value;
638
639		ret = i2c_master_send(hdata->hdmiphy_port, buffer, 2);
640		if (ret == 2)
641			return 0;
642		return ret;
643	} else {
644		writeb(value, hdata->regs_hdmiphy + (reg_offset<<2));
645		return 0;
646	}
647}
648
649static int hdmiphy_reg_write_buf(struct hdmi_context *hdata,
650			u32 reg_offset, const u8 *buf, u32 len)
651{
652	if ((reg_offset + len) > 32)
653		return -EINVAL;
654
655	if (hdata->hdmiphy_port) {
656		int ret;
657
658		ret = i2c_master_send(hdata->hdmiphy_port, buf, len);
659		if (ret == len)
660			return 0;
661		return ret;
662	} else {
663		int i;
664		for (i = 0; i < len; i++)
665			writeb(buf[i], hdata->regs_hdmiphy +
666				((reg_offset + i)<<2));
667		return 0;
668	}
669}
670
671static void hdmi_v13_regs_dump(struct hdmi_context *hdata, char *prefix)
672{
673#define DUMPREG(reg_id) \
674	DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
675	readl(hdata->regs + reg_id))
676	DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
677	DUMPREG(HDMI_INTC_FLAG);
678	DUMPREG(HDMI_INTC_CON);
679	DUMPREG(HDMI_HPD_STATUS);
680	DUMPREG(HDMI_V13_PHY_RSTOUT);
681	DUMPREG(HDMI_V13_PHY_VPLL);
682	DUMPREG(HDMI_V13_PHY_CMU);
683	DUMPREG(HDMI_V13_CORE_RSTOUT);
684
685	DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
686	DUMPREG(HDMI_CON_0);
687	DUMPREG(HDMI_CON_1);
688	DUMPREG(HDMI_CON_2);
689	DUMPREG(HDMI_SYS_STATUS);
690	DUMPREG(HDMI_V13_PHY_STATUS);
691	DUMPREG(HDMI_STATUS_EN);
692	DUMPREG(HDMI_HPD);
693	DUMPREG(HDMI_MODE_SEL);
694	DUMPREG(HDMI_V13_HPD_GEN);
695	DUMPREG(HDMI_V13_DC_CONTROL);
696	DUMPREG(HDMI_V13_VIDEO_PATTERN_GEN);
697
698	DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
699	DUMPREG(HDMI_H_BLANK_0);
700	DUMPREG(HDMI_H_BLANK_1);
701	DUMPREG(HDMI_V13_V_BLANK_0);
702	DUMPREG(HDMI_V13_V_BLANK_1);
703	DUMPREG(HDMI_V13_V_BLANK_2);
704	DUMPREG(HDMI_V13_H_V_LINE_0);
705	DUMPREG(HDMI_V13_H_V_LINE_1);
706	DUMPREG(HDMI_V13_H_V_LINE_2);
707	DUMPREG(HDMI_VSYNC_POL);
708	DUMPREG(HDMI_INT_PRO_MODE);
709	DUMPREG(HDMI_V13_V_BLANK_F_0);
710	DUMPREG(HDMI_V13_V_BLANK_F_1);
711	DUMPREG(HDMI_V13_V_BLANK_F_2);
712	DUMPREG(HDMI_V13_H_SYNC_GEN_0);
713	DUMPREG(HDMI_V13_H_SYNC_GEN_1);
714	DUMPREG(HDMI_V13_H_SYNC_GEN_2);
715	DUMPREG(HDMI_V13_V_SYNC_GEN_1_0);
716	DUMPREG(HDMI_V13_V_SYNC_GEN_1_1);
717	DUMPREG(HDMI_V13_V_SYNC_GEN_1_2);
718	DUMPREG(HDMI_V13_V_SYNC_GEN_2_0);
719	DUMPREG(HDMI_V13_V_SYNC_GEN_2_1);
720	DUMPREG(HDMI_V13_V_SYNC_GEN_2_2);
721	DUMPREG(HDMI_V13_V_SYNC_GEN_3_0);
722	DUMPREG(HDMI_V13_V_SYNC_GEN_3_1);
723	DUMPREG(HDMI_V13_V_SYNC_GEN_3_2);
724
725	DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
726	DUMPREG(HDMI_TG_CMD);
727	DUMPREG(HDMI_TG_H_FSZ_L);
728	DUMPREG(HDMI_TG_H_FSZ_H);
729	DUMPREG(HDMI_TG_HACT_ST_L);
730	DUMPREG(HDMI_TG_HACT_ST_H);
731	DUMPREG(HDMI_TG_HACT_SZ_L);
732	DUMPREG(HDMI_TG_HACT_SZ_H);
733	DUMPREG(HDMI_TG_V_FSZ_L);
734	DUMPREG(HDMI_TG_V_FSZ_H);
735	DUMPREG(HDMI_TG_VSYNC_L);
736	DUMPREG(HDMI_TG_VSYNC_H);
737	DUMPREG(HDMI_TG_VSYNC2_L);
738	DUMPREG(HDMI_TG_VSYNC2_H);
739	DUMPREG(HDMI_TG_VACT_ST_L);
740	DUMPREG(HDMI_TG_VACT_ST_H);
741	DUMPREG(HDMI_TG_VACT_SZ_L);
742	DUMPREG(HDMI_TG_VACT_SZ_H);
743	DUMPREG(HDMI_TG_FIELD_CHG_L);
744	DUMPREG(HDMI_TG_FIELD_CHG_H);
745	DUMPREG(HDMI_TG_VACT_ST2_L);
746	DUMPREG(HDMI_TG_VACT_ST2_H);
747	DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
748	DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
749	DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
750	DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
751	DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
752	DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
753	DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
754	DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
755#undef DUMPREG
756}
757
758static void hdmi_v14_regs_dump(struct hdmi_context *hdata, char *prefix)
759{
760	int i;
761
762#define DUMPREG(reg_id) \
763	DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
764	readl(hdata->regs + reg_id))
765
766	DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
767	DUMPREG(HDMI_INTC_CON);
768	DUMPREG(HDMI_INTC_FLAG);
769	DUMPREG(HDMI_HPD_STATUS);
770	DUMPREG(HDMI_INTC_CON_1);
771	DUMPREG(HDMI_INTC_FLAG_1);
772	DUMPREG(HDMI_PHY_STATUS_0);
773	DUMPREG(HDMI_PHY_STATUS_PLL);
774	DUMPREG(HDMI_PHY_CON_0);
775	DUMPREG(HDMI_PHY_RSTOUT);
776	DUMPREG(HDMI_PHY_VPLL);
777	DUMPREG(HDMI_PHY_CMU);
778	DUMPREG(HDMI_CORE_RSTOUT);
779
780	DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
781	DUMPREG(HDMI_CON_0);
782	DUMPREG(HDMI_CON_1);
783	DUMPREG(HDMI_CON_2);
784	DUMPREG(HDMI_SYS_STATUS);
785	DUMPREG(HDMI_PHY_STATUS_0);
786	DUMPREG(HDMI_STATUS_EN);
787	DUMPREG(HDMI_HPD);
788	DUMPREG(HDMI_MODE_SEL);
789	DUMPREG(HDMI_ENC_EN);
790	DUMPREG(HDMI_DC_CONTROL);
791	DUMPREG(HDMI_VIDEO_PATTERN_GEN);
792
793	DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
794	DUMPREG(HDMI_H_BLANK_0);
795	DUMPREG(HDMI_H_BLANK_1);
796	DUMPREG(HDMI_V2_BLANK_0);
797	DUMPREG(HDMI_V2_BLANK_1);
798	DUMPREG(HDMI_V1_BLANK_0);
799	DUMPREG(HDMI_V1_BLANK_1);
800	DUMPREG(HDMI_V_LINE_0);
801	DUMPREG(HDMI_V_LINE_1);
802	DUMPREG(HDMI_H_LINE_0);
803	DUMPREG(HDMI_H_LINE_1);
804	DUMPREG(HDMI_HSYNC_POL);
805
806	DUMPREG(HDMI_VSYNC_POL);
807	DUMPREG(HDMI_INT_PRO_MODE);
808	DUMPREG(HDMI_V_BLANK_F0_0);
809	DUMPREG(HDMI_V_BLANK_F0_1);
810	DUMPREG(HDMI_V_BLANK_F1_0);
811	DUMPREG(HDMI_V_BLANK_F1_1);
812
813	DUMPREG(HDMI_H_SYNC_START_0);
814	DUMPREG(HDMI_H_SYNC_START_1);
815	DUMPREG(HDMI_H_SYNC_END_0);
816	DUMPREG(HDMI_H_SYNC_END_1);
817
818	DUMPREG(HDMI_V_SYNC_LINE_BEF_2_0);
819	DUMPREG(HDMI_V_SYNC_LINE_BEF_2_1);
820	DUMPREG(HDMI_V_SYNC_LINE_BEF_1_0);
821	DUMPREG(HDMI_V_SYNC_LINE_BEF_1_1);
822
823	DUMPREG(HDMI_V_SYNC_LINE_AFT_2_0);
824	DUMPREG(HDMI_V_SYNC_LINE_AFT_2_1);
825	DUMPREG(HDMI_V_SYNC_LINE_AFT_1_0);
826	DUMPREG(HDMI_V_SYNC_LINE_AFT_1_1);
827
828	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_0);
829	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_1);
830	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_0);
831	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_1);
832
833	DUMPREG(HDMI_V_BLANK_F2_0);
834	DUMPREG(HDMI_V_BLANK_F2_1);
835	DUMPREG(HDMI_V_BLANK_F3_0);
836	DUMPREG(HDMI_V_BLANK_F3_1);
837	DUMPREG(HDMI_V_BLANK_F4_0);
838	DUMPREG(HDMI_V_BLANK_F4_1);
839	DUMPREG(HDMI_V_BLANK_F5_0);
840	DUMPREG(HDMI_V_BLANK_F5_1);
841
842	DUMPREG(HDMI_V_SYNC_LINE_AFT_3_0);
843	DUMPREG(HDMI_V_SYNC_LINE_AFT_3_1);
844	DUMPREG(HDMI_V_SYNC_LINE_AFT_4_0);
845	DUMPREG(HDMI_V_SYNC_LINE_AFT_4_1);
846	DUMPREG(HDMI_V_SYNC_LINE_AFT_5_0);
847	DUMPREG(HDMI_V_SYNC_LINE_AFT_5_1);
848	DUMPREG(HDMI_V_SYNC_LINE_AFT_6_0);
849	DUMPREG(HDMI_V_SYNC_LINE_AFT_6_1);
850
851	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_0);
852	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_1);
853	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_0);
854	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_1);
855	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_0);
856	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_1);
857	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_0);
858	DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_1);
859
860	DUMPREG(HDMI_VACT_SPACE_1_0);
861	DUMPREG(HDMI_VACT_SPACE_1_1);
862	DUMPREG(HDMI_VACT_SPACE_2_0);
863	DUMPREG(HDMI_VACT_SPACE_2_1);
864	DUMPREG(HDMI_VACT_SPACE_3_0);
865	DUMPREG(HDMI_VACT_SPACE_3_1);
866	DUMPREG(HDMI_VACT_SPACE_4_0);
867	DUMPREG(HDMI_VACT_SPACE_4_1);
868	DUMPREG(HDMI_VACT_SPACE_5_0);
869	DUMPREG(HDMI_VACT_SPACE_5_1);
870	DUMPREG(HDMI_VACT_SPACE_6_0);
871	DUMPREG(HDMI_VACT_SPACE_6_1);
872
873	DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
874	DUMPREG(HDMI_TG_CMD);
875	DUMPREG(HDMI_TG_H_FSZ_L);
876	DUMPREG(HDMI_TG_H_FSZ_H);
877	DUMPREG(HDMI_TG_HACT_ST_L);
878	DUMPREG(HDMI_TG_HACT_ST_H);
879	DUMPREG(HDMI_TG_HACT_SZ_L);
880	DUMPREG(HDMI_TG_HACT_SZ_H);
881	DUMPREG(HDMI_TG_V_FSZ_L);
882	DUMPREG(HDMI_TG_V_FSZ_H);
883	DUMPREG(HDMI_TG_VSYNC_L);
884	DUMPREG(HDMI_TG_VSYNC_H);
885	DUMPREG(HDMI_TG_VSYNC2_L);
886	DUMPREG(HDMI_TG_VSYNC2_H);
887	DUMPREG(HDMI_TG_VACT_ST_L);
888	DUMPREG(HDMI_TG_VACT_ST_H);
889	DUMPREG(HDMI_TG_VACT_SZ_L);
890	DUMPREG(HDMI_TG_VACT_SZ_H);
891	DUMPREG(HDMI_TG_FIELD_CHG_L);
892	DUMPREG(HDMI_TG_FIELD_CHG_H);
893	DUMPREG(HDMI_TG_VACT_ST2_L);
894	DUMPREG(HDMI_TG_VACT_ST2_H);
895	DUMPREG(HDMI_TG_VACT_ST3_L);
896	DUMPREG(HDMI_TG_VACT_ST3_H);
897	DUMPREG(HDMI_TG_VACT_ST4_L);
898	DUMPREG(HDMI_TG_VACT_ST4_H);
899	DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
900	DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
901	DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
902	DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
903	DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
904	DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
905	DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
906	DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
907	DUMPREG(HDMI_TG_3D);
908
909	DRM_DEBUG_KMS("%s: ---- PACKET REGISTERS ----\n", prefix);
910	DUMPREG(HDMI_AVI_CON);
911	DUMPREG(HDMI_AVI_HEADER0);
912	DUMPREG(HDMI_AVI_HEADER1);
913	DUMPREG(HDMI_AVI_HEADER2);
914	DUMPREG(HDMI_AVI_CHECK_SUM);
915	DUMPREG(HDMI_VSI_CON);
916	DUMPREG(HDMI_VSI_HEADER0);
917	DUMPREG(HDMI_VSI_HEADER1);
918	DUMPREG(HDMI_VSI_HEADER2);
919	for (i = 0; i < 7; ++i)
920		DUMPREG(HDMI_VSI_DATA(i));
921
922#undef DUMPREG
923}
924
925static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
926{
927	if (hdata->type == HDMI_TYPE13)
928		hdmi_v13_regs_dump(hdata, prefix);
929	else
930		hdmi_v14_regs_dump(hdata, prefix);
931}
932
933static u8 hdmi_chksum(struct hdmi_context *hdata,
934			u32 start, u8 len, u32 hdr_sum)
935{
936	int i;
937
938	/* hdr_sum : header0 + header1 + header2
939	* start : start address of packet byte1
940	* len : packet bytes - 1 */
941	for (i = 0; i < len; ++i)
942		hdr_sum += 0xff & hdmi_reg_read(hdata, start + i * 4);
943
944	/* return 2's complement of 8 bit hdr_sum */
945	return (u8)(~(hdr_sum & 0xff) + 1);
946}
947
948static void hdmi_reg_infoframe(struct hdmi_context *hdata,
949			union hdmi_infoframe *infoframe)
950{
951	u32 hdr_sum;
952	u8 chksum;
953	u32 mod;
954	u32 vic;
955
956	mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
957	if (hdata->dvi_mode) {
958		hdmi_reg_writeb(hdata, HDMI_VSI_CON,
959				HDMI_VSI_CON_DO_NOT_TRANSMIT);
960		hdmi_reg_writeb(hdata, HDMI_AVI_CON,
961				HDMI_AVI_CON_DO_NOT_TRANSMIT);
962		hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN);
963		return;
964	}
965
966	switch (infoframe->any.type) {
967	case HDMI_INFOFRAME_TYPE_AVI:
968		hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC);
969		hdmi_reg_writeb(hdata, HDMI_AVI_HEADER0, infoframe->any.type);
970		hdmi_reg_writeb(hdata, HDMI_AVI_HEADER1,
971				infoframe->any.version);
972		hdmi_reg_writeb(hdata, HDMI_AVI_HEADER2, infoframe->any.length);
973		hdr_sum = infoframe->any.type + infoframe->any.version +
974			  infoframe->any.length;
975
976		/* Output format zero hardcoded ,RGB YBCR selection */
977		hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 0 << 5 |
978			AVI_ACTIVE_FORMAT_VALID |
979			AVI_UNDERSCANNED_DISPLAY_VALID);
980
981		/*
982		 * Set the aspect ratio as per the mode, mentioned in
983		 * Table 9 AVI InfoFrame Data Byte 2 of CEA-861-D Standard
984		 */
985		switch (hdata->mode_conf.aspect_ratio) {
986		case HDMI_PICTURE_ASPECT_4_3:
987			hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2),
988					hdata->mode_conf.aspect_ratio |
989					AVI_4_3_CENTER_RATIO);
990			break;
991		case HDMI_PICTURE_ASPECT_16_9:
992			hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2),
993					hdata->mode_conf.aspect_ratio |
994					AVI_16_9_CENTER_RATIO);
995			break;
996		case HDMI_PICTURE_ASPECT_NONE:
997		default:
998			hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2),
999					hdata->mode_conf.aspect_ratio |
1000					AVI_SAME_AS_PIC_ASPECT_RATIO);
1001			break;
1002		}
1003
1004		vic = hdata->mode_conf.cea_video_id;
1005		hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), vic);
1006
1007		chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1),
1008					infoframe->any.length, hdr_sum);
1009		DRM_DEBUG_KMS("AVI checksum = 0x%x\n", chksum);
1010		hdmi_reg_writeb(hdata, HDMI_AVI_CHECK_SUM, chksum);
1011		break;
1012	case HDMI_INFOFRAME_TYPE_AUDIO:
1013		hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02);
1014		hdmi_reg_writeb(hdata, HDMI_AUI_HEADER0, infoframe->any.type);
1015		hdmi_reg_writeb(hdata, HDMI_AUI_HEADER1,
1016				infoframe->any.version);
1017		hdmi_reg_writeb(hdata, HDMI_AUI_HEADER2, infoframe->any.length);
1018		hdr_sum = infoframe->any.type + infoframe->any.version +
1019			  infoframe->any.length;
1020		chksum = hdmi_chksum(hdata, HDMI_AUI_BYTE(1),
1021					infoframe->any.length, hdr_sum);
1022		DRM_DEBUG_KMS("AUI checksum = 0x%x\n", chksum);
1023		hdmi_reg_writeb(hdata, HDMI_AUI_CHECK_SUM, chksum);
1024		break;
1025	default:
1026		break;
1027	}
1028}
1029
1030static enum drm_connector_status hdmi_detect(struct drm_connector *connector,
1031				bool force)
1032{
1033	struct hdmi_context *hdata = ctx_from_connector(connector);
1034
1035	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
1036
1037	return hdata->hpd ? connector_status_connected :
1038			connector_status_disconnected;
1039}
1040
1041static void hdmi_connector_destroy(struct drm_connector *connector)
1042{
1043	drm_connector_unregister(connector);
1044	drm_connector_cleanup(connector);
1045}
1046
1047static struct drm_connector_funcs hdmi_connector_funcs = {
1048	.dpms = drm_helper_connector_dpms,
1049	.fill_modes = drm_helper_probe_single_connector_modes,
1050	.detect = hdmi_detect,
1051	.destroy = hdmi_connector_destroy,
1052};
1053
1054static int hdmi_get_modes(struct drm_connector *connector)
1055{
1056	struct hdmi_context *hdata = ctx_from_connector(connector);
1057	struct edid *edid;
1058
1059	if (!hdata->ddc_adpt)
1060		return -ENODEV;
1061
1062	edid = drm_get_edid(connector, hdata->ddc_adpt);
1063	if (!edid)
1064		return -ENODEV;
1065
1066	hdata->dvi_mode = !drm_detect_hdmi_monitor(edid);
1067	DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
1068		(hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
1069		edid->width_cm, edid->height_cm);
1070
1071	drm_mode_connector_update_edid_property(connector, edid);
1072
1073	return drm_add_edid_modes(connector, edid);
1074}
1075
1076static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
1077{
1078	int i;
1079
1080	for (i = 0; i < hdata->phy_conf_count; i++)
1081		if (hdata->phy_confs[i].pixel_clock == pixel_clock)
1082			return i;
1083
1084	DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
1085	return -EINVAL;
1086}
1087
1088static int hdmi_mode_valid(struct drm_connector *connector,
1089			struct drm_display_mode *mode)
1090{
1091	struct hdmi_context *hdata = ctx_from_connector(connector);
1092	int ret;
1093
1094	DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d clock=%d\n",
1095		mode->hdisplay, mode->vdisplay, mode->vrefresh,
1096		(mode->flags & DRM_MODE_FLAG_INTERLACE) ? true :
1097		false, mode->clock * 1000);
1098
1099	ret = mixer_check_mode(mode);
1100	if (ret)
1101		return MODE_BAD;
1102
1103	ret = hdmi_find_phy_conf(hdata, mode->clock * 1000);
1104	if (ret < 0)
1105		return MODE_BAD;
1106
1107	return MODE_OK;
1108}
1109
1110static struct drm_encoder *hdmi_best_encoder(struct drm_connector *connector)
1111{
1112	struct hdmi_context *hdata = ctx_from_connector(connector);
1113
1114	return hdata->encoder;
1115}
1116
1117static struct drm_connector_helper_funcs hdmi_connector_helper_funcs = {
1118	.get_modes = hdmi_get_modes,
1119	.mode_valid = hdmi_mode_valid,
1120	.best_encoder = hdmi_best_encoder,
1121};
1122
1123static int hdmi_create_connector(struct exynos_drm_display *display,
1124			struct drm_encoder *encoder)
1125{
1126	struct hdmi_context *hdata = display->ctx;
1127	struct drm_connector *connector = &hdata->connector;
1128	int ret;
1129
1130	hdata->encoder = encoder;
1131	connector->interlace_allowed = true;
1132	connector->polled = DRM_CONNECTOR_POLL_HPD;
1133
1134	ret = drm_connector_init(hdata->drm_dev, connector,
1135			&hdmi_connector_funcs, DRM_MODE_CONNECTOR_HDMIA);
1136	if (ret) {
1137		DRM_ERROR("Failed to initialize connector with drm\n");
1138		return ret;
1139	}
1140
1141	drm_connector_helper_add(connector, &hdmi_connector_helper_funcs);
1142	drm_connector_register(connector);
1143	drm_mode_connector_attach_encoder(connector, encoder);
1144
1145	return 0;
1146}
1147
1148static void hdmi_mode_fixup(struct exynos_drm_display *display,
1149				struct drm_connector *connector,
1150				const struct drm_display_mode *mode,
1151				struct drm_display_mode *adjusted_mode)
1152{
1153	struct drm_display_mode *m;
1154	int mode_ok;
1155
1156	DRM_DEBUG_KMS("%s\n", __FILE__);
1157
1158	drm_mode_set_crtcinfo(adjusted_mode, 0);
1159
1160	mode_ok = hdmi_mode_valid(connector, adjusted_mode);
1161
1162	/* just return if user desired mode exists. */
1163	if (mode_ok == MODE_OK)
1164		return;
1165
1166	/*
1167	 * otherwise, find the most suitable mode among modes and change it
1168	 * to adjusted_mode.
1169	 */
1170	list_for_each_entry(m, &connector->modes, head) {
1171		mode_ok = hdmi_mode_valid(connector, m);
1172
1173		if (mode_ok == MODE_OK) {
1174			DRM_INFO("desired mode doesn't exist so\n");
1175			DRM_INFO("use the most suitable mode among modes.\n");
1176
1177			DRM_DEBUG_KMS("Adjusted Mode: [%d]x[%d] [%d]Hz\n",
1178				m->hdisplay, m->vdisplay, m->vrefresh);
1179
1180			drm_mode_copy(adjusted_mode, m);
1181			break;
1182		}
1183	}
1184}
1185
1186static void hdmi_set_acr(u32 freq, u8 *acr)
1187{
1188	u32 n, cts;
1189
1190	switch (freq) {
1191	case 32000:
1192		n = 4096;
1193		cts = 27000;
1194		break;
1195	case 44100:
1196		n = 6272;
1197		cts = 30000;
1198		break;
1199	case 88200:
1200		n = 12544;
1201		cts = 30000;
1202		break;
1203	case 176400:
1204		n = 25088;
1205		cts = 30000;
1206		break;
1207	case 48000:
1208		n = 6144;
1209		cts = 27000;
1210		break;
1211	case 96000:
1212		n = 12288;
1213		cts = 27000;
1214		break;
1215	case 192000:
1216		n = 24576;
1217		cts = 27000;
1218		break;
1219	default:
1220		n = 0;
1221		cts = 0;
1222		break;
1223	}
1224
1225	acr[1] = cts >> 16;
1226	acr[2] = cts >> 8 & 0xff;
1227	acr[3] = cts & 0xff;
1228
1229	acr[4] = n >> 16;
1230	acr[5] = n >> 8 & 0xff;
1231	acr[6] = n & 0xff;
1232}
1233
1234static void hdmi_reg_acr(struct hdmi_context *hdata, u8 *acr)
1235{
1236	hdmi_reg_writeb(hdata, HDMI_ACR_N0, acr[6]);
1237	hdmi_reg_writeb(hdata, HDMI_ACR_N1, acr[5]);
1238	hdmi_reg_writeb(hdata, HDMI_ACR_N2, acr[4]);
1239	hdmi_reg_writeb(hdata, HDMI_ACR_MCTS0, acr[3]);
1240	hdmi_reg_writeb(hdata, HDMI_ACR_MCTS1, acr[2]);
1241	hdmi_reg_writeb(hdata, HDMI_ACR_MCTS2, acr[1]);
1242	hdmi_reg_writeb(hdata, HDMI_ACR_CTS0, acr[3]);
1243	hdmi_reg_writeb(hdata, HDMI_ACR_CTS1, acr[2]);
1244	hdmi_reg_writeb(hdata, HDMI_ACR_CTS2, acr[1]);
1245
1246	if (hdata->type == HDMI_TYPE13)
1247		hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 4);
1248	else
1249		hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
1250}
1251
1252static void hdmi_audio_init(struct hdmi_context *hdata)
1253{
1254	u32 sample_rate, bits_per_sample;
1255	u32 data_num, bit_ch, sample_frq;
1256	u32 val;
1257	u8 acr[7];
1258
1259	sample_rate = 44100;
1260	bits_per_sample = 16;
1261
1262	switch (bits_per_sample) {
1263	case 20:
1264		data_num = 2;
1265		bit_ch  = 1;
1266		break;
1267	case 24:
1268		data_num = 3;
1269		bit_ch  = 1;
1270		break;
1271	default:
1272		data_num = 1;
1273		bit_ch  = 0;
1274		break;
1275	}
1276
1277	hdmi_set_acr(sample_rate, acr);
1278	hdmi_reg_acr(hdata, acr);
1279
1280	hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
1281				| HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
1282				| HDMI_I2S_MUX_ENABLE);
1283
1284	hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
1285			| HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
1286
1287	hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
1288
1289	sample_frq = (sample_rate == 44100) ? 0 :
1290			(sample_rate == 48000) ? 2 :
1291			(sample_rate == 32000) ? 3 :
1292			(sample_rate == 96000) ? 0xa : 0x0;
1293
1294	hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
1295	hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
1296
1297	val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
1298	hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
1299
1300	/* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
1301	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
1302			| HDMI_I2S_SEL_LRCK(6));
1303	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(1)
1304			| HDMI_I2S_SEL_SDATA2(4));
1305	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
1306			| HDMI_I2S_SEL_SDATA2(2));
1307	hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
1308
1309	/* I2S_CON_1 & 2 */
1310	hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
1311			| HDMI_I2S_L_CH_LOW_POL);
1312	hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
1313			| HDMI_I2S_SET_BIT_CH(bit_ch)
1314			| HDMI_I2S_SET_SDATA_BIT(data_num)
1315			| HDMI_I2S_BASIC_FORMAT);
1316
1317	/* Configure register related to CUV information */
1318	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0
1319			| HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH
1320			| HDMI_I2S_COPYRIGHT
1321			| HDMI_I2S_LINEAR_PCM
1322			| HDMI_I2S_CONSUMER_FORMAT);
1323	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER);
1324	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0));
1325	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2
1326			| HDMI_I2S_SET_SMP_FREQ(sample_frq));
1327	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4,
1328			HDMI_I2S_ORG_SMP_FREQ_44_1
1329			| HDMI_I2S_WORD_LEN_MAX24_24BITS
1330			| HDMI_I2S_WORD_LEN_MAX_24BITS);
1331
1332	hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
1333}
1334
1335static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
1336{
1337	if (hdata->dvi_mode)
1338		return;
1339
1340	hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
1341	hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ?
1342			HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
1343}
1344
1345static void hdmi_start(struct hdmi_context *hdata, bool start)
1346{
1347	u32 val = start ? HDMI_TG_EN : 0;
1348
1349	if (hdata->current_mode.flags & DRM_MODE_FLAG_INTERLACE)
1350		val |= HDMI_FIELD_EN;
1351
1352	hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN);
1353	hdmi_reg_writemask(hdata, HDMI_TG_CMD, val, HDMI_TG_EN | HDMI_FIELD_EN);
1354}
1355
1356static void hdmi_conf_init(struct hdmi_context *hdata)
1357{
1358	union hdmi_infoframe infoframe;
1359
1360	/* disable HPD interrupts from HDMI IP block, use GPIO instead */
1361	hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
1362		HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
1363
1364	/* choose HDMI mode */
1365	hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1366		HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
1367	/* Apply Video preable and Guard band in HDMI mode only */
1368	hdmi_reg_writeb(hdata, HDMI_CON_2, 0);
1369	/* disable bluescreen */
1370	hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
1371
1372	if (hdata->dvi_mode) {
1373		/* choose DVI mode */
1374		hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1375				HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1376		hdmi_reg_writeb(hdata, HDMI_CON_2,
1377				HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1378	}
1379
1380	if (hdata->type == HDMI_TYPE13) {
1381		/* choose bluescreen (fecal) color */
1382		hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
1383		hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
1384		hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1385
1386		/* enable AVI packet every vsync, fixes purple line problem */
1387		hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1388		/* force RGB, look to CEA-861-D, table 7 for more detail */
1389		hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1390		hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1391
1392		hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1393		hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1394		hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1395	} else {
1396		infoframe.any.type = HDMI_INFOFRAME_TYPE_AVI;
1397		infoframe.any.version = HDMI_AVI_VERSION;
1398		infoframe.any.length = HDMI_AVI_LENGTH;
1399		hdmi_reg_infoframe(hdata, &infoframe);
1400
1401		infoframe.any.type = HDMI_INFOFRAME_TYPE_AUDIO;
1402		infoframe.any.version = HDMI_AUI_VERSION;
1403		infoframe.any.length = HDMI_AUI_LENGTH;
1404		hdmi_reg_infoframe(hdata, &infoframe);
1405
1406		/* enable AVI packet every vsync, fixes purple line problem */
1407		hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1408	}
1409}
1410
1411static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
1412{
1413	const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg;
1414	const struct hdmi_v13_core_regs *core =
1415		&hdata->mode_conf.conf.v13_conf.core;
1416	int tries;
1417
1418	/* setting core registers */
1419	hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1420	hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1421	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_0, core->v_blank[0]);
1422	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_1, core->v_blank[1]);
1423	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_2, core->v_blank[2]);
1424	hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_0, core->h_v_line[0]);
1425	hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_1, core->h_v_line[1]);
1426	hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_2, core->h_v_line[2]);
1427	hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1428	hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1429	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_0, core->v_blank_f[0]);
1430	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_1, core->v_blank_f[1]);
1431	hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_2, core->v_blank_f[2]);
1432	hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_0, core->h_sync_gen[0]);
1433	hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_1, core->h_sync_gen[1]);
1434	hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_2, core->h_sync_gen[2]);
1435	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_0, core->v_sync_gen1[0]);
1436	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_1, core->v_sync_gen1[1]);
1437	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_2, core->v_sync_gen1[2]);
1438	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_0, core->v_sync_gen2[0]);
1439	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_1, core->v_sync_gen2[1]);
1440	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_2, core->v_sync_gen2[2]);
1441	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_0, core->v_sync_gen3[0]);
1442	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_1, core->v_sync_gen3[1]);
1443	hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_2, core->v_sync_gen3[2]);
1444	/* Timing generator registers */
1445	hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1446	hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1447	hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1448	hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1449	hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1450	hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1451	hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1452	hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1453	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1454	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1455	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1456	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1457	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1458	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1459	hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1460	hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1461	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1462	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1463	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1464	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1465	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1466	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1467	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1468	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1469	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1470	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1471	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1472	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1473
1474	/* waiting for HDMIPHY's PLL to get to steady state */
1475	for (tries = 100; tries; --tries) {
1476		u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
1477		if (val & HDMI_PHY_STATUS_READY)
1478			break;
1479		usleep_range(1000, 2000);
1480	}
1481	/* steady state not achieved */
1482	if (tries == 0) {
1483		DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1484		hdmi_regs_dump(hdata, "timing apply");
1485	}
1486
1487	clk_disable_unprepare(hdata->res.sclk_hdmi);
1488	clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_hdmiphy);
1489	clk_prepare_enable(hdata->res.sclk_hdmi);
1490
1491	/* enable HDMI and timing generator */
1492	hdmi_start(hdata, true);
1493}
1494
1495static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
1496{
1497	const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg;
1498	const struct hdmi_v14_core_regs *core =
1499		&hdata->mode_conf.conf.v14_conf.core;
1500	int tries;
1501
1502	/* setting core registers */
1503	hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1504	hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1505	hdmi_reg_writeb(hdata, HDMI_V2_BLANK_0, core->v2_blank[0]);
1506	hdmi_reg_writeb(hdata, HDMI_V2_BLANK_1, core->v2_blank[1]);
1507	hdmi_reg_writeb(hdata, HDMI_V1_BLANK_0, core->v1_blank[0]);
1508	hdmi_reg_writeb(hdata, HDMI_V1_BLANK_1, core->v1_blank[1]);
1509	hdmi_reg_writeb(hdata, HDMI_V_LINE_0, core->v_line[0]);
1510	hdmi_reg_writeb(hdata, HDMI_V_LINE_1, core->v_line[1]);
1511	hdmi_reg_writeb(hdata, HDMI_H_LINE_0, core->h_line[0]);
1512	hdmi_reg_writeb(hdata, HDMI_H_LINE_1, core->h_line[1]);
1513	hdmi_reg_writeb(hdata, HDMI_HSYNC_POL, core->hsync_pol[0]);
1514	hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1515	hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1516	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_0, core->v_blank_f0[0]);
1517	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_1, core->v_blank_f0[1]);
1518	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_0, core->v_blank_f1[0]);
1519	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_1, core->v_blank_f1[1]);
1520	hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_0, core->h_sync_start[0]);
1521	hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_1, core->h_sync_start[1]);
1522	hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_0, core->h_sync_end[0]);
1523	hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_1, core->h_sync_end[1]);
1524	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_0,
1525			core->v_sync_line_bef_2[0]);
1526	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_1,
1527			core->v_sync_line_bef_2[1]);
1528	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_0,
1529			core->v_sync_line_bef_1[0]);
1530	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_1,
1531			core->v_sync_line_bef_1[1]);
1532	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_0,
1533			core->v_sync_line_aft_2[0]);
1534	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_1,
1535			core->v_sync_line_aft_2[1]);
1536	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_0,
1537			core->v_sync_line_aft_1[0]);
1538	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_1,
1539			core->v_sync_line_aft_1[1]);
1540	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0,
1541			core->v_sync_line_aft_pxl_2[0]);
1542	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_1,
1543			core->v_sync_line_aft_pxl_2[1]);
1544	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0,
1545			core->v_sync_line_aft_pxl_1[0]);
1546	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_1,
1547			core->v_sync_line_aft_pxl_1[1]);
1548	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_0, core->v_blank_f2[0]);
1549	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_1, core->v_blank_f2[1]);
1550	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_0, core->v_blank_f3[0]);
1551	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_1, core->v_blank_f3[1]);
1552	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_0, core->v_blank_f4[0]);
1553	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_1, core->v_blank_f4[1]);
1554	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_0, core->v_blank_f5[0]);
1555	hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_1, core->v_blank_f5[1]);
1556	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_0,
1557			core->v_sync_line_aft_3[0]);
1558	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_1,
1559			core->v_sync_line_aft_3[1]);
1560	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_0,
1561			core->v_sync_line_aft_4[0]);
1562	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_1,
1563			core->v_sync_line_aft_4[1]);
1564	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_0,
1565			core->v_sync_line_aft_5[0]);
1566	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_1,
1567			core->v_sync_line_aft_5[1]);
1568	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_0,
1569			core->v_sync_line_aft_6[0]);
1570	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_1,
1571			core->v_sync_line_aft_6[1]);
1572	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0,
1573			core->v_sync_line_aft_pxl_3[0]);
1574	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_1,
1575			core->v_sync_line_aft_pxl_3[1]);
1576	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0,
1577			core->v_sync_line_aft_pxl_4[0]);
1578	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_1,
1579			core->v_sync_line_aft_pxl_4[1]);
1580	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0,
1581			core->v_sync_line_aft_pxl_5[0]);
1582	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_1,
1583			core->v_sync_line_aft_pxl_5[1]);
1584	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0,
1585			core->v_sync_line_aft_pxl_6[0]);
1586	hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_1,
1587			core->v_sync_line_aft_pxl_6[1]);
1588	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_0, core->vact_space_1[0]);
1589	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_1, core->vact_space_1[1]);
1590	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_0, core->vact_space_2[0]);
1591	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_1, core->vact_space_2[1]);
1592	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_0, core->vact_space_3[0]);
1593	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_1, core->vact_space_3[1]);
1594	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_0, core->vact_space_4[0]);
1595	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_1, core->vact_space_4[1]);
1596	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_0, core->vact_space_5[0]);
1597	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_1, core->vact_space_5[1]);
1598	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_0, core->vact_space_6[0]);
1599	hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_1, core->vact_space_6[1]);
1600
1601	/* Timing generator registers */
1602	hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1603	hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1604	hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1605	hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1606	hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1607	hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1608	hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1609	hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1610	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1611	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1612	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1613	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1614	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1615	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1616	hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1617	hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1618	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1619	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1620	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1621	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1622	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_L, tg->vact_st3[0]);
1623	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_H, tg->vact_st3[1]);
1624	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_L, tg->vact_st4[0]);
1625	hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_H, tg->vact_st4[1]);
1626	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1627	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1628	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1629	hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1630	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1631	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1632	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1633	hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1634	hdmi_reg_writeb(hdata, HDMI_TG_3D, tg->tg_3d[0]);
1635
1636	/* waiting for HDMIPHY's PLL to get to steady state */
1637	for (tries = 100; tries; --tries) {
1638		u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
1639		if (val & HDMI_PHY_STATUS_READY)
1640			break;
1641		usleep_range(1000, 2000);
1642	}
1643	/* steady state not achieved */
1644	if (tries == 0) {
1645		DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1646		hdmi_regs_dump(hdata, "timing apply");
1647	}
1648
1649	clk_disable_unprepare(hdata->res.sclk_hdmi);
1650	clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_hdmiphy);
1651	clk_prepare_enable(hdata->res.sclk_hdmi);
1652
1653	/* enable HDMI and timing generator */
1654	hdmi_start(hdata, true);
1655}
1656
1657static void hdmi_mode_apply(struct hdmi_context *hdata)
1658{
1659	if (hdata->type == HDMI_TYPE13)
1660		hdmi_v13_mode_apply(hdata);
1661	else
1662		hdmi_v14_mode_apply(hdata);
1663}
1664
1665static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1666{
1667	u8 buffer[2];
1668	u32 reg;
1669
1670	clk_disable_unprepare(hdata->res.sclk_hdmi);
1671	clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_pixel);
1672	clk_prepare_enable(hdata->res.sclk_hdmi);
1673
1674	/* operation mode */
1675	buffer[0] = 0x1f;
1676	buffer[1] = 0x00;
1677
1678	if (hdata->hdmiphy_port)
1679		i2c_master_send(hdata->hdmiphy_port, buffer, 2);
1680
1681	if (hdata->type == HDMI_TYPE13)
1682		reg = HDMI_V13_PHY_RSTOUT;
1683	else
1684		reg = HDMI_PHY_RSTOUT;
1685
1686	/* reset hdmiphy */
1687	hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
1688	usleep_range(10000, 12000);
1689	hdmi_reg_writemask(hdata, reg,  0, HDMI_PHY_SW_RSTOUT);
1690	usleep_range(10000, 12000);
1691}
1692
1693static void hdmiphy_poweron(struct hdmi_context *hdata)
1694{
1695	if (hdata->type != HDMI_TYPE14)
1696		return;
1697
1698	DRM_DEBUG_KMS("\n");
1699
1700	/* For PHY Mode Setting */
1701	hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1702				HDMI_PHY_ENABLE_MODE_SET);
1703	/* Phy Power On */
1704	hdmiphy_reg_writeb(hdata, HDMIPHY_POWER,
1705				HDMI_PHY_POWER_ON);
1706	/* For PHY Mode Setting */
1707	hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1708				HDMI_PHY_DISABLE_MODE_SET);
1709	/* PHY SW Reset */
1710	hdmiphy_conf_reset(hdata);
1711}
1712
1713static void hdmiphy_poweroff(struct hdmi_context *hdata)
1714{
1715	if (hdata->type != HDMI_TYPE14)
1716		return;
1717
1718	DRM_DEBUG_KMS("\n");
1719
1720	/* PHY SW Reset */
1721	hdmiphy_conf_reset(hdata);
1722	/* For PHY Mode Setting */
1723	hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1724				HDMI_PHY_ENABLE_MODE_SET);
1725
1726	/* PHY Power Off */
1727	hdmiphy_reg_writeb(hdata, HDMIPHY_POWER,
1728				HDMI_PHY_POWER_OFF);
1729
1730	/* For PHY Mode Setting */
1731	hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1732				HDMI_PHY_DISABLE_MODE_SET);
1733}
1734
1735static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1736{
1737	int ret;
1738	int i;
1739
1740	/* pixel clock */
1741	i = hdmi_find_phy_conf(hdata, hdata->mode_conf.pixel_clock);
1742	if (i < 0) {
1743		DRM_ERROR("failed to find hdmiphy conf\n");
1744		return;
1745	}
1746
1747	ret = hdmiphy_reg_write_buf(hdata, 0, hdata->phy_confs[i].conf, 32);
1748	if (ret) {
1749		DRM_ERROR("failed to configure hdmiphy\n");
1750		return;
1751	}
1752
1753	usleep_range(10000, 12000);
1754
1755	ret = hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1756				HDMI_PHY_DISABLE_MODE_SET);
1757	if (ret) {
1758		DRM_ERROR("failed to enable hdmiphy\n");
1759		return;
1760	}
1761
1762}
1763
1764static void hdmi_conf_apply(struct hdmi_context *hdata)
1765{
1766	hdmiphy_conf_reset(hdata);
1767	hdmiphy_conf_apply(hdata);
1768
1769	mutex_lock(&hdata->hdmi_mutex);
1770	hdmi_start(hdata, false);
1771	hdmi_conf_init(hdata);
1772	mutex_unlock(&hdata->hdmi_mutex);
1773
1774	hdmi_audio_init(hdata);
1775
1776	/* setting core registers */
1777	hdmi_mode_apply(hdata);
1778	hdmi_audio_control(hdata, true);
1779
1780	hdmi_regs_dump(hdata, "start");
1781}
1782
1783static void hdmi_set_reg(u8 *reg_pair, int num_bytes, u32 value)
1784{
1785	int i;
1786	BUG_ON(num_bytes > 4);
1787	for (i = 0; i < num_bytes; i++)
1788		reg_pair[i] = (value >> (8 * i)) & 0xff;
1789}
1790
1791static void hdmi_v13_mode_set(struct hdmi_context *hdata,
1792			struct drm_display_mode *m)
1793{
1794	struct hdmi_v13_core_regs *core = &hdata->mode_conf.conf.v13_conf.core;
1795	struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg;
1796	unsigned int val;
1797
1798	hdata->mode_conf.cea_video_id =
1799		drm_match_cea_mode((struct drm_display_mode *)m);
1800	hdata->mode_conf.pixel_clock = m->clock * 1000;
1801	hdata->mode_conf.aspect_ratio = m->picture_aspect_ratio;
1802
1803	hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1804	hdmi_set_reg(core->h_v_line, 3, (m->htotal << 12) | m->vtotal);
1805
1806	val = (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0;
1807	hdmi_set_reg(core->vsync_pol, 1, val);
1808
1809	val = (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0;
1810	hdmi_set_reg(core->int_pro_mode, 1, val);
1811
1812	val = (m->hsync_start - m->hdisplay - 2);
1813	val |= ((m->hsync_end - m->hdisplay - 2) << 10);
1814	val |= ((m->flags & DRM_MODE_FLAG_NHSYNC)  ? 1 : 0)<<20;
1815	hdmi_set_reg(core->h_sync_gen, 3, val);
1816
1817	/*
1818	 * Quirk requirement for exynos HDMI IP design,
1819	 * 2 pixels less than the actual calculation for hsync_start
1820	 * and end.
1821	 */
1822
1823	/* Following values & calculations differ for different type of modes */
1824	if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1825		/* Interlaced Mode */
1826		val = ((m->vsync_end - m->vdisplay) / 2);
1827		val |= ((m->vsync_start - m->vdisplay) / 2) << 12;
1828		hdmi_set_reg(core->v_sync_gen1, 3, val);
1829
1830		val = m->vtotal / 2;
1831		val |= ((m->vtotal - m->vdisplay) / 2) << 11;
1832		hdmi_set_reg(core->v_blank, 3, val);
1833
1834		val = (m->vtotal +
1835			((m->vsync_end - m->vsync_start) * 4) + 5) / 2;
1836		val |= m->vtotal << 11;
1837		hdmi_set_reg(core->v_blank_f, 3, val);
1838
1839		val = ((m->vtotal / 2) + 7);
1840		val |= ((m->vtotal / 2) + 2) << 12;
1841		hdmi_set_reg(core->v_sync_gen2, 3, val);
1842
1843		val = ((m->htotal / 2) + (m->hsync_start - m->hdisplay));
1844		val |= ((m->htotal / 2) +
1845			(m->hsync_start - m->hdisplay)) << 12;
1846		hdmi_set_reg(core->v_sync_gen3, 3, val);
1847
1848		hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1849		hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1850
1851		hdmi_set_reg(tg->vact_st2, 2, 0x249);/* Reset value + 1*/
1852	} else {
1853		/* Progressive Mode */
1854
1855		val = m->vtotal;
1856		val |= (m->vtotal - m->vdisplay) << 11;
1857		hdmi_set_reg(core->v_blank, 3, val);
1858
1859		hdmi_set_reg(core->v_blank_f, 3, 0);
1860
1861		val = (m->vsync_end - m->vdisplay);
1862		val |= ((m->vsync_start - m->vdisplay) << 12);
1863		hdmi_set_reg(core->v_sync_gen1, 3, val);
1864
1865		hdmi_set_reg(core->v_sync_gen2, 3, 0x1001);/* Reset value  */
1866		hdmi_set_reg(core->v_sync_gen3, 3, 0x1001);/* Reset value  */
1867		hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1868		hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1869		hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1870	}
1871
1872	/* Timing generator registers */
1873	hdmi_set_reg(tg->cmd, 1, 0x0);
1874	hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1875	hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1876	hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1877	hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1878	hdmi_set_reg(tg->vsync, 2, 0x1);
1879	hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1880	hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1881	hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1882	hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1883	hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1884	hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1885	hdmi_set_reg(tg->tg_3d, 1, 0x0); /* Not used */
1886}
1887
1888static void hdmi_v14_mode_set(struct hdmi_context *hdata,
1889			struct drm_display_mode *m)
1890{
1891	struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg;
1892	struct hdmi_v14_core_regs *core =
1893		&hdata->mode_conf.conf.v14_conf.core;
1894
1895	hdata->mode_conf.cea_video_id =
1896		drm_match_cea_mode((struct drm_display_mode *)m);
1897	hdata->mode_conf.pixel_clock = m->clock * 1000;
1898	hdata->mode_conf.aspect_ratio = m->picture_aspect_ratio;
1899
1900	hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1901	hdmi_set_reg(core->v_line, 2, m->vtotal);
1902	hdmi_set_reg(core->h_line, 2, m->htotal);
1903	hdmi_set_reg(core->hsync_pol, 1,
1904			(m->flags & DRM_MODE_FLAG_NHSYNC)  ? 1 : 0);
1905	hdmi_set_reg(core->vsync_pol, 1,
1906			(m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1907	hdmi_set_reg(core->int_pro_mode, 1,
1908			(m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1909
1910	/*
1911	 * Quirk requirement for exynos 5 HDMI IP design,
1912	 * 2 pixels less than the actual calculation for hsync_start
1913	 * and end.
1914	 */
1915
1916	/* Following values & calculations differ for different type of modes */
1917	if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1918		/* Interlaced Mode */
1919		hdmi_set_reg(core->v_sync_line_bef_2, 2,
1920			(m->vsync_end - m->vdisplay) / 2);
1921		hdmi_set_reg(core->v_sync_line_bef_1, 2,
1922			(m->vsync_start - m->vdisplay) / 2);
1923		hdmi_set_reg(core->v2_blank, 2, m->vtotal / 2);
1924		hdmi_set_reg(core->v1_blank, 2, (m->vtotal - m->vdisplay) / 2);
1925		hdmi_set_reg(core->v_blank_f0, 2, m->vtotal - m->vdisplay / 2);
1926		hdmi_set_reg(core->v_blank_f1, 2, m->vtotal);
1927		hdmi_set_reg(core->v_sync_line_aft_2, 2, (m->vtotal / 2) + 7);
1928		hdmi_set_reg(core->v_sync_line_aft_1, 2, (m->vtotal / 2) + 2);
1929		hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2,
1930			(m->htotal / 2) + (m->hsync_start - m->hdisplay));
1931		hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2,
1932			(m->htotal / 2) + (m->hsync_start - m->hdisplay));
1933		hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1934		hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1935		hdmi_set_reg(tg->vact_st2, 2, m->vtotal - m->vdisplay / 2);
1936		hdmi_set_reg(tg->vsync2, 2, (m->vtotal / 2) + 1);
1937		hdmi_set_reg(tg->vsync_bot_hdmi, 2, (m->vtotal / 2) + 1);
1938		hdmi_set_reg(tg->field_bot_hdmi, 2, (m->vtotal / 2) + 1);
1939		hdmi_set_reg(tg->vact_st3, 2, 0x0);
1940		hdmi_set_reg(tg->vact_st4, 2, 0x0);
1941	} else {
1942		/* Progressive Mode */
1943		hdmi_set_reg(core->v_sync_line_bef_2, 2,
1944			m->vsync_end - m->vdisplay);
1945		hdmi_set_reg(core->v_sync_line_bef_1, 2,
1946			m->vsync_start - m->vdisplay);
1947		hdmi_set_reg(core->v2_blank, 2, m->vtotal);
1948		hdmi_set_reg(core->v1_blank, 2, m->vtotal - m->vdisplay);
1949		hdmi_set_reg(core->v_blank_f0, 2, 0xffff);
1950		hdmi_set_reg(core->v_blank_f1, 2, 0xffff);
1951		hdmi_set_reg(core->v_sync_line_aft_2, 2, 0xffff);
1952		hdmi_set_reg(core->v_sync_line_aft_1, 2, 0xffff);
1953		hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2, 0xffff);
1954		hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2, 0xffff);
1955		hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1956		hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1957		hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1958		hdmi_set_reg(tg->vact_st3, 2, 0x47b); /* Reset value */
1959		hdmi_set_reg(tg->vact_st4, 2, 0x6ae); /* Reset value */
1960		hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1961		hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1962		hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1963	}
1964
1965	/* Following values & calculations are same irrespective of mode type */
1966	hdmi_set_reg(core->h_sync_start, 2, m->hsync_start - m->hdisplay - 2);
1967	hdmi_set_reg(core->h_sync_end, 2, m->hsync_end - m->hdisplay - 2);
1968	hdmi_set_reg(core->vact_space_1, 2, 0xffff);
1969	hdmi_set_reg(core->vact_space_2, 2, 0xffff);
1970	hdmi_set_reg(core->vact_space_3, 2, 0xffff);
1971	hdmi_set_reg(core->vact_space_4, 2, 0xffff);
1972	hdmi_set_reg(core->vact_space_5, 2, 0xffff);
1973	hdmi_set_reg(core->vact_space_6, 2, 0xffff);
1974	hdmi_set_reg(core->v_blank_f2, 2, 0xffff);
1975	hdmi_set_reg(core->v_blank_f3, 2, 0xffff);
1976	hdmi_set_reg(core->v_blank_f4, 2, 0xffff);
1977	hdmi_set_reg(core->v_blank_f5, 2, 0xffff);
1978	hdmi_set_reg(core->v_sync_line_aft_3, 2, 0xffff);
1979	hdmi_set_reg(core->v_sync_line_aft_4, 2, 0xffff);
1980	hdmi_set_reg(core->v_sync_line_aft_5, 2, 0xffff);
1981	hdmi_set_reg(core->v_sync_line_aft_6, 2, 0xffff);
1982	hdmi_set_reg(core->v_sync_line_aft_pxl_3, 2, 0xffff);
1983	hdmi_set_reg(core->v_sync_line_aft_pxl_4, 2, 0xffff);
1984	hdmi_set_reg(core->v_sync_line_aft_pxl_5, 2, 0xffff);
1985	hdmi_set_reg(core->v_sync_line_aft_pxl_6, 2, 0xffff);
1986
1987	/* Timing generator registers */
1988	hdmi_set_reg(tg->cmd, 1, 0x0);
1989	hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1990	hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1991	hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1992	hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1993	hdmi_set_reg(tg->vsync, 2, 0x1);
1994	hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1995	hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1996	hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1997	hdmi_set_reg(tg->tg_3d, 1, 0x0);
1998}
1999
2000static void hdmi_mode_set(struct exynos_drm_display *display,
2001			struct drm_display_mode *mode)
2002{
2003	struct hdmi_context *hdata = display->ctx;
2004	struct drm_display_mode *m = mode;
2005
2006	DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%s\n",
2007		m->hdisplay, m->vdisplay,
2008		m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ?
2009		"INTERLACED" : "PROGERESSIVE");
2010
2011	/* preserve mode information for later use. */
2012	drm_mode_copy(&hdata->current_mode, mode);
2013
2014	if (hdata->type == HDMI_TYPE13)
2015		hdmi_v13_mode_set(hdata, mode);
2016	else
2017		hdmi_v14_mode_set(hdata, mode);
2018}
2019
2020static void hdmi_commit(struct exynos_drm_display *display)
2021{
2022	struct hdmi_context *hdata = display->ctx;
2023
2024	mutex_lock(&hdata->hdmi_mutex);
2025	if (!hdata->powered) {
2026		mutex_unlock(&hdata->hdmi_mutex);
2027		return;
2028	}
2029	mutex_unlock(&hdata->hdmi_mutex);
2030
2031	hdmi_conf_apply(hdata);
2032}
2033
2034static void hdmi_poweron(struct exynos_drm_display *display)
2035{
2036	struct hdmi_context *hdata = display->ctx;
2037	struct hdmi_resources *res = &hdata->res;
2038
2039	mutex_lock(&hdata->hdmi_mutex);
2040	if (hdata->powered) {
2041		mutex_unlock(&hdata->hdmi_mutex);
2042		return;
2043	}
2044
2045	hdata->powered = true;
2046
2047	mutex_unlock(&hdata->hdmi_mutex);
2048
2049	pm_runtime_get_sync(hdata->dev);
2050
2051	if (regulator_bulk_enable(res->regul_count, res->regul_bulk))
2052		DRM_DEBUG_KMS("failed to enable regulator bulk\n");
2053
2054	/* set pmu hdmiphy control bit to enable hdmiphy */
2055	regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
2056			PMU_HDMI_PHY_ENABLE_BIT, 1);
2057
2058	clk_prepare_enable(res->hdmi);
2059	clk_prepare_enable(res->sclk_hdmi);
2060
2061	hdmiphy_poweron(hdata);
2062	hdmi_commit(display);
2063}
2064
2065static void hdmi_poweroff(struct exynos_drm_display *display)
2066{
2067	struct hdmi_context *hdata = display->ctx;
2068	struct hdmi_resources *res = &hdata->res;
2069
2070	mutex_lock(&hdata->hdmi_mutex);
2071	if (!hdata->powered)
2072		goto out;
2073	mutex_unlock(&hdata->hdmi_mutex);
2074
2075	/* HDMI System Disable */
2076	hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN);
2077
2078	hdmiphy_poweroff(hdata);
2079
2080	cancel_delayed_work(&hdata->hotplug_work);
2081
2082	clk_disable_unprepare(res->sclk_hdmi);
2083	clk_disable_unprepare(res->hdmi);
2084
2085	/* reset pmu hdmiphy control bit to disable hdmiphy */
2086	regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
2087			PMU_HDMI_PHY_ENABLE_BIT, 0);
2088
2089	regulator_bulk_disable(res->regul_count, res->regul_bulk);
2090
2091	pm_runtime_put_sync(hdata->dev);
2092
2093	mutex_lock(&hdata->hdmi_mutex);
2094	hdata->powered = false;
2095
2096out:
2097	mutex_unlock(&hdata->hdmi_mutex);
2098}
2099
2100static void hdmi_dpms(struct exynos_drm_display *display, int mode)
2101{
2102	struct hdmi_context *hdata = display->ctx;
2103	struct drm_encoder *encoder = hdata->encoder;
2104	struct drm_crtc *crtc = encoder->crtc;
2105	struct drm_crtc_helper_funcs *funcs = NULL;
2106
2107	DRM_DEBUG_KMS("mode %d\n", mode);
2108
2109	switch (mode) {
2110	case DRM_MODE_DPMS_ON:
2111		hdmi_poweron(display);
2112		break;
2113	case DRM_MODE_DPMS_STANDBY:
2114	case DRM_MODE_DPMS_SUSPEND:
2115	case DRM_MODE_DPMS_OFF:
2116		/*
2117		 * The SFRs of VP and Mixer are updated by Vertical Sync of
2118		 * Timing generator which is a part of HDMI so the sequence
2119		 * to disable TV Subsystem should be as following,
2120		 *	VP -> Mixer -> HDMI
2121		 *
2122		 * Below codes will try to disable Mixer and VP(if used)
2123		 * prior to disabling HDMI.
2124		 */
2125		if (crtc)
2126			funcs = crtc->helper_private;
2127		if (funcs && funcs->dpms)
2128			(*funcs->dpms)(crtc, mode);
2129
2130		hdmi_poweroff(display);
2131		break;
2132	default:
2133		DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
2134		break;
2135	}
2136}
2137
2138static struct exynos_drm_display_ops hdmi_display_ops = {
2139	.create_connector = hdmi_create_connector,
2140	.mode_fixup	= hdmi_mode_fixup,
2141	.mode_set	= hdmi_mode_set,
2142	.dpms		= hdmi_dpms,
2143	.commit		= hdmi_commit,
2144};
2145
2146static struct exynos_drm_display hdmi_display = {
2147	.type = EXYNOS_DISPLAY_TYPE_HDMI,
2148	.ops = &hdmi_display_ops,
2149};
2150
2151static void hdmi_hotplug_work_func(struct work_struct *work)
2152{
2153	struct hdmi_context *hdata;
2154
2155	hdata = container_of(work, struct hdmi_context, hotplug_work.work);
2156
2157	mutex_lock(&hdata->hdmi_mutex);
2158	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
2159	mutex_unlock(&hdata->hdmi_mutex);
2160
2161	if (hdata->drm_dev)
2162		drm_helper_hpd_irq_event(hdata->drm_dev);
2163}
2164
2165static irqreturn_t hdmi_irq_thread(int irq, void *arg)
2166{
2167	struct hdmi_context *hdata = arg;
2168
2169	mod_delayed_work(system_wq, &hdata->hotplug_work,
2170			msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS));
2171
2172	return IRQ_HANDLED;
2173}
2174
2175static int hdmi_resources_init(struct hdmi_context *hdata)
2176{
2177	struct device *dev = hdata->dev;
2178	struct hdmi_resources *res = &hdata->res;
2179	static char *supply[] = {
2180		"vdd",
2181		"vdd_osc",
2182		"vdd_pll",
2183	};
2184	int i, ret;
2185
2186	DRM_DEBUG_KMS("HDMI resource init\n");
2187
2188	/* get clocks, power */
2189	res->hdmi = devm_clk_get(dev, "hdmi");
2190	if (IS_ERR(res->hdmi)) {
2191		DRM_ERROR("failed to get clock 'hdmi'\n");
2192		ret = PTR_ERR(res->hdmi);
2193		goto fail;
2194	}
2195	res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi");
2196	if (IS_ERR(res->sclk_hdmi)) {
2197		DRM_ERROR("failed to get clock 'sclk_hdmi'\n");
2198		ret = PTR_ERR(res->sclk_hdmi);
2199		goto fail;
2200	}
2201	res->sclk_pixel = devm_clk_get(dev, "sclk_pixel");
2202	if (IS_ERR(res->sclk_pixel)) {
2203		DRM_ERROR("failed to get clock 'sclk_pixel'\n");
2204		ret = PTR_ERR(res->sclk_pixel);
2205		goto fail;
2206	}
2207	res->sclk_hdmiphy = devm_clk_get(dev, "sclk_hdmiphy");
2208	if (IS_ERR(res->sclk_hdmiphy)) {
2209		DRM_ERROR("failed to get clock 'sclk_hdmiphy'\n");
2210		ret = PTR_ERR(res->sclk_hdmiphy);
2211		goto fail;
2212	}
2213	res->mout_hdmi = devm_clk_get(dev, "mout_hdmi");
2214	if (IS_ERR(res->mout_hdmi)) {
2215		DRM_ERROR("failed to get clock 'mout_hdmi'\n");
2216		ret = PTR_ERR(res->mout_hdmi);
2217		goto fail;
2218	}
2219
2220	clk_set_parent(res->mout_hdmi, res->sclk_pixel);
2221
2222	res->regul_bulk = devm_kzalloc(dev, ARRAY_SIZE(supply) *
2223		sizeof(res->regul_bulk[0]), GFP_KERNEL);
2224	if (!res->regul_bulk) {
2225		ret = -ENOMEM;
2226		goto fail;
2227	}
2228	for (i = 0; i < ARRAY_SIZE(supply); ++i) {
2229		res->regul_bulk[i].supply = supply[i];
2230		res->regul_bulk[i].consumer = NULL;
2231	}
2232	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), res->regul_bulk);
2233	if (ret) {
2234		DRM_ERROR("failed to get regulators\n");
2235		return ret;
2236	}
2237	res->regul_count = ARRAY_SIZE(supply);
2238
2239	res->reg_hdmi_en = devm_regulator_get(dev, "hdmi-en");
2240	if (IS_ERR(res->reg_hdmi_en) && PTR_ERR(res->reg_hdmi_en) != -ENOENT) {
2241		DRM_ERROR("failed to get hdmi-en regulator\n");
2242		return PTR_ERR(res->reg_hdmi_en);
2243	}
2244	if (!IS_ERR(res->reg_hdmi_en)) {
2245		ret = regulator_enable(res->reg_hdmi_en);
2246		if (ret) {
2247			DRM_ERROR("failed to enable hdmi-en regulator\n");
2248			return ret;
2249		}
2250	} else
2251		res->reg_hdmi_en = NULL;
2252
2253	return ret;
2254fail:
2255	DRM_ERROR("HDMI resource init - failed\n");
2256	return ret;
2257}
2258
2259static struct s5p_hdmi_platform_data *drm_hdmi_dt_parse_pdata
2260					(struct device *dev)
2261{
2262	struct device_node *np = dev->of_node;
2263	struct s5p_hdmi_platform_data *pd;
2264	u32 value;
2265
2266	pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
2267	if (!pd)
2268		goto err_data;
2269
2270	if (!of_find_property(np, "hpd-gpio", &value)) {
2271		DRM_ERROR("no hpd gpio property found\n");
2272		goto err_data;
2273	}
2274
2275	pd->hpd_gpio = of_get_named_gpio(np, "hpd-gpio", 0);
2276
2277	return pd;
2278
2279err_data:
2280	return NULL;
2281}
2282
2283static struct of_device_id hdmi_match_types[] = {
2284	{
2285		.compatible = "samsung,exynos5-hdmi",
2286		.data = &exynos5_hdmi_driver_data,
2287	}, {
2288		.compatible = "samsung,exynos4210-hdmi",
2289		.data = &exynos4210_hdmi_driver_data,
2290	}, {
2291		.compatible = "samsung,exynos4212-hdmi",
2292		.data = &exynos4212_hdmi_driver_data,
2293	}, {
2294		.compatible = "samsung,exynos5420-hdmi",
2295		.data = &exynos5420_hdmi_driver_data,
2296	}, {
2297		/* end node */
2298	}
2299};
2300MODULE_DEVICE_TABLE (of, hdmi_match_types);
2301
2302static int hdmi_bind(struct device *dev, struct device *master, void *data)
2303{
2304	struct drm_device *drm_dev = data;
2305	struct hdmi_context *hdata;
2306
2307	hdata = hdmi_display.ctx;
2308	hdata->drm_dev = drm_dev;
2309
2310	return exynos_drm_create_enc_conn(drm_dev, &hdmi_display);
2311}
2312
2313static void hdmi_unbind(struct device *dev, struct device *master, void *data)
2314{
2315}
2316
2317static const struct component_ops hdmi_component_ops = {
2318	.bind	= hdmi_bind,
2319	.unbind = hdmi_unbind,
2320};
2321
2322static struct device_node *hdmi_legacy_ddc_dt_binding(struct device *dev)
2323{
2324	const char *compatible_str = "samsung,exynos4210-hdmiddc";
2325	struct device_node *np;
2326
2327	np = of_find_compatible_node(NULL, NULL, compatible_str);
2328	if (np)
2329		return of_get_next_parent(np);
2330
2331	return NULL;
2332}
2333
2334static struct device_node *hdmi_legacy_phy_dt_binding(struct device *dev)
2335{
2336	const char *compatible_str = "samsung,exynos4212-hdmiphy";
2337
2338	return of_find_compatible_node(NULL, NULL, compatible_str);
2339}
2340
2341static int hdmi_probe(struct platform_device *pdev)
2342{
2343	struct device_node *ddc_node, *phy_node;
2344	struct s5p_hdmi_platform_data *pdata;
2345	struct hdmi_driver_data *drv_data;
2346	const struct of_device_id *match;
2347	struct device *dev = &pdev->dev;
2348	struct hdmi_context *hdata;
2349	struct resource *res;
2350	int ret;
2351
2352	ret = exynos_drm_component_add(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR,
2353					hdmi_display.type);
2354	if (ret)
2355		return ret;
2356
2357	if (!dev->of_node) {
2358		ret = -ENODEV;
2359		goto err_del_component;
2360	}
2361
2362	pdata = drm_hdmi_dt_parse_pdata(dev);
2363	if (!pdata) {
2364		ret = -EINVAL;
2365		goto err_del_component;
2366	}
2367
2368	hdata = devm_kzalloc(dev, sizeof(struct hdmi_context), GFP_KERNEL);
2369	if (!hdata) {
2370		ret = -ENOMEM;
2371		goto err_del_component;
2372	}
2373
2374	mutex_init(&hdata->hdmi_mutex);
2375
2376	platform_set_drvdata(pdev, &hdmi_display);
2377
2378	match = of_match_node(hdmi_match_types, dev->of_node);
2379	if (!match) {
2380		ret = -ENODEV;
2381		goto err_del_component;
2382	}
2383
2384	drv_data = (struct hdmi_driver_data *)match->data;
2385	hdata->type = drv_data->type;
2386	hdata->phy_confs = drv_data->phy_confs;
2387	hdata->phy_conf_count = drv_data->phy_conf_count;
2388
2389	hdata->hpd_gpio = pdata->hpd_gpio;
2390	hdata->dev = dev;
2391
2392	ret = hdmi_resources_init(hdata);
2393	if (ret) {
2394		DRM_ERROR("hdmi_resources_init failed\n");
2395		return ret;
2396	}
2397
2398	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2399	hdata->regs = devm_ioremap_resource(dev, res);
2400	if (IS_ERR(hdata->regs)) {
2401		ret = PTR_ERR(hdata->regs);
2402		goto err_del_component;
2403	}
2404
2405	ret = devm_gpio_request(dev, hdata->hpd_gpio, "HPD");
2406	if (ret) {
2407		DRM_ERROR("failed to request HPD gpio\n");
2408		goto err_del_component;
2409	}
2410
2411	ddc_node = hdmi_legacy_ddc_dt_binding(dev);
2412	if (ddc_node)
2413		goto out_get_ddc_adpt;
2414
2415	/* DDC i2c driver */
2416	ddc_node = of_parse_phandle(dev->of_node, "ddc", 0);
2417	if (!ddc_node) {
2418		DRM_ERROR("Failed to find ddc node in device tree\n");
2419		ret = -ENODEV;
2420		goto err_del_component;
2421	}
2422
2423out_get_ddc_adpt:
2424	hdata->ddc_adpt = of_find_i2c_adapter_by_node(ddc_node);
2425	if (!hdata->ddc_adpt) {
2426		DRM_ERROR("Failed to get ddc i2c adapter by node\n");
2427		return -EPROBE_DEFER;
2428	}
2429
2430	phy_node = hdmi_legacy_phy_dt_binding(dev);
2431	if (phy_node)
2432		goto out_get_phy_port;
2433
2434	/* hdmiphy i2c driver */
2435	phy_node = of_parse_phandle(dev->of_node, "phy", 0);
2436	if (!phy_node) {
2437		DRM_ERROR("Failed to find hdmiphy node in device tree\n");
2438		ret = -ENODEV;
2439		goto err_ddc;
2440	}
2441
2442out_get_phy_port:
2443	if (drv_data->is_apb_phy) {
2444		hdata->regs_hdmiphy = of_iomap(phy_node, 0);
2445		if (!hdata->regs_hdmiphy) {
2446			DRM_ERROR("failed to ioremap hdmi phy\n");
2447			ret = -ENOMEM;
2448			goto err_ddc;
2449		}
2450	} else {
2451		hdata->hdmiphy_port = of_find_i2c_device_by_node(phy_node);
2452		if (!hdata->hdmiphy_port) {
2453			DRM_ERROR("Failed to get hdmi phy i2c client\n");
2454			ret = -EPROBE_DEFER;
2455			goto err_ddc;
2456		}
2457	}
2458
2459	hdata->irq = gpio_to_irq(hdata->hpd_gpio);
2460	if (hdata->irq < 0) {
2461		DRM_ERROR("failed to get GPIO irq\n");
2462		ret = hdata->irq;
2463		goto err_hdmiphy;
2464	}
2465
2466	hdata->hpd = gpio_get_value(hdata->hpd_gpio);
2467
2468	INIT_DELAYED_WORK(&hdata->hotplug_work, hdmi_hotplug_work_func);
2469
2470	ret = devm_request_threaded_irq(dev, hdata->irq, NULL,
2471			hdmi_irq_thread, IRQF_TRIGGER_RISING |
2472			IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
2473			"hdmi", hdata);
2474	if (ret) {
2475		DRM_ERROR("failed to register hdmi interrupt\n");
2476		goto err_hdmiphy;
2477	}
2478
2479	hdata->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node,
2480			"samsung,syscon-phandle");
2481	if (IS_ERR(hdata->pmureg)) {
2482		DRM_ERROR("syscon regmap lookup failed.\n");
2483		ret = -EPROBE_DEFER;
2484		goto err_hdmiphy;
2485	}
2486
2487	pm_runtime_enable(dev);
2488	hdmi_display.ctx = hdata;
2489
2490	ret = component_add(&pdev->dev, &hdmi_component_ops);
2491	if (ret)
2492		goto err_disable_pm_runtime;
2493
2494	return ret;
2495
2496err_disable_pm_runtime:
2497	pm_runtime_disable(dev);
2498
2499err_hdmiphy:
2500	if (hdata->hdmiphy_port)
2501		put_device(&hdata->hdmiphy_port->dev);
2502err_ddc:
2503	put_device(&hdata->ddc_adpt->dev);
2504
2505err_del_component:
2506	exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR);
2507
2508	return ret;
2509}
2510
2511static int hdmi_remove(struct platform_device *pdev)
2512{
2513	struct hdmi_context *hdata = hdmi_display.ctx;
2514
2515	cancel_delayed_work_sync(&hdata->hotplug_work);
2516
2517	if (hdata->res.reg_hdmi_en)
2518		regulator_disable(hdata->res.reg_hdmi_en);
2519
2520	if (hdata->hdmiphy_port)
2521		put_device(&hdata->hdmiphy_port->dev);
2522	put_device(&hdata->ddc_adpt->dev);
2523
2524	pm_runtime_disable(&pdev->dev);
2525	component_del(&pdev->dev, &hdmi_component_ops);
2526
2527	exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR);
2528	return 0;
2529}
2530
2531struct platform_driver hdmi_driver = {
2532	.probe		= hdmi_probe,
2533	.remove		= hdmi_remove,
2534	.driver		= {
2535		.name	= "exynos-hdmi",
2536		.owner	= THIS_MODULE,
2537		.of_match_table = hdmi_match_types,
2538	},
2539};
2540