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