1e26cd4f834798a12145d23b880904f4cd2b3284
[linux-2.6-block.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.h>
25 #include <linux/of_address.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                 .pixel_clock = 154000000,
527                 .conf = {
528                         0x01, 0xD1, 0x20, 0x01, 0x40, 0x30, 0x08, 0xCC,
529                         0x8C, 0xE8, 0xC1, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
530                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x86,
531                         0x54, 0x3F, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
532                 },
533         },
534 };
535
536 static const struct hdmiphy_config hdmiphy_5433_configs[] = {
537         {
538                 .pixel_clock = 27000000,
539                 .conf = {
540                         0x01, 0x51, 0x2d, 0x75, 0x01, 0x00, 0x88, 0x02,
541                         0x72, 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 = 27027000,
548                 .conf = {
549                         0x01, 0x51, 0x2d, 0x72, 0x64, 0x09, 0x88, 0xc3,
550                         0x71, 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 = 40000000,
557                 .conf = {
558                         0x01, 0x51, 0x32, 0x55, 0x01, 0x00, 0x88, 0x02,
559                         0x4d, 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 = 50000000,
566                 .conf = {
567                         0x01, 0x51, 0x34, 0x40, 0x64, 0x09, 0x88, 0xc3,
568                         0x3d, 0x50, 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 = 65000000,
575                 .conf = {
576                         0x01, 0x51, 0x36, 0x31, 0x40, 0x10, 0x04, 0xc6,
577                         0x2e, 0xe8, 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 = 74176000,
584                 .conf = {
585                         0x01, 0x51, 0x3E, 0x35, 0x5B, 0xDE, 0x88, 0x42,
586                         0x53, 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 = 74250000,
593                 .conf = {
594                         0x01, 0x51, 0x3E, 0x35, 0x40, 0xF0, 0x88, 0xC2,
595                         0x52, 0x51, 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 = 108000000,
602                 .conf = {
603                         0x01, 0x51, 0x2d, 0x15, 0x01, 0x00, 0x88, 0x02,
604                         0x72, 0x52, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
605                         0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
606                         0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
607                 },
608         },
609         {
610                 .pixel_clock = 148500000,
611                 .conf = {
612                         0x01, 0x51, 0x1f, 0x00, 0x40, 0xf8, 0x88, 0xc1,
613                         0x52, 0x52, 0x24, 0x0c, 0x24, 0x0f, 0x7c, 0xa5,
614                         0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30,
615                         0x08, 0x10, 0x01, 0x01, 0x48, 0x4a, 0x00, 0x40,
616                 },
617         },
618         {
619                 .pixel_clock = 297000000,
620                 .conf = {
621                         0x01, 0x51, 0x3E, 0x05, 0x40, 0xF0, 0x88, 0xC2,
622                         0x52, 0x53, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
623                         0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
624                         0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
625                 },
626         },
627 };
628
629 static const char * const hdmi_clk_gates4[] = {
630         "hdmi", "sclk_hdmi"
631 };
632
633 static const char * const hdmi_clk_muxes4[] = {
634         "sclk_pixel", "sclk_hdmiphy", "mout_hdmi"
635 };
636
637 static const char * const hdmi_clk_gates5433[] = {
638         "hdmi_pclk", "hdmi_i_pclk", "i_tmds_clk", "i_pixel_clk", "i_spdif_clk"
639 };
640
641 static const char * const hdmi_clk_muxes5433[] = {
642         "oscclk", "tmds_clko", "tmds_clko_user",
643         "oscclk", "pixel_clko", "pixel_clko_user"
644 };
645
646 static const struct hdmi_driver_data exynos4210_hdmi_driver_data = {
647         .type           = HDMI_TYPE13,
648         .phy_confs      = INIT_ARRAY_SPEC(hdmiphy_v13_configs),
649         .clk_gates      = INIT_ARRAY_SPEC(hdmi_clk_gates4),
650         .clk_muxes      = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
651 };
652
653 static const struct hdmi_driver_data exynos4212_hdmi_driver_data = {
654         .type           = HDMI_TYPE14,
655         .phy_confs      = INIT_ARRAY_SPEC(hdmiphy_v14_configs),
656         .clk_gates      = INIT_ARRAY_SPEC(hdmi_clk_gates4),
657         .clk_muxes      = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
658 };
659
660 static const struct hdmi_driver_data exynos5420_hdmi_driver_data = {
661         .type           = HDMI_TYPE14,
662         .is_apb_phy     = 1,
663         .phy_confs      = INIT_ARRAY_SPEC(hdmiphy_5420_configs),
664         .clk_gates      = INIT_ARRAY_SPEC(hdmi_clk_gates4),
665         .clk_muxes      = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
666 };
667
668 static const struct hdmi_driver_data exynos5433_hdmi_driver_data = {
669         .type           = HDMI_TYPE14,
670         .is_apb_phy     = 1,
671         .has_sysreg     = 1,
672         .phy_confs      = INIT_ARRAY_SPEC(hdmiphy_5433_configs),
673         .clk_gates      = INIT_ARRAY_SPEC(hdmi_clk_gates5433),
674         .clk_muxes      = INIT_ARRAY_SPEC(hdmi_clk_muxes5433),
675 };
676
677 static inline u32 hdmi_map_reg(struct hdmi_context *hdata, u32 reg_id)
678 {
679         if ((reg_id & 0xffff0000) == HDMI_MAPPED_BASE)
680                 return hdmi_reg_map[reg_id & 0xffff][hdata->drv_data->type];
681         return reg_id;
682 }
683
684 static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id)
685 {
686         return readl(hdata->regs + hdmi_map_reg(hdata, reg_id));
687 }
688
689 static inline void hdmi_reg_writeb(struct hdmi_context *hdata,
690                                  u32 reg_id, u8 value)
691 {
692         writel(value, hdata->regs + hdmi_map_reg(hdata, reg_id));
693 }
694
695 static inline void hdmi_reg_writev(struct hdmi_context *hdata, u32 reg_id,
696                                    int bytes, u32 val)
697 {
698         reg_id = hdmi_map_reg(hdata, reg_id);
699
700         while (--bytes >= 0) {
701                 writel(val & 0xff, hdata->regs + reg_id);
702                 val >>= 8;
703                 reg_id += 4;
704         }
705 }
706
707 static inline void hdmi_reg_write_buf(struct hdmi_context *hdata, u32 reg_id,
708                                       u8 *buf, int size)
709 {
710         for (reg_id = hdmi_map_reg(hdata, reg_id); size; --size, reg_id += 4)
711                 writel(*buf++, hdata->regs + reg_id);
712 }
713
714 static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
715                                  u32 reg_id, u32 value, u32 mask)
716 {
717         u32 old;
718
719         reg_id = hdmi_map_reg(hdata, reg_id);
720         old = readl(hdata->regs + reg_id);
721         value = (value & mask) | (old & ~mask);
722         writel(value, hdata->regs + reg_id);
723 }
724
725 static int hdmiphy_reg_write_buf(struct hdmi_context *hdata,
726                         u32 reg_offset, const u8 *buf, u32 len)
727 {
728         if ((reg_offset + len) > 32)
729                 return -EINVAL;
730
731         if (hdata->hdmiphy_port) {
732                 int ret;
733
734                 ret = i2c_master_send(hdata->hdmiphy_port, buf, len);
735                 if (ret == len)
736                         return 0;
737                 return ret;
738         } else {
739                 int i;
740                 for (i = 0; i < len; i++)
741                         writel(buf[i], hdata->regs_hdmiphy +
742                                 ((reg_offset + i)<<2));
743                 return 0;
744         }
745 }
746
747 static int hdmi_clk_enable_gates(struct hdmi_context *hdata)
748 {
749         int i, ret;
750
751         for (i = 0; i < hdata->drv_data->clk_gates.count; ++i) {
752                 ret = clk_prepare_enable(hdata->clk_gates[i]);
753                 if (!ret)
754                         continue;
755
756                 dev_err(hdata->dev, "Cannot enable clock '%s', %d\n",
757                         hdata->drv_data->clk_gates.data[i], ret);
758                 while (i--)
759                         clk_disable_unprepare(hdata->clk_gates[i]);
760                 return ret;
761         }
762
763         return 0;
764 }
765
766 static void hdmi_clk_disable_gates(struct hdmi_context *hdata)
767 {
768         int i = hdata->drv_data->clk_gates.count;
769
770         while (i--)
771                 clk_disable_unprepare(hdata->clk_gates[i]);
772 }
773
774 static int hdmi_clk_set_parents(struct hdmi_context *hdata, bool to_phy)
775 {
776         struct device *dev = hdata->dev;
777         int ret = 0;
778         int i;
779
780         for (i = 0; i < hdata->drv_data->clk_muxes.count; i += 3) {
781                 struct clk **c = &hdata->clk_muxes[i];
782
783                 ret = clk_set_parent(c[2], c[to_phy]);
784                 if (!ret)
785                         continue;
786
787                 dev_err(dev, "Cannot set clock parent of '%s' to '%s', %d\n",
788                         hdata->drv_data->clk_muxes.data[i + 2],
789                         hdata->drv_data->clk_muxes.data[i + to_phy], ret);
790         }
791
792         return ret;
793 }
794
795 static int hdmi_audio_infoframe_apply(struct hdmi_context *hdata)
796 {
797         struct hdmi_audio_infoframe *infoframe = &hdata->audio.infoframe;
798         u8 buf[HDMI_INFOFRAME_SIZE(AUDIO)];
799         int len;
800
801         len = hdmi_audio_infoframe_pack(infoframe, buf, sizeof(buf));
802         if (len < 0)
803                 return len;
804
805         hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_EVERY_VSYNC);
806         hdmi_reg_write_buf(hdata, HDMI_AUI_HEADER0, buf, len);
807
808         return 0;
809 }
810
811 static void hdmi_reg_infoframes(struct hdmi_context *hdata)
812 {
813         struct drm_display_mode *m = &hdata->encoder.crtc->state->mode;
814         union hdmi_infoframe frm;
815         u8 buf[25];
816         int ret;
817
818         if (hdata->dvi_mode) {
819                 hdmi_reg_writeb(hdata, HDMI_AVI_CON,
820                                 HDMI_AVI_CON_DO_NOT_TRANSMIT);
821                 hdmi_reg_writeb(hdata, HDMI_VSI_CON,
822                                 HDMI_VSI_CON_DO_NOT_TRANSMIT);
823                 hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN);
824                 return;
825         }
826
827         ret = drm_hdmi_avi_infoframe_from_display_mode(&frm.avi,
828                                                        &hdata->connector, m);
829         if (!ret)
830                 ret = hdmi_avi_infoframe_pack(&frm.avi, buf, sizeof(buf));
831         if (ret > 0) {
832                 hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC);
833                 hdmi_reg_write_buf(hdata, HDMI_AVI_HEADER0, buf, ret);
834         } else {
835                 DRM_INFO("%s: invalid AVI infoframe (%d)\n", __func__, ret);
836         }
837
838         ret = drm_hdmi_vendor_infoframe_from_display_mode(&frm.vendor.hdmi,
839                                                           &hdata->connector, m);
840         if (!ret)
841                 ret = hdmi_vendor_infoframe_pack(&frm.vendor.hdmi, buf,
842                                 sizeof(buf));
843         if (ret > 0) {
844                 hdmi_reg_writeb(hdata, HDMI_VSI_CON, HDMI_VSI_CON_EVERY_VSYNC);
845                 hdmi_reg_write_buf(hdata, HDMI_VSI_HEADER0, buf, 3);
846                 hdmi_reg_write_buf(hdata, HDMI_VSI_DATA(0), buf + 3, ret - 3);
847         }
848
849         hdmi_audio_infoframe_apply(hdata);
850 }
851
852 static enum drm_connector_status hdmi_detect(struct drm_connector *connector,
853                                 bool force)
854 {
855         struct hdmi_context *hdata = connector_to_hdmi(connector);
856
857         if (gpiod_get_value(hdata->hpd_gpio))
858                 return connector_status_connected;
859
860         cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID);
861         return connector_status_disconnected;
862 }
863
864 static void hdmi_connector_destroy(struct drm_connector *connector)
865 {
866         struct hdmi_context *hdata = connector_to_hdmi(connector);
867
868         cec_notifier_conn_unregister(hdata->notifier);
869
870         drm_connector_unregister(connector);
871         drm_connector_cleanup(connector);
872 }
873
874 static const struct drm_connector_funcs hdmi_connector_funcs = {
875         .fill_modes = drm_helper_probe_single_connector_modes,
876         .detect = hdmi_detect,
877         .destroy = hdmi_connector_destroy,
878         .reset = drm_atomic_helper_connector_reset,
879         .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
880         .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
881 };
882
883 static int hdmi_get_modes(struct drm_connector *connector)
884 {
885         struct hdmi_context *hdata = connector_to_hdmi(connector);
886         struct edid *edid;
887         int ret;
888
889         if (!hdata->ddc_adpt)
890                 goto no_edid;
891
892         edid = drm_get_edid(connector, hdata->ddc_adpt);
893         if (!edid)
894                 goto no_edid;
895
896         hdata->dvi_mode = !connector->display_info.is_hdmi;
897         DRM_DEV_DEBUG_KMS(hdata->dev, "%s : width[%d] x height[%d]\n",
898                           (hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
899                           edid->width_cm, edid->height_cm);
900
901         drm_connector_update_edid_property(connector, edid);
902         cec_notifier_set_phys_addr_from_edid(hdata->notifier, edid);
903
904         ret = drm_add_edid_modes(connector, edid);
905
906         kfree(edid);
907
908         return ret;
909
910 no_edid:
911         return drm_add_modes_noedid(connector, 640, 480);
912 }
913
914 static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
915 {
916         const struct hdmiphy_configs *confs = &hdata->drv_data->phy_confs;
917         int i;
918
919         for (i = 0; i < confs->count; i++)
920                 if (confs->data[i].pixel_clock == pixel_clock)
921                         return i;
922
923         DRM_DEV_DEBUG_KMS(hdata->dev, "Could not find phy config for %d\n",
924                           pixel_clock);
925         return -EINVAL;
926 }
927
928 static enum drm_mode_status hdmi_mode_valid(struct drm_connector *connector,
929                                             struct drm_display_mode *mode)
930 {
931         struct hdmi_context *hdata = connector_to_hdmi(connector);
932         int ret;
933
934         DRM_DEV_DEBUG_KMS(hdata->dev,
935                           "xres=%d, yres=%d, refresh=%d, intl=%d clock=%d\n",
936                           mode->hdisplay, mode->vdisplay,
937                           drm_mode_vrefresh(mode),
938                           (mode->flags & DRM_MODE_FLAG_INTERLACE) ? true :
939                           false, mode->clock * 1000);
940
941         ret = hdmi_find_phy_conf(hdata, mode->clock * 1000);
942         if (ret < 0)
943                 return MODE_BAD;
944
945         return MODE_OK;
946 }
947
948 static const struct drm_connector_helper_funcs hdmi_connector_helper_funcs = {
949         .get_modes = hdmi_get_modes,
950         .mode_valid = hdmi_mode_valid,
951 };
952
953 static int hdmi_create_connector(struct drm_encoder *encoder)
954 {
955         struct hdmi_context *hdata = encoder_to_hdmi(encoder);
956         struct drm_connector *connector = &hdata->connector;
957         struct cec_connector_info conn_info;
958         int ret;
959
960         connector->interlace_allowed = true;
961         connector->polled = DRM_CONNECTOR_POLL_HPD;
962
963         ret = drm_connector_init_with_ddc(hdata->drm_dev, connector,
964                                           &hdmi_connector_funcs,
965                                           DRM_MODE_CONNECTOR_HDMIA,
966                                           hdata->ddc_adpt);
967         if (ret) {
968                 DRM_DEV_ERROR(hdata->dev,
969                               "Failed to initialize connector with drm\n");
970                 return ret;
971         }
972
973         drm_connector_helper_add(connector, &hdmi_connector_helper_funcs);
974         drm_connector_attach_encoder(connector, encoder);
975
976         if (hdata->bridge)
977                 ret = drm_bridge_attach(encoder, hdata->bridge, NULL, 0);
978
979         cec_fill_conn_info_from_drm(&conn_info, connector);
980
981         hdata->notifier = cec_notifier_conn_register(hdata->dev, NULL,
982                                                      &conn_info);
983         if (!hdata->notifier) {
984                 ret = -ENOMEM;
985                 DRM_DEV_ERROR(hdata->dev, "Failed to allocate CEC notifier\n");
986         }
987
988         return ret;
989 }
990
991 static bool hdmi_mode_fixup(struct drm_encoder *encoder,
992                             const struct drm_display_mode *mode,
993                             struct drm_display_mode *adjusted_mode)
994 {
995         struct drm_device *dev = encoder->dev;
996         struct drm_connector *connector;
997         struct drm_display_mode *m;
998         struct drm_connector_list_iter conn_iter;
999         int mode_ok;
1000
1001         drm_mode_set_crtcinfo(adjusted_mode, 0);
1002
1003         drm_connector_list_iter_begin(dev, &conn_iter);
1004         drm_for_each_connector_iter(connector, &conn_iter) {
1005                 if (connector->encoder == encoder)
1006                         break;
1007         }
1008         if (connector)
1009                 drm_connector_get(connector);
1010         drm_connector_list_iter_end(&conn_iter);
1011
1012         if (!connector)
1013                 return true;
1014
1015         mode_ok = hdmi_mode_valid(connector, adjusted_mode);
1016
1017         if (mode_ok == MODE_OK)
1018                 goto cleanup;
1019
1020         /*
1021          * Find the most suitable mode and copy it to adjusted_mode.
1022          */
1023         list_for_each_entry(m, &connector->modes, head) {
1024                 mode_ok = hdmi_mode_valid(connector, m);
1025
1026                 if (mode_ok == MODE_OK) {
1027                         DRM_INFO("desired mode doesn't exist so\n");
1028                         DRM_INFO("use the most suitable mode among modes.\n");
1029
1030                         DRM_DEV_DEBUG_KMS(dev->dev,
1031                                           "Adjusted Mode: [%d]x[%d] [%d]Hz\n",
1032                                           m->hdisplay, m->vdisplay,
1033                                           drm_mode_vrefresh(m));
1034
1035                         drm_mode_copy(adjusted_mode, m);
1036                         break;
1037                 }
1038         }
1039
1040 cleanup:
1041         drm_connector_put(connector);
1042
1043         return true;
1044 }
1045
1046 static void hdmi_reg_acr(struct hdmi_context *hdata, u32 freq)
1047 {
1048         u32 n, cts;
1049
1050         cts = (freq % 9) ? 27000 : 30000;
1051         n = 128 * freq / (27000000 / cts);
1052
1053         hdmi_reg_writev(hdata, HDMI_ACR_N0, 3, n);
1054         hdmi_reg_writev(hdata, HDMI_ACR_MCTS0, 3, cts);
1055         hdmi_reg_writev(hdata, HDMI_ACR_CTS0, 3, cts);
1056         hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
1057 }
1058
1059 static void hdmi_audio_config(struct hdmi_context *hdata)
1060 {
1061         u32 bit_ch = 1;
1062         u32 data_num, val;
1063         int i;
1064
1065         switch (hdata->audio.params.sample_width) {
1066         case 20:
1067                 data_num = 2;
1068                 break;
1069         case 24:
1070                 data_num = 3;
1071                 break;
1072         default:
1073                 data_num = 1;
1074                 bit_ch = 0;
1075                 break;
1076         }
1077
1078         hdmi_reg_acr(hdata, hdata->audio.params.sample_rate);
1079
1080         hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
1081                                 | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
1082                                 | HDMI_I2S_MUX_ENABLE);
1083
1084         hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
1085                         | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
1086
1087         hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
1088         hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
1089         hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
1090
1091         val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
1092         hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
1093
1094         /* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
1095         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
1096                         | HDMI_I2S_SEL_LRCK(6));
1097
1098         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(3)
1099                         | HDMI_I2S_SEL_SDATA0(4));
1100
1101         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
1102                         | HDMI_I2S_SEL_SDATA2(2));
1103
1104         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
1105
1106         /* I2S_CON_1 & 2 */
1107         hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
1108                         | HDMI_I2S_L_CH_LOW_POL);
1109         hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
1110                         | HDMI_I2S_SET_BIT_CH(bit_ch)
1111                         | HDMI_I2S_SET_SDATA_BIT(data_num)
1112                         | HDMI_I2S_BASIC_FORMAT);
1113
1114         /* Configuration of the audio channel status registers */
1115         for (i = 0; i < HDMI_I2S_CH_ST_MAXNUM; i++)
1116                 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST(i),
1117                                 hdata->audio.params.iec.status[i]);
1118
1119         hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
1120 }
1121
1122 static void hdmi_audio_control(struct hdmi_context *hdata)
1123 {
1124         bool enable = !hdata->audio.mute;
1125
1126         if (hdata->dvi_mode)
1127                 return;
1128
1129         hdmi_reg_writeb(hdata, HDMI_AUI_CON, enable ?
1130                         HDMI_AVI_CON_EVERY_VSYNC : HDMI_AUI_CON_NO_TRAN);
1131         hdmi_reg_writemask(hdata, HDMI_CON_0, enable ?
1132                         HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
1133 }
1134
1135 static void hdmi_start(struct hdmi_context *hdata, bool start)
1136 {
1137         struct drm_display_mode *m = &hdata->encoder.crtc->state->mode;
1138         u32 val = start ? HDMI_TG_EN : 0;
1139
1140         if (m->flags & DRM_MODE_FLAG_INTERLACE)
1141                 val |= HDMI_FIELD_EN;
1142
1143         hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN);
1144         hdmi_reg_writemask(hdata, HDMI_TG_CMD, val, HDMI_TG_EN | HDMI_FIELD_EN);
1145 }
1146
1147 static void hdmi_conf_init(struct hdmi_context *hdata)
1148 {
1149         /* disable HPD interrupts from HDMI IP block, use GPIO instead */
1150         hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
1151                 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
1152
1153         /* choose HDMI mode */
1154         hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1155                 HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
1156         /* apply video pre-amble and guard band in HDMI mode only */
1157         hdmi_reg_writeb(hdata, HDMI_CON_2, 0);
1158         /* disable bluescreen */
1159         hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
1160
1161         if (hdata->dvi_mode) {
1162                 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1163                                 HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1164                 hdmi_reg_writeb(hdata, HDMI_CON_2,
1165                                 HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1166         }
1167
1168         if (hdata->drv_data->type == HDMI_TYPE13) {
1169                 /* choose bluescreen (fecal) color */
1170                 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
1171                 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
1172                 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1173
1174                 /* enable AVI packet every vsync, fixes purple line problem */
1175                 hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1176                 /* force RGB, look to CEA-861-D, table 7 for more detail */
1177                 hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1178                 hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1179
1180                 hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1181                 hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1182                 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1183         } else {
1184                 hdmi_reg_infoframes(hdata);
1185
1186                 /* enable AVI packet every vsync, fixes purple line problem */
1187                 hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1188         }
1189 }
1190
1191 static void hdmiphy_wait_for_pll(struct hdmi_context *hdata)
1192 {
1193         int tries;
1194
1195         for (tries = 0; tries < 10; ++tries) {
1196                 u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS);
1197
1198                 if (val & HDMI_PHY_STATUS_READY) {
1199                         DRM_DEV_DEBUG_KMS(hdata->dev,
1200                                           "PLL stabilized after %d tries\n",
1201                                           tries);
1202                         return;
1203                 }
1204                 usleep_range(10, 20);
1205         }
1206
1207         DRM_DEV_ERROR(hdata->dev, "PLL could not reach steady state\n");
1208 }
1209
1210 static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
1211 {
1212         struct drm_display_mode *m = &hdata->encoder.crtc->state->mode;
1213         unsigned int val;
1214
1215         hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay);
1216         hdmi_reg_writev(hdata, HDMI_V13_H_V_LINE_0, 3,
1217                         (m->htotal << 12) | m->vtotal);
1218
1219         val = (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0;
1220         hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1, val);
1221
1222         val = (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0;
1223         hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1, val);
1224
1225         val = (m->hsync_start - m->hdisplay - 2);
1226         val |= ((m->hsync_end - m->hdisplay - 2) << 10);
1227         val |= ((m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0)<<20;
1228         hdmi_reg_writev(hdata, HDMI_V13_H_SYNC_GEN_0, 3, val);
1229
1230         /*
1231          * Quirk requirement for exynos HDMI IP design,
1232          * 2 pixels less than the actual calculation for hsync_start
1233          * and end.
1234          */
1235
1236         /* Following values & calculations differ for different type of modes */
1237         if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1238                 val = ((m->vsync_end - m->vdisplay) / 2);
1239                 val |= ((m->vsync_start - m->vdisplay) / 2) << 12;
1240                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val);
1241
1242                 val = m->vtotal / 2;
1243                 val |= ((m->vtotal - m->vdisplay) / 2) << 11;
1244                 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val);
1245
1246                 val = (m->vtotal +
1247                         ((m->vsync_end - m->vsync_start) * 4) + 5) / 2;
1248                 val |= m->vtotal << 11;
1249                 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_F_0, 3, val);
1250
1251                 val = ((m->vtotal / 2) + 7);
1252                 val |= ((m->vtotal / 2) + 2) << 12;
1253                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_2_0, 3, val);
1254
1255                 val = ((m->htotal / 2) + (m->hsync_start - m->hdisplay));
1256                 val |= ((m->htotal / 2) +
1257                         (m->hsync_start - m->hdisplay)) << 12;
1258                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_3_0, 3, val);
1259
1260                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1261                                 (m->vtotal - m->vdisplay) / 2);
1262                 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay / 2);
1263
1264                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2, 0x249);
1265         } else {
1266                 val = m->vtotal;
1267                 val |= (m->vtotal - m->vdisplay) << 11;
1268                 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val);
1269
1270                 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_F_0, 3, 0);
1271
1272                 val = (m->vsync_end - m->vdisplay);
1273                 val |= ((m->vsync_start - m->vdisplay) << 12);
1274                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val);
1275
1276                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_2_0, 3, 0x1001);
1277                 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_3_0, 3, 0x1001);
1278                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1279                                 m->vtotal - m->vdisplay);
1280                 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay);
1281         }
1282
1283         hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal);
1284         hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay);
1285         hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay);
1286         hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal);
1287 }
1288
1289 static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
1290 {
1291         struct drm_display_mode *m = &hdata->encoder.crtc->state->mode;
1292         struct drm_display_mode *am =
1293                                 &hdata->encoder.crtc->state->adjusted_mode;
1294         int hquirk = 0;
1295
1296         /*
1297          * In case video mode coming from CRTC differs from requested one HDMI
1298          * sometimes is able to almost properly perform conversion - only
1299          * first line is distorted.
1300          */
1301         if ((m->vdisplay != am->vdisplay) &&
1302             (m->hdisplay == 1280 || m->hdisplay == 1024 || m->hdisplay == 1366))
1303                 hquirk = 258;
1304
1305         hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay);
1306         hdmi_reg_writev(hdata, HDMI_V_LINE_0, 2, m->vtotal);
1307         hdmi_reg_writev(hdata, HDMI_H_LINE_0, 2, m->htotal);
1308         hdmi_reg_writev(hdata, HDMI_HSYNC_POL, 1,
1309                         (m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0);
1310         hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1,
1311                         (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1312         hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1,
1313                         (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1314
1315         /*
1316          * Quirk requirement for exynos 5 HDMI IP design,
1317          * 2 pixels less than the actual calculation for hsync_start
1318          * and end.
1319          */
1320
1321         /* Following values & calculations differ for different type of modes */
1322         if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1323                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2,
1324                         (m->vsync_end - m->vdisplay) / 2);
1325                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2,
1326                         (m->vsync_start - m->vdisplay) / 2);
1327                 hdmi_reg_writev(hdata, HDMI_V2_BLANK_0, 2, m->vtotal / 2);
1328                 hdmi_reg_writev(hdata, HDMI_V1_BLANK_0, 2,
1329                                 (m->vtotal - m->vdisplay) / 2);
1330                 hdmi_reg_writev(hdata, HDMI_V_BLANK_F0_0, 2,
1331                                 m->vtotal - m->vdisplay / 2);
1332                 hdmi_reg_writev(hdata, HDMI_V_BLANK_F1_0, 2, m->vtotal);
1333                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_2_0, 2,
1334                                 (m->vtotal / 2) + 7);
1335                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_1_0, 2,
1336                                 (m->vtotal / 2) + 2);
1337                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0, 2,
1338                         (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1339                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0, 2,
1340                         (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1341                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1342                                 (m->vtotal - m->vdisplay) / 2);
1343                 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay / 2);
1344                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2,
1345                                 m->vtotal - m->vdisplay / 2);
1346                 hdmi_reg_writev(hdata, HDMI_TG_VSYNC2_L, 2,
1347                                 (m->vtotal / 2) + 1);
1348                 hdmi_reg_writev(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, 2,
1349                                 (m->vtotal / 2) + 1);
1350                 hdmi_reg_writev(hdata, HDMI_TG_FIELD_BOT_HDMI_L, 2,
1351                                 (m->vtotal / 2) + 1);
1352                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST3_L, 2, 0x0);
1353                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST4_L, 2, 0x0);
1354         } else {
1355                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2,
1356                         m->vsync_end - m->vdisplay);
1357                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2,
1358                         m->vsync_start - m->vdisplay);
1359                 hdmi_reg_writev(hdata, HDMI_V2_BLANK_0, 2, m->vtotal);
1360                 hdmi_reg_writev(hdata, HDMI_V1_BLANK_0, 2,
1361                                 m->vtotal - m->vdisplay);
1362                 hdmi_reg_writev(hdata, HDMI_V_BLANK_F0_0, 2, 0xffff);
1363                 hdmi_reg_writev(hdata, HDMI_V_BLANK_F1_0, 2, 0xffff);
1364                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_2_0, 2, 0xffff);
1365                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_1_0, 2, 0xffff);
1366                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0, 2, 0xffff);
1367                 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0, 2, 0xffff);
1368                 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1369                                 m->vtotal - m->vdisplay);
1370                 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay);
1371         }
1372
1373         hdmi_reg_writev(hdata, HDMI_H_SYNC_START_0, 2,
1374                         m->hsync_start - m->hdisplay - 2);
1375         hdmi_reg_writev(hdata, HDMI_H_SYNC_END_0, 2,
1376                         m->hsync_end - m->hdisplay - 2);
1377         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_1_0, 2, 0xffff);
1378         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_2_0, 2, 0xffff);
1379         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_3_0, 2, 0xffff);
1380         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_4_0, 2, 0xffff);
1381         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_5_0, 2, 0xffff);
1382         hdmi_reg_writev(hdata, HDMI_VACT_SPACE_6_0, 2, 0xffff);
1383         hdmi_reg_writev(hdata, HDMI_V_BLANK_F2_0, 2, 0xffff);
1384         hdmi_reg_writev(hdata, HDMI_V_BLANK_F3_0, 2, 0xffff);
1385         hdmi_reg_writev(hdata, HDMI_V_BLANK_F4_0, 2, 0xffff);
1386         hdmi_reg_writev(hdata, HDMI_V_BLANK_F5_0, 2, 0xffff);
1387         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_3_0, 2, 0xffff);
1388         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_4_0, 2, 0xffff);
1389         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_5_0, 2, 0xffff);
1390         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_6_0, 2, 0xffff);
1391         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0, 2, 0xffff);
1392         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0, 2, 0xffff);
1393         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0, 2, 0xffff);
1394         hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0, 2, 0xffff);
1395
1396         hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal);
1397         hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2,
1398                                         m->htotal - m->hdisplay - hquirk);
1399         hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay + hquirk);
1400         hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal);
1401         if (hdata->drv_data == &exynos5433_hdmi_driver_data)
1402                 hdmi_reg_writeb(hdata, HDMI_TG_DECON_EN, 1);
1403 }
1404
1405 static void hdmi_mode_apply(struct hdmi_context *hdata)
1406 {
1407         if (hdata->drv_data->type == HDMI_TYPE13)
1408                 hdmi_v13_mode_apply(hdata);
1409         else
1410                 hdmi_v14_mode_apply(hdata);
1411
1412         hdmi_start(hdata, true);
1413 }
1414
1415 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1416 {
1417         hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, 0, 1);
1418         usleep_range(10000, 12000);
1419         hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, ~0, 1);
1420         usleep_range(10000, 12000);
1421         hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, ~0, HDMI_PHY_SW_RSTOUT);
1422         usleep_range(10000, 12000);
1423         hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, 0, HDMI_PHY_SW_RSTOUT);
1424         usleep_range(10000, 12000);
1425 }
1426
1427 static void hdmiphy_enable_mode_set(struct hdmi_context *hdata, bool enable)
1428 {
1429         u8 v = enable ? HDMI_PHY_ENABLE_MODE_SET : HDMI_PHY_DISABLE_MODE_SET;
1430
1431         if (hdata->drv_data == &exynos5433_hdmi_driver_data)
1432                 writel(v, hdata->regs_hdmiphy + HDMIPHY5433_MODE_SET_DONE);
1433 }
1434
1435 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1436 {
1437         struct drm_display_mode *m = &hdata->encoder.crtc->state->mode;
1438         int ret;
1439         const u8 *phy_conf;
1440
1441         ret = hdmi_find_phy_conf(hdata, m->clock * 1000);
1442         if (ret < 0) {
1443                 DRM_DEV_ERROR(hdata->dev, "failed to find hdmiphy conf\n");
1444                 return;
1445         }
1446         phy_conf = hdata->drv_data->phy_confs.data[ret].conf;
1447
1448         hdmi_clk_set_parents(hdata, false);
1449
1450         hdmiphy_conf_reset(hdata);
1451
1452         hdmiphy_enable_mode_set(hdata, true);
1453         ret = hdmiphy_reg_write_buf(hdata, 0, phy_conf, 32);
1454         if (ret) {
1455                 DRM_DEV_ERROR(hdata->dev, "failed to configure hdmiphy\n");
1456                 return;
1457         }
1458         hdmiphy_enable_mode_set(hdata, false);
1459         hdmi_clk_set_parents(hdata, true);
1460         usleep_range(10000, 12000);
1461         hdmiphy_wait_for_pll(hdata);
1462 }
1463
1464 /* Should be called with hdata->mutex mutex held */
1465 static void hdmi_conf_apply(struct hdmi_context *hdata)
1466 {
1467         hdmi_start(hdata, false);
1468         hdmi_conf_init(hdata);
1469         hdmi_audio_config(hdata);
1470         hdmi_mode_apply(hdata);
1471         hdmi_audio_control(hdata);
1472 }
1473
1474 static void hdmi_set_refclk(struct hdmi_context *hdata, bool on)
1475 {
1476         if (!hdata->sysreg)
1477                 return;
1478
1479         regmap_update_bits(hdata->sysreg, EXYNOS5433_SYSREG_DISP_HDMI_PHY,
1480                            SYSREG_HDMI_REFCLK_INT_CLK, on ? ~0 : 0);
1481 }
1482
1483 /* Should be called with hdata->mutex mutex held. */
1484 static void hdmiphy_enable(struct hdmi_context *hdata)
1485 {
1486         int ret;
1487
1488         if (hdata->powered)
1489                 return;
1490
1491         ret = pm_runtime_resume_and_get(hdata->dev);
1492         if (ret < 0) {
1493                 dev_err(hdata->dev, "failed to enable HDMIPHY device.\n");
1494                 return;
1495         }
1496
1497         if (regulator_bulk_enable(ARRAY_SIZE(supply), hdata->regul_bulk))
1498                 DRM_DEV_DEBUG_KMS(hdata->dev,
1499                                   "failed to enable regulator bulk\n");
1500
1501         regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
1502                         PMU_HDMI_PHY_ENABLE_BIT, 1);
1503
1504         hdmi_set_refclk(hdata, true);
1505
1506         hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, 0, HDMI_PHY_POWER_OFF_EN);
1507
1508         hdmiphy_conf_apply(hdata);
1509
1510         hdata->powered = true;
1511 }
1512
1513 /* Should be called with hdata->mutex mutex held. */
1514 static void hdmiphy_disable(struct hdmi_context *hdata)
1515 {
1516         if (!hdata->powered)
1517                 return;
1518
1519         hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN);
1520
1521         hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, ~0, HDMI_PHY_POWER_OFF_EN);
1522
1523         hdmi_set_refclk(hdata, false);
1524
1525         regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
1526                         PMU_HDMI_PHY_ENABLE_BIT, 0);
1527
1528         regulator_bulk_disable(ARRAY_SIZE(supply), hdata->regul_bulk);
1529
1530         pm_runtime_put_sync(hdata->dev);
1531
1532         hdata->powered = false;
1533 }
1534
1535 static void hdmi_enable(struct drm_encoder *encoder)
1536 {
1537         struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1538
1539         mutex_lock(&hdata->mutex);
1540
1541         hdmiphy_enable(hdata);
1542         hdmi_conf_apply(hdata);
1543
1544         mutex_unlock(&hdata->mutex);
1545 }
1546
1547 static void hdmi_disable(struct drm_encoder *encoder)
1548 {
1549         struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1550
1551         mutex_lock(&hdata->mutex);
1552
1553         if (hdata->powered) {
1554                 /*
1555                  * The SFRs of VP and Mixer are updated by Vertical Sync of
1556                  * Timing generator which is a part of HDMI so the sequence
1557                  * to disable TV Subsystem should be as following,
1558                  *      VP -> Mixer -> HDMI
1559                  *
1560                  * To achieve such sequence HDMI is disabled together with
1561                  * HDMI PHY, via pipe clock callback.
1562                  */
1563                 mutex_unlock(&hdata->mutex);
1564                 cancel_delayed_work(&hdata->hotplug_work);
1565                 if (hdata->notifier)
1566                         cec_notifier_phys_addr_invalidate(hdata->notifier);
1567                 return;
1568         }
1569
1570         mutex_unlock(&hdata->mutex);
1571 }
1572
1573 static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = {
1574         .mode_fixup     = hdmi_mode_fixup,
1575         .enable         = hdmi_enable,
1576         .disable        = hdmi_disable,
1577 };
1578
1579 static void hdmi_audio_shutdown(struct device *dev, void *data)
1580 {
1581         struct hdmi_context *hdata = dev_get_drvdata(dev);
1582
1583         mutex_lock(&hdata->mutex);
1584
1585         hdata->audio.mute = true;
1586
1587         if (hdata->powered)
1588                 hdmi_audio_control(hdata);
1589
1590         mutex_unlock(&hdata->mutex);
1591 }
1592
1593 static int hdmi_audio_hw_params(struct device *dev, void *data,
1594                                 struct hdmi_codec_daifmt *daifmt,
1595                                 struct hdmi_codec_params *params)
1596 {
1597         struct hdmi_context *hdata = dev_get_drvdata(dev);
1598
1599         if (daifmt->fmt != HDMI_I2S || daifmt->bit_clk_inv ||
1600             daifmt->frame_clk_inv || daifmt->bit_clk_provider ||
1601             daifmt->frame_clk_provider) {
1602                 dev_err(dev, "%s: Bad flags %d %d %d %d\n", __func__,
1603                         daifmt->bit_clk_inv, daifmt->frame_clk_inv,
1604                         daifmt->bit_clk_provider,
1605                         daifmt->frame_clk_provider);
1606                 return -EINVAL;
1607         }
1608
1609         mutex_lock(&hdata->mutex);
1610
1611         hdata->audio.params = *params;
1612
1613         if (hdata->powered) {
1614                 hdmi_audio_config(hdata);
1615                 hdmi_audio_infoframe_apply(hdata);
1616         }
1617
1618         mutex_unlock(&hdata->mutex);
1619
1620         return 0;
1621 }
1622
1623 static int hdmi_audio_mute(struct device *dev, void *data,
1624                            bool mute, int direction)
1625 {
1626         struct hdmi_context *hdata = dev_get_drvdata(dev);
1627
1628         mutex_lock(&hdata->mutex);
1629
1630         hdata->audio.mute = mute;
1631
1632         if (hdata->powered)
1633                 hdmi_audio_control(hdata);
1634
1635         mutex_unlock(&hdata->mutex);
1636
1637         return 0;
1638 }
1639
1640 static int hdmi_audio_get_eld(struct device *dev, void *data, uint8_t *buf,
1641                               size_t len)
1642 {
1643         struct hdmi_context *hdata = dev_get_drvdata(dev);
1644         struct drm_connector *connector = &hdata->connector;
1645
1646         memcpy(buf, connector->eld, min(sizeof(connector->eld), len));
1647
1648         return 0;
1649 }
1650
1651 static const struct hdmi_codec_ops audio_codec_ops = {
1652         .hw_params = hdmi_audio_hw_params,
1653         .audio_shutdown = hdmi_audio_shutdown,
1654         .mute_stream = hdmi_audio_mute,
1655         .get_eld = hdmi_audio_get_eld,
1656         .no_capture_mute = 1,
1657 };
1658
1659 static int hdmi_register_audio_device(struct hdmi_context *hdata)
1660 {
1661         struct hdmi_codec_pdata codec_data = {
1662                 .ops = &audio_codec_ops,
1663                 .max_i2s_channels = 6,
1664                 .i2s = 1,
1665         };
1666
1667         hdata->audio.pdev = platform_device_register_data(
1668                 hdata->dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO,
1669                 &codec_data, sizeof(codec_data));
1670
1671         return PTR_ERR_OR_ZERO(hdata->audio.pdev);
1672 }
1673
1674 static void hdmi_hotplug_work_func(struct work_struct *work)
1675 {
1676         struct hdmi_context *hdata;
1677
1678         hdata = container_of(work, struct hdmi_context, hotplug_work.work);
1679
1680         if (hdata->drm_dev)
1681                 drm_helper_hpd_irq_event(hdata->drm_dev);
1682 }
1683
1684 static irqreturn_t hdmi_irq_thread(int irq, void *arg)
1685 {
1686         struct hdmi_context *hdata = arg;
1687
1688         mod_delayed_work(system_wq, &hdata->hotplug_work,
1689                         msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS));
1690
1691         return IRQ_HANDLED;
1692 }
1693
1694 static int hdmi_clks_get(struct hdmi_context *hdata,
1695                          const struct string_array_spec *names,
1696                          struct clk **clks)
1697 {
1698         struct device *dev = hdata->dev;
1699         int i;
1700
1701         for (i = 0; i < names->count; ++i) {
1702                 struct clk *clk = devm_clk_get(dev, names->data[i]);
1703
1704                 if (IS_ERR(clk)) {
1705                         int ret = PTR_ERR(clk);
1706
1707                         dev_err(dev, "Cannot get clock %s, %d\n",
1708                                 names->data[i], ret);
1709
1710                         return ret;
1711                 }
1712
1713                 clks[i] = clk;
1714         }
1715
1716         return 0;
1717 }
1718
1719 static int hdmi_clk_init(struct hdmi_context *hdata)
1720 {
1721         const struct hdmi_driver_data *drv_data = hdata->drv_data;
1722         int count = drv_data->clk_gates.count + drv_data->clk_muxes.count;
1723         struct device *dev = hdata->dev;
1724         struct clk **clks;
1725         int ret;
1726
1727         if (!count)
1728                 return 0;
1729
1730         clks = devm_kcalloc(dev, count, sizeof(*clks), GFP_KERNEL);
1731         if (!clks)
1732                 return -ENOMEM;
1733
1734         hdata->clk_gates = clks;
1735         hdata->clk_muxes = clks + drv_data->clk_gates.count;
1736
1737         ret = hdmi_clks_get(hdata, &drv_data->clk_gates, hdata->clk_gates);
1738         if (ret)
1739                 return ret;
1740
1741         return hdmi_clks_get(hdata, &drv_data->clk_muxes, hdata->clk_muxes);
1742 }
1743
1744
1745 static void hdmiphy_clk_enable(struct exynos_drm_clk *clk, bool enable)
1746 {
1747         struct hdmi_context *hdata = container_of(clk, struct hdmi_context,
1748                                                   phy_clk);
1749         mutex_lock(&hdata->mutex);
1750
1751         if (enable)
1752                 hdmiphy_enable(hdata);
1753         else
1754                 hdmiphy_disable(hdata);
1755
1756         mutex_unlock(&hdata->mutex);
1757 }
1758
1759 static int hdmi_bridge_init(struct hdmi_context *hdata)
1760 {
1761         struct device *dev = hdata->dev;
1762         struct device_node *ep, *np;
1763
1764         ep = of_graph_get_endpoint_by_regs(dev->of_node, 1, -1);
1765         if (!ep)
1766                 return 0;
1767
1768         np = of_graph_get_remote_port_parent(ep);
1769         of_node_put(ep);
1770         if (!np) {
1771                 DRM_DEV_ERROR(dev, "failed to get remote port parent");
1772                 return -EINVAL;
1773         }
1774
1775         hdata->bridge = of_drm_find_bridge(np);
1776         of_node_put(np);
1777
1778         if (!hdata->bridge)
1779                 return -EPROBE_DEFER;
1780
1781         return 0;
1782 }
1783
1784 static int hdmi_resources_init(struct hdmi_context *hdata)
1785 {
1786         struct device *dev = hdata->dev;
1787         int i, ret;
1788
1789         DRM_DEV_DEBUG_KMS(dev, "HDMI resource init\n");
1790
1791         hdata->hpd_gpio = devm_gpiod_get(dev, "hpd", GPIOD_IN);
1792         if (IS_ERR(hdata->hpd_gpio)) {
1793                 DRM_DEV_ERROR(dev, "cannot get hpd gpio property\n");
1794                 return PTR_ERR(hdata->hpd_gpio);
1795         }
1796
1797         hdata->irq = gpiod_to_irq(hdata->hpd_gpio);
1798         if (hdata->irq < 0) {
1799                 DRM_DEV_ERROR(dev, "failed to get GPIO irq\n");
1800                 return  hdata->irq;
1801         }
1802
1803         ret = hdmi_clk_init(hdata);
1804         if (ret)
1805                 return ret;
1806
1807         ret = hdmi_clk_set_parents(hdata, false);
1808         if (ret)
1809                 return ret;
1810
1811         for (i = 0; i < ARRAY_SIZE(supply); ++i)
1812                 hdata->regul_bulk[i].supply = supply[i];
1813
1814         ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), hdata->regul_bulk);
1815         if (ret)
1816                 return dev_err_probe(dev, ret, "failed to get regulators\n");
1817
1818         hdata->reg_hdmi_en = devm_regulator_get_optional(dev, "hdmi-en");
1819
1820         if (PTR_ERR(hdata->reg_hdmi_en) != -ENODEV)
1821                 if (IS_ERR(hdata->reg_hdmi_en))
1822                         return PTR_ERR(hdata->reg_hdmi_en);
1823
1824         return hdmi_bridge_init(hdata);
1825 }
1826
1827 static const struct of_device_id hdmi_match_types[] = {
1828         {
1829                 .compatible = "samsung,exynos4210-hdmi",
1830                 .data = &exynos4210_hdmi_driver_data,
1831         }, {
1832                 .compatible = "samsung,exynos4212-hdmi",
1833                 .data = &exynos4212_hdmi_driver_data,
1834         }, {
1835                 .compatible = "samsung,exynos5420-hdmi",
1836                 .data = &exynos5420_hdmi_driver_data,
1837         }, {
1838                 .compatible = "samsung,exynos5433-hdmi",
1839                 .data = &exynos5433_hdmi_driver_data,
1840         }, {
1841                 /* end node */
1842         }
1843 };
1844 MODULE_DEVICE_TABLE (of, hdmi_match_types);
1845
1846 static int hdmi_bind(struct device *dev, struct device *master, void *data)
1847 {
1848         struct drm_device *drm_dev = data;
1849         struct hdmi_context *hdata = dev_get_drvdata(dev);
1850         struct drm_encoder *encoder = &hdata->encoder;
1851         struct exynos_drm_crtc *crtc;
1852         int ret;
1853
1854         hdata->drm_dev = drm_dev;
1855
1856         hdata->phy_clk.enable = hdmiphy_clk_enable;
1857
1858         drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
1859
1860         drm_encoder_helper_add(encoder, &exynos_hdmi_encoder_helper_funcs);
1861
1862         ret = exynos_drm_set_possible_crtcs(encoder, EXYNOS_DISPLAY_TYPE_HDMI);
1863         if (ret < 0)
1864                 return ret;
1865
1866         crtc = exynos_drm_crtc_get_by_type(drm_dev, EXYNOS_DISPLAY_TYPE_HDMI);
1867         if (IS_ERR(crtc))
1868                 return PTR_ERR(crtc);
1869         crtc->pipe_clk = &hdata->phy_clk;
1870
1871         ret = hdmi_create_connector(encoder);
1872         if (ret) {
1873                 DRM_DEV_ERROR(dev, "failed to create connector ret = %d\n",
1874                               ret);
1875                 drm_encoder_cleanup(encoder);
1876                 return ret;
1877         }
1878
1879         return 0;
1880 }
1881
1882 static void hdmi_unbind(struct device *dev, struct device *master, void *data)
1883 {
1884 }
1885
1886 static const struct component_ops hdmi_component_ops = {
1887         .bind   = hdmi_bind,
1888         .unbind = hdmi_unbind,
1889 };
1890
1891 static int hdmi_get_ddc_adapter(struct hdmi_context *hdata)
1892 {
1893         const char *compatible_str = "samsung,exynos4210-hdmiddc";
1894         struct device_node *np;
1895         struct i2c_adapter *adpt;
1896
1897         np = of_find_compatible_node(NULL, NULL, compatible_str);
1898         if (np)
1899                 np = of_get_next_parent(np);
1900         else
1901                 np = of_parse_phandle(hdata->dev->of_node, "ddc", 0);
1902
1903         if (!np) {
1904                 DRM_DEV_ERROR(hdata->dev,
1905                               "Failed to find ddc node in device tree\n");
1906                 return -ENODEV;
1907         }
1908
1909         adpt = of_find_i2c_adapter_by_node(np);
1910         of_node_put(np);
1911
1912         if (!adpt) {
1913                 DRM_INFO("Failed to get ddc i2c adapter by node\n");
1914                 return -EPROBE_DEFER;
1915         }
1916
1917         hdata->ddc_adpt = adpt;
1918
1919         return 0;
1920 }
1921
1922 static int hdmi_get_phy_io(struct hdmi_context *hdata)
1923 {
1924         const char *compatible_str = "samsung,exynos4212-hdmiphy";
1925         struct device_node *np __free(device_node) =
1926                 of_find_compatible_node(NULL, NULL, compatible_str);
1927
1928         if (!np) {
1929                 np = of_parse_phandle(hdata->dev->of_node, "phy", 0);
1930                 if (!np) {
1931                         DRM_DEV_ERROR(hdata->dev,
1932                                       "Failed to find hdmiphy node in device tree\n");
1933                         return -ENODEV;
1934                 }
1935         }
1936
1937         if (hdata->drv_data->is_apb_phy) {
1938                 hdata->regs_hdmiphy = of_iomap(np, 0);
1939                 if (!hdata->regs_hdmiphy) {
1940                         DRM_DEV_ERROR(hdata->dev,
1941                                       "failed to ioremap hdmi phy\n");
1942                         return -ENOMEM;
1943                 }
1944         } else {
1945                 hdata->hdmiphy_port = of_find_i2c_device_by_node(np);
1946                 if (!hdata->hdmiphy_port) {
1947                         DRM_INFO("Failed to get hdmi phy i2c client\n");
1948                         return -EPROBE_DEFER;
1949                 }
1950         }
1951
1952         return 0;
1953 }
1954
1955 static int hdmi_probe(struct platform_device *pdev)
1956 {
1957         struct hdmi_audio_infoframe *audio_infoframe;
1958         struct device *dev = &pdev->dev;
1959         struct hdmi_context *hdata;
1960         int ret;
1961
1962         hdata = devm_kzalloc(dev, sizeof(struct hdmi_context), GFP_KERNEL);
1963         if (!hdata)
1964                 return -ENOMEM;
1965
1966         hdata->drv_data = of_device_get_match_data(dev);
1967
1968         platform_set_drvdata(pdev, hdata);
1969
1970         hdata->dev = dev;
1971
1972         mutex_init(&hdata->mutex);
1973
1974         ret = hdmi_resources_init(hdata);
1975         if (ret) {
1976                 if (ret != -EPROBE_DEFER)
1977                         DRM_DEV_ERROR(dev, "hdmi_resources_init failed\n");
1978                 return ret;
1979         }
1980
1981         hdata->regs = devm_platform_ioremap_resource(pdev, 0);
1982         if (IS_ERR(hdata->regs)) {
1983                 ret = PTR_ERR(hdata->regs);
1984                 return ret;
1985         }
1986
1987         ret = hdmi_get_ddc_adapter(hdata);
1988         if (ret)
1989                 return ret;
1990
1991         ret = hdmi_get_phy_io(hdata);
1992         if (ret)
1993                 goto err_ddc;
1994
1995         INIT_DELAYED_WORK(&hdata->hotplug_work, hdmi_hotplug_work_func);
1996
1997         ret = devm_request_threaded_irq(dev, hdata->irq, NULL,
1998                         hdmi_irq_thread, IRQF_TRIGGER_RISING |
1999                         IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
2000                         "hdmi", hdata);
2001         if (ret) {
2002                 DRM_DEV_ERROR(dev, "failed to register hdmi interrupt\n");
2003                 goto err_hdmiphy;
2004         }
2005
2006         hdata->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node,
2007                         "samsung,syscon-phandle");
2008         if (IS_ERR(hdata->pmureg)) {
2009                 DRM_DEV_ERROR(dev, "syscon regmap lookup failed.\n");
2010                 ret = -EPROBE_DEFER;
2011                 goto err_hdmiphy;
2012         }
2013
2014         if (hdata->drv_data->has_sysreg) {
2015                 hdata->sysreg = syscon_regmap_lookup_by_phandle(dev->of_node,
2016                                 "samsung,sysreg-phandle");
2017                 if (IS_ERR(hdata->sysreg)) {
2018                         DRM_DEV_ERROR(dev, "sysreg regmap lookup failed.\n");
2019                         ret = -EPROBE_DEFER;
2020                         goto err_hdmiphy;
2021                 }
2022         }
2023
2024         if (!IS_ERR(hdata->reg_hdmi_en)) {
2025                 ret = regulator_enable(hdata->reg_hdmi_en);
2026                 if (ret) {
2027                         DRM_DEV_ERROR(dev,
2028                               "failed to enable hdmi-en regulator\n");
2029                         goto err_hdmiphy;
2030                 }
2031         }
2032
2033         pm_runtime_enable(dev);
2034
2035         audio_infoframe = &hdata->audio.infoframe;
2036         hdmi_audio_infoframe_init(audio_infoframe);
2037         audio_infoframe->coding_type = HDMI_AUDIO_CODING_TYPE_STREAM;
2038         audio_infoframe->sample_size = HDMI_AUDIO_SAMPLE_SIZE_STREAM;
2039         audio_infoframe->sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM;
2040         audio_infoframe->channels = 2;
2041
2042         ret = hdmi_register_audio_device(hdata);
2043         if (ret)
2044                 goto err_rpm_disable;
2045
2046         ret = component_add(&pdev->dev, &hdmi_component_ops);
2047         if (ret)
2048                 goto err_unregister_audio;
2049
2050         return ret;
2051
2052 err_unregister_audio:
2053         platform_device_unregister(hdata->audio.pdev);
2054
2055 err_rpm_disable:
2056         pm_runtime_disable(dev);
2057         if (!IS_ERR(hdata->reg_hdmi_en))
2058                 regulator_disable(hdata->reg_hdmi_en);
2059 err_hdmiphy:
2060         if (hdata->hdmiphy_port)
2061                 put_device(&hdata->hdmiphy_port->dev);
2062         if (hdata->regs_hdmiphy)
2063                 iounmap(hdata->regs_hdmiphy);
2064 err_ddc:
2065         put_device(&hdata->ddc_adpt->dev);
2066
2067         return ret;
2068 }
2069
2070 static void hdmi_remove(struct platform_device *pdev)
2071 {
2072         struct hdmi_context *hdata = platform_get_drvdata(pdev);
2073
2074         cancel_delayed_work_sync(&hdata->hotplug_work);
2075
2076         component_del(&pdev->dev, &hdmi_component_ops);
2077         platform_device_unregister(hdata->audio.pdev);
2078
2079         pm_runtime_disable(&pdev->dev);
2080
2081         if (!IS_ERR(hdata->reg_hdmi_en))
2082                 regulator_disable(hdata->reg_hdmi_en);
2083
2084         if (hdata->hdmiphy_port)
2085                 put_device(&hdata->hdmiphy_port->dev);
2086
2087         if (hdata->regs_hdmiphy)
2088                 iounmap(hdata->regs_hdmiphy);
2089
2090         put_device(&hdata->ddc_adpt->dev);
2091
2092         mutex_destroy(&hdata->mutex);
2093 }
2094
2095 static int __maybe_unused exynos_hdmi_suspend(struct device *dev)
2096 {
2097         struct hdmi_context *hdata = dev_get_drvdata(dev);
2098
2099         hdmi_clk_disable_gates(hdata);
2100
2101         return 0;
2102 }
2103
2104 static int __maybe_unused exynos_hdmi_resume(struct device *dev)
2105 {
2106         struct hdmi_context *hdata = dev_get_drvdata(dev);
2107         int ret;
2108
2109         ret = hdmi_clk_enable_gates(hdata);
2110         if (ret < 0)
2111                 return ret;
2112
2113         return 0;
2114 }
2115
2116 static const struct dev_pm_ops exynos_hdmi_pm_ops = {
2117         SET_RUNTIME_PM_OPS(exynos_hdmi_suspend, exynos_hdmi_resume, NULL)
2118         SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
2119                                 pm_runtime_force_resume)
2120 };
2121
2122 struct platform_driver hdmi_driver = {
2123         .probe          = hdmi_probe,
2124         .remove_new     = hdmi_remove,
2125         .driver         = {
2126                 .name   = "exynos-hdmi",
2127                 .pm     = &exynos_hdmi_pm_ops,
2128                 .of_match_table = hdmi_match_types,
2129         },
2130 };