Version:  2.0.40 2.2.26 2.4.37 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0

Linux/drivers/gpu/drm/exynos/exynos_hdmi.c

  1 /*
  2  * Copyright (C) 2011 Samsung Electronics Co.Ltd
  3  * Authors:
  4  * Seung-Woo Kim <sw0312.kim@samsung.com>
  5  *      Inki Dae <inki.dae@samsung.com>
  6  *      Joonyoung Shim <jy0922.shim@samsung.com>
  7  *
  8  * Based on drivers/media/video/s5p-tv/hdmi_drv.c
  9  *
 10  * This program is free software; you can redistribute  it and/or modify it
 11  * under  the terms of  the GNU General  Public License as published by the
 12  * Free Software Foundation;  either version 2 of the  License, or (at your
 13  * option) any later version.
 14  *
 15  */
 16 
 17 #include <drm/drmP.h>
 18 #include <drm/drm_edid.h>
 19 #include <drm/drm_crtc_helper.h>
 20 
 21 #include "regs-hdmi.h"
 22 
 23 #include <linux/kernel.h>
 24 #include <linux/spinlock.h>
 25 #include <linux/wait.h>
 26 #include <linux/i2c.h>
 27 #include <linux/platform_device.h>
 28 #include <linux/interrupt.h>
 29 #include <linux/irq.h>
 30 #include <linux/delay.h>
 31 #include <linux/pm_runtime.h>
 32 #include <linux/clk.h>
 33 #include <linux/regulator/consumer.h>
 34 #include <linux/io.h>
 35 #include <linux/of.h>
 36 #include <linux/of_address.h>
 37 #include <linux/of_gpio.h>
 38 #include <linux/hdmi.h>
 39 #include <linux/component.h>
 40 #include <linux/mfd/syscon.h>
 41 #include <linux/regmap.h>
 42 
 43 #include <drm/exynos_drm.h>
 44 
 45 #include "exynos_drm_drv.h"
 46 #include "exynos_drm_crtc.h"
 47 #include "exynos_mixer.h"
 48 
 49 #include <linux/gpio.h>
 50 #include <media/s5p_hdmi.h>
 51 
 52 #define ctx_from_connector(c)   container_of(c, struct hdmi_context, connector)
 53 
 54 #define HOTPLUG_DEBOUNCE_MS             1100
 55 
 56 /* AVI header and aspect ratio */
 57 #define HDMI_AVI_VERSION                0x02
 58 #define HDMI_AVI_LENGTH         0x0D
 59 
 60 /* AUI header info */
 61 #define HDMI_AUI_VERSION        0x01
 62 #define HDMI_AUI_LENGTH 0x0A
 63 #define AVI_SAME_AS_PIC_ASPECT_RATIO 0x8
 64 #define AVI_4_3_CENTER_RATIO    0x9
 65 #define AVI_16_9_CENTER_RATIO   0xa
 66 
 67 enum hdmi_type {
 68         HDMI_TYPE13,
 69         HDMI_TYPE14,
 70 };
 71 
 72 struct hdmi_driver_data {
 73         unsigned int type;
 74         const struct hdmiphy_config *phy_confs;
 75         unsigned int phy_conf_count;
 76         unsigned int is_apb_phy:1;
 77 };
 78 
 79 struct hdmi_resources {
 80         struct clk                      *hdmi;
 81         struct clk                      *sclk_hdmi;
 82         struct clk                      *sclk_pixel;
 83         struct clk                      *sclk_hdmiphy;
 84         struct clk                      *mout_hdmi;
 85         struct regulator_bulk_data      *regul_bulk;
 86         struct regulator                *reg_hdmi_en;
 87         int                             regul_count;
 88 };
 89 
 90 struct hdmi_tg_regs {
 91         u8 cmd[1];
 92         u8 h_fsz[2];
 93         u8 hact_st[2];
 94         u8 hact_sz[2];
 95         u8 v_fsz[2];
 96         u8 vsync[2];
 97         u8 vsync2[2];
 98         u8 vact_st[2];
 99         u8 vact_sz[2];
100         u8 field_chg[2];
101         u8 vact_st2[2];
102         u8 vact_st3[2];
103         u8 vact_st4[2];
104         u8 vsync_top_hdmi[2];
105         u8 vsync_bot_hdmi[2];
106         u8 field_top_hdmi[2];
107         u8 field_bot_hdmi[2];
108         u8 tg_3d[1];
109 };
110 
111 struct hdmi_v13_core_regs {
112         u8 h_blank[2];
113         u8 v_blank[3];
114         u8 h_v_line[3];
115         u8 vsync_pol[1];
116         u8 int_pro_mode[1];
117         u8 v_blank_f[3];
118         u8 h_sync_gen[3];
119         u8 v_sync_gen1[3];
120         u8 v_sync_gen2[3];
121         u8 v_sync_gen3[3];
122 };
123 
124 struct hdmi_v14_core_regs {
125         u8 h_blank[2];
126         u8 v2_blank[2];
127         u8 v1_blank[2];
128         u8 v_line[2];
129         u8 h_line[2];
130         u8 hsync_pol[1];
131         u8 vsync_pol[1];
132         u8 int_pro_mode[1];
133         u8 v_blank_f0[2];
134         u8 v_blank_f1[2];
135         u8 h_sync_start[2];
136         u8 h_sync_end[2];
137         u8 v_sync_line_bef_2[2];
138         u8 v_sync_line_bef_1[2];
139         u8 v_sync_line_aft_2[2];
140         u8 v_sync_line_aft_1[2];
141         u8 v_sync_line_aft_pxl_2[2];
142         u8 v_sync_line_aft_pxl_1[2];
143         u8 v_blank_f2[2]; /* for 3D mode */
144         u8 v_blank_f3[2]; /* for 3D mode */
145         u8 v_blank_f4[2]; /* for 3D mode */
146         u8 v_blank_f5[2]; /* for 3D mode */
147         u8 v_sync_line_aft_3[2];
148         u8 v_sync_line_aft_4[2];
149         u8 v_sync_line_aft_5[2];
150         u8 v_sync_line_aft_6[2];
151         u8 v_sync_line_aft_pxl_3[2];
152         u8 v_sync_line_aft_pxl_4[2];
153         u8 v_sync_line_aft_pxl_5[2];
154         u8 v_sync_line_aft_pxl_6[2];
155         u8 vact_space_1[2];
156         u8 vact_space_2[2];
157         u8 vact_space_3[2];
158         u8 vact_space_4[2];
159         u8 vact_space_5[2];
160         u8 vact_space_6[2];
161 };
162 
163 struct hdmi_v13_conf {
164         struct hdmi_v13_core_regs core;
165         struct hdmi_tg_regs tg;
166 };
167 
168 struct hdmi_v14_conf {
169         struct hdmi_v14_core_regs core;
170         struct hdmi_tg_regs tg;
171 };
172 
173 struct hdmi_conf_regs {
174         int pixel_clock;
175         int cea_video_id;
176         enum hdmi_picture_aspect aspect_ratio;
177         union {
178                 struct hdmi_v13_conf v13_conf;
179                 struct hdmi_v14_conf v14_conf;
180         } conf;
181 };
182 
183 struct hdmi_context {
184         struct exynos_drm_display       display;
185         struct device                   *dev;
186         struct drm_device               *drm_dev;
187         struct drm_connector            connector;
188         struct drm_encoder              *encoder;
189         bool                            hpd;
190         bool                            powered;
191         bool                            dvi_mode;
192         struct mutex                    hdmi_mutex;
193 
194         void __iomem                    *regs;
195         int                             irq;
196         struct delayed_work             hotplug_work;
197 
198         struct i2c_adapter              *ddc_adpt;
199         struct i2c_client               *hdmiphy_port;
200 
201         /* current hdmiphy conf regs */
202         struct drm_display_mode         current_mode;
203         struct hdmi_conf_regs           mode_conf;
204 
205         struct hdmi_resources           res;
206 
207         int                             hpd_gpio;
208         void __iomem                    *regs_hdmiphy;
209         const struct hdmiphy_config             *phy_confs;
210         unsigned int                    phy_conf_count;
211 
212         struct regmap                   *pmureg;
213         enum hdmi_type                  type;
214 };
215 
216 static inline struct hdmi_context *display_to_hdmi(struct exynos_drm_display *d)
217 {
218         return container_of(d, struct hdmi_context, display);
219 }
220 
221 struct hdmiphy_config {
222         int pixel_clock;
223         u8 conf[32];
224 };
225 
226 /* list of phy config settings */
227 static const struct hdmiphy_config hdmiphy_v13_configs[] = {
228         {
229                 .pixel_clock = 27000000,
230                 .conf = {
231                         0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
232                         0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
233                         0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
234                         0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
235                 },
236         },
237         {
238                 .pixel_clock = 27027000,
239                 .conf = {
240                         0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
241                         0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
242                         0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
243                         0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
244                 },
245         },
246         {
247                 .pixel_clock = 74176000,
248                 .conf = {
249                         0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
250                         0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
251                         0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
252                         0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x00,
253                 },
254         },
255         {
256                 .pixel_clock = 74250000,
257                 .conf = {
258                         0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
259                         0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
260                         0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0,
261                         0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x00,
262                 },
263         },
264         {
265                 .pixel_clock = 148500000,
266                 .conf = {
267                         0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
268                         0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
269                         0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
270                         0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x00,
271                 },
272         },
273 };
274 
275 static const struct hdmiphy_config hdmiphy_v14_configs[] = {
276         {
277                 .pixel_clock = 25200000,
278                 .conf = {
279                         0x01, 0x51, 0x2A, 0x75, 0x40, 0x01, 0x00, 0x08,
280                         0x82, 0x80, 0xfc, 0xd8, 0x45, 0xa0, 0xac, 0x80,
281                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
282                         0x54, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
283                 },
284         },
285         {
286                 .pixel_clock = 27000000,
287                 .conf = {
288                         0x01, 0xd1, 0x22, 0x51, 0x40, 0x08, 0xfc, 0x20,
289                         0x98, 0xa0, 0xcb, 0xd8, 0x45, 0xa0, 0xac, 0x80,
290                         0x06, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
291                         0x54, 0xe4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
292                 },
293         },
294         {
295                 .pixel_clock = 27027000,
296                 .conf = {
297                         0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08,
298                         0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
299                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
300                         0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00,
301                 },
302         },
303         {
304                 .pixel_clock = 36000000,
305                 .conf = {
306                         0x01, 0x51, 0x2d, 0x55, 0x40, 0x01, 0x00, 0x08,
307                         0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
308                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
309                         0x54, 0xab, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
310                 },
311         },
312         {
313                 .pixel_clock = 40000000,
314                 .conf = {
315                         0x01, 0x51, 0x32, 0x55, 0x40, 0x01, 0x00, 0x08,
316                         0x82, 0x80, 0x2c, 0xd9, 0x45, 0xa0, 0xac, 0x80,
317                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
318                         0x54, 0x9a, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
319                 },
320         },
321         {
322                 .pixel_clock = 65000000,
323                 .conf = {
324                         0x01, 0xd1, 0x36, 0x34, 0x40, 0x1e, 0x0a, 0x08,
325                         0x82, 0xa0, 0x45, 0xd9, 0x45, 0xa0, 0xac, 0x80,
326                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
327                         0x54, 0xbd, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
328                 },
329         },
330         {
331                 .pixel_clock = 71000000,
332                 .conf = {
333                         0x01, 0xd1, 0x3b, 0x35, 0x40, 0x0c, 0x04, 0x08,
334                         0x85, 0xa0, 0x63, 0xd9, 0x45, 0xa0, 0xac, 0x80,
335                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
336                         0x54, 0xad, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
337                 },
338         },
339         {
340                 .pixel_clock = 73250000,
341                 .conf = {
342                         0x01, 0xd1, 0x3d, 0x35, 0x40, 0x18, 0x02, 0x08,
343                         0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
344                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
345                         0x54, 0xa8, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
346                 },
347         },
348         {
349                 .pixel_clock = 74176000,
350                 .conf = {
351                         0x01, 0xd1, 0x3e, 0x35, 0x40, 0x5b, 0xde, 0x08,
352                         0x82, 0xa0, 0x73, 0xd9, 0x45, 0xa0, 0xac, 0x80,
353                         0x56, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
354                         0x54, 0xa6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
355                 },
356         },
357         {
358                 .pixel_clock = 74250000,
359                 .conf = {
360                         0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08,
361                         0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
362                         0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
363                         0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00,
364                 },
365         },
366         {
367                 .pixel_clock = 83500000,
368                 .conf = {
369                         0x01, 0xd1, 0x23, 0x11, 0x40, 0x0c, 0xfb, 0x08,
370                         0x85, 0xa0, 0xd1, 0xd8, 0x45, 0xa0, 0xac, 0x80,
371                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
372                         0x54, 0x93, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
373                 },
374         },
375         {
376                 .pixel_clock = 106500000,
377                 .conf = {
378                         0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08,
379                         0x84, 0xa0, 0x0a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
380                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
381                         0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
382                 },
383         },
384         {
385                 .pixel_clock = 108000000,
386                 .conf = {
387                         0x01, 0x51, 0x2d, 0x15, 0x40, 0x01, 0x00, 0x08,
388                         0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
389                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
390                         0x54, 0xc7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
391                 },
392         },
393         {
394                 .pixel_clock = 115500000,
395                 .conf = {
396                         0x01, 0xd1, 0x30, 0x12, 0x40, 0x40, 0x10, 0x08,
397                         0x80, 0x80, 0x21, 0xd9, 0x45, 0xa0, 0xac, 0x80,
398                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
399                         0x54, 0xaa, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
400                 },
401         },
402         {
403                 .pixel_clock = 119000000,
404                 .conf = {
405                         0x01, 0xd1, 0x32, 0x1a, 0x40, 0x30, 0xd8, 0x08,
406                         0x04, 0xa0, 0x2a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
407                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
408                         0x54, 0x9d, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
409                 },
410         },
411         {
412                 .pixel_clock = 146250000,
413                 .conf = {
414                         0x01, 0xd1, 0x3d, 0x15, 0x40, 0x18, 0xfd, 0x08,
415                         0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
416                         0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
417                         0x54, 0x50, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
418                 },
419         },
420         {
421                 .pixel_clock = 148500000,
422                 .conf = {
423                         0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08,
424                         0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
425                         0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
426                         0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x00,
427                 },
428         },
429 };
430 
431 static const struct hdmiphy_config hdmiphy_5420_configs[] = {
432         {
433                 .pixel_clock = 25200000,
434                 .conf = {
435                         0x01, 0x52, 0x3F, 0x55, 0x40, 0x01, 0x00, 0xC8,
436                         0x82, 0xC8, 0xBD, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
437                         0x06, 0x80, 0x01, 0x84, 0x05, 0x02, 0x24, 0x66,
438                         0x54, 0xF4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
439                 },
440         },
441         {
442                 .pixel_clock = 27000000,
443                 .conf = {
444                         0x01, 0xD1, 0x22, 0x51, 0x40, 0x08, 0xFC, 0xE0,
445                         0x98, 0xE8, 0xCB, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
446                         0x06, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
447                         0x54, 0xE4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
448                 },
449         },
450         {
451                 .pixel_clock = 27027000,
452                 .conf = {
453                         0x01, 0xD1, 0x2D, 0x72, 0x40, 0x64, 0x12, 0xC8,
454                         0x43, 0xE8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
455                         0x26, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
456                         0x54, 0xE3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
457                 },
458         },
459         {
460                 .pixel_clock = 36000000,
461                 .conf = {
462                         0x01, 0x51, 0x2D, 0x55, 0x40, 0x40, 0x00, 0xC8,
463                         0x02, 0xC8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
464                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
465                         0x54, 0xAB, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
466                 },
467         },
468         {
469                 .pixel_clock = 40000000,
470                 .conf = {
471                         0x01, 0xD1, 0x21, 0x31, 0x40, 0x3C, 0x28, 0xC8,
472                         0x87, 0xE8, 0xC8, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
473                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
474                         0x54, 0x9A, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
475                 },
476         },
477         {
478                 .pixel_clock = 65000000,
479                 .conf = {
480                         0x01, 0xD1, 0x36, 0x34, 0x40, 0x0C, 0x04, 0xC8,
481                         0x82, 0xE8, 0x45, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
482                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
483                         0x54, 0xBD, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
484                 },
485         },
486         {
487                 .pixel_clock = 71000000,
488                 .conf = {
489                         0x01, 0xD1, 0x3B, 0x35, 0x40, 0x0C, 0x04, 0xC8,
490                         0x85, 0xE8, 0x63, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
491                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
492                         0x54, 0x57, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
493                 },
494         },
495         {
496                 .pixel_clock = 73250000,
497                 .conf = {
498                         0x01, 0xD1, 0x1F, 0x10, 0x40, 0x78, 0x8D, 0xC8,
499                         0x81, 0xE8, 0xB7, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
500                         0x56, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
501                         0x54, 0xA8, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
502                 },
503         },
504         {
505                 .pixel_clock = 74176000,
506                 .conf = {
507                         0x01, 0xD1, 0x1F, 0x10, 0x40, 0x5B, 0xEF, 0xC8,
508                         0x81, 0xE8, 0xB9, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
509                         0x56, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
510                         0x54, 0xA6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
511                 },
512         },
513         {
514                 .pixel_clock = 74250000,
515                 .conf = {
516                         0x01, 0xD1, 0x1F, 0x10, 0x40, 0x40, 0xF8, 0x08,
517                         0x81, 0xE8, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
518                         0x26, 0x80, 0x09, 0x84, 0x05, 0x22, 0x24, 0x66,
519                         0x54, 0xA5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
520                 },
521         },
522         {
523                 .pixel_clock = 83500000,
524                 .conf = {
525                         0x01, 0xD1, 0x23, 0x11, 0x40, 0x0C, 0xFB, 0xC8,
526                         0x85, 0xE8, 0xD1, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
527                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
528                         0x54, 0x4A, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
529                 },
530         },
531         {
532                 .pixel_clock = 88750000,
533                 .conf = {
534                         0x01, 0xD1, 0x25, 0x11, 0x40, 0x18, 0xFF, 0xC8,
535                         0x83, 0xE8, 0xDE, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
536                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
537                         0x54, 0x45, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
538                 },
539         },
540         {
541                 .pixel_clock = 106500000,
542                 .conf = {
543                         0x01, 0xD1, 0x2C, 0x12, 0x40, 0x0C, 0x09, 0xC8,
544                         0x84, 0xE8, 0x0A, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
545                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
546                         0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
547                 },
548         },
549         {
550                 .pixel_clock = 108000000,
551                 .conf = {
552                         0x01, 0x51, 0x2D, 0x15, 0x40, 0x01, 0x00, 0xC8,
553                         0x82, 0xC8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
554                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
555                         0x54, 0xC7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
556                 },
557         },
558         {
559                 .pixel_clock = 115500000,
560                 .conf = {
561                         0x01, 0xD1, 0x30, 0x14, 0x40, 0x0C, 0x03, 0xC8,
562                         0x88, 0xE8, 0x21, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
563                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
564                         0x54, 0x6A, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
565                 },
566         },
567         {
568                 .pixel_clock = 146250000,
569                 .conf = {
570                         0x01, 0xD1, 0x3D, 0x15, 0x40, 0x18, 0xFD, 0xC8,
571                         0x83, 0xE8, 0x6E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
572                         0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
573                         0x54, 0x54, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
574                 },
575         },
576         {
577                 .pixel_clock = 148500000,
578                 .conf = {
579                         0x01, 0xD1, 0x1F, 0x00, 0x40, 0x40, 0xF8, 0x08,
580                         0x81, 0xE8, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
581                         0x26, 0x80, 0x09, 0x84, 0x05, 0x22, 0x24, 0x66,
582                         0x54, 0x4B, 0x25, 0x03, 0x00, 0x80, 0x01, 0x80,
583                 },
584         },
585 };
586 
587 static struct hdmi_driver_data exynos5420_hdmi_driver_data = {
588         .type           = HDMI_TYPE14,
589         .phy_confs      = hdmiphy_5420_configs,
590         .phy_conf_count = ARRAY_SIZE(hdmiphy_5420_configs),
591         .is_apb_phy     = 1,
592 };
593 
594 static struct hdmi_driver_data exynos4212_hdmi_driver_data = {
595         .type           = HDMI_TYPE14,
596         .phy_confs      = hdmiphy_v14_configs,
597         .phy_conf_count = ARRAY_SIZE(hdmiphy_v14_configs),
598         .is_apb_phy     = 0,
599 };
600 
601 static struct hdmi_driver_data exynos4210_hdmi_driver_data = {
602         .type           = HDMI_TYPE13,
603         .phy_confs      = hdmiphy_v13_configs,
604         .phy_conf_count = ARRAY_SIZE(hdmiphy_v13_configs),
605         .is_apb_phy     = 0,
606 };
607 
608 static struct hdmi_driver_data exynos5_hdmi_driver_data = {
609         .type           = HDMI_TYPE14,
610         .phy_confs      = hdmiphy_v13_configs,
611         .phy_conf_count = ARRAY_SIZE(hdmiphy_v13_configs),
612         .is_apb_phy     = 0,
613 };
614 
615 static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id)
616 {
617         return readl(hdata->regs + reg_id);
618 }
619 
620 static inline void hdmi_reg_writeb(struct hdmi_context *hdata,
621                                  u32 reg_id, u8 value)
622 {
623         writeb(value, hdata->regs + reg_id);
624 }
625 
626 static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
627                                  u32 reg_id, u32 value, u32 mask)
628 {
629         u32 old = readl(hdata->regs + reg_id);
630         value = (value & mask) | (old & ~mask);
631         writel(value, hdata->regs + reg_id);
632 }
633 
634 static int hdmiphy_reg_writeb(struct hdmi_context *hdata,
635                         u32 reg_offset, u8 value)
636 {
637         if (hdata->hdmiphy_port) {
638                 u8 buffer[2];
639                 int ret;
640 
641                 buffer[0] = reg_offset;
642                 buffer[1] = value;
643 
644                 ret = i2c_master_send(hdata->hdmiphy_port, buffer, 2);
645                 if (ret == 2)
646                         return 0;
647                 return ret;
648         } else {
649                 writeb(value, hdata->regs_hdmiphy + (reg_offset<<2));
650                 return 0;
651         }
652 }
653 
654 static int hdmiphy_reg_write_buf(struct hdmi_context *hdata,
655                         u32 reg_offset, const u8 *buf, u32 len)
656 {
657         if ((reg_offset + len) > 32)
658                 return -EINVAL;
659 
660         if (hdata->hdmiphy_port) {
661                 int ret;
662 
663                 ret = i2c_master_send(hdata->hdmiphy_port, buf, len);
664                 if (ret == len)
665                         return 0;
666                 return ret;
667         } else {
668                 int i;
669                 for (i = 0; i < len; i++)
670                         writeb(buf[i], hdata->regs_hdmiphy +
671                                 ((reg_offset + i)<<2));
672                 return 0;
673         }
674 }
675 
676 static void hdmi_v13_regs_dump(struct hdmi_context *hdata, char *prefix)
677 {
678 #define DUMPREG(reg_id) \
679         DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
680         readl(hdata->regs + reg_id))
681         DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
682         DUMPREG(HDMI_INTC_FLAG);
683         DUMPREG(HDMI_INTC_CON);
684         DUMPREG(HDMI_HPD_STATUS);
685         DUMPREG(HDMI_V13_PHY_RSTOUT);
686         DUMPREG(HDMI_V13_PHY_VPLL);
687         DUMPREG(HDMI_V13_PHY_CMU);
688         DUMPREG(HDMI_V13_CORE_RSTOUT);
689 
690         DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
691         DUMPREG(HDMI_CON_0);
692         DUMPREG(HDMI_CON_1);
693         DUMPREG(HDMI_CON_2);
694         DUMPREG(HDMI_SYS_STATUS);
695         DUMPREG(HDMI_V13_PHY_STATUS);
696         DUMPREG(HDMI_STATUS_EN);
697         DUMPREG(HDMI_HPD);
698         DUMPREG(HDMI_MODE_SEL);
699         DUMPREG(HDMI_V13_HPD_GEN);
700         DUMPREG(HDMI_V13_DC_CONTROL);
701         DUMPREG(HDMI_V13_VIDEO_PATTERN_GEN);
702 
703         DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
704         DUMPREG(HDMI_H_BLANK_0);
705         DUMPREG(HDMI_H_BLANK_1);
706         DUMPREG(HDMI_V13_V_BLANK_0);
707         DUMPREG(HDMI_V13_V_BLANK_1);
708         DUMPREG(HDMI_V13_V_BLANK_2);
709         DUMPREG(HDMI_V13_H_V_LINE_0);
710         DUMPREG(HDMI_V13_H_V_LINE_1);
711         DUMPREG(HDMI_V13_H_V_LINE_2);
712         DUMPREG(HDMI_VSYNC_POL);
713         DUMPREG(HDMI_INT_PRO_MODE);
714         DUMPREG(HDMI_V13_V_BLANK_F_0);
715         DUMPREG(HDMI_V13_V_BLANK_F_1);
716         DUMPREG(HDMI_V13_V_BLANK_F_2);
717         DUMPREG(HDMI_V13_H_SYNC_GEN_0);
718         DUMPREG(HDMI_V13_H_SYNC_GEN_1);
719         DUMPREG(HDMI_V13_H_SYNC_GEN_2);
720         DUMPREG(HDMI_V13_V_SYNC_GEN_1_0);
721         DUMPREG(HDMI_V13_V_SYNC_GEN_1_1);
722         DUMPREG(HDMI_V13_V_SYNC_GEN_1_2);
723         DUMPREG(HDMI_V13_V_SYNC_GEN_2_0);
724         DUMPREG(HDMI_V13_V_SYNC_GEN_2_1);
725         DUMPREG(HDMI_V13_V_SYNC_GEN_2_2);
726         DUMPREG(HDMI_V13_V_SYNC_GEN_3_0);
727         DUMPREG(HDMI_V13_V_SYNC_GEN_3_1);
728         DUMPREG(HDMI_V13_V_SYNC_GEN_3_2);
729 
730         DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
731         DUMPREG(HDMI_TG_CMD);
732         DUMPREG(HDMI_TG_H_FSZ_L);
733         DUMPREG(HDMI_TG_H_FSZ_H);
734         DUMPREG(HDMI_TG_HACT_ST_L);
735         DUMPREG(HDMI_TG_HACT_ST_H);
736         DUMPREG(HDMI_TG_HACT_SZ_L);
737         DUMPREG(HDMI_TG_HACT_SZ_H);
738         DUMPREG(HDMI_TG_V_FSZ_L);
739         DUMPREG(HDMI_TG_V_FSZ_H);
740         DUMPREG(HDMI_TG_VSYNC_L);
741         DUMPREG(HDMI_TG_VSYNC_H);
742         DUMPREG(HDMI_TG_VSYNC2_L);
743         DUMPREG(HDMI_TG_VSYNC2_H);
744         DUMPREG(HDMI_TG_VACT_ST_L);
745         DUMPREG(HDMI_TG_VACT_ST_H);
746         DUMPREG(HDMI_TG_VACT_SZ_L);
747         DUMPREG(HDMI_TG_VACT_SZ_H);
748         DUMPREG(HDMI_TG_FIELD_CHG_L);
749         DUMPREG(HDMI_TG_FIELD_CHG_H);
750         DUMPREG(HDMI_TG_VACT_ST2_L);
751         DUMPREG(HDMI_TG_VACT_ST2_H);
752         DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
753         DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
754         DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
755         DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
756         DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
757         DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
758         DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
759         DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
760 #undef DUMPREG
761 }
762 
763 static void hdmi_v14_regs_dump(struct hdmi_context *hdata, char *prefix)
764 {
765         int i;
766 
767 #define DUMPREG(reg_id) \
768         DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
769         readl(hdata->regs + reg_id))
770 
771         DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
772         DUMPREG(HDMI_INTC_CON);
773         DUMPREG(HDMI_INTC_FLAG);
774         DUMPREG(HDMI_HPD_STATUS);
775         DUMPREG(HDMI_INTC_CON_1);
776         DUMPREG(HDMI_INTC_FLAG_1);
777         DUMPREG(HDMI_PHY_STATUS_0);
778         DUMPREG(HDMI_PHY_STATUS_PLL);
779         DUMPREG(HDMI_PHY_CON_0);
780         DUMPREG(HDMI_PHY_RSTOUT);
781         DUMPREG(HDMI_PHY_VPLL);
782         DUMPREG(HDMI_PHY_CMU);
783         DUMPREG(HDMI_CORE_RSTOUT);
784 
785         DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
786         DUMPREG(HDMI_CON_0);
787         DUMPREG(HDMI_CON_1);
788         DUMPREG(HDMI_CON_2);
789         DUMPREG(HDMI_SYS_STATUS);
790         DUMPREG(HDMI_PHY_STATUS_0);
791         DUMPREG(HDMI_STATUS_EN);
792         DUMPREG(HDMI_HPD);
793         DUMPREG(HDMI_MODE_SEL);
794         DUMPREG(HDMI_ENC_EN);
795         DUMPREG(HDMI_DC_CONTROL);
796         DUMPREG(HDMI_VIDEO_PATTERN_GEN);
797 
798         DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
799         DUMPREG(HDMI_H_BLANK_0);
800         DUMPREG(HDMI_H_BLANK_1);
801         DUMPREG(HDMI_V2_BLANK_0);
802         DUMPREG(HDMI_V2_BLANK_1);
803         DUMPREG(HDMI_V1_BLANK_0);
804         DUMPREG(HDMI_V1_BLANK_1);
805         DUMPREG(HDMI_V_LINE_0);
806         DUMPREG(HDMI_V_LINE_1);
807         DUMPREG(HDMI_H_LINE_0);
808         DUMPREG(HDMI_H_LINE_1);
809         DUMPREG(HDMI_HSYNC_POL);
810 
811         DUMPREG(HDMI_VSYNC_POL);
812         DUMPREG(HDMI_INT_PRO_MODE);
813         DUMPREG(HDMI_V_BLANK_F0_0);
814         DUMPREG(HDMI_V_BLANK_F0_1);
815         DUMPREG(HDMI_V_BLANK_F1_0);
816         DUMPREG(HDMI_V_BLANK_F1_1);
817 
818         DUMPREG(HDMI_H_SYNC_START_0);
819         DUMPREG(HDMI_H_SYNC_START_1);
820         DUMPREG(HDMI_H_SYNC_END_0);
821         DUMPREG(HDMI_H_SYNC_END_1);
822 
823         DUMPREG(HDMI_V_SYNC_LINE_BEF_2_0);
824         DUMPREG(HDMI_V_SYNC_LINE_BEF_2_1);
825         DUMPREG(HDMI_V_SYNC_LINE_BEF_1_0);
826         DUMPREG(HDMI_V_SYNC_LINE_BEF_1_1);
827 
828         DUMPREG(HDMI_V_SYNC_LINE_AFT_2_0);
829         DUMPREG(HDMI_V_SYNC_LINE_AFT_2_1);
830         DUMPREG(HDMI_V_SYNC_LINE_AFT_1_0);
831         DUMPREG(HDMI_V_SYNC_LINE_AFT_1_1);
832 
833         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_0);
834         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_1);
835         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_0);
836         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_1);
837 
838         DUMPREG(HDMI_V_BLANK_F2_0);
839         DUMPREG(HDMI_V_BLANK_F2_1);
840         DUMPREG(HDMI_V_BLANK_F3_0);
841         DUMPREG(HDMI_V_BLANK_F3_1);
842         DUMPREG(HDMI_V_BLANK_F4_0);
843         DUMPREG(HDMI_V_BLANK_F4_1);
844         DUMPREG(HDMI_V_BLANK_F5_0);
845         DUMPREG(HDMI_V_BLANK_F5_1);
846 
847         DUMPREG(HDMI_V_SYNC_LINE_AFT_3_0);
848         DUMPREG(HDMI_V_SYNC_LINE_AFT_3_1);
849         DUMPREG(HDMI_V_SYNC_LINE_AFT_4_0);
850         DUMPREG(HDMI_V_SYNC_LINE_AFT_4_1);
851         DUMPREG(HDMI_V_SYNC_LINE_AFT_5_0);
852         DUMPREG(HDMI_V_SYNC_LINE_AFT_5_1);
853         DUMPREG(HDMI_V_SYNC_LINE_AFT_6_0);
854         DUMPREG(HDMI_V_SYNC_LINE_AFT_6_1);
855 
856         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_0);
857         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_1);
858         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_0);
859         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_1);
860         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_0);
861         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_1);
862         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_0);
863         DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_1);
864 
865         DUMPREG(HDMI_VACT_SPACE_1_0);
866         DUMPREG(HDMI_VACT_SPACE_1_1);
867         DUMPREG(HDMI_VACT_SPACE_2_0);
868         DUMPREG(HDMI_VACT_SPACE_2_1);
869         DUMPREG(HDMI_VACT_SPACE_3_0);
870         DUMPREG(HDMI_VACT_SPACE_3_1);
871         DUMPREG(HDMI_VACT_SPACE_4_0);
872         DUMPREG(HDMI_VACT_SPACE_4_1);
873         DUMPREG(HDMI_VACT_SPACE_5_0);
874         DUMPREG(HDMI_VACT_SPACE_5_1);
875         DUMPREG(HDMI_VACT_SPACE_6_0);
876         DUMPREG(HDMI_VACT_SPACE_6_1);
877 
878         DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
879         DUMPREG(HDMI_TG_CMD);
880         DUMPREG(HDMI_TG_H_FSZ_L);
881         DUMPREG(HDMI_TG_H_FSZ_H);
882         DUMPREG(HDMI_TG_HACT_ST_L);
883         DUMPREG(HDMI_TG_HACT_ST_H);
884         DUMPREG(HDMI_TG_HACT_SZ_L);
885         DUMPREG(HDMI_TG_HACT_SZ_H);
886         DUMPREG(HDMI_TG_V_FSZ_L);
887         DUMPREG(HDMI_TG_V_FSZ_H);
888         DUMPREG(HDMI_TG_VSYNC_L);
889         DUMPREG(HDMI_TG_VSYNC_H);
890         DUMPREG(HDMI_TG_VSYNC2_L);
891         DUMPREG(HDMI_TG_VSYNC2_H);
892         DUMPREG(HDMI_TG_VACT_ST_L);
893         DUMPREG(HDMI_TG_VACT_ST_H);
894         DUMPREG(HDMI_TG_VACT_SZ_L);
895         DUMPREG(HDMI_TG_VACT_SZ_H);
896         DUMPREG(HDMI_TG_FIELD_CHG_L);
897         DUMPREG(HDMI_TG_FIELD_CHG_H);
898         DUMPREG(HDMI_TG_VACT_ST2_L);
899         DUMPREG(HDMI_TG_VACT_ST2_H);
900         DUMPREG(HDMI_TG_VACT_ST3_L);
901         DUMPREG(HDMI_TG_VACT_ST3_H);
902         DUMPREG(HDMI_TG_VACT_ST4_L);
903         DUMPREG(HDMI_TG_VACT_ST4_H);
904         DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
905         DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
906         DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
907         DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
908         DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
909         DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
910         DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
911         DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
912         DUMPREG(HDMI_TG_3D);
913 
914         DRM_DEBUG_KMS("%s: ---- PACKET REGISTERS ----\n", prefix);
915         DUMPREG(HDMI_AVI_CON);
916         DUMPREG(HDMI_AVI_HEADER0);
917         DUMPREG(HDMI_AVI_HEADER1);
918         DUMPREG(HDMI_AVI_HEADER2);
919         DUMPREG(HDMI_AVI_CHECK_SUM);
920         DUMPREG(HDMI_VSI_CON);
921         DUMPREG(HDMI_VSI_HEADER0);
922         DUMPREG(HDMI_VSI_HEADER1);
923         DUMPREG(HDMI_VSI_HEADER2);
924         for (i = 0; i < 7; ++i)
925                 DUMPREG(HDMI_VSI_DATA(i));
926 
927 #undef DUMPREG
928 }
929 
930 static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
931 {
932         if (hdata->type == HDMI_TYPE13)
933                 hdmi_v13_regs_dump(hdata, prefix);
934         else
935                 hdmi_v14_regs_dump(hdata, prefix);
936 }
937 
938 static u8 hdmi_chksum(struct hdmi_context *hdata,
939                         u32 start, u8 len, u32 hdr_sum)
940 {
941         int i;
942 
943         /* hdr_sum : header0 + header1 + header2
944         * start : start address of packet byte1
945         * len : packet bytes - 1 */
946         for (i = 0; i < len; ++i)
947                 hdr_sum += 0xff & hdmi_reg_read(hdata, start + i * 4);
948 
949         /* return 2's complement of 8 bit hdr_sum */
950         return (u8)(~(hdr_sum & 0xff) + 1);
951 }
952 
953 static void hdmi_reg_infoframe(struct hdmi_context *hdata,
954                         union hdmi_infoframe *infoframe)
955 {
956         u32 hdr_sum;
957         u8 chksum;
958         u32 mod;
959         u32 vic;
960 
961         mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
962         if (hdata->dvi_mode) {
963                 hdmi_reg_writeb(hdata, HDMI_VSI_CON,
964                                 HDMI_VSI_CON_DO_NOT_TRANSMIT);
965                 hdmi_reg_writeb(hdata, HDMI_AVI_CON,
966                                 HDMI_AVI_CON_DO_NOT_TRANSMIT);
967                 hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN);
968                 return;
969         }
970 
971         switch (infoframe->any.type) {
972         case HDMI_INFOFRAME_TYPE_AVI:
973                 hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC);
974                 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER0, infoframe->any.type);
975                 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER1,
976                                 infoframe->any.version);
977                 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER2, infoframe->any.length);
978                 hdr_sum = infoframe->any.type + infoframe->any.version +
979                           infoframe->any.length;
980 
981                 /* Output format zero hardcoded ,RGB YBCR selection */
982                 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 0 << 5 |
983                         AVI_ACTIVE_FORMAT_VALID |
984                         AVI_UNDERSCANNED_DISPLAY_VALID);
985 
986                 /*
987                  * Set the aspect ratio as per the mode, mentioned in
988                  * Table 9 AVI InfoFrame Data Byte 2 of CEA-861-D Standard
989                  */
990                 switch (hdata->mode_conf.aspect_ratio) {
991                 case HDMI_PICTURE_ASPECT_4_3:
992                         hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2),
993                                         hdata->mode_conf.aspect_ratio |
994                                         AVI_4_3_CENTER_RATIO);
995                         break;
996                 case HDMI_PICTURE_ASPECT_16_9:
997                         hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2),
998                                         hdata->mode_conf.aspect_ratio |
999                                         AVI_16_9_CENTER_RATIO);
1000                         break;
1001                 case HDMI_PICTURE_ASPECT_NONE:
1002                 default:
1003                         hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2),
1004                                         hdata->mode_conf.aspect_ratio |
1005                                         AVI_SAME_AS_PIC_ASPECT_RATIO);
1006                         break;
1007                 }
1008 
1009                 vic = hdata->mode_conf.cea_video_id;
1010                 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), vic);
1011 
1012                 chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1),
1013                                         infoframe->any.length, hdr_sum);
1014                 DRM_DEBUG_KMS("AVI checksum = 0x%x\n", chksum);
1015                 hdmi_reg_writeb(hdata, HDMI_AVI_CHECK_SUM, chksum);
1016                 break;
1017         case HDMI_INFOFRAME_TYPE_AUDIO:
1018                 hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02);
1019                 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER0, infoframe->any.type);
1020                 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER1,
1021                                 infoframe->any.version);
1022                 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER2, infoframe->any.length);
1023                 hdr_sum = infoframe->any.type + infoframe->any.version +
1024                           infoframe->any.length;
1025                 chksum = hdmi_chksum(hdata, HDMI_AUI_BYTE(1),
1026                                         infoframe->any.length, hdr_sum);
1027                 DRM_DEBUG_KMS("AUI checksum = 0x%x\n", chksum);
1028                 hdmi_reg_writeb(hdata, HDMI_AUI_CHECK_SUM, chksum);
1029                 break;
1030         default:
1031                 break;
1032         }
1033 }
1034 
1035 static enum drm_connector_status hdmi_detect(struct drm_connector *connector,
1036                                 bool force)
1037 {
1038         struct hdmi_context *hdata = ctx_from_connector(connector);
1039 
1040         hdata->hpd = gpio_get_value(hdata->hpd_gpio);
1041 
1042         return hdata->hpd ? connector_status_connected :
1043                         connector_status_disconnected;
1044 }
1045 
1046 static void hdmi_connector_destroy(struct drm_connector *connector)
1047 {
1048         drm_connector_unregister(connector);
1049         drm_connector_cleanup(connector);
1050 }
1051 
1052 static struct drm_connector_funcs hdmi_connector_funcs = {
1053         .dpms = drm_helper_connector_dpms,
1054         .fill_modes = drm_helper_probe_single_connector_modes,
1055         .detect = hdmi_detect,
1056         .destroy = hdmi_connector_destroy,
1057 };
1058 
1059 static int hdmi_get_modes(struct drm_connector *connector)
1060 {
1061         struct hdmi_context *hdata = ctx_from_connector(connector);
1062         struct edid *edid;
1063 
1064         if (!hdata->ddc_adpt)
1065                 return -ENODEV;
1066 
1067         edid = drm_get_edid(connector, hdata->ddc_adpt);
1068         if (!edid)
1069                 return -ENODEV;
1070 
1071         hdata->dvi_mode = !drm_detect_hdmi_monitor(edid);
1072         DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
1073                 (hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
1074                 edid->width_cm, edid->height_cm);
1075 
1076         drm_mode_connector_update_edid_property(connector, edid);
1077 
1078         return drm_add_edid_modes(connector, edid);
1079 }
1080 
1081 static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
1082 {
1083         int i;
1084 
1085         for (i = 0; i < hdata->phy_conf_count; i++)
1086                 if (hdata->phy_confs[i].pixel_clock == pixel_clock)
1087                         return i;
1088 
1089         DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
1090         return -EINVAL;
1091 }
1092 
1093 static int hdmi_mode_valid(struct drm_connector *connector,
1094                         struct drm_display_mode *mode)
1095 {
1096         struct hdmi_context *hdata = ctx_from_connector(connector);
1097         int ret;
1098 
1099         DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d clock=%d\n",
1100                 mode->hdisplay, mode->vdisplay, mode->vrefresh,
1101                 (mode->flags & DRM_MODE_FLAG_INTERLACE) ? true :
1102                 false, mode->clock * 1000);
1103 
1104         ret = mixer_check_mode(mode);
1105         if (ret)
1106                 return MODE_BAD;
1107 
1108         ret = hdmi_find_phy_conf(hdata, mode->clock * 1000);
1109         if (ret < 0)
1110                 return MODE_BAD;
1111 
1112         return MODE_OK;
1113 }
1114 
1115 static struct drm_encoder *hdmi_best_encoder(struct drm_connector *connector)
1116 {
1117         struct hdmi_context *hdata = ctx_from_connector(connector);
1118 
1119         return hdata->encoder;
1120 }
1121 
1122 static struct drm_connector_helper_funcs hdmi_connector_helper_funcs = {
1123         .get_modes = hdmi_get_modes,
1124         .mode_valid = hdmi_mode_valid,
1125         .best_encoder = hdmi_best_encoder,
1126 };
1127 
1128 static int hdmi_create_connector(struct exynos_drm_display *display,
1129                         struct drm_encoder *encoder)
1130 {
1131         struct hdmi_context *hdata = display_to_hdmi(display);
1132         struct drm_connector *connector = &hdata->connector;
1133         int ret;
1134 
1135         hdata->encoder = encoder;
1136         connector->interlace_allowed = true;
1137         connector->polled = DRM_CONNECTOR_POLL_HPD;
1138 
1139         ret = drm_connector_init(hdata->drm_dev, connector,
1140                         &hdmi_connector_funcs, DRM_MODE_CONNECTOR_HDMIA);
1141         if (ret) {
1142                 DRM_ERROR("Failed to initialize connector with drm\n");
1143                 return ret;
1144         }
1145 
1146         drm_connector_helper_add(connector, &hdmi_connector_helper_funcs);
1147         drm_connector_register(connector);
1148         drm_mode_connector_attach_encoder(connector, encoder);
1149 
1150         return 0;
1151 }
1152 
1153 static void hdmi_mode_fixup(struct exynos_drm_display *display,
1154                                 struct drm_connector *connector,
1155                                 const struct drm_display_mode *mode,
1156                                 struct drm_display_mode *adjusted_mode)
1157 {
1158         struct drm_display_mode *m;
1159         int mode_ok;
1160 
1161         DRM_DEBUG_KMS("%s\n", __FILE__);
1162 
1163         drm_mode_set_crtcinfo(adjusted_mode, 0);
1164 
1165         mode_ok = hdmi_mode_valid(connector, adjusted_mode);
1166 
1167         /* just return if user desired mode exists. */
1168         if (mode_ok == MODE_OK)
1169                 return;
1170 
1171         /*
1172          * otherwise, find the most suitable mode among modes and change it
1173          * to adjusted_mode.
1174          */
1175         list_for_each_entry(m, &connector->modes, head) {
1176                 mode_ok = hdmi_mode_valid(connector, m);
1177 
1178                 if (mode_ok == MODE_OK) {
1179                         DRM_INFO("desired mode doesn't exist so\n");
1180                         DRM_INFO("use the most suitable mode among modes.\n");
1181 
1182                         DRM_DEBUG_KMS("Adjusted Mode: [%d]x[%d] [%d]Hz\n",
1183                                 m->hdisplay, m->vdisplay, m->vrefresh);
1184 
1185                         drm_mode_copy(adjusted_mode, m);
1186                         break;
1187                 }
1188         }
1189 }
1190 
1191 static void hdmi_set_acr(u32 freq, u8 *acr)
1192 {
1193         u32 n, cts;
1194 
1195         switch (freq) {
1196         case 32000:
1197                 n = 4096;
1198                 cts = 27000;
1199                 break;
1200         case 44100:
1201                 n = 6272;
1202                 cts = 30000;
1203                 break;
1204         case 88200:
1205                 n = 12544;
1206                 cts = 30000;
1207                 break;
1208         case 176400:
1209                 n = 25088;
1210                 cts = 30000;
1211                 break;
1212         case 48000:
1213                 n = 6144;
1214                 cts = 27000;
1215                 break;
1216         case 96000:
1217                 n = 12288;
1218                 cts = 27000;
1219                 break;
1220         case 192000:
1221                 n = 24576;
1222                 cts = 27000;
1223                 break;
1224         default:
1225                 n = 0;
1226                 cts = 0;
1227                 break;
1228         }
1229 
1230         acr[1] = cts >> 16;
1231         acr[2] = cts >> 8 & 0xff;
1232         acr[3] = cts & 0xff;
1233 
1234         acr[4] = n >> 16;
1235         acr[5] = n >> 8 & 0xff;
1236         acr[6] = n & 0xff;
1237 }
1238 
1239 static void hdmi_reg_acr(struct hdmi_context *hdata, u8 *acr)
1240 {
1241         hdmi_reg_writeb(hdata, HDMI_ACR_N0, acr[6]);
1242         hdmi_reg_writeb(hdata, HDMI_ACR_N1, acr[5]);
1243         hdmi_reg_writeb(hdata, HDMI_ACR_N2, acr[4]);
1244         hdmi_reg_writeb(hdata, HDMI_ACR_MCTS0, acr[3]);
1245         hdmi_reg_writeb(hdata, HDMI_ACR_MCTS1, acr[2]);
1246         hdmi_reg_writeb(hdata, HDMI_ACR_MCTS2, acr[1]);
1247         hdmi_reg_writeb(hdata, HDMI_ACR_CTS0, acr[3]);
1248         hdmi_reg_writeb(hdata, HDMI_ACR_CTS1, acr[2]);
1249         hdmi_reg_writeb(hdata, HDMI_ACR_CTS2, acr[1]);
1250 
1251         if (hdata->type == HDMI_TYPE13)
1252                 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 4);
1253         else
1254                 hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
1255 }
1256 
1257 static void hdmi_audio_init(struct hdmi_context *hdata)
1258 {
1259         u32 sample_rate, bits_per_sample;
1260         u32 data_num, bit_ch, sample_frq;
1261         u32 val;
1262         u8 acr[7];
1263 
1264         sample_rate = 44100;
1265         bits_per_sample = 16;
1266 
1267         switch (bits_per_sample) {
1268         case 20:
1269                 data_num = 2;
1270                 bit_ch  = 1;
1271                 break;
1272         case 24:
1273                 data_num = 3;
1274                 bit_ch  = 1;
1275                 break;
1276         default:
1277                 data_num = 1;
1278                 bit_ch  = 0;
1279                 break;
1280         }
1281 
1282         hdmi_set_acr(sample_rate, acr);
1283         hdmi_reg_acr(hdata, acr);
1284 
1285         hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
1286                                 | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
1287                                 | HDMI_I2S_MUX_ENABLE);
1288 
1289         hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
1290                         | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
1291 
1292         hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
1293 
1294         sample_frq = (sample_rate == 44100) ? 0 :
1295                         (sample_rate == 48000) ? 2 :
1296                         (sample_rate == 32000) ? 3 :
1297                         (sample_rate == 96000) ? 0xa : 0x0;
1298 
1299         hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
1300         hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
1301 
1302         val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
1303         hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
1304 
1305         /* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
1306         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
1307                         | HDMI_I2S_SEL_LRCK(6));
1308         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(1)
1309                         | HDMI_I2S_SEL_SDATA2(4));
1310         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
1311                         | HDMI_I2S_SEL_SDATA2(2));
1312         hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
1313 
1314         /* I2S_CON_1 & 2 */
1315         hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
1316                         | HDMI_I2S_L_CH_LOW_POL);
1317         hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
1318                         | HDMI_I2S_SET_BIT_CH(bit_ch)
1319                         | HDMI_I2S_SET_SDATA_BIT(data_num)
1320                         | HDMI_I2S_BASIC_FORMAT);
1321 
1322         /* Configure register related to CUV information */
1323         hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0
1324                         | HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH
1325                         | HDMI_I2S_COPYRIGHT
1326                         | HDMI_I2S_LINEAR_PCM
1327                         | HDMI_I2S_CONSUMER_FORMAT);
1328         hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER);
1329         hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0));
1330         hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2
1331                         | HDMI_I2S_SET_SMP_FREQ(sample_frq));
1332         hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4,
1333                         HDMI_I2S_ORG_SMP_FREQ_44_1
1334                         | HDMI_I2S_WORD_LEN_MAX24_24BITS
1335                         | HDMI_I2S_WORD_LEN_MAX_24BITS);
1336 
1337         hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
1338 }
1339 
1340 static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
1341 {
1342         if (hdata->dvi_mode)
1343                 return;
1344 
1345         hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
1346         hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ?
1347                         HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
1348 }
1349 
1350 static void hdmi_start(struct hdmi_context *hdata, bool start)
1351 {
1352         u32 val = start ? HDMI_TG_EN : 0;
1353 
1354         if (hdata->current_mode.flags & DRM_MODE_FLAG_INTERLACE)
1355                 val |= HDMI_FIELD_EN;
1356 
1357         hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN);
1358         hdmi_reg_writemask(hdata, HDMI_TG_CMD, val, HDMI_TG_EN | HDMI_FIELD_EN);
1359 }
1360 
1361 static void hdmi_conf_init(struct hdmi_context *hdata)
1362 {
1363         union hdmi_infoframe infoframe;
1364 
1365         /* disable HPD interrupts from HDMI IP block, use GPIO instead */
1366         hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
1367                 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
1368 
1369         /* choose HDMI mode */
1370         hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1371                 HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
1372         /* Apply Video preable and Guard band in HDMI mode only */
1373         hdmi_reg_writeb(hdata, HDMI_CON_2, 0);
1374         /* disable bluescreen */
1375         hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
1376 
1377         if (hdata->dvi_mode) {
1378                 /* choose DVI mode */
1379                 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1380                                 HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1381                 hdmi_reg_writeb(hdata, HDMI_CON_2,
1382                                 HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1383         }
1384 
1385         if (hdata->type == HDMI_TYPE13) {
1386                 /* choose bluescreen (fecal) color */
1387                 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
1388                 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
1389                 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1390 
1391                 /* enable AVI packet every vsync, fixes purple line problem */
1392                 hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1393                 /* force RGB, look to CEA-861-D, table 7 for more detail */
1394                 hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1395                 hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1396 
1397                 hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1398                 hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1399                 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1400         } else {
1401                 infoframe.any.type = HDMI_INFOFRAME_TYPE_AVI;
1402                 infoframe.any.version = HDMI_AVI_VERSION;
1403                 infoframe.any.length = HDMI_AVI_LENGTH;
1404                 hdmi_reg_infoframe(hdata, &infoframe);
1405 
1406                 infoframe.any.type = HDMI_INFOFRAME_TYPE_AUDIO;
1407                 infoframe.any.version = HDMI_AUI_VERSION;
1408                 infoframe.any.length = HDMI_AUI_LENGTH;
1409                 hdmi_reg_infoframe(hdata, &infoframe);
1410 
1411                 /* enable AVI packet every vsync, fixes purple line problem */
1412                 hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1413         }
1414 }
1415 
1416 static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
1417 {
1418         const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg;
1419         const struct hdmi_v13_core_regs *core =
1420                 &hdata->mode_conf.conf.v13_conf.core;
1421         int tries;
1422 
1423         /* setting core registers */
1424         hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1425         hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1426         hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_0, core->v_blank[0]);
1427         hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_1, core->v_blank[1]);
1428         hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_2, core->v_blank[2]);
1429         hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_0, core->h_v_line[0]);
1430         hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_1, core->h_v_line[1]);
1431         hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_2, core->h_v_line[2]);
1432         hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1433         hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1434         hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_0, core->v_blank_f[0]);
1435         hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_1, core->v_blank_f[1]);
1436         hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_2, core->v_blank_f[2]);
1437         hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_0, core->h_sync_gen[0]);
1438         hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_1, core->h_sync_gen[1]);
1439         hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_2, core->h_sync_gen[2]);
1440         hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_0, core->v_sync_gen1[0]);
1441         hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_1, core->v_sync_gen1[1]);
1442         hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_2, core->v_sync_gen1[2]);
1443         hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_0, core->v_sync_gen2[0]);
1444         hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_1, core->v_sync_gen2[1]);
1445         hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_2, core->v_sync_gen2[2]);
1446         hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_0, core->v_sync_gen3[0]);
1447         hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_1, core->v_sync_gen3[1]);
1448         hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_2, core->v_sync_gen3[2]);
1449         /* Timing generator registers */
1450         hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1451         hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1452         hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1453         hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1454         hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1455         hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1456         hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1457         hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1458         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1459         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1460         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1461         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1462         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1463         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1464         hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1465         hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1466         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1467         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1468         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1469         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1470         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1471         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1472         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1473         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1474         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1475         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1476         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1477         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1478 
1479         /* waiting for HDMIPHY's PLL to get to steady state */
1480         for (tries = 100; tries; --tries) {
1481                 u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
1482                 if (val & HDMI_PHY_STATUS_READY)
1483                         break;
1484                 usleep_range(1000, 2000);
1485         }
1486         /* steady state not achieved */
1487         if (tries == 0) {
1488                 DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1489                 hdmi_regs_dump(hdata, "timing apply");
1490         }
1491 
1492         clk_disable_unprepare(hdata->res.sclk_hdmi);
1493         clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_hdmiphy);
1494         clk_prepare_enable(hdata->res.sclk_hdmi);
1495 
1496         /* enable HDMI and timing generator */
1497         hdmi_start(hdata, true);
1498 }
1499 
1500 static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
1501 {
1502         const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg;
1503         const struct hdmi_v14_core_regs *core =
1504                 &hdata->mode_conf.conf.v14_conf.core;
1505         int tries;
1506 
1507         /* setting core registers */
1508         hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1509         hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1510         hdmi_reg_writeb(hdata, HDMI_V2_BLANK_0, core->v2_blank[0]);
1511         hdmi_reg_writeb(hdata, HDMI_V2_BLANK_1, core->v2_blank[1]);
1512         hdmi_reg_writeb(hdata, HDMI_V1_BLANK_0, core->v1_blank[0]);
1513         hdmi_reg_writeb(hdata, HDMI_V1_BLANK_1, core->v1_blank[1]);
1514         hdmi_reg_writeb(hdata, HDMI_V_LINE_0, core->v_line[0]);
1515         hdmi_reg_writeb(hdata, HDMI_V_LINE_1, core->v_line[1]);
1516         hdmi_reg_writeb(hdata, HDMI_H_LINE_0, core->h_line[0]);
1517         hdmi_reg_writeb(hdata, HDMI_H_LINE_1, core->h_line[1]);
1518         hdmi_reg_writeb(hdata, HDMI_HSYNC_POL, core->hsync_pol[0]);
1519         hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1520         hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1521         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_0, core->v_blank_f0[0]);
1522         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_1, core->v_blank_f0[1]);
1523         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_0, core->v_blank_f1[0]);
1524         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_1, core->v_blank_f1[1]);
1525         hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_0, core->h_sync_start[0]);
1526         hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_1, core->h_sync_start[1]);
1527         hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_0, core->h_sync_end[0]);
1528         hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_1, core->h_sync_end[1]);
1529         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_0,
1530                         core->v_sync_line_bef_2[0]);
1531         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_1,
1532                         core->v_sync_line_bef_2[1]);
1533         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_0,
1534                         core->v_sync_line_bef_1[0]);
1535         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_1,
1536                         core->v_sync_line_bef_1[1]);
1537         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_0,
1538                         core->v_sync_line_aft_2[0]);
1539         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_1,
1540                         core->v_sync_line_aft_2[1]);
1541         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_0,
1542                         core->v_sync_line_aft_1[0]);
1543         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_1,
1544                         core->v_sync_line_aft_1[1]);
1545         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0,
1546                         core->v_sync_line_aft_pxl_2[0]);
1547         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_1,
1548                         core->v_sync_line_aft_pxl_2[1]);
1549         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0,
1550                         core->v_sync_line_aft_pxl_1[0]);
1551         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_1,
1552                         core->v_sync_line_aft_pxl_1[1]);
1553         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_0, core->v_blank_f2[0]);
1554         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_1, core->v_blank_f2[1]);
1555         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_0, core->v_blank_f3[0]);
1556         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_1, core->v_blank_f3[1]);
1557         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_0, core->v_blank_f4[0]);
1558         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_1, core->v_blank_f4[1]);
1559         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_0, core->v_blank_f5[0]);
1560         hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_1, core->v_blank_f5[1]);
1561         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_0,
1562                         core->v_sync_line_aft_3[0]);
1563         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_1,
1564                         core->v_sync_line_aft_3[1]);
1565         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_0,
1566                         core->v_sync_line_aft_4[0]);
1567         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_1,
1568                         core->v_sync_line_aft_4[1]);
1569         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_0,
1570                         core->v_sync_line_aft_5[0]);
1571         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_1,
1572                         core->v_sync_line_aft_5[1]);
1573         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_0,
1574                         core->v_sync_line_aft_6[0]);
1575         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_1,
1576                         core->v_sync_line_aft_6[1]);
1577         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0,
1578                         core->v_sync_line_aft_pxl_3[0]);
1579         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_1,
1580                         core->v_sync_line_aft_pxl_3[1]);
1581         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0,
1582                         core->v_sync_line_aft_pxl_4[0]);
1583         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_1,
1584                         core->v_sync_line_aft_pxl_4[1]);
1585         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0,
1586                         core->v_sync_line_aft_pxl_5[0]);
1587         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_1,
1588                         core->v_sync_line_aft_pxl_5[1]);
1589         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0,
1590                         core->v_sync_line_aft_pxl_6[0]);
1591         hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_1,
1592                         core->v_sync_line_aft_pxl_6[1]);
1593         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_0, core->vact_space_1[0]);
1594         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_1, core->vact_space_1[1]);
1595         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_0, core->vact_space_2[0]);
1596         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_1, core->vact_space_2[1]);
1597         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_0, core->vact_space_3[0]);
1598         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_1, core->vact_space_3[1]);
1599         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_0, core->vact_space_4[0]);
1600         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_1, core->vact_space_4[1]);
1601         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_0, core->vact_space_5[0]);
1602         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_1, core->vact_space_5[1]);
1603         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_0, core->vact_space_6[0]);
1604         hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_1, core->vact_space_6[1]);
1605 
1606         /* Timing generator registers */
1607         hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1608         hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1609         hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1610         hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1611         hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1612         hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1613         hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1614         hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1615         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1616         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1617         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1618         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1619         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1620         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1621         hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1622         hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1623         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1624         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1625         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1626         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1627         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_L, tg->vact_st3[0]);
1628         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_H, tg->vact_st3[1]);
1629         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_L, tg->vact_st4[0]);
1630         hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_H, tg->vact_st4[1]);
1631         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1632         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1633         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1634         hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1635         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1636         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1637         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1638         hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1639         hdmi_reg_writeb(hdata, HDMI_TG_3D, tg->tg_3d[0]);
1640 
1641         /* waiting for HDMIPHY's PLL to get to steady state */
1642         for (tries = 100; tries; --tries) {
1643                 u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
1644                 if (val & HDMI_PHY_STATUS_READY)
1645                         break;
1646                 usleep_range(1000, 2000);
1647         }
1648         /* steady state not achieved */
1649         if (tries == 0) {
1650                 DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1651                 hdmi_regs_dump(hdata, "timing apply");
1652         }
1653 
1654         clk_disable_unprepare(hdata->res.sclk_hdmi);
1655         clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_hdmiphy);
1656         clk_prepare_enable(hdata->res.sclk_hdmi);
1657 
1658         /* enable HDMI and timing generator */
1659         hdmi_start(hdata, true);
1660 }
1661 
1662 static void hdmi_mode_apply(struct hdmi_context *hdata)
1663 {
1664         if (hdata->type == HDMI_TYPE13)
1665                 hdmi_v13_mode_apply(hdata);
1666         else
1667                 hdmi_v14_mode_apply(hdata);
1668 }
1669 
1670 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1671 {
1672         u32 reg;
1673 
1674         clk_disable_unprepare(hdata->res.sclk_hdmi);
1675         clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_pixel);
1676         clk_prepare_enable(hdata->res.sclk_hdmi);
1677 
1678         /* operation mode */
1679         hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1680                                 HDMI_PHY_ENABLE_MODE_SET);
1681 
1682         if (hdata->type == HDMI_TYPE13)
1683                 reg = HDMI_V13_PHY_RSTOUT;
1684         else
1685                 reg = HDMI_PHY_RSTOUT;
1686 
1687         /* reset hdmiphy */
1688         hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
1689         usleep_range(10000, 12000);
1690         hdmi_reg_writemask(hdata, reg,  0, HDMI_PHY_SW_RSTOUT);
1691         usleep_range(10000, 12000);
1692 }
1693 
1694 static void hdmiphy_poweron(struct hdmi_context *hdata)
1695 {
1696         if (hdata->type != HDMI_TYPE14)
1697                 return;
1698 
1699         DRM_DEBUG_KMS("\n");
1700 
1701         /* For PHY Mode Setting */
1702         hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1703                                 HDMI_PHY_ENABLE_MODE_SET);
1704         /* Phy Power On */
1705         hdmiphy_reg_writeb(hdata, HDMIPHY_POWER,
1706                                 HDMI_PHY_POWER_ON);
1707         /* For PHY Mode Setting */
1708         hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1709                                 HDMI_PHY_DISABLE_MODE_SET);
1710         /* PHY SW Reset */
1711         hdmiphy_conf_reset(hdata);
1712 }
1713 
1714 static void hdmiphy_poweroff(struct hdmi_context *hdata)
1715 {
1716         if (hdata->type != HDMI_TYPE14)
1717                 return;
1718 
1719         DRM_DEBUG_KMS("\n");
1720 
1721         /* PHY SW Reset */
1722         hdmiphy_conf_reset(hdata);
1723         /* For PHY Mode Setting */
1724         hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1725                                 HDMI_PHY_ENABLE_MODE_SET);
1726 
1727         /* PHY Power Off */
1728         hdmiphy_reg_writeb(hdata, HDMIPHY_POWER,
1729                                 HDMI_PHY_POWER_OFF);
1730 
1731         /* For PHY Mode Setting */
1732         hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1733                                 HDMI_PHY_DISABLE_MODE_SET);
1734 }
1735 
1736 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1737 {
1738         int ret;
1739         int i;
1740 
1741         /* pixel clock */
1742         i = hdmi_find_phy_conf(hdata, hdata->mode_conf.pixel_clock);
1743         if (i < 0) {
1744                 DRM_ERROR("failed to find hdmiphy conf\n");
1745                 return;
1746         }
1747 
1748         ret = hdmiphy_reg_write_buf(hdata, 0, hdata->phy_confs[i].conf, 32);
1749         if (ret) {
1750                 DRM_ERROR("failed to configure hdmiphy\n");
1751                 return;
1752         }
1753 
1754         usleep_range(10000, 12000);
1755 
1756         ret = hdmiphy_reg_writeb(hdata, HDMIPHY_MODE_SET_DONE,
1757                                 HDMI_PHY_DISABLE_MODE_SET);
1758         if (ret) {
1759                 DRM_ERROR("failed to enable hdmiphy\n");
1760                 return;
1761         }
1762 
1763 }
1764 
1765 static void hdmi_conf_apply(struct hdmi_context *hdata)
1766 {
1767         hdmiphy_conf_reset(hdata);
1768         hdmiphy_conf_apply(hdata);
1769 
1770         mutex_lock(&hdata->hdmi_mutex);
1771         hdmi_start(hdata, false);
1772         hdmi_conf_init(hdata);
1773         mutex_unlock(&hdata->hdmi_mutex);
1774 
1775         hdmi_audio_init(hdata);
1776 
1777         /* setting core registers */
1778         hdmi_mode_apply(hdata);
1779         hdmi_audio_control(hdata, true);
1780 
1781         hdmi_regs_dump(hdata, "start");
1782 }
1783 
1784 static void hdmi_set_reg(u8 *reg_pair, int num_bytes, u32 value)
1785 {
1786         int i;
1787         BUG_ON(num_bytes > 4);
1788         for (i = 0; i < num_bytes; i++)
1789                 reg_pair[i] = (value >> (8 * i)) & 0xff;
1790 }
1791 
1792 static void hdmi_v13_mode_set(struct hdmi_context *hdata,
1793                         struct drm_display_mode *m)
1794 {
1795         struct hdmi_v13_core_regs *core = &hdata->mode_conf.conf.v13_conf.core;
1796         struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg;
1797         unsigned int val;
1798 
1799         hdata->mode_conf.cea_video_id =
1800                 drm_match_cea_mode((struct drm_display_mode *)m);
1801         hdata->mode_conf.pixel_clock = m->clock * 1000;
1802         hdata->mode_conf.aspect_ratio = m->picture_aspect_ratio;
1803 
1804         hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1805         hdmi_set_reg(core->h_v_line, 3, (m->htotal << 12) | m->vtotal);
1806 
1807         val = (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0;
1808         hdmi_set_reg(core->vsync_pol, 1, val);
1809 
1810         val = (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0;
1811         hdmi_set_reg(core->int_pro_mode, 1, val);
1812 
1813         val = (m->hsync_start - m->hdisplay - 2);
1814         val |= ((m->hsync_end - m->hdisplay - 2) << 10);
1815         val |= ((m->flags & DRM_MODE_FLAG_NHSYNC)  ? 1 : 0)<<20;
1816         hdmi_set_reg(core->h_sync_gen, 3, val);
1817 
1818         /*
1819          * Quirk requirement for exynos HDMI IP design,
1820          * 2 pixels less than the actual calculation for hsync_start
1821          * and end.
1822          */
1823 
1824         /* Following values & calculations differ for different type of modes */
1825         if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1826                 /* Interlaced Mode */
1827                 val = ((m->vsync_end - m->vdisplay) / 2);
1828                 val |= ((m->vsync_start - m->vdisplay) / 2) << 12;
1829                 hdmi_set_reg(core->v_sync_gen1, 3, val);
1830 
1831                 val = m->vtotal / 2;
1832                 val |= ((m->vtotal - m->vdisplay) / 2) << 11;
1833                 hdmi_set_reg(core->v_blank, 3, val);
1834 
1835                 val = (m->vtotal +
1836                         ((m->vsync_end - m->vsync_start) * 4) + 5) / 2;
1837                 val |= m->vtotal << 11;
1838                 hdmi_set_reg(core->v_blank_f, 3, val);
1839 
1840                 val = ((m->vtotal / 2) + 7);
1841                 val |= ((m->vtotal / 2) + 2) << 12;
1842                 hdmi_set_reg(core->v_sync_gen2, 3, val);
1843 
1844                 val = ((m->htotal / 2) + (m->hsync_start - m->hdisplay));
1845                 val |= ((m->htotal / 2) +
1846                         (m->hsync_start - m->hdisplay)) << 12;
1847                 hdmi_set_reg(core->v_sync_gen3, 3, val);
1848 
1849                 hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1850                 hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1851 
1852                 hdmi_set_reg(tg->vact_st2, 2, 0x249);/* Reset value + 1*/
1853         } else {
1854                 /* Progressive Mode */
1855 
1856                 val = m->vtotal;
1857                 val |= (m->vtotal - m->vdisplay) << 11;
1858                 hdmi_set_reg(core->v_blank, 3, val);
1859 
1860                 hdmi_set_reg(core->v_blank_f, 3, 0);
1861 
1862                 val = (m->vsync_end - m->vdisplay);
1863                 val |= ((m->vsync_start - m->vdisplay) << 12);
1864                 hdmi_set_reg(core->v_sync_gen1, 3, val);
1865 
1866                 hdmi_set_reg(core->v_sync_gen2, 3, 0x1001);/* Reset value  */
1867                 hdmi_set_reg(core->v_sync_gen3, 3, 0x1001);/* Reset value  */
1868                 hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1869                 hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1870                 hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1871         }
1872 
1873         /* Timing generator registers */
1874         hdmi_set_reg(tg->cmd, 1, 0x0);
1875         hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1876         hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1877         hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1878         hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1879         hdmi_set_reg(tg->vsync, 2, 0x1);
1880         hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1881         hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1882         hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1883         hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1884         hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1885         hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1886         hdmi_set_reg(tg->tg_3d, 1, 0x0); /* Not used */
1887 }
1888 
1889 static void hdmi_v14_mode_set(struct hdmi_context *hdata,
1890                         struct drm_display_mode *m)
1891 {
1892         struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg;
1893         struct hdmi_v14_core_regs *core =
1894                 &hdata->mode_conf.conf.v14_conf.core;
1895 
1896         hdata->mode_conf.cea_video_id =
1897                 drm_match_cea_mode((struct drm_display_mode *)m);
1898         hdata->mode_conf.pixel_clock = m->clock * 1000;
1899         hdata->mode_conf.aspect_ratio = m->picture_aspect_ratio;
1900 
1901         hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1902         hdmi_set_reg(core->v_line, 2, m->vtotal);
1903         hdmi_set_reg(core->h_line, 2, m->htotal);
1904         hdmi_set_reg(core->hsync_pol, 1,
1905                         (m->flags & DRM_MODE_FLAG_NHSYNC)  ? 1 : 0);
1906         hdmi_set_reg(core->vsync_pol, 1,
1907                         (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1908         hdmi_set_reg(core->int_pro_mode, 1,
1909                         (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1910 
1911         /*
1912          * Quirk requirement for exynos 5 HDMI IP design,
1913          * 2 pixels less than the actual calculation for hsync_start
1914          * and end.
1915          */
1916 
1917         /* Following values & calculations differ for different type of modes */
1918         if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1919                 /* Interlaced Mode */
1920                 hdmi_set_reg(core->v_sync_line_bef_2, 2,
1921                         (m->vsync_end - m->vdisplay) / 2);
1922                 hdmi_set_reg(core->v_sync_line_bef_1, 2,
1923                         (m->vsync_start - m->vdisplay) / 2);
1924                 hdmi_set_reg(core->v2_blank, 2, m->vtotal / 2);
1925                 hdmi_set_reg(core->v1_blank, 2, (m->vtotal - m->vdisplay) / 2);
1926                 hdmi_set_reg(core->v_blank_f0, 2, m->vtotal - m->vdisplay / 2);
1927                 hdmi_set_reg(core->v_blank_f1, 2, m->vtotal);
1928                 hdmi_set_reg(core->v_sync_line_aft_2, 2, (m->vtotal / 2) + 7);
1929                 hdmi_set_reg(core->v_sync_line_aft_1, 2, (m->vtotal / 2) + 2);
1930                 hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2,
1931                         (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1932                 hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2,
1933                         (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1934                 hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1935                 hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1936                 hdmi_set_reg(tg->vact_st2, 2, m->vtotal - m->vdisplay / 2);
1937                 hdmi_set_reg(tg->vsync2, 2, (m->vtotal / 2) + 1);
1938                 hdmi_set_reg(tg->vsync_bot_hdmi, 2, (m->vtotal / 2) + 1);
1939                 hdmi_set_reg(tg->field_bot_hdmi, 2, (m->vtotal / 2) + 1);
1940                 hdmi_set_reg(tg->vact_st3, 2, 0x0);
1941                 hdmi_set_reg(tg->vact_st4, 2, 0x0);
1942         } else {
1943                 /* Progressive Mode */
1944                 hdmi_set_reg(core->v_sync_line_bef_2, 2,
1945                         m->vsync_end - m->vdisplay);
1946                 hdmi_set_reg(core->v_sync_line_bef_1, 2,
1947                         m->vsync_start - m->vdisplay);
1948                 hdmi_set_reg(core->v2_blank, 2, m->vtotal);
1949                 hdmi_set_reg(core->v1_blank, 2, m->vtotal - m->vdisplay);
1950                 hdmi_set_reg(core->v_blank_f0, 2, 0xffff);
1951                 hdmi_set_reg(core->v_blank_f1, 2, 0xffff);
1952                 hdmi_set_reg(core->v_sync_line_aft_2, 2, 0xffff);
1953                 hdmi_set_reg(core->v_sync_line_aft_1, 2, 0xffff);
1954                 hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2, 0xffff);
1955                 hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2, 0xffff);
1956                 hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1957                 hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1958                 hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1959                 hdmi_set_reg(tg->vact_st3, 2, 0x47b); /* Reset value */
1960                 hdmi_set_reg(tg->vact_st4, 2, 0x6ae); /* Reset value */
1961                 hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1962                 hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1963                 hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1964         }
1965 
1966         /* Following values & calculations are same irrespective of mode type */
1967         hdmi_set_reg(core->h_sync_start, 2, m->hsync_start - m->hdisplay - 2);
1968         hdmi_set_reg(core->h_sync_end, 2, m->hsync_end - m->hdisplay - 2);
1969         hdmi_set_reg(core->vact_space_1, 2, 0xffff);
1970         hdmi_set_reg(core->vact_space_2, 2, 0xffff);
1971         hdmi_set_reg(core->vact_space_3, 2, 0xffff);
1972         hdmi_set_reg(core->vact_space_4, 2, 0xffff);
1973         hdmi_set_reg(core->vact_space_5, 2, 0xffff);
1974         hdmi_set_reg(core->vact_space_6, 2, 0xffff);
1975         hdmi_set_reg(core->v_blank_f2, 2, 0xffff);
1976         hdmi_set_reg(core->v_blank_f3, 2, 0xffff);
1977         hdmi_set_reg(core->v_blank_f4, 2, 0xffff);
1978         hdmi_set_reg(core->v_blank_f5, 2, 0xffff);
1979         hdmi_set_reg(core->v_sync_line_aft_3, 2, 0xffff);
1980         hdmi_set_reg(core->v_sync_line_aft_4, 2, 0xffff);
1981         hdmi_set_reg(core->v_sync_line_aft_5, 2, 0xffff);
1982         hdmi_set_reg(core->v_sync_line_aft_6, 2, 0xffff);
1983         hdmi_set_reg(core->v_sync_line_aft_pxl_3, 2, 0xffff);
1984         hdmi_set_reg(core->v_sync_line_aft_pxl_4, 2, 0xffff);
1985         hdmi_set_reg(core->v_sync_line_aft_pxl_5, 2, 0xffff);
1986         hdmi_set_reg(core->v_sync_line_aft_pxl_6, 2, 0xffff);
1987 
1988         /* Timing generator registers */
1989         hdmi_set_reg(tg->cmd, 1, 0x0);
1990         hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1991         hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1992         hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1993         hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1994         hdmi_set_reg(tg->vsync, 2, 0x1);
1995         hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1996         hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1997         hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1998         hdmi_set_reg(tg->tg_3d, 1, 0x0);
1999 }
2000 
2001 static void hdmi_mode_set(struct exynos_drm_display *display,
2002                         struct drm_display_mode *mode)
2003 {
2004         struct hdmi_context *hdata = display_to_hdmi(display);
2005         struct drm_display_mode *m = mode;
2006 
2007         DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%s\n",
2008                 m->hdisplay, m->vdisplay,
2009                 m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ?
2010                 "INTERLACED" : "PROGERESSIVE");
2011 
2012         /* preserve mode information for later use. */
2013         drm_mode_copy(&hdata->current_mode, mode);
2014 
2015         if (hdata->type == HDMI_TYPE13)
2016                 hdmi_v13_mode_set(hdata, mode);
2017         else
2018                 hdmi_v14_mode_set(hdata, mode);
2019 }
2020 
2021 static void hdmi_commit(struct exynos_drm_display *display)
2022 {
2023         struct hdmi_context *hdata = display_to_hdmi(display);
2024 
2025         mutex_lock(&hdata->hdmi_mutex);
2026         if (!hdata->powered) {
2027                 mutex_unlock(&hdata->hdmi_mutex);
2028                 return;
2029         }
2030         mutex_unlock(&hdata->hdmi_mutex);
2031 
2032         hdmi_conf_apply(hdata);
2033 }
2034 
2035 static void hdmi_poweron(struct hdmi_context *hdata)
2036 {
2037         struct hdmi_resources *res = &hdata->res;
2038 
2039         mutex_lock(&hdata->hdmi_mutex);
2040         if (hdata->powered) {
2041                 mutex_unlock(&hdata->hdmi_mutex);
2042                 return;
2043         }
2044 
2045         hdata->powered = true;
2046 
2047         mutex_unlock(&hdata->hdmi_mutex);
2048 
2049         pm_runtime_get_sync(hdata->dev);
2050 
2051         if (regulator_bulk_enable(res->regul_count, res->regul_bulk))
2052                 DRM_DEBUG_KMS("failed to enable regulator bulk\n");
2053 
2054         /* set pmu hdmiphy control bit to enable hdmiphy */
2055         regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
2056                         PMU_HDMI_PHY_ENABLE_BIT, 1);
2057 
2058         clk_prepare_enable(res->hdmi);
2059         clk_prepare_enable(res->sclk_hdmi);
2060 
2061         hdmiphy_poweron(hdata);
2062         hdmi_commit(&hdata->display);
2063 }
2064 
2065 static void hdmi_poweroff(struct hdmi_context *hdata)
2066 {
2067         struct hdmi_resources *res = &hdata->res;
2068 
2069         mutex_lock(&hdata->hdmi_mutex);
2070         if (!hdata->powered)
2071                 goto out;
2072         mutex_unlock(&hdata->hdmi_mutex);
2073 
2074         /* HDMI System Disable */
2075         hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN);
2076 
2077         hdmiphy_poweroff(hdata);
2078 
2079         cancel_delayed_work(&hdata->hotplug_work);
2080 
2081         clk_disable_unprepare(res->sclk_hdmi);
2082         clk_disable_unprepare(res->hdmi);
2083 
2084         /* reset pmu hdmiphy control bit to disable hdmiphy */
2085         regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
2086                         PMU_HDMI_PHY_ENABLE_BIT, 0);
2087 
2088         regulator_bulk_disable(res->regul_count, res->regul_bulk);
2089 
2090         pm_runtime_put_sync(hdata->dev);
2091 
2092         mutex_lock(&hdata->hdmi_mutex);
2093         hdata->powered = false;
2094 
2095 out:
2096         mutex_unlock(&hdata->hdmi_mutex);
2097 }
2098 
2099 static void hdmi_dpms(struct exynos_drm_display *display, int mode)
2100 {
2101         struct hdmi_context *hdata = display_to_hdmi(display);
2102         struct drm_encoder *encoder = hdata->encoder;
2103         struct drm_crtc *crtc = encoder->crtc;
2104         struct drm_crtc_helper_funcs *funcs = NULL;
2105 
2106         DRM_DEBUG_KMS("mode %d\n", mode);
2107 
2108         switch (mode) {
2109         case DRM_MODE_DPMS_ON:
2110                 hdmi_poweron(hdata);
2111                 break;
2112         case DRM_MODE_DPMS_STANDBY:
2113         case DRM_MODE_DPMS_SUSPEND:
2114         case DRM_MODE_DPMS_OFF:
2115                 /*
2116                  * The SFRs of VP and Mixer are updated by Vertical Sync of
2117                  * Timing generator which is a part of HDMI so the sequence
2118                  * to disable TV Subsystem should be as following,
2119                  *      VP -> Mixer -> HDMI
2120                  *
2121                  * Below codes will try to disable Mixer and VP(if used)
2122                  * prior to disabling HDMI.
2123                  */
2124                 if (crtc)
2125                         funcs = crtc->helper_private;
2126                 if (funcs && funcs->dpms)
2127                         (*funcs->dpms)(crtc, mode);
2128 
2129                 hdmi_poweroff(hdata);
2130                 break;
2131         default:
2132                 DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
2133                 break;
2134         }
2135 }
2136 
2137 static struct exynos_drm_display_ops hdmi_display_ops = {
2138         .create_connector = hdmi_create_connector,
2139         .mode_fixup     = hdmi_mode_fixup,
2140         .mode_set       = hdmi_mode_set,
2141         .dpms           = hdmi_dpms,
2142         .commit         = hdmi_commit,
2143 };
2144 
2145 static void hdmi_hotplug_work_func(struct work_struct *work)
2146 {
2147         struct hdmi_context *hdata;
2148 
2149         hdata = container_of(work, struct hdmi_context, hotplug_work.work);
2150 
2151         mutex_lock(&hdata->hdmi_mutex);
2152         hdata->hpd = gpio_get_value(hdata->hpd_gpio);
2153         mutex_unlock(&hdata->hdmi_mutex);
2154 
2155         if (hdata->drm_dev)
2156                 drm_helper_hpd_irq_event(hdata->drm_dev);
2157 }
2158 
2159 static irqreturn_t hdmi_irq_thread(int irq, void *arg)
2160 {
2161         struct hdmi_context *hdata = arg;
2162 
2163         mod_delayed_work(system_wq, &hdata->hotplug_work,
2164                         msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS));
2165 
2166         return IRQ_HANDLED;
2167 }
2168 
2169 static int hdmi_resources_init(struct hdmi_context *hdata)
2170 {
2171         struct device *dev = hdata->dev;
2172         struct hdmi_resources *res = &hdata->res;
2173         static char *supply[] = {
2174                 "vdd",
2175                 "vdd_osc",
2176                 "vdd_pll",
2177         };
2178         int i, ret;
2179 
2180         DRM_DEBUG_KMS("HDMI resource init\n");
2181 
2182         /* get clocks, power */
2183         res->hdmi = devm_clk_get(dev, "hdmi");
2184         if (IS_ERR(res->hdmi)) {
2185                 DRM_ERROR("failed to get clock 'hdmi'\n");
2186                 ret = PTR_ERR(res->hdmi);
2187                 goto fail;
2188         }
2189         res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi");
2190         if (IS_ERR(res->sclk_hdmi)) {
2191                 DRM_ERROR("failed to get clock 'sclk_hdmi'\n");
2192                 ret = PTR_ERR(res->sclk_hdmi);
2193                 goto fail;
2194         }
2195         res->sclk_pixel = devm_clk_get(dev, "sclk_pixel");
2196         if (IS_ERR(res->sclk_pixel)) {
2197                 DRM_ERROR("failed to get clock 'sclk_pixel'\n");
2198                 ret = PTR_ERR(res->sclk_pixel);
2199                 goto fail;
2200         }
2201         res->sclk_hdmiphy = devm_clk_get(dev, "sclk_hdmiphy");
2202         if (IS_ERR(res->sclk_hdmiphy)) {
2203                 DRM_ERROR("failed to get clock 'sclk_hdmiphy'\n");
2204                 ret = PTR_ERR(res->sclk_hdmiphy);
2205                 goto fail;
2206         }
2207         res->mout_hdmi = devm_clk_get(dev, "mout_hdmi");
2208         if (IS_ERR(res->mout_hdmi)) {
2209                 DRM_ERROR("failed to get clock 'mout_hdmi'\n");
2210                 ret = PTR_ERR(res->mout_hdmi);
2211                 goto fail;
2212         }
2213 
2214         clk_set_parent(res->mout_hdmi, res->sclk_pixel);
2215 
2216         res->regul_bulk = devm_kzalloc(dev, ARRAY_SIZE(supply) *
2217                 sizeof(res->regul_bulk[0]), GFP_KERNEL);
2218         if (!res->regul_bulk) {
2219                 ret = -ENOMEM;
2220                 goto fail;
2221         }
2222         for (i = 0; i < ARRAY_SIZE(supply); ++i) {
2223                 res->regul_bulk[i].supply = supply[i];
2224                 res->regul_bulk[i].consumer = NULL;
2225         }
2226         ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), res->regul_bulk);
2227         if (ret) {
2228                 DRM_ERROR("failed to get regulators\n");
2229                 return ret;
2230         }
2231         res->regul_count = ARRAY_SIZE(supply);
2232 
2233         res->reg_hdmi_en = devm_regulator_get(dev, "hdmi-en");
2234         if (IS_ERR(res->reg_hdmi_en) && PTR_ERR(res->reg_hdmi_en) != -ENOENT) {
2235                 DRM_ERROR("failed to get hdmi-en regulator\n");
2236                 return PTR_ERR(res->reg_hdmi_en);
2237         }
2238         if (!IS_ERR(res->reg_hdmi_en)) {
2239                 ret = regulator_enable(res->reg_hdmi_en);
2240                 if (ret) {
2241                         DRM_ERROR("failed to enable hdmi-en regulator\n");
2242                         return ret;
2243                 }
2244         } else
2245                 res->reg_hdmi_en = NULL;
2246 
2247         return ret;
2248 fail:
2249         DRM_ERROR("HDMI resource init - failed\n");
2250         return ret;
2251 }
2252 
2253 static struct s5p_hdmi_platform_data *drm_hdmi_dt_parse_pdata
2254                                         (struct device *dev)
2255 {
2256         struct device_node *np = dev->of_node;
2257         struct s5p_hdmi_platform_data *pd;
2258         u32 value;
2259 
2260         pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
2261         if (!pd)
2262                 goto err_data;
2263 
2264         if (!of_find_property(np, "hpd-gpio", &value)) {
2265                 DRM_ERROR("no hpd gpio property found\n");
2266                 goto err_data;
2267         }
2268 
2269         pd->hpd_gpio = of_get_named_gpio(np, "hpd-gpio", 0);
2270 
2271         return pd;
2272 
2273 err_data:
2274         return NULL;
2275 }
2276 
2277 static struct of_device_id hdmi_match_types[] = {
2278         {
2279                 .compatible = "samsung,exynos5-hdmi",
2280                 .data = &exynos5_hdmi_driver_data,
2281         }, {
2282                 .compatible = "samsung,exynos4210-hdmi",
2283                 .data = &exynos4210_hdmi_driver_data,
2284         }, {
2285                 .compatible = "samsung,exynos4212-hdmi",
2286                 .data = &exynos4212_hdmi_driver_data,
2287         }, {
2288                 .compatible = "samsung,exynos5420-hdmi",
2289                 .data = &exynos5420_hdmi_driver_data,
2290         }, {
2291                 /* end node */
2292         }
2293 };
2294 MODULE_DEVICE_TABLE (of, hdmi_match_types);
2295 
2296 static int hdmi_bind(struct device *dev, struct device *master, void *data)
2297 {
2298         struct drm_device *drm_dev = data;
2299         struct hdmi_context *hdata = dev_get_drvdata(dev);
2300 
2301         hdata->drm_dev = drm_dev;
2302 
2303         return exynos_drm_create_enc_conn(drm_dev, &hdata->display);
2304 }
2305 
2306 static void hdmi_unbind(struct device *dev, struct device *master, void *data)
2307 {
2308 }
2309 
2310 static const struct component_ops hdmi_component_ops = {
2311         .bind   = hdmi_bind,
2312         .unbind = hdmi_unbind,
2313 };
2314 
2315 static struct device_node *hdmi_legacy_ddc_dt_binding(struct device *dev)
2316 {
2317         const char *compatible_str = "samsung,exynos4210-hdmiddc";
2318         struct device_node *np;
2319 
2320         np = of_find_compatible_node(NULL, NULL, compatible_str);
2321         if (np)
2322                 return of_get_next_parent(np);
2323 
2324         return NULL;
2325 }
2326 
2327 static struct device_node *hdmi_legacy_phy_dt_binding(struct device *dev)
2328 {
2329         const char *compatible_str = "samsung,exynos4212-hdmiphy";
2330 
2331         return of_find_compatible_node(NULL, NULL, compatible_str);
2332 }
2333 
2334 static int hdmi_probe(struct platform_device *pdev)
2335 {
2336         struct device_node *ddc_node, *phy_node;
2337         struct s5p_hdmi_platform_data *pdata;
2338         struct hdmi_driver_data *drv_data;
2339         const struct of_device_id *match;
2340         struct device *dev = &pdev->dev;
2341         struct hdmi_context *hdata;
2342         struct resource *res;
2343         int ret;
2344 
2345         if (!dev->of_node)
2346                 return -ENODEV;
2347 
2348         pdata = drm_hdmi_dt_parse_pdata(dev);
2349         if (!pdata)
2350                 return -EINVAL;
2351 
2352         hdata = devm_kzalloc(dev, sizeof(struct hdmi_context), GFP_KERNEL);
2353         if (!hdata)
2354                 return -ENOMEM;
2355 
2356         hdata->display.type = EXYNOS_DISPLAY_TYPE_HDMI;
2357         hdata->display.ops = &hdmi_display_ops;
2358 
2359         ret = exynos_drm_component_add(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR,
2360                                         hdata->display.type);
2361         if (ret)
2362                 return ret;
2363 
2364         mutex_init(&hdata->hdmi_mutex);
2365 
2366         platform_set_drvdata(pdev, hdata);
2367 
2368         match = of_match_node(hdmi_match_types, dev->of_node);
2369         if (!match) {
2370                 ret = -ENODEV;
2371                 goto err_del_component;
2372         }
2373 
2374         drv_data = (struct hdmi_driver_data *)match->data;
2375         hdata->type = drv_data->type;
2376         hdata->phy_confs = drv_data->phy_confs;
2377         hdata->phy_conf_count = drv_data->phy_conf_count;
2378 
2379         hdata->hpd_gpio = pdata->hpd_gpio;
2380         hdata->dev = dev;
2381 
2382         ret = hdmi_resources_init(hdata);
2383         if (ret) {
2384                 DRM_ERROR("hdmi_resources_init failed\n");
2385                 return ret;
2386         }
2387 
2388         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2389         hdata->regs = devm_ioremap_resource(dev, res);
2390         if (IS_ERR(hdata->regs)) {
2391                 ret = PTR_ERR(hdata->regs);
2392                 goto err_del_component;
2393         }
2394 
2395         ret = devm_gpio_request(dev, hdata->hpd_gpio, "HPD");
2396         if (ret) {
2397                 DRM_ERROR("failed to request HPD gpio\n");
2398                 goto err_del_component;
2399         }
2400 
2401         ddc_node = hdmi_legacy_ddc_dt_binding(dev);
2402         if (ddc_node)
2403                 goto out_get_ddc_adpt;
2404 
2405         /* DDC i2c driver */
2406         ddc_node = of_parse_phandle(dev->of_node, "ddc", 0);
2407         if (!ddc_node) {
2408                 DRM_ERROR("Failed to find ddc node in device tree\n");
2409                 ret = -ENODEV;
2410                 goto err_del_component;
2411         }
2412 
2413 out_get_ddc_adpt:
2414         hdata->ddc_adpt = of_find_i2c_adapter_by_node(ddc_node);
2415         if (!hdata->ddc_adpt) {
2416                 DRM_ERROR("Failed to get ddc i2c adapter by node\n");
2417                 return -EPROBE_DEFER;
2418         }
2419 
2420         phy_node = hdmi_legacy_phy_dt_binding(dev);
2421         if (phy_node)
2422                 goto out_get_phy_port;
2423 
2424         /* hdmiphy i2c driver */
2425         phy_node = of_parse_phandle(dev->of_node, "phy", 0);
2426         if (!phy_node) {
2427                 DRM_ERROR("Failed to find hdmiphy node in device tree\n");
2428                 ret = -ENODEV;
2429                 goto err_ddc;
2430         }
2431 
2432 out_get_phy_port:
2433         if (drv_data->is_apb_phy) {
2434                 hdata->regs_hdmiphy = of_iomap(phy_node, 0);
2435                 if (!hdata->regs_hdmiphy) {
2436                         DRM_ERROR("failed to ioremap hdmi phy\n");
2437                         ret = -ENOMEM;
2438                         goto err_ddc;
2439                 }
2440         } else {
2441                 hdata->hdmiphy_port = of_find_i2c_device_by_node(phy_node);
2442                 if (!hdata->hdmiphy_port) {
2443                         DRM_ERROR("Failed to get hdmi phy i2c client\n");
2444                         ret = -EPROBE_DEFER;
2445                         goto err_ddc;
2446                 }
2447         }
2448 
2449         hdata->irq = gpio_to_irq(hdata->hpd_gpio);
2450         if (hdata->irq < 0) {
2451                 DRM_ERROR("failed to get GPIO irq\n");
2452                 ret = hdata->irq;
2453                 goto err_hdmiphy;
2454         }
2455 
2456         hdata->hpd = gpio_get_value(hdata->hpd_gpio);
2457 
2458         INIT_DELAYED_WORK(&hdata->hotplug_work, hdmi_hotplug_work_func);
2459 
2460         ret = devm_request_threaded_irq(dev, hdata->irq, NULL,
2461                         hdmi_irq_thread, IRQF_TRIGGER_RISING |
2462                         IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
2463                         "hdmi", hdata);
2464         if (ret) {
2465                 DRM_ERROR("failed to register hdmi interrupt\n");
2466                 goto err_hdmiphy;
2467         }
2468 
2469         hdata->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node,
2470                         "samsung,syscon-phandle");
2471         if (IS_ERR(hdata->pmureg)) {
2472                 DRM_ERROR("syscon regmap lookup failed.\n");
2473                 ret = -EPROBE_DEFER;
2474                 goto err_hdmiphy;
2475         }
2476 
2477         pm_runtime_enable(dev);
2478 
2479         ret = component_add(&pdev->dev, &hdmi_component_ops);
2480         if (ret)
2481                 goto err_disable_pm_runtime;
2482 
2483         return ret;
2484 
2485 err_disable_pm_runtime:
2486         pm_runtime_disable(dev);
2487 
2488 err_hdmiphy:
2489         if (hdata->hdmiphy_port)
2490                 put_device(&hdata->hdmiphy_port->dev);
2491 err_ddc:
2492         put_device(&hdata->ddc_adpt->dev);
2493 
2494 err_del_component:
2495         exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR);
2496 
2497         return ret;
2498 }
2499 
2500 static int hdmi_remove(struct platform_device *pdev)
2501 {
2502         struct hdmi_context *hdata = platform_get_drvdata(pdev);
2503 
2504         cancel_delayed_work_sync(&hdata->hotplug_work);
2505 
2506         if (hdata->res.reg_hdmi_en)
2507                 regulator_disable(hdata->res.reg_hdmi_en);
2508 
2509         if (hdata->hdmiphy_port)
2510                 put_device(&hdata->hdmiphy_port->dev);
2511         put_device(&hdata->ddc_adpt->dev);
2512 
2513         pm_runtime_disable(&pdev->dev);
2514         component_del(&pdev->dev, &hdmi_component_ops);
2515 
2516         exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR);
2517         return 0;
2518 }
2519 
2520 struct platform_driver hdmi_driver = {
2521         .probe          = hdmi_probe,
2522         .remove         = hdmi_remove,
2523         .driver         = {
2524                 .name   = "exynos-hdmi",
2525                 .owner  = THIS_MODULE,
2526                 .of_match_table = hdmi_match_types,
2527         },
2528 };
2529 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us