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