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