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