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