Merge tag 'pci-v5.8-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
[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, mode->vrefresh,
925                           (mode->flags & DRM_MODE_FLAG_INTERLACE) ? true :
926                           false, mode->clock * 1000);
927
928         ret = hdmi_find_phy_conf(hdata, mode->clock * 1000);
929         if (ret < 0)
930                 return MODE_BAD;
931
932         return MODE_OK;
933 }
934
935 static const struct drm_connector_helper_funcs hdmi_connector_helper_funcs = {
936         .get_modes = hdmi_get_modes,
937         .mode_valid = hdmi_mode_valid,
938 };
939
940 static int hdmi_create_connector(struct drm_encoder *encoder)
941 {
942         struct hdmi_context *hdata = encoder_to_hdmi(encoder);
943         struct drm_connector *connector = &hdata->connector;
944         struct cec_connector_info conn_info;
945         int ret;
946
947         connector->interlace_allowed = true;
948         connector->polled = DRM_CONNECTOR_POLL_HPD;
949
950         ret = drm_connector_init_with_ddc(hdata->drm_dev, connector,
951                                           &hdmi_connector_funcs,
952                                           DRM_MODE_CONNECTOR_HDMIA,
953                                           hdata->ddc_adpt);
954         if (ret) {
955                 DRM_DEV_ERROR(hdata->dev,
956                               "Failed to initialize connector with drm\n");
957                 return ret;
958         }
959
960         drm_connector_helper_add(connector, &hdmi_connector_helper_funcs);
961         drm_connector_attach_encoder(connector, encoder);
962
963         if (hdata->bridge) {
964                 ret = drm_bridge_attach(encoder, hdata->bridge, NULL, 0);
965                 if (ret)
966                         DRM_DEV_ERROR(hdata->dev, "Failed to attach bridge\n");
967         }
968
969         cec_fill_conn_info_from_drm(&conn_info, connector);
970
971         hdata->notifier = cec_notifier_conn_register(hdata->dev, NULL,
972                                                      &conn_info);
973         if (!hdata->notifier) {
974                 ret = -ENOMEM;
975                 DRM_DEV_ERROR(hdata->dev, "Failed to allocate CEC notifier\n");
976         }
977
978         return ret;
979 }
980
981 static bool hdmi_mode_fixup(struct drm_encoder *encoder,
982                             const struct drm_display_mode *mode,
983                             struct drm_display_mode *adjusted_mode)
984 {
985         struct drm_device *dev = encoder->dev;
986         struct drm_connector *connector;
987         struct drm_display_mode *m;
988         struct drm_connector_list_iter conn_iter;
989         int mode_ok;
990
991         drm_mode_set_crtcinfo(adjusted_mode, 0);
992
993         drm_connector_list_iter_begin(dev, &conn_iter);
994         drm_for_each_connector_iter(connector, &conn_iter) {
995                 if (connector->encoder == encoder)
996                         break;
997         }
998         if (connector)
999                 drm_connector_get(connector);
1000         drm_connector_list_iter_end(&conn_iter);
1001
1002         if (!connector)
1003                 return true;
1004
1005         mode_ok = hdmi_mode_valid(connector, adjusted_mode);
1006
1007         if (mode_ok == MODE_OK)
1008                 goto cleanup;
1009
1010         /*
1011          * Find the most suitable mode and copy it to adjusted_mode.
1012          */
1013         list_for_each_entry(m, &connector->modes, head) {
1014                 mode_ok = hdmi_mode_valid(connector, m);
1015
1016                 if (mode_ok == MODE_OK) {
1017                         DRM_INFO("desired mode doesn't exist so\n");
1018                         DRM_INFO("use the most suitable mode among modes.\n");
1019
1020                         DRM_DEV_DEBUG_KMS(dev->dev,
1021                                           "Adjusted Mode: [%d]x[%d] [%d]Hz\n",
1022                                           m->hdisplay, m->vdisplay,
1023                                           m->vrefresh);
1024
1025                         drm_mode_copy(adjusted_mode, m);
1026                         break;
1027                 }
1028         }
1029
1030 cleanup:
1031         drm_connector_put(connector);
1032
1033         return true;
1034 }
1035
1036 static void hdmi_reg_acr(struct hdmi_context *hdata, u32 freq)
1037 {
1038         u32 n, cts;
1039
1040         cts = (freq % 9) ? 27000 : 30000;
1041         n = 128 * freq / (27000000 / cts);
1042
1043         hdmi_reg_writev(hdata, HDMI_ACR_N0, 3, n);
1044         hdmi_reg_writev(hdata, HDMI_ACR_MCTS0, 3, cts);
1045         hdmi_reg_writev(hdata, HDMI_ACR_CTS0, 3, cts);
1046         hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
1047 }
1048
1049 static void hdmi_audio_config(struct hdmi_context *hdata)
1050 {
1051         u32 bit_ch = 1;
1052         u32 data_num, val;
1053         int i;
1054
1055         switch (hdata->audio.params.sample_width) {
1056         case 20:
1057                 data_num = 2;
1058                 break;
1059         case 24:
1060                 data_num = 3;
1061                 break;
1062         default:
1063                 data_num = 1;
1064                 bit_ch = 0;
1065                 break;
1066         }
1067
1068         hdmi_reg_acr(hdata, hdata->audio.params.sample_rate);
1069
1070         hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
1071                                 | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
1072                                 | HDMI_I2S_MUX_ENABLE);
1073
1074         hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
1075                         | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
1076
1077         hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
1078         hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
1079         hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
1080
1081         val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
1082         hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
1083
1084         /* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
1085         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
1086                         | HDMI_I2S_SEL_LRCK(6));
1087
1088         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(3)
1089                         | HDMI_I2S_SEL_SDATA0(4));
1090
1091         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
1092                         | HDMI_I2S_SEL_SDATA2(2));
1093
1094         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
1095
1096         /* I2S_CON_1 & 2 */
1097         hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
1098                         | HDMI_I2S_L_CH_LOW_POL);
1099         hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
1100                         | HDMI_I2S_SET_BIT_CH(bit_ch)
1101                         | HDMI_I2S_SET_SDATA_BIT(data_num)
1102                         | HDMI_I2S_BASIC_FORMAT);
1103
1104         /* Configuration of the audio channel status registers */
1105         for (i = 0; i < HDMI_I2S_CH_ST_MAXNUM; i++)
1106                 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST(i),
1107                                 hdata->audio.params.iec.status[i]);
1108
1109         hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
1110 }
1111
1112 static void hdmi_audio_control(struct hdmi_context *hdata)
1113 {
1114         bool enable = !hdata->audio.mute;
1115
1116         if (hdata->dvi_mode)
1117                 return;
1118
1119         hdmi_reg_writeb(hdata, HDMI_AUI_CON, enable ?
1120                         HDMI_AVI_CON_EVERY_VSYNC : HDMI_AUI_CON_NO_TRAN);
1121         hdmi_reg_writemask(hdata, HDMI_CON_0, enable ?
1122                         HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
1123 }
1124
1125 static void hdmi_start(struct hdmi_context *hdata, bool start)
1126 {
1127         struct drm_display_mode *m = &hdata->encoder.crtc->state->mode;
1128         u32 val = start ? HDMI_TG_EN : 0;
1129
1130         if (m->flags & DRM_MODE_FLAG_INTERLACE)
1131                 val |= HDMI_FIELD_EN;
1132
1133         hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN);
1134         hdmi_reg_writemask(hdata, HDMI_TG_CMD, val, HDMI_TG_EN | HDMI_FIELD_EN);
1135 }
1136
1137 static void hdmi_conf_init(struct hdmi_context *hdata)
1138 {
1139         /* disable HPD interrupts from HDMI IP block, use GPIO instead */
1140         hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
1141                 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
1142
1143         /* choose HDMI mode */
1144         hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1145                 HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
1146         /* apply video pre-amble and guard band in HDMI mode only */
1147         hdmi_reg_writeb(hdata, HDMI_CON_2, 0);
1148         /* disable bluescreen */
1149         hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
1150
1151         if (hdata->dvi_mode) {
1152                 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1153                                 HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1154                 hdmi_reg_writeb(hdata, HDMI_CON_2,
1155                                 HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1156         }
1157
1158         if (hdata->drv_data->type == HDMI_TYPE13) {
1159                 /* choose bluescreen (fecal) color */
1160                 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
1161                 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
1162                 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1163
1164                 /* enable AVI packet every vsync, fixes purple line problem */
1165                 hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1166                 /* force RGB, look to CEA-861-D, table 7 for more detail */
1167                 hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1168                 hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1169
1170                 hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1171                 hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1172                 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1173         } else {
1174                 hdmi_reg_infoframes(hdata);
1175
1176                 /* enable AVI packet every vsync, fixes purple line problem */
1177                 hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1178         }
1179 }
1180
1181 static void hdmiphy_wait_for_pll(struct hdmi_context *hdata)
1182 {
1183         int tries;
1184
1185         for (tries = 0; tries < 10; ++tries) {
1186                 u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS);
1187
1188                 if (val & HDMI_PHY_STATUS_READY) {
1189                         DRM_DEV_DEBUG_KMS(hdata->dev,
1190                                           "PLL stabilized after %d tries\n",
1191                                           tries);
1192                         return;
1193                 }
1194                 usleep_range(10, 20);
1195         }
1196
1197         DRM_DEV_ERROR(hdata->dev, "PLL could not reach steady state\n");
1198 }
1199
1200 static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
1201 {
1202         struct drm_display_mode *m = &hdata->encoder.crtc->state->mode;
1203         unsigned int val;
1204
1205         hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay);
1206         hdmi_reg_writev(hdata, HDMI_V13_H_V_LINE_0, 3,
1207                         (m->htotal << 12) | m->vtotal);
1208
1209         val = (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0;
1210         hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1, val);
1211
1212         val = (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0;
1213         hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1, val);
1214
1215         val = (m->hsync_start - m->hdisplay - 2);
1216         val |= ((m->hsync_end - m->hdisplay - 2) << 10);
1217         val |= ((m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0)<<20;
1218         hdmi_reg_writev(hdata, HDMI_V13_H_SYNC_GEN_0, 3, val);
1219
1220         /*
1221          * Quirk requirement for exynos HDMI IP design,
1222          * 2 pixels less than the actual calculation for hsync_start
1223          * and end.
1224          */
1225
1226         /* Following values & calculations differ for different type of modes */
1227         if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1228                 val = ((m->vsync_end - m->vdisplay) / 2);
1229                 val |= ((m->vsync_start - m->vdisplay) / 2) << 12;
1230                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val);
1231
1232                 val = m->vtotal / 2;
1233                 val |= ((m->vtotal - m->vdisplay) / 2) << 11;
1234                 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val);
1235
1236                 val = (m->vtotal +
1237                         ((m->vsync_end - m->vsync_start) * 4) + 5) / 2;
1238                 val |= m->vtotal << 11;
1239                 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_F_0, 3, val);
1240
1241                 val = ((m->vtotal / 2) + 7);
1242                 val |= ((m->vtotal / 2) + 2) << 12;
1243                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_2_0, 3, val);
1244
1245                 val = ((m->htotal / 2) + (m->hsync_start - m->hdisplay));
1246                 val |= ((m->htotal / 2) +
1247                         (m->hsync_start - m->hdisplay)) << 12;
1248                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_3_0, 3, val);
1249
1250                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1251                                 (m->vtotal - m->vdisplay) / 2);
1252                 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay / 2);
1253
1254                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2, 0x249);
1255         } else {
1256                 val = m->vtotal;
1257                 val |= (m->vtotal - m->vdisplay) << 11;
1258                 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val);
1259
1260                 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_F_0, 3, 0);
1261
1262                 val = (m->vsync_end - m->vdisplay);
1263                 val |= ((m->vsync_start - m->vdisplay) << 12);
1264                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val);
1265
1266                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_2_0, 3, 0x1001);
1267                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_3_0, 3, 0x1001);
1268                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1269                                 m->vtotal - m->vdisplay);
1270                 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay);
1271         }
1272
1273         hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal);
1274         hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay);
1275         hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay);
1276         hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal);
1277 }
1278
1279 static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
1280 {
1281         struct drm_display_mode *m = &hdata->encoder.crtc->state->mode;
1282         struct drm_display_mode *am =
1283                                 &hdata->encoder.crtc->state->adjusted_mode;
1284         int hquirk = 0;
1285
1286         /*
1287          * In case video mode coming from CRTC differs from requested one HDMI
1288          * sometimes is able to almost properly perform conversion - only
1289          * first line is distorted.
1290          */
1291         if ((m->vdisplay != am->vdisplay) &&
1292             (m->hdisplay == 1280 || m->hdisplay == 1024 || m->hdisplay == 1366))
1293                 hquirk = 258;
1294
1295         hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay);
1296         hdmi_reg_writev(hdata, HDMI_V_LINE_0, 2, m->vtotal);
1297         hdmi_reg_writev(hdata, HDMI_H_LINE_0, 2, m->htotal);
1298         hdmi_reg_writev(hdata, HDMI_HSYNC_POL, 1,
1299                         (m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0);
1300         hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1,
1301                         (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1302         hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1,
1303                         (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1304
1305         /*
1306          * Quirk requirement for exynos 5 HDMI IP design,
1307          * 2 pixels less than the actual calculation for hsync_start
1308          * and end.
1309          */
1310
1311         /* Following values & calculations differ for different type of modes */
1312         if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1313                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2,
1314                         (m->vsync_end - m->vdisplay) / 2);
1315                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2,
1316                         (m->vsync_start - m->vdisplay) / 2);
1317                 hdmi_reg_writev(hdata, HDMI_V2_BLANK_0, 2, m->vtotal / 2);
1318                 hdmi_reg_writev(hdata, HDMI_V1_BLANK_0, 2,
1319                                 (m->vtotal - m->vdisplay) / 2);
1320                 hdmi_reg_writev(hdata, HDMI_V_BLANK_F0_0, 2,
1321                                 m->vtotal - m->vdisplay / 2);
1322                 hdmi_reg_writev(hdata, HDMI_V_BLANK_F1_0, 2, m->vtotal);
1323                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_2_0, 2,
1324                                 (m->vtotal / 2) + 7);
1325                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_1_0, 2,
1326                                 (m->vtotal / 2) + 2);
1327                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0, 2,
1328                         (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1329                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0, 2,
1330                         (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1331                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1332                                 (m->vtotal - m->vdisplay) / 2);
1333                 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay / 2);
1334                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2,
1335                                 m->vtotal - m->vdisplay / 2);
1336                 hdmi_reg_writev(hdata, HDMI_TG_VSYNC2_L, 2,
1337                                 (m->vtotal / 2) + 1);
1338                 hdmi_reg_writev(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, 2,
1339                                 (m->vtotal / 2) + 1);
1340                 hdmi_reg_writev(hdata, HDMI_TG_FIELD_BOT_HDMI_L, 2,
1341                                 (m->vtotal / 2) + 1);
1342                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST3_L, 2, 0x0);
1343                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST4_L, 2, 0x0);
1344         } else {
1345                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2,
1346                         m->vsync_end - m->vdisplay);
1347                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2,
1348                         m->vsync_start - m->vdisplay);
1349                 hdmi_reg_writev(hdata, HDMI_V2_BLANK_0, 2, m->vtotal);
1350                 hdmi_reg_writev(hdata, HDMI_V1_BLANK_0, 2,
1351                                 m->vtotal - m->vdisplay);
1352                 hdmi_reg_writev(hdata, HDMI_V_BLANK_F0_0, 2, 0xffff);
1353                 hdmi_reg_writev(hdata, HDMI_V_BLANK_F1_0, 2, 0xffff);
1354                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_2_0, 2, 0xffff);
1355                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_1_0, 2, 0xffff);
1356                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0, 2, 0xffff);
1357                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0, 2, 0xffff);
1358                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1359                                 m->vtotal - m->vdisplay);
1360                 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay);
1361         }
1362
1363         hdmi_reg_writev(hdata, HDMI_H_SYNC_START_0, 2,
1364                         m->hsync_start - m->hdisplay - 2);
1365         hdmi_reg_writev(hdata, HDMI_H_SYNC_END_0, 2,
1366                         m->hsync_end - m->hdisplay - 2);
1367         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_1_0, 2, 0xffff);
1368         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_2_0, 2, 0xffff);
1369         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_3_0, 2, 0xffff);
1370         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_4_0, 2, 0xffff);
1371         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_5_0, 2, 0xffff);
1372         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_6_0, 2, 0xffff);
1373         hdmi_reg_writev(hdata, HDMI_V_BLANK_F2_0, 2, 0xffff);
1374         hdmi_reg_writev(hdata, HDMI_V_BLANK_F3_0, 2, 0xffff);
1375         hdmi_reg_writev(hdata, HDMI_V_BLANK_F4_0, 2, 0xffff);
1376         hdmi_reg_writev(hdata, HDMI_V_BLANK_F5_0, 2, 0xffff);
1377         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_3_0, 2, 0xffff);
1378         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_4_0, 2, 0xffff);
1379         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_5_0, 2, 0xffff);
1380         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_6_0, 2, 0xffff);
1381         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0, 2, 0xffff);
1382         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0, 2, 0xffff);
1383         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0, 2, 0xffff);
1384         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0, 2, 0xffff);
1385
1386         hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal);
1387         hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2,
1388                                         m->htotal - m->hdisplay - hquirk);
1389         hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay + hquirk);
1390         hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal);
1391         if (hdata->drv_data == &exynos5433_hdmi_driver_data)
1392                 hdmi_reg_writeb(hdata, HDMI_TG_DECON_EN, 1);
1393 }
1394
1395 static void hdmi_mode_apply(struct hdmi_context *hdata)
1396 {
1397         if (hdata->drv_data->type == HDMI_TYPE13)
1398                 hdmi_v13_mode_apply(hdata);
1399         else
1400                 hdmi_v14_mode_apply(hdata);
1401
1402         hdmi_start(hdata, true);
1403 }
1404
1405 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1406 {
1407         hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, 0, 1);
1408         usleep_range(10000, 12000);
1409         hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, ~0, 1);
1410         usleep_range(10000, 12000);
1411         hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, ~0, HDMI_PHY_SW_RSTOUT);
1412         usleep_range(10000, 12000);
1413         hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, 0, HDMI_PHY_SW_RSTOUT);
1414         usleep_range(10000, 12000);
1415 }
1416
1417 static void hdmiphy_enable_mode_set(struct hdmi_context *hdata, bool enable)
1418 {
1419         u8 v = enable ? HDMI_PHY_ENABLE_MODE_SET : HDMI_PHY_DISABLE_MODE_SET;
1420
1421         if (hdata->drv_data == &exynos5433_hdmi_driver_data)
1422                 writel(v, hdata->regs_hdmiphy + HDMIPHY5433_MODE_SET_DONE);
1423 }
1424
1425 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1426 {
1427         struct drm_display_mode *m = &hdata->encoder.crtc->state->mode;
1428         int ret;
1429         const u8 *phy_conf;
1430
1431         ret = hdmi_find_phy_conf(hdata, m->clock * 1000);
1432         if (ret < 0) {
1433                 DRM_DEV_ERROR(hdata->dev, "failed to find hdmiphy conf\n");
1434                 return;
1435         }
1436         phy_conf = hdata->drv_data->phy_confs.data[ret].conf;
1437
1438         hdmi_clk_set_parents(hdata, false);
1439
1440         hdmiphy_conf_reset(hdata);
1441
1442         hdmiphy_enable_mode_set(hdata, true);
1443         ret = hdmiphy_reg_write_buf(hdata, 0, phy_conf, 32);
1444         if (ret) {
1445                 DRM_DEV_ERROR(hdata->dev, "failed to configure hdmiphy\n");
1446                 return;
1447         }
1448         hdmiphy_enable_mode_set(hdata, false);
1449         hdmi_clk_set_parents(hdata, true);
1450         usleep_range(10000, 12000);
1451         hdmiphy_wait_for_pll(hdata);
1452 }
1453
1454 /* Should be called with hdata->mutex mutex held */
1455 static void hdmi_conf_apply(struct hdmi_context *hdata)
1456 {
1457         hdmi_start(hdata, false);
1458         hdmi_conf_init(hdata);
1459         hdmi_audio_config(hdata);
1460         hdmi_mode_apply(hdata);
1461         hdmi_audio_control(hdata);
1462 }
1463
1464 static void hdmi_set_refclk(struct hdmi_context *hdata, bool on)
1465 {
1466         if (!hdata->sysreg)
1467                 return;
1468
1469         regmap_update_bits(hdata->sysreg, EXYNOS5433_SYSREG_DISP_HDMI_PHY,
1470                            SYSREG_HDMI_REFCLK_INT_CLK, on ? ~0 : 0);
1471 }
1472
1473 /* Should be called with hdata->mutex mutex held. */
1474 static void hdmiphy_enable(struct hdmi_context *hdata)
1475 {
1476         if (hdata->powered)
1477                 return;
1478
1479         pm_runtime_get_sync(hdata->dev);
1480
1481         if (regulator_bulk_enable(ARRAY_SIZE(supply), hdata->regul_bulk))
1482                 DRM_DEV_DEBUG_KMS(hdata->dev,
1483                                   "failed to enable regulator bulk\n");
1484
1485         regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
1486                         PMU_HDMI_PHY_ENABLE_BIT, 1);
1487
1488         hdmi_set_refclk(hdata, true);
1489
1490         hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, 0, HDMI_PHY_POWER_OFF_EN);
1491
1492         hdmiphy_conf_apply(hdata);
1493
1494         hdata->powered = true;
1495 }
1496
1497 /* Should be called with hdata->mutex mutex held. */
1498 static void hdmiphy_disable(struct hdmi_context *hdata)
1499 {
1500         if (!hdata->powered)
1501                 return;
1502
1503         hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN);
1504
1505         hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, ~0, HDMI_PHY_POWER_OFF_EN);
1506
1507         hdmi_set_refclk(hdata, false);
1508
1509         regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
1510                         PMU_HDMI_PHY_ENABLE_BIT, 0);
1511
1512         regulator_bulk_disable(ARRAY_SIZE(supply), hdata->regul_bulk);
1513
1514         pm_runtime_put_sync(hdata->dev);
1515
1516         hdata->powered = false;
1517 }
1518
1519 static void hdmi_enable(struct drm_encoder *encoder)
1520 {
1521         struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1522
1523         mutex_lock(&hdata->mutex);
1524
1525         hdmiphy_enable(hdata);
1526         hdmi_conf_apply(hdata);
1527
1528         mutex_unlock(&hdata->mutex);
1529 }
1530
1531 static void hdmi_disable(struct drm_encoder *encoder)
1532 {
1533         struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1534
1535         mutex_lock(&hdata->mutex);
1536
1537         if (hdata->powered) {
1538                 /*
1539                  * The SFRs of VP and Mixer are updated by Vertical Sync of
1540                  * Timing generator which is a part of HDMI so the sequence
1541                  * to disable TV Subsystem should be as following,
1542                  *      VP -> Mixer -> HDMI
1543                  *
1544                  * To achieve such sequence HDMI is disabled together with
1545                  * HDMI PHY, via pipe clock callback.
1546                  */
1547                 mutex_unlock(&hdata->mutex);
1548                 cancel_delayed_work(&hdata->hotplug_work);
1549                 if (hdata->notifier)
1550                         cec_notifier_phys_addr_invalidate(hdata->notifier);
1551                 return;
1552         }
1553
1554         mutex_unlock(&hdata->mutex);
1555 }
1556
1557 static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = {
1558         .mode_fixup     = hdmi_mode_fixup,
1559         .enable         = hdmi_enable,
1560         .disable        = hdmi_disable,
1561 };
1562
1563 static void hdmi_audio_shutdown(struct device *dev, void *data)
1564 {
1565         struct hdmi_context *hdata = dev_get_drvdata(dev);
1566
1567         mutex_lock(&hdata->mutex);
1568
1569         hdata->audio.mute = true;
1570
1571         if (hdata->powered)
1572                 hdmi_audio_control(hdata);
1573
1574         mutex_unlock(&hdata->mutex);
1575 }
1576
1577 static int hdmi_audio_hw_params(struct device *dev, void *data,
1578                                 struct hdmi_codec_daifmt *daifmt,
1579                                 struct hdmi_codec_params *params)
1580 {
1581         struct hdmi_context *hdata = dev_get_drvdata(dev);
1582
1583         if (daifmt->fmt != HDMI_I2S || daifmt->bit_clk_inv ||
1584             daifmt->frame_clk_inv || daifmt->bit_clk_master ||
1585             daifmt->frame_clk_master) {
1586                 dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__,
1587                         daifmt->bit_clk_inv, daifmt->frame_clk_inv,
1588                         daifmt->bit_clk_master,
1589                         daifmt->frame_clk_master);
1590                 return -EINVAL;
1591         }
1592
1593         mutex_lock(&hdata->mutex);
1594
1595         hdata->audio.params = *params;
1596
1597         if (hdata->powered) {
1598                 hdmi_audio_config(hdata);
1599                 hdmi_audio_infoframe_apply(hdata);
1600         }
1601
1602         mutex_unlock(&hdata->mutex);
1603
1604         return 0;
1605 }
1606
1607 static int hdmi_audio_digital_mute(struct device *dev, void *data, bool mute)
1608 {
1609         struct hdmi_context *hdata = dev_get_drvdata(dev);
1610
1611         mutex_lock(&hdata->mutex);
1612
1613         hdata->audio.mute = mute;
1614
1615         if (hdata->powered)
1616                 hdmi_audio_control(hdata);
1617
1618         mutex_unlock(&hdata->mutex);
1619
1620         return 0;
1621 }
1622
1623 static int hdmi_audio_get_eld(struct device *dev, void *data, uint8_t *buf,
1624                               size_t len)
1625 {
1626         struct hdmi_context *hdata = dev_get_drvdata(dev);
1627         struct drm_connector *connector = &hdata->connector;
1628
1629         memcpy(buf, connector->eld, min(sizeof(connector->eld), len));
1630
1631         return 0;
1632 }
1633
1634 static const struct hdmi_codec_ops audio_codec_ops = {
1635         .hw_params = hdmi_audio_hw_params,
1636         .audio_shutdown = hdmi_audio_shutdown,
1637         .digital_mute = hdmi_audio_digital_mute,
1638         .get_eld = hdmi_audio_get_eld,
1639 };
1640
1641 static int hdmi_register_audio_device(struct hdmi_context *hdata)
1642 {
1643         struct hdmi_codec_pdata codec_data = {
1644                 .ops = &audio_codec_ops,
1645                 .max_i2s_channels = 6,
1646                 .i2s = 1,
1647         };
1648
1649         hdata->audio.pdev = platform_device_register_data(
1650                 hdata->dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO,
1651                 &codec_data, sizeof(codec_data));
1652
1653         return PTR_ERR_OR_ZERO(hdata->audio.pdev);
1654 }
1655
1656 static void hdmi_hotplug_work_func(struct work_struct *work)
1657 {
1658         struct hdmi_context *hdata;
1659
1660         hdata = container_of(work, struct hdmi_context, hotplug_work.work);
1661
1662         if (hdata->drm_dev)
1663                 drm_helper_hpd_irq_event(hdata->drm_dev);
1664 }
1665
1666 static irqreturn_t hdmi_irq_thread(int irq, void *arg)
1667 {
1668         struct hdmi_context *hdata = arg;
1669
1670         mod_delayed_work(system_wq, &hdata->hotplug_work,
1671                         msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS));
1672
1673         return IRQ_HANDLED;
1674 }
1675
1676 static int hdmi_clks_get(struct hdmi_context *hdata,
1677                          const struct string_array_spec *names,
1678                          struct clk **clks)
1679 {
1680         struct device *dev = hdata->dev;
1681         int i;
1682
1683         for (i = 0; i < names->count; ++i) {
1684                 struct clk *clk = devm_clk_get(dev, names->data[i]);
1685
1686                 if (IS_ERR(clk)) {
1687                         int ret = PTR_ERR(clk);
1688
1689                         dev_err(dev, "Cannot get clock %s, %d\n",
1690                                 names->data[i], ret);
1691
1692                         return ret;
1693                 }
1694
1695                 clks[i] = clk;
1696         }
1697
1698         return 0;
1699 }
1700
1701 static int hdmi_clk_init(struct hdmi_context *hdata)
1702 {
1703         const struct hdmi_driver_data *drv_data = hdata->drv_data;
1704         int count = drv_data->clk_gates.count + drv_data->clk_muxes.count;
1705         struct device *dev = hdata->dev;
1706         struct clk **clks;
1707         int ret;
1708
1709         if (!count)
1710                 return 0;
1711
1712         clks = devm_kcalloc(dev, count, sizeof(*clks), GFP_KERNEL);
1713         if (!clks)
1714                 return -ENOMEM;
1715
1716         hdata->clk_gates = clks;
1717         hdata->clk_muxes = clks + drv_data->clk_gates.count;
1718
1719         ret = hdmi_clks_get(hdata, &drv_data->clk_gates, hdata->clk_gates);
1720         if (ret)
1721                 return ret;
1722
1723         return hdmi_clks_get(hdata, &drv_data->clk_muxes, hdata->clk_muxes);
1724 }
1725
1726
1727 static void hdmiphy_clk_enable(struct exynos_drm_clk *clk, bool enable)
1728 {
1729         struct hdmi_context *hdata = container_of(clk, struct hdmi_context,
1730                                                   phy_clk);
1731         mutex_lock(&hdata->mutex);
1732
1733         if (enable)
1734                 hdmiphy_enable(hdata);
1735         else
1736                 hdmiphy_disable(hdata);
1737
1738         mutex_unlock(&hdata->mutex);
1739 }
1740
1741 static int hdmi_bridge_init(struct hdmi_context *hdata)
1742 {
1743         struct device *dev = hdata->dev;
1744         struct device_node *ep, *np;
1745
1746         ep = of_graph_get_endpoint_by_regs(dev->of_node, 1, -1);
1747         if (!ep)
1748                 return 0;
1749
1750         np = of_graph_get_remote_port_parent(ep);
1751         of_node_put(ep);
1752         if (!np) {
1753                 DRM_DEV_ERROR(dev, "failed to get remote port parent");
1754                 return -EINVAL;
1755         }
1756
1757         hdata->bridge = of_drm_find_bridge(np);
1758         of_node_put(np);
1759
1760         if (!hdata->bridge)
1761                 return -EPROBE_DEFER;
1762
1763         return 0;
1764 }
1765
1766 static int hdmi_resources_init(struct hdmi_context *hdata)
1767 {
1768         struct device *dev = hdata->dev;
1769         int i, ret;
1770
1771         DRM_DEV_DEBUG_KMS(dev, "HDMI resource init\n");
1772
1773         hdata->hpd_gpio = devm_gpiod_get(dev, "hpd", GPIOD_IN);
1774         if (IS_ERR(hdata->hpd_gpio)) {
1775                 DRM_DEV_ERROR(dev, "cannot get hpd gpio property\n");
1776                 return PTR_ERR(hdata->hpd_gpio);
1777         }
1778
1779         hdata->irq = gpiod_to_irq(hdata->hpd_gpio);
1780         if (hdata->irq < 0) {
1781                 DRM_DEV_ERROR(dev, "failed to get GPIO irq\n");
1782                 return  hdata->irq;
1783         }
1784
1785         ret = hdmi_clk_init(hdata);
1786         if (ret)
1787                 return ret;
1788
1789         ret = hdmi_clk_set_parents(hdata, false);
1790         if (ret)
1791                 return ret;
1792
1793         for (i = 0; i < ARRAY_SIZE(supply); ++i)
1794                 hdata->regul_bulk[i].supply = supply[i];
1795
1796         ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), hdata->regul_bulk);
1797         if (ret) {
1798                 if (ret != -EPROBE_DEFER)
1799                         DRM_DEV_ERROR(dev, "failed to get regulators\n");
1800                 return ret;
1801         }
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 };