2 * Copyright (C) 2011 Samsung Electronics Co.Ltd
4 * Seung-Woo Kim <sw0312.kim@samsung.com>
5 * Inki Dae <inki.dae@samsung.com>
6 * Joonyoung Shim <jy0922.shim@samsung.com>
8 * Based on drivers/media/video/s5p-tv/hdmi_drv.c
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.
19 #include "drm_crtc_helper.h"
22 #include "regs-hdmi.h"
24 #include <linux/kernel.h>
25 #include <linux/spinlock.h>
26 #include <linux/wait.h>
27 #include <linux/i2c.h>
28 #include <linux/module.h>
29 #include <linux/platform_device.h>
30 #include <linux/interrupt.h>
31 #include <linux/irq.h>
32 #include <linux/delay.h>
33 #include <linux/clk.h>
34 #include <linux/regulator/consumer.h>
37 #include <linux/of_i2c.h>
38 #include <linux/of_gpio.h>
39 #include <plat/gpio-cfg.h>
41 #include <drm/exynos_drm.h>
43 #include "exynos_drm_drv.h"
44 #include "exynos_drm_display.h"
46 #include "exynos_hdmi.h"
48 #define get_hdmi_context(dev) platform_get_drvdata(to_platform_device(dev))
50 struct hdmi_resources {
52 struct clk *sclk_hdmi;
53 struct clk *sclk_pixel;
54 struct clk *sclk_hdmiphy;
56 struct regulator_bulk_data *regul_bulk;
81 struct hdmi_core_regs {
94 u8 v_sync_line_bef_2[2];
95 u8 v_sync_line_bef_1[2];
96 u8 v_sync_line_aft_2[2];
97 u8 v_sync_line_aft_1[2];
98 u8 v_sync_line_aft_pxl_2[2];
99 u8 v_sync_line_aft_pxl_1[2];
100 u8 v_blank_f2[2]; /* for 3D mode */
101 u8 v_blank_f3[2]; /* for 3D mode */
102 u8 v_blank_f4[2]; /* for 3D mode */
103 u8 v_blank_f5[2]; /* for 3D mode */
104 u8 v_sync_line_aft_3[2];
105 u8 v_sync_line_aft_4[2];
106 u8 v_sync_line_aft_5[2];
107 u8 v_sync_line_aft_6[2];
108 u8 v_sync_line_aft_pxl_3[2];
109 u8 v_sync_line_aft_pxl_4[2];
110 u8 v_sync_line_aft_pxl_5[2];
111 u8 v_sync_line_aft_pxl_6[2];
120 struct hdmi_mode_conf {
122 struct hdmi_core_regs core;
123 struct hdmi_tg_regs tg;
127 struct hdmi_context {
129 struct drm_device *drm_dev;
130 struct fb_videomode *default_timing;
131 struct hdmi_mode_conf mode_conf;
132 unsigned int is_v13:1;
133 unsigned int default_win;
134 unsigned int default_bpp;
139 bool is_hdmi_powered_on;
142 struct resource *regs_res;
144 unsigned int external_irq;
145 unsigned int internal_irq;
146 unsigned int curr_irq;
147 struct workqueue_struct *wq;
148 struct work_struct hotplug_work;
150 struct i2c_client *ddc_port;
151 struct i2c_client *hdmiphy_port;
153 /* current hdmiphy conf index */
156 struct hdmi_resources res;
159 /* HDMI Version 1.3 */
160 static const u8 hdmiphy_v13_conf27[32] = {
161 0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
162 0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
163 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
164 0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
167 static const u8 hdmiphy_v13_conf27_027[32] = {
168 0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
169 0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
170 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
171 0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
174 static const u8 hdmiphy_v13_conf74_175[32] = {
175 0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
176 0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
177 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
178 0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x00,
181 static const u8 hdmiphy_v13_conf74_25[32] = {
182 0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
183 0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
184 0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0,
185 0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x00,
188 static const u8 hdmiphy_v13_conf148_5[32] = {
189 0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
190 0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
191 0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
192 0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x00,
195 struct hdmi_v13_tg_regs {
227 struct hdmi_v13_core_regs {
240 struct hdmi_v13_preset_conf {
241 struct hdmi_v13_core_regs core;
242 struct hdmi_v13_tg_regs tg;
245 struct hdmi_v13_conf {
250 const u8 *hdmiphy_data;
251 const struct hdmi_v13_preset_conf *conf;
254 static const struct hdmi_v13_preset_conf hdmi_v13_conf_480p = {
256 .h_blank = {0x8a, 0x00},
257 .v_blank = {0x0d, 0x6a, 0x01},
258 .h_v_line = {0x0d, 0xa2, 0x35},
260 .int_pro_mode = {0x00},
261 .v_blank_f = {0x00, 0x00, 0x00},
262 .h_sync_gen = {0x0e, 0x30, 0x11},
263 .v_sync_gen1 = {0x0f, 0x90, 0x00},
264 /* other don't care */
268 0x5a, 0x03, /* h_fsz */
269 0x8a, 0x00, 0xd0, 0x02, /* hact */
270 0x0d, 0x02, /* v_fsz */
271 0x01, 0x00, 0x33, 0x02, /* vsync */
272 0x2d, 0x00, 0xe0, 0x01, /* vact */
273 0x33, 0x02, /* field_chg */
274 0x49, 0x02, /* vact_st2 */
275 0x01, 0x00, 0x33, 0x02, /* vsync top/bot */
276 0x01, 0x00, 0x33, 0x02, /* field top/bot */
280 static const struct hdmi_v13_preset_conf hdmi_v13_conf_720p60 = {
282 .h_blank = {0x72, 0x01},
283 .v_blank = {0xee, 0xf2, 0x00},
284 .h_v_line = {0xee, 0x22, 0x67},
286 .int_pro_mode = {0x00},
287 .v_blank_f = {0x00, 0x00, 0x00}, /* don't care */
288 .h_sync_gen = {0x6c, 0x50, 0x02},
289 .v_sync_gen1 = {0x0a, 0x50, 0x00},
290 .v_sync_gen2 = {0x01, 0x10, 0x00},
291 .v_sync_gen3 = {0x01, 0x10, 0x00},
292 /* other don't care */
296 0x72, 0x06, /* h_fsz */
297 0x71, 0x01, 0x01, 0x05, /* hact */
298 0xee, 0x02, /* v_fsz */
299 0x01, 0x00, 0x33, 0x02, /* vsync */
300 0x1e, 0x00, 0xd0, 0x02, /* vact */
301 0x33, 0x02, /* field_chg */
302 0x49, 0x02, /* vact_st2 */
303 0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
304 0x01, 0x00, 0x33, 0x02, /* field top/bot */
308 static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080i50 = {
310 .h_blank = {0xd0, 0x02},
311 .v_blank = {0x32, 0xB2, 0x00},
312 .h_v_line = {0x65, 0x04, 0xa5},
314 .int_pro_mode = {0x01},
315 .v_blank_f = {0x49, 0x2A, 0x23},
316 .h_sync_gen = {0x0E, 0xEA, 0x08},
317 .v_sync_gen1 = {0x07, 0x20, 0x00},
318 .v_sync_gen2 = {0x39, 0x42, 0x23},
319 .v_sync_gen3 = {0x38, 0x87, 0x73},
320 /* other don't care */
324 0x50, 0x0A, /* h_fsz */
325 0xCF, 0x02, 0x81, 0x07, /* hact */
326 0x65, 0x04, /* v_fsz */
327 0x01, 0x00, 0x33, 0x02, /* vsync */
328 0x16, 0x00, 0x1c, 0x02, /* vact */
329 0x33, 0x02, /* field_chg */
330 0x49, 0x02, /* vact_st2 */
331 0x01, 0x00, 0x33, 0x02, /* vsync top/bot */
332 0x01, 0x00, 0x33, 0x02, /* field top/bot */
336 static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080p50 = {
338 .h_blank = {0xd0, 0x02},
339 .v_blank = {0x65, 0x6c, 0x01},
340 .h_v_line = {0x65, 0x04, 0xa5},
342 .int_pro_mode = {0x00},
343 .v_blank_f = {0x00, 0x00, 0x00}, /* don't care */
344 .h_sync_gen = {0x0e, 0xea, 0x08},
345 .v_sync_gen1 = {0x09, 0x40, 0x00},
346 .v_sync_gen2 = {0x01, 0x10, 0x00},
347 .v_sync_gen3 = {0x01, 0x10, 0x00},
348 /* other don't care */
352 0x50, 0x0A, /* h_fsz */
353 0xCF, 0x02, 0x81, 0x07, /* hact */
354 0x65, 0x04, /* v_fsz */
355 0x01, 0x00, 0x33, 0x02, /* vsync */
356 0x2d, 0x00, 0x38, 0x04, /* vact */
357 0x33, 0x02, /* field_chg */
358 0x48, 0x02, /* vact_st2 */
359 0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
360 0x01, 0x00, 0x33, 0x02, /* field top/bot */
364 static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080i60 = {
366 .h_blank = {0x18, 0x01},
367 .v_blank = {0x32, 0xB2, 0x00},
368 .h_v_line = {0x65, 0x84, 0x89},
370 .int_pro_mode = {0x01},
371 .v_blank_f = {0x49, 0x2A, 0x23},
372 .h_sync_gen = {0x56, 0x08, 0x02},
373 .v_sync_gen1 = {0x07, 0x20, 0x00},
374 .v_sync_gen2 = {0x39, 0x42, 0x23},
375 .v_sync_gen3 = {0xa4, 0x44, 0x4a},
376 /* other don't care */
380 0x98, 0x08, /* h_fsz */
381 0x17, 0x01, 0x81, 0x07, /* hact */
382 0x65, 0x04, /* v_fsz */
383 0x01, 0x00, 0x33, 0x02, /* vsync */
384 0x16, 0x00, 0x1c, 0x02, /* vact */
385 0x33, 0x02, /* field_chg */
386 0x49, 0x02, /* vact_st2 */
387 0x01, 0x00, 0x33, 0x02, /* vsync top/bot */
388 0x01, 0x00, 0x33, 0x02, /* field top/bot */
392 static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080p60 = {
394 .h_blank = {0x18, 0x01},
395 .v_blank = {0x65, 0x6c, 0x01},
396 .h_v_line = {0x65, 0x84, 0x89},
398 .int_pro_mode = {0x00},
399 .v_blank_f = {0x00, 0x00, 0x00}, /* don't care */
400 .h_sync_gen = {0x56, 0x08, 0x02},
401 .v_sync_gen1 = {0x09, 0x40, 0x00},
402 .v_sync_gen2 = {0x01, 0x10, 0x00},
403 .v_sync_gen3 = {0x01, 0x10, 0x00},
404 /* other don't care */
408 0x98, 0x08, /* h_fsz */
409 0x17, 0x01, 0x81, 0x07, /* hact */
410 0x65, 0x04, /* v_fsz */
411 0x01, 0x00, 0x33, 0x02, /* vsync */
412 0x2d, 0x00, 0x38, 0x04, /* vact */
413 0x33, 0x02, /* field_chg */
414 0x48, 0x02, /* vact_st2 */
415 0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
416 0x01, 0x00, 0x33, 0x02, /* field top/bot */
420 static const struct hdmi_v13_conf hdmi_v13_confs[] = {
421 { 1280, 720, 60, false, hdmiphy_v13_conf74_25, &hdmi_v13_conf_720p60 },
422 { 1280, 720, 50, false, hdmiphy_v13_conf74_25, &hdmi_v13_conf_720p60 },
423 { 720, 480, 60, false, hdmiphy_v13_conf27_027, &hdmi_v13_conf_480p },
424 { 1920, 1080, 50, true, hdmiphy_v13_conf74_25, &hdmi_v13_conf_1080i50 },
425 { 1920, 1080, 50, false, hdmiphy_v13_conf148_5,
426 &hdmi_v13_conf_1080p50 },
427 { 1920, 1080, 60, true, hdmiphy_v13_conf74_25, &hdmi_v13_conf_1080i60 },
428 { 1920, 1080, 60, false, hdmiphy_v13_conf148_5,
429 &hdmi_v13_conf_1080p60 },
432 struct hdmiphy_config {
437 static const struct hdmiphy_config phy_configs[] = {
439 .pixel_clock = 25200000,
441 0x01, 0x51, 0x2A, 0x75, 0x40, 0x01, 0x00, 0x08,
442 0x82, 0x80, 0xfc, 0xd8, 0x45, 0xa0, 0xac, 0x80,
443 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
444 0x54, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
448 .pixel_clock = 27000000,
450 0x01, 0xd1, 0x22, 0x51, 0x40, 0x08, 0xfc, 0x20,
451 0x98, 0xa0, 0xcb, 0xd8, 0x45, 0xa0, 0xac, 0x80,
452 0x06, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
453 0x54, 0xe4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
457 .pixel_clock = 27027000,
459 0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08,
460 0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
461 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
462 0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00,
466 .pixel_clock = 36000000,
468 0x01, 0x51, 0x2d, 0x55, 0x40, 0x01, 0x00, 0x08,
469 0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
470 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
471 0x54, 0xab, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
475 .pixel_clock = 40000000,
477 0x01, 0x51, 0x32, 0x55, 0x40, 0x01, 0x00, 0x08,
478 0x82, 0x80, 0x2c, 0xd9, 0x45, 0xa0, 0xac, 0x80,
479 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
480 0x54, 0x9a, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
484 .pixel_clock = 65000000,
486 0x01, 0xd1, 0x36, 0x34, 0x40, 0x1e, 0x0a, 0x08,
487 0x82, 0xa0, 0x45, 0xd9, 0x45, 0xa0, 0xac, 0x80,
488 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
489 0x54, 0xbd, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
493 .pixel_clock = 74176000,
495 0x01, 0xd1, 0x3e, 0x35, 0x40, 0x5b, 0xde, 0x08,
496 0x82, 0xa0, 0x73, 0xd9, 0x45, 0xa0, 0xac, 0x80,
497 0x56, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
498 0x54, 0xa6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
502 .pixel_clock = 74250000,
504 0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08,
505 0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
506 0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
507 0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00,
511 .pixel_clock = 83500000,
513 0x01, 0xd1, 0x23, 0x11, 0x40, 0x0c, 0xfb, 0x08,
514 0x85, 0xa0, 0xd1, 0xd8, 0x45, 0xa0, 0xac, 0x80,
515 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
516 0x54, 0x93, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
520 .pixel_clock = 106500000,
522 0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08,
523 0x84, 0xa0, 0x0a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
524 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
525 0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
529 .pixel_clock = 108000000,
531 0x01, 0x51, 0x2d, 0x15, 0x40, 0x01, 0x00, 0x08,
532 0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
533 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
534 0x54, 0xc7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
538 .pixel_clock = 146250000,
540 0x01, 0xd1, 0x3d, 0x15, 0x40, 0x18, 0xfd, 0x08,
541 0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
542 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
543 0x54, 0x50, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
547 .pixel_clock = 148500000,
549 0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08,
550 0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
551 0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
552 0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x00,
557 struct hdmi_infoframe {
558 enum HDMI_PACKET_TYPE type;
563 static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id)
565 return readl(hdata->regs + reg_id);
568 static inline void hdmi_reg_writeb(struct hdmi_context *hdata,
569 u32 reg_id, u8 value)
571 writeb(value, hdata->regs + reg_id);
574 static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
575 u32 reg_id, u32 value, u32 mask)
577 u32 old = readl(hdata->regs + reg_id);
578 value = (value & mask) | (old & ~mask);
579 writel(value, hdata->regs + reg_id);
582 static void hdmi_cfg_hpd(struct hdmi_context *hdata, bool external)
585 s3c_gpio_cfgpin(hdata->hpd_gpio, S3C_GPIO_SFN(0xf));
586 s3c_gpio_setpull(hdata->hpd_gpio, S3C_GPIO_PULL_DOWN);
588 s3c_gpio_cfgpin(hdata->hpd_gpio, S3C_GPIO_SFN(3));
589 s3c_gpio_setpull(hdata->hpd_gpio, S3C_GPIO_PULL_NONE);
593 static int hdmi_get_hpd(struct hdmi_context *hdata)
595 return gpio_get_value(hdata->hpd_gpio);
598 static void hdmi_v13_regs_dump(struct hdmi_context *hdata, char *prefix)
600 #define DUMPREG(reg_id) \
601 DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
602 readl(hdata->regs + reg_id))
603 DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
604 DUMPREG(HDMI_INTC_FLAG);
605 DUMPREG(HDMI_INTC_CON);
606 DUMPREG(HDMI_HPD_STATUS);
607 DUMPREG(HDMI_V13_PHY_RSTOUT);
608 DUMPREG(HDMI_V13_PHY_VPLL);
609 DUMPREG(HDMI_V13_PHY_CMU);
610 DUMPREG(HDMI_V13_CORE_RSTOUT);
612 DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
616 DUMPREG(HDMI_SYS_STATUS);
617 DUMPREG(HDMI_V13_PHY_STATUS);
618 DUMPREG(HDMI_STATUS_EN);
620 DUMPREG(HDMI_MODE_SEL);
621 DUMPREG(HDMI_V13_HPD_GEN);
622 DUMPREG(HDMI_V13_DC_CONTROL);
623 DUMPREG(HDMI_V13_VIDEO_PATTERN_GEN);
625 DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
626 DUMPREG(HDMI_H_BLANK_0);
627 DUMPREG(HDMI_H_BLANK_1);
628 DUMPREG(HDMI_V13_V_BLANK_0);
629 DUMPREG(HDMI_V13_V_BLANK_1);
630 DUMPREG(HDMI_V13_V_BLANK_2);
631 DUMPREG(HDMI_V13_H_V_LINE_0);
632 DUMPREG(HDMI_V13_H_V_LINE_1);
633 DUMPREG(HDMI_V13_H_V_LINE_2);
634 DUMPREG(HDMI_VSYNC_POL);
635 DUMPREG(HDMI_INT_PRO_MODE);
636 DUMPREG(HDMI_V13_V_BLANK_F_0);
637 DUMPREG(HDMI_V13_V_BLANK_F_1);
638 DUMPREG(HDMI_V13_V_BLANK_F_2);
639 DUMPREG(HDMI_V13_H_SYNC_GEN_0);
640 DUMPREG(HDMI_V13_H_SYNC_GEN_1);
641 DUMPREG(HDMI_V13_H_SYNC_GEN_2);
642 DUMPREG(HDMI_V13_V_SYNC_GEN_1_0);
643 DUMPREG(HDMI_V13_V_SYNC_GEN_1_1);
644 DUMPREG(HDMI_V13_V_SYNC_GEN_1_2);
645 DUMPREG(HDMI_V13_V_SYNC_GEN_2_0);
646 DUMPREG(HDMI_V13_V_SYNC_GEN_2_1);
647 DUMPREG(HDMI_V13_V_SYNC_GEN_2_2);
648 DUMPREG(HDMI_V13_V_SYNC_GEN_3_0);
649 DUMPREG(HDMI_V13_V_SYNC_GEN_3_1);
650 DUMPREG(HDMI_V13_V_SYNC_GEN_3_2);
652 DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
653 DUMPREG(HDMI_TG_CMD);
654 DUMPREG(HDMI_TG_H_FSZ_L);
655 DUMPREG(HDMI_TG_H_FSZ_H);
656 DUMPREG(HDMI_TG_HACT_ST_L);
657 DUMPREG(HDMI_TG_HACT_ST_H);
658 DUMPREG(HDMI_TG_HACT_SZ_L);
659 DUMPREG(HDMI_TG_HACT_SZ_H);
660 DUMPREG(HDMI_TG_V_FSZ_L);
661 DUMPREG(HDMI_TG_V_FSZ_H);
662 DUMPREG(HDMI_TG_VSYNC_L);
663 DUMPREG(HDMI_TG_VSYNC_H);
664 DUMPREG(HDMI_TG_VSYNC2_L);
665 DUMPREG(HDMI_TG_VSYNC2_H);
666 DUMPREG(HDMI_TG_VACT_ST_L);
667 DUMPREG(HDMI_TG_VACT_ST_H);
668 DUMPREG(HDMI_TG_VACT_SZ_L);
669 DUMPREG(HDMI_TG_VACT_SZ_H);
670 DUMPREG(HDMI_TG_FIELD_CHG_L);
671 DUMPREG(HDMI_TG_FIELD_CHG_H);
672 DUMPREG(HDMI_TG_VACT_ST2_L);
673 DUMPREG(HDMI_TG_VACT_ST2_H);
674 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
675 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
676 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
677 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
678 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
679 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
680 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
681 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
685 static void hdmi_v14_regs_dump(struct hdmi_context *hdata, char *prefix)
689 #define DUMPREG(reg_id) \
690 DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
691 readl(hdata->regs + reg_id))
693 DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
694 DUMPREG(HDMI_INTC_CON);
695 DUMPREG(HDMI_INTC_FLAG);
696 DUMPREG(HDMI_HPD_STATUS);
697 DUMPREG(HDMI_INTC_CON_1);
698 DUMPREG(HDMI_INTC_FLAG_1);
699 DUMPREG(HDMI_PHY_STATUS_0);
700 DUMPREG(HDMI_PHY_STATUS_PLL);
701 DUMPREG(HDMI_PHY_CON_0);
702 DUMPREG(HDMI_PHY_RSTOUT);
703 DUMPREG(HDMI_PHY_VPLL);
704 DUMPREG(HDMI_PHY_CMU);
705 DUMPREG(HDMI_CORE_RSTOUT);
707 DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
711 DUMPREG(HDMI_SYS_STATUS);
712 DUMPREG(HDMI_PHY_STATUS_0);
713 DUMPREG(HDMI_STATUS_EN);
715 DUMPREG(HDMI_MODE_SEL);
716 DUMPREG(HDMI_ENC_EN);
717 DUMPREG(HDMI_DC_CONTROL);
718 DUMPREG(HDMI_VIDEO_PATTERN_GEN);
720 DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
721 DUMPREG(HDMI_H_BLANK_0);
722 DUMPREG(HDMI_H_BLANK_1);
723 DUMPREG(HDMI_V2_BLANK_0);
724 DUMPREG(HDMI_V2_BLANK_1);
725 DUMPREG(HDMI_V1_BLANK_0);
726 DUMPREG(HDMI_V1_BLANK_1);
727 DUMPREG(HDMI_V_LINE_0);
728 DUMPREG(HDMI_V_LINE_1);
729 DUMPREG(HDMI_H_LINE_0);
730 DUMPREG(HDMI_H_LINE_1);
731 DUMPREG(HDMI_HSYNC_POL);
733 DUMPREG(HDMI_VSYNC_POL);
734 DUMPREG(HDMI_INT_PRO_MODE);
735 DUMPREG(HDMI_V_BLANK_F0_0);
736 DUMPREG(HDMI_V_BLANK_F0_1);
737 DUMPREG(HDMI_V_BLANK_F1_0);
738 DUMPREG(HDMI_V_BLANK_F1_1);
740 DUMPREG(HDMI_H_SYNC_START_0);
741 DUMPREG(HDMI_H_SYNC_START_1);
742 DUMPREG(HDMI_H_SYNC_END_0);
743 DUMPREG(HDMI_H_SYNC_END_1);
745 DUMPREG(HDMI_V_SYNC_LINE_BEF_2_0);
746 DUMPREG(HDMI_V_SYNC_LINE_BEF_2_1);
747 DUMPREG(HDMI_V_SYNC_LINE_BEF_1_0);
748 DUMPREG(HDMI_V_SYNC_LINE_BEF_1_1);
750 DUMPREG(HDMI_V_SYNC_LINE_AFT_2_0);
751 DUMPREG(HDMI_V_SYNC_LINE_AFT_2_1);
752 DUMPREG(HDMI_V_SYNC_LINE_AFT_1_0);
753 DUMPREG(HDMI_V_SYNC_LINE_AFT_1_1);
755 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_0);
756 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_1);
757 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_0);
758 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_1);
760 DUMPREG(HDMI_V_BLANK_F2_0);
761 DUMPREG(HDMI_V_BLANK_F2_1);
762 DUMPREG(HDMI_V_BLANK_F3_0);
763 DUMPREG(HDMI_V_BLANK_F3_1);
764 DUMPREG(HDMI_V_BLANK_F4_0);
765 DUMPREG(HDMI_V_BLANK_F4_1);
766 DUMPREG(HDMI_V_BLANK_F5_0);
767 DUMPREG(HDMI_V_BLANK_F5_1);
769 DUMPREG(HDMI_V_SYNC_LINE_AFT_3_0);
770 DUMPREG(HDMI_V_SYNC_LINE_AFT_3_1);
771 DUMPREG(HDMI_V_SYNC_LINE_AFT_4_0);
772 DUMPREG(HDMI_V_SYNC_LINE_AFT_4_1);
773 DUMPREG(HDMI_V_SYNC_LINE_AFT_5_0);
774 DUMPREG(HDMI_V_SYNC_LINE_AFT_5_1);
775 DUMPREG(HDMI_V_SYNC_LINE_AFT_6_0);
776 DUMPREG(HDMI_V_SYNC_LINE_AFT_6_1);
778 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_0);
779 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_1);
780 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_0);
781 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_1);
782 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_0);
783 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_1);
784 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_0);
785 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_1);
787 DUMPREG(HDMI_VACT_SPACE_1_0);
788 DUMPREG(HDMI_VACT_SPACE_1_1);
789 DUMPREG(HDMI_VACT_SPACE_2_0);
790 DUMPREG(HDMI_VACT_SPACE_2_1);
791 DUMPREG(HDMI_VACT_SPACE_3_0);
792 DUMPREG(HDMI_VACT_SPACE_3_1);
793 DUMPREG(HDMI_VACT_SPACE_4_0);
794 DUMPREG(HDMI_VACT_SPACE_4_1);
795 DUMPREG(HDMI_VACT_SPACE_5_0);
796 DUMPREG(HDMI_VACT_SPACE_5_1);
797 DUMPREG(HDMI_VACT_SPACE_6_0);
798 DUMPREG(HDMI_VACT_SPACE_6_1);
800 DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
801 DUMPREG(HDMI_TG_CMD);
802 DUMPREG(HDMI_TG_H_FSZ_L);
803 DUMPREG(HDMI_TG_H_FSZ_H);
804 DUMPREG(HDMI_TG_HACT_ST_L);
805 DUMPREG(HDMI_TG_HACT_ST_H);
806 DUMPREG(HDMI_TG_HACT_SZ_L);
807 DUMPREG(HDMI_TG_HACT_SZ_H);
808 DUMPREG(HDMI_TG_V_FSZ_L);
809 DUMPREG(HDMI_TG_V_FSZ_H);
810 DUMPREG(HDMI_TG_VSYNC_L);
811 DUMPREG(HDMI_TG_VSYNC_H);
812 DUMPREG(HDMI_TG_VSYNC2_L);
813 DUMPREG(HDMI_TG_VSYNC2_H);
814 DUMPREG(HDMI_TG_VACT_ST_L);
815 DUMPREG(HDMI_TG_VACT_ST_H);
816 DUMPREG(HDMI_TG_VACT_SZ_L);
817 DUMPREG(HDMI_TG_VACT_SZ_H);
818 DUMPREG(HDMI_TG_FIELD_CHG_L);
819 DUMPREG(HDMI_TG_FIELD_CHG_H);
820 DUMPREG(HDMI_TG_VACT_ST2_L);
821 DUMPREG(HDMI_TG_VACT_ST2_H);
822 DUMPREG(HDMI_TG_VACT_ST3_L);
823 DUMPREG(HDMI_TG_VACT_ST3_H);
824 DUMPREG(HDMI_TG_VACT_ST4_L);
825 DUMPREG(HDMI_TG_VACT_ST4_H);
826 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
827 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
828 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
829 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
830 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
831 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
832 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
833 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
836 DRM_DEBUG_KMS("%s: ---- PACKET REGISTERS ----\n", prefix);
837 DUMPREG(HDMI_AVI_CON);
838 DUMPREG(HDMI_AVI_HEADER0);
839 DUMPREG(HDMI_AVI_HEADER1);
840 DUMPREG(HDMI_AVI_HEADER2);
841 DUMPREG(HDMI_AVI_CHECK_SUM);
842 DUMPREG(HDMI_VSI_CON);
843 DUMPREG(HDMI_VSI_HEADER0);
844 DUMPREG(HDMI_VSI_HEADER1);
845 DUMPREG(HDMI_VSI_HEADER2);
846 for (i = 0; i < 7; ++i)
847 DUMPREG(HDMI_VSI_DATA(i));
852 static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
855 hdmi_v13_regs_dump(hdata, prefix);
857 hdmi_v14_regs_dump(hdata, prefix);
860 static int hdmi_v13_conf_index(struct drm_display_mode *mode)
864 for (i = 0; i < ARRAY_SIZE(hdmi_v13_confs); ++i)
865 if (hdmi_v13_confs[i].width == mode->hdisplay &&
866 hdmi_v13_confs[i].height == mode->vdisplay &&
867 hdmi_v13_confs[i].vrefresh == mode->vrefresh &&
868 hdmi_v13_confs[i].interlace ==
869 ((mode->flags & DRM_MODE_FLAG_INTERLACE) ?
876 static bool hdmi_is_connected(void *ctx)
878 struct hdmi_context *hdata = ctx;
879 if (hdata->is_hdmi_powered_on) {
880 if (!hdmi_reg_read(hdata, HDMI_HPD_STATUS)) {
881 DRM_DEBUG_KMS("hdmi is not connected\n");
884 } else if (!hdmi_get_hpd(hdata)) {
885 DRM_DEBUG_KMS("hdmi is not connected\n");
892 static struct edid *hdmi_get_edid(void *ctx, struct drm_connector *connector)
894 struct hdmi_context *hdata = ctx;
897 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", DRM_BASE_ID(connector),
898 drm_get_connector_name(connector));
900 if (!hdata->ddc_port)
901 return ERR_PTR(-ENODEV);
903 edid = drm_get_edid(connector, hdata->ddc_port->adapter);
905 return ERR_PTR(-ENODEV);
908 * TODO : Need to call this in exynos_drm_connector.c, do a drm_get_edid
909 * to get the edid and then call drm_detect_hdmi_monitor.
911 hdata->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
912 hdata->has_hdmi_audio = drm_detect_monitor_audio(edid);
913 DRM_DEBUG_KMS("%s monitor\n", hdata->has_hdmi_sink ? "hdmi" : "dvi");
918 static int hdmi_v13_check_timing(struct fb_videomode *check_timing)
922 DRM_DEBUG_KMS("valid mode : xres=%d, yres=%d, refresh=%d, intl=%d\n",
923 check_timing->xres, check_timing->yres,
924 check_timing->refresh, (check_timing->vmode &
925 FB_VMODE_INTERLACED) ? true : false);
927 for (i = 0; i < ARRAY_SIZE(hdmi_v13_confs); ++i)
928 if (hdmi_v13_confs[i].width == check_timing->xres &&
929 hdmi_v13_confs[i].height == check_timing->yres &&
930 hdmi_v13_confs[i].vrefresh == check_timing->refresh &&
931 hdmi_v13_confs[i].interlace ==
932 ((check_timing->vmode & FB_VMODE_INTERLACED) ?
941 static int find_hdmiphy_conf(int pixel_clock)
945 for (i = 0; i < ARRAY_SIZE(phy_configs); i++) {
946 if (phy_configs[i].pixel_clock == pixel_clock)
949 DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
953 static int hdmi_v14_check_timing(struct fb_videomode *mode)
956 enum exynos_mixer_mode_type mode_type;
958 /* Make sure the mixer can generate this mode */
959 mode_type = exynos_mixer_get_mode_type(mode->xres, mode->yres);
960 if (mode_type == EXYNOS_MIXER_MODE_INVALID)
963 ret = find_hdmiphy_conf(mode->pixclock);
964 return ret < 0 ? ret : 0;
967 static u8 hdmi_chksum(struct hdmi_context *hdata,
968 u32 start, u8 len, u32 hdr_sum)
971 /* hdr_sum : header0 + header1 + header2
972 * start : start address of packet byte1
973 * len : packet bytes - 1 */
974 for (i = 0; i < len; ++i)
975 hdr_sum += hdmi_reg_read(hdata, start + i * 4);
977 return (u8)(0x100 - (hdr_sum & 0xff));
980 void hdmi_reg_infoframe(struct hdmi_context *hdata,
981 struct hdmi_infoframe *infoframe)
988 /* TODO: stringify HDMI_PACKET_TYPE */
989 DRM_DEBUG_KMS("type: %d ver: %d len: %d\n", infoframe->type,
990 infoframe->ver, infoframe->len);
991 mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
992 if (!hdata->has_hdmi_sink) {
993 hdmi_reg_writeb(hdata, HDMI_VSI_CON,
994 HDMI_VSI_CON_DO_NOT_TRANSMIT);
995 hdmi_reg_writeb(hdata, HDMI_AVI_CON,
996 HDMI_AVI_CON_DO_NOT_TRANSMIT);
997 hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN);
1001 switch (infoframe->type) {
1003 case HDMI_PACKET_TYPE_AVI:
1004 hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC);
1005 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER0, infoframe->type);
1006 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER1, infoframe->ver);
1007 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER2, infoframe->len);
1008 hdr_sum = infoframe->type + infoframe->ver + infoframe->len;
1009 /* Output format zero hardcoded ,RGB YBCR selection */
1010 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 0 << 5 |
1011 AVI_ACTIVE_FORMAT_VALID | AVI_UNDERSCANNED_DISPLAY_VALID);
1013 aspect_ratio = AVI_PIC_ASPECT_RATIO_16_9;
1015 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), aspect_ratio |
1016 AVI_SAME_AS_PIC_ASPECT_RATIO);
1017 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), hdata->mode_conf.vic);
1019 chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1),
1020 infoframe->len, hdr_sum);
1021 DRM_DEBUG_KMS("AVI checksum = 0x%x\n", chksum);
1022 hdmi_reg_writeb(hdata, HDMI_AVI_CHECK_SUM, chksum);
1025 case HDMI_PACKET_TYPE_AUI:
1026 hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02);
1027 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER0, infoframe->type);
1028 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER1, infoframe->ver);
1029 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER2, infoframe->len);
1030 hdr_sum = infoframe->type + infoframe->ver + infoframe->len;
1031 chksum = hdmi_chksum(hdata, HDMI_AUI_BYTE(1),
1032 infoframe->len, hdr_sum);
1033 DRM_DEBUG_KMS("AUI checksum = 0x%x\n", chksum);
1034 hdmi_reg_writeb(hdata, HDMI_AUI_CHECK_SUM, chksum);
1042 static int hdmi_check_timing(void *ctx, void *timing)
1044 struct hdmi_context *hdata = ctx;
1045 struct fb_videomode *check_timing = timing;
1047 DRM_DEBUG_KMS("[%d]x[%d] [%d]Hz [%x]\n", check_timing->xres,
1048 check_timing->yres, check_timing->refresh,
1049 check_timing->vmode);
1052 return hdmi_v13_check_timing(check_timing);
1054 return hdmi_v14_check_timing(check_timing);
1057 static void hdmi_set_acr(u32 freq, u8 *acr)
1097 acr[2] = cts >> 8 & 0xff;
1098 acr[3] = cts & 0xff;
1101 acr[5] = n >> 8 & 0xff;
1105 static void hdmi_reg_acr(struct hdmi_context *hdata, u8 *acr)
1107 hdmi_reg_writeb(hdata, HDMI_ACR_N0, acr[6]);
1108 hdmi_reg_writeb(hdata, HDMI_ACR_N1, acr[5]);
1109 hdmi_reg_writeb(hdata, HDMI_ACR_N2, acr[4]);
1110 hdmi_reg_writeb(hdata, HDMI_ACR_MCTS0, acr[3]);
1111 hdmi_reg_writeb(hdata, HDMI_ACR_MCTS1, acr[2]);
1112 hdmi_reg_writeb(hdata, HDMI_ACR_MCTS2, acr[1]);
1113 hdmi_reg_writeb(hdata, HDMI_ACR_CTS0, acr[3]);
1114 hdmi_reg_writeb(hdata, HDMI_ACR_CTS1, acr[2]);
1115 hdmi_reg_writeb(hdata, HDMI_ACR_CTS2, acr[1]);
1118 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 4);
1120 hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
1123 static void hdmi_audio_init(struct hdmi_context *hdata)
1125 u32 sample_rate, bits_per_sample, frame_size_code;
1126 u32 data_num, bit_ch, sample_frq;
1130 sample_rate = 44100;
1131 bits_per_sample = 16;
1132 frame_size_code = 0;
1134 switch (bits_per_sample) {
1149 hdmi_set_acr(sample_rate, acr);
1150 hdmi_reg_acr(hdata, acr);
1152 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
1153 | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
1154 | HDMI_I2S_MUX_ENABLE);
1156 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
1157 | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
1159 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
1161 sample_frq = (sample_rate == 44100) ? 0 :
1162 (sample_rate == 48000) ? 2 :
1163 (sample_rate == 32000) ? 3 :
1164 (sample_rate == 96000) ? 0xa : 0x0;
1166 hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
1167 hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
1169 val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
1170 hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
1172 /* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
1173 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
1174 | HDMI_I2S_SEL_LRCK(6));
1175 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(1)
1176 | HDMI_I2S_SEL_SDATA2(4));
1177 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
1178 | HDMI_I2S_SEL_SDATA2(2));
1179 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
1182 hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
1183 | HDMI_I2S_L_CH_LOW_POL);
1184 hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
1185 | HDMI_I2S_SET_BIT_CH(bit_ch)
1186 | HDMI_I2S_SET_SDATA_BIT(data_num)
1187 | HDMI_I2S_BASIC_FORMAT);
1189 /* Configure register related to CUV information */
1190 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0
1191 | HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH
1192 | HDMI_I2S_COPYRIGHT
1193 | HDMI_I2S_LINEAR_PCM
1194 | HDMI_I2S_CONSUMER_FORMAT);
1195 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER);
1196 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0));
1197 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2
1198 | HDMI_I2S_SET_SMP_FREQ(sample_frq));
1199 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4,
1200 HDMI_I2S_ORG_SMP_FREQ_44_1
1201 | HDMI_I2S_WORD_LEN_MAX24_24BITS
1202 | HDMI_I2S_WORD_LEN_MAX_24BITS);
1204 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
1207 static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
1209 if (!hdata->has_hdmi_audio)
1212 hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
1213 hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ?
1214 HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
1217 static void hdmi_conf_reset(struct hdmi_context *hdata)
1221 /* disable hpd handle for drm */
1222 hdata->hpd_handle = false;
1225 reg = HDMI_V13_CORE_RSTOUT;
1227 reg = HDMI_CORE_RSTOUT;
1229 /* resetting HDMI core */
1230 hdmi_reg_writemask(hdata, reg, 0, HDMI_CORE_SW_RSTOUT);
1232 hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
1235 /* enable hpd handle for drm */
1236 hdata->hpd_handle = true;
1239 static void hdmi_enable_video(struct hdmi_context *hdata)
1244 hdata->video_enabled = true;
1245 hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
1248 static void hdmi_disable_video(struct hdmi_context *hdata)
1253 /* Set the blue screen color to black */
1254 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_R_0, 0);
1255 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_R_1, 0);
1256 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_G_0, 0);
1257 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_G_1, 0);
1258 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_B_0, 0);
1259 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_B_1, 0);
1261 /* Enable the "blue screen", which effectively disconnects the mixer */
1262 hdata->video_enabled = false;
1263 hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_BLUE_SCR_EN);
1266 static void hdmi_conf_init(struct hdmi_context *hdata)
1268 struct hdmi_infoframe infoframe;
1269 /* disable hpd handle for drm */
1270 hdata->hpd_handle = false;
1272 /* enable HPD interrupts */
1273 hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
1274 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
1276 hdmi_reg_writemask(hdata, HDMI_INTC_CON, ~0, HDMI_INTC_EN_GLOBAL |
1277 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
1279 /* choose HDMI mode */
1280 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1281 HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
1283 if (hdata->video_enabled)
1284 hdmi_enable_video(hdata);
1286 hdmi_disable_video(hdata);
1288 if (!hdata->has_hdmi_sink) {
1289 /* choose DVI mode */
1290 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1291 HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1292 hdmi_reg_writeb(hdata, HDMI_CON_2,
1293 HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1296 if (hdata->is_v13) {
1297 /* choose bluescreen (fecal) color */
1298 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
1299 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
1300 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1302 /* enable AVI packet every vsync, fixes purple line problem */
1303 hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1304 /* force RGB, look to CEA-861-D, table 7 for more detail */
1305 hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1306 hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1308 hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1309 hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1310 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1312 /* enable AVI packet every vsync, fixes purple line problem */
1313 hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1315 infoframe.type = HDMI_PACKET_TYPE_AVI;
1316 infoframe.ver = HDMI_AVI_VERSION;
1317 infoframe.len = HDMI_AVI_LENGTH;
1318 hdmi_reg_infoframe(hdata, &infoframe);
1320 infoframe.type = HDMI_PACKET_TYPE_AUI;
1321 infoframe.ver = HDMI_AUI_VERSION;
1322 infoframe.len = HDMI_AUI_LENGTH;
1323 hdmi_reg_infoframe(hdata, &infoframe);
1327 /* enable hpd handle for drm */
1328 hdata->hpd_handle = true;
1331 static void hdmi_v13_timing_apply(struct hdmi_context *hdata)
1333 const struct hdmi_v13_preset_conf *conf =
1334 hdmi_v13_confs[hdata->cur_conf].conf;
1335 const struct hdmi_v13_core_regs *core = &conf->core;
1336 const struct hdmi_v13_tg_regs *tg = &conf->tg;
1339 /* setting core registers */
1340 hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1341 hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1342 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_0, core->v_blank[0]);
1343 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_1, core->v_blank[1]);
1344 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_2, core->v_blank[2]);
1345 hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_0, core->h_v_line[0]);
1346 hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_1, core->h_v_line[1]);
1347 hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_2, core->h_v_line[2]);
1348 hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1349 hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1350 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_0, core->v_blank_f[0]);
1351 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_1, core->v_blank_f[1]);
1352 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_2, core->v_blank_f[2]);
1353 hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_0, core->h_sync_gen[0]);
1354 hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_1, core->h_sync_gen[1]);
1355 hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_2, core->h_sync_gen[2]);
1356 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_0, core->v_sync_gen1[0]);
1357 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_1, core->v_sync_gen1[1]);
1358 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_2, core->v_sync_gen1[2]);
1359 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_0, core->v_sync_gen2[0]);
1360 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_1, core->v_sync_gen2[1]);
1361 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_2, core->v_sync_gen2[2]);
1362 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_0, core->v_sync_gen3[0]);
1363 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_1, core->v_sync_gen3[1]);
1364 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_2, core->v_sync_gen3[2]);
1365 /* Timing generator registers */
1366 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz_l);
1367 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz_h);
1368 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st_l);
1369 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st_h);
1370 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz_l);
1371 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz_h);
1372 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz_l);
1373 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz_h);
1374 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync_l);
1375 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync_h);
1376 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2_l);
1377 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2_h);
1378 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st_l);
1379 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st_h);
1380 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz_l);
1381 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz_h);
1382 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg_l);
1383 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg_h);
1384 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2_l);
1385 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2_h);
1386 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi_l);
1387 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi_h);
1388 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi_l);
1389 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi_h);
1390 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi_l);
1391 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi_h);
1392 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi_l);
1393 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi_h);
1395 /* waiting for HDMIPHY's PLL to get to steady state */
1396 for (tries = 100; tries; --tries) {
1397 u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
1398 if (val & HDMI_PHY_STATUS_READY)
1402 /* steady state not achieved */
1404 DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1405 hdmi_regs_dump(hdata, "timing apply");
1408 clk_disable(hdata->res.sclk_hdmi);
1409 clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_hdmiphy);
1410 clk_enable(hdata->res.sclk_hdmi);
1412 /* enable HDMI and timing generator */
1413 hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
1414 if (core->int_pro_mode[0])
1415 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
1418 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
1421 static void hdmi_v14_timing_apply(struct hdmi_context *hdata)
1423 struct hdmi_core_regs *core = &hdata->mode_conf.core;
1424 struct hdmi_tg_regs *tg = &hdata->mode_conf.tg;
1427 hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1428 hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1429 hdmi_reg_writeb(hdata, HDMI_V2_BLANK_0, core->v2_blank[0]);
1430 hdmi_reg_writeb(hdata, HDMI_V2_BLANK_1, core->v2_blank[1]);
1431 hdmi_reg_writeb(hdata, HDMI_V1_BLANK_0, core->v1_blank[0]);
1432 hdmi_reg_writeb(hdata, HDMI_V1_BLANK_1, core->v1_blank[1]);
1433 hdmi_reg_writeb(hdata, HDMI_V_LINE_0, core->v_line[0]);
1434 hdmi_reg_writeb(hdata, HDMI_V_LINE_1, core->v_line[1]);
1435 hdmi_reg_writeb(hdata, HDMI_H_LINE_0, core->h_line[0]);
1436 hdmi_reg_writeb(hdata, HDMI_H_LINE_1, core->h_line[1]);
1437 hdmi_reg_writeb(hdata, HDMI_HSYNC_POL, core->hsync_pol[0]);
1438 hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1439 hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1440 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_0, core->v_blank_f0[0]);
1441 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_1, core->v_blank_f0[1]);
1442 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_0, core->v_blank_f1[0]);
1443 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_1, core->v_blank_f1[1]);
1444 hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_0, core->h_sync_start[0]);
1445 hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_1, core->h_sync_start[1]);
1446 hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_0, core->h_sync_end[0]);
1447 hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_1, core->h_sync_end[1]);
1448 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_0,
1449 core->v_sync_line_bef_2[0]);
1450 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_1,
1451 core->v_sync_line_bef_2[1]);
1452 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_0,
1453 core->v_sync_line_bef_1[0]);
1454 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_1,
1455 core->v_sync_line_bef_1[1]);
1456 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_0,
1457 core->v_sync_line_aft_2[0]);
1458 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_1,
1459 core->v_sync_line_aft_2[1]);
1460 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_0,
1461 core->v_sync_line_aft_1[0]);
1462 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_1,
1463 core->v_sync_line_aft_1[1]);
1464 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0,
1465 core->v_sync_line_aft_pxl_2[0]);
1466 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_1,
1467 core->v_sync_line_aft_pxl_2[1]);
1468 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0,
1469 core->v_sync_line_aft_pxl_1[0]);
1470 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_1,
1471 core->v_sync_line_aft_pxl_1[1]);
1472 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_0, core->v_blank_f2[0]);
1473 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_1, core->v_blank_f2[1]);
1474 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_0, core->v_blank_f3[0]);
1475 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_1, core->v_blank_f3[1]);
1476 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_0, core->v_blank_f4[0]);
1477 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_1, core->v_blank_f4[1]);
1478 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_0, core->v_blank_f5[0]);
1479 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_1, core->v_blank_f5[1]);
1480 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_0,
1481 core->v_sync_line_aft_3[0]);
1482 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_1,
1483 core->v_sync_line_aft_3[1]);
1484 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_0,
1485 core->v_sync_line_aft_4[0]);
1486 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_1,
1487 core->v_sync_line_aft_4[1]);
1488 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_0,
1489 core->v_sync_line_aft_5[0]);
1490 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_1,
1491 core->v_sync_line_aft_5[1]);
1492 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_0,
1493 core->v_sync_line_aft_6[0]);
1494 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_1,
1495 core->v_sync_line_aft_6[1]);
1496 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0,
1497 core->v_sync_line_aft_pxl_3[0]);
1498 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_1,
1499 core->v_sync_line_aft_pxl_3[1]);
1500 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0,
1501 core->v_sync_line_aft_pxl_4[0]);
1502 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_1,
1503 core->v_sync_line_aft_pxl_4[1]);
1504 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0,
1505 core->v_sync_line_aft_pxl_5[0]);
1506 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_1,
1507 core->v_sync_line_aft_pxl_5[1]);
1508 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0,
1509 core->v_sync_line_aft_pxl_6[0]);
1510 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_1,
1511 core->v_sync_line_aft_pxl_6[1]);
1512 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_0, core->vact_space_1[0]);
1513 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_1, core->vact_space_1[1]);
1514 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_0, core->vact_space_2[0]);
1515 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_1, core->vact_space_2[1]);
1516 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_0, core->vact_space_3[0]);
1517 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_1, core->vact_space_3[1]);
1518 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_0, core->vact_space_4[0]);
1519 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_1, core->vact_space_4[1]);
1520 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_0, core->vact_space_5[0]);
1521 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_1, core->vact_space_5[1]);
1522 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_0, core->vact_space_6[0]);
1523 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_1, core->vact_space_6[1]);
1525 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1526 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1527 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1528 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1529 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1530 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1531 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1532 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1533 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1534 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1535 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1536 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1537 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1538 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1539 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1540 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1541 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1542 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1543 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1544 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1545 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_L, tg->vact_st3[0]);
1546 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_H, tg->vact_st3[1]);
1547 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_L, tg->vact_st4[0]);
1548 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_H, tg->vact_st4[1]);
1549 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1550 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1551 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1552 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1553 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1554 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1555 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1556 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1557 hdmi_reg_writeb(hdata, HDMI_TG_3D, tg->tg_3d[0]);
1559 /* waiting for HDMIPHY's PLL to get to steady state */
1560 for (tries = 100; tries; --tries) {
1561 u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
1562 if (val & HDMI_PHY_STATUS_READY)
1566 /* steady state not achieved */
1568 DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1569 hdmi_regs_dump(hdata, "timing apply");
1572 clk_disable(hdata->res.sclk_hdmi);
1573 clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_hdmiphy);
1574 clk_enable(hdata->res.sclk_hdmi);
1576 /* enable HDMI and timing generator */
1577 hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
1578 if (core->int_pro_mode[0])
1579 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
1582 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
1585 static void hdmi_timing_apply(struct hdmi_context *hdata)
1588 hdmi_v13_timing_apply(hdata);
1590 hdmi_v14_timing_apply(hdata);
1593 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1598 clk_disable(hdata->res.sclk_hdmi);
1599 clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_pixel);
1600 clk_enable(hdata->res.sclk_hdmi);
1602 /* operation mode */
1606 if (hdata->hdmiphy_port)
1607 i2c_master_send(hdata->hdmiphy_port, buffer, 2);
1610 reg = HDMI_V13_PHY_RSTOUT;
1612 reg = HDMI_PHY_RSTOUT;
1615 hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
1617 hdmi_reg_writemask(hdata, reg, 0, HDMI_PHY_SW_RSTOUT);
1621 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1623 const u8 *hdmiphy_data;
1626 u8 read_buffer[32] = {0, };
1630 DRM_DEBUG_KMS("\n");
1632 if (!hdata->hdmiphy_port) {
1633 DRM_ERROR("hdmiphy is not attached\n");
1638 if (hdata->is_v13) {
1639 hdmiphy_data = hdmi_v13_confs[hdata->cur_conf].hdmiphy_data;
1641 i = find_hdmiphy_conf(hdata->mode_conf.pixel_clock);
1642 hdmiphy_data = phy_configs[i].conf;
1645 memcpy(buffer, hdmiphy_data, 32);
1646 ret = i2c_master_send(hdata->hdmiphy_port, buffer, 32);
1648 DRM_ERROR("failed to configure HDMIPHY via I2C\n");
1654 /* operation mode */
1655 operation[0] = 0x1f;
1656 operation[1] = 0x80;
1658 ret = i2c_master_send(hdata->hdmiphy_port, operation, 2);
1660 DRM_ERROR("failed to enable hdmiphy\n");
1664 ret = i2c_master_recv(hdata->hdmiphy_port, read_buffer, 32);
1666 DRM_ERROR("failed to read hdmiphy config\n");
1670 for (i = 0; i < ret; i++)
1671 DRM_DEBUG_KMS("hdmiphy[0x%02x] write[0x%02x] - "
1672 "recv [0x%02x]\n", i, buffer[i], read_buffer[i]);
1675 static void hdmi_conf_apply(struct hdmi_context *hdata)
1677 DRM_DEBUG_KMS("\n");
1679 hdmiphy_conf_reset(hdata);
1680 hdmiphy_conf_apply(hdata);
1682 hdmi_conf_reset(hdata);
1683 hdmi_conf_init(hdata);
1684 if (!hdata->is_soc_exynos5)
1685 hdmi_audio_init(hdata);
1687 /* setting core registers */
1688 hdmi_timing_apply(hdata);
1689 if (!hdata->is_soc_exynos5)
1690 hdmi_audio_control(hdata, true);
1692 hdmi_regs_dump(hdata, "start");
1695 static void hdmi_mode_copy(struct drm_display_mode *dst,
1696 struct drm_display_mode *src)
1698 struct drm_mode_object base;
1700 DRM_DEBUG_KMS("[MODE:%d:%s]\n", DRM_BASE_ID(src), src->name);
1702 /* following information should be preserved,
1703 * required for releasing the drm_display_mode node,
1704 * duplicated to recieve adjustment info. */
1706 base.id = dst->base.id;
1707 base.type = dst->base.type;
1709 memcpy(dst, src, sizeof(struct drm_display_mode));
1711 dst->base.id = base.id;
1712 dst->base.type = base.type;
1715 static void hdmi_mode_fixup(void *ctx, struct drm_connector *connector,
1716 struct drm_display_mode *mode,
1717 struct drm_display_mode *adjusted_mode)
1719 struct drm_display_mode *m;
1720 struct hdmi_context *hdata = ctx;
1723 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] [MODE:%d:%s]\n",
1724 DRM_BASE_ID(connector),
1725 drm_get_connector_name(connector),
1726 DRM_BASE_ID(mode), mode->name);
1728 drm_mode_set_crtcinfo(adjusted_mode, 0);
1731 index = hdmi_v13_conf_index(adjusted_mode);
1733 index = find_hdmiphy_conf(adjusted_mode->clock * 1000);
1735 /* just return if user desired mode exists. */
1740 * otherwise, find the most suitable mode among modes and change it
1743 list_for_each_entry(m, &connector->modes, head) {
1745 index = hdmi_v13_conf_index(m);
1747 index = find_hdmiphy_conf(m->clock * 1000);
1750 DRM_INFO("desired mode doesn't exist so\n");
1751 DRM_INFO("use the most suitable mode among modes.\n");
1752 hdmi_mode_copy(adjusted_mode, m);
1758 static void hdmi_set_reg(u8 *reg_pair, int num_bytes, u32 value)
1761 BUG_ON(num_bytes > 4);
1762 for (i = 0; i < num_bytes; i++)
1763 reg_pair[i] = (value >> (8 * i)) & 0xff;
1766 static void hdmi_v14_mode_set(struct hdmi_context *hdata,
1767 struct drm_display_mode *m)
1769 struct hdmi_core_regs *core = &hdata->mode_conf.core;
1770 struct hdmi_tg_regs *tg = &hdata->mode_conf.tg;
1772 DRM_DEBUG_KMS("[MODE:%d:%s]\n", DRM_BASE_ID(m), m->name);
1774 hdata->mode_conf.vic = drm_match_cea_mode(m);
1776 hdata->mode_conf.pixel_clock = m->clock * 1000;
1777 hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1778 hdmi_set_reg(core->v_line, 2, m->vtotal);
1779 hdmi_set_reg(core->h_line, 2, m->htotal);
1780 hdmi_set_reg(core->hsync_pol, 1,
1781 (m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0);
1782 hdmi_set_reg(core->vsync_pol, 1,
1783 (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1784 hdmi_set_reg(core->int_pro_mode, 1,
1785 (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1788 * Quirk requirement for exynos 5 HDMI IP design,
1789 * 2 pixels less than the actual calculation for hsync_start
1793 /* Following values & calculations differ for different type of modes */
1794 if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1795 /* Interlaced Mode */
1796 hdmi_set_reg(core->v_sync_line_bef_2, 2,
1797 (m->vsync_end - m->vdisplay) / 2);
1798 hdmi_set_reg(core->v_sync_line_bef_1, 2,
1799 (m->vsync_start - m->vdisplay) / 2);
1800 hdmi_set_reg(core->v2_blank, 2, m->vtotal / 2);
1801 hdmi_set_reg(core->v1_blank, 2, (m->vtotal - m->vdisplay) / 2);
1802 hdmi_set_reg(core->v_blank_f0, 2,
1803 (m->vtotal + ((m->vsync_end - m->vsync_start) * 4) + 5) / 2);
1804 hdmi_set_reg(core->v_blank_f1, 2, m->vtotal);
1805 hdmi_set_reg(core->v_sync_line_aft_2, 2, (m->vtotal / 2) + 7);
1806 hdmi_set_reg(core->v_sync_line_aft_1, 2, (m->vtotal / 2) + 2);
1807 hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2,
1808 (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1809 hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2,
1810 (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1811 hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1812 hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1813 hdmi_set_reg(tg->vact_st2, 2, 0x249);/* Reset value + 1*/
1814 hdmi_set_reg(tg->vact_st3, 2, 0x0);
1815 hdmi_set_reg(tg->vact_st4, 2, 0x0);
1817 /* Progressive Mode */
1818 hdmi_set_reg(core->v_sync_line_bef_2, 2,
1819 m->vsync_end - m->vdisplay);
1820 hdmi_set_reg(core->v_sync_line_bef_1, 2,
1821 m->vsync_start - m->vdisplay);
1822 hdmi_set_reg(core->v2_blank, 2, m->vtotal);
1823 hdmi_set_reg(core->v1_blank, 2, m->vtotal - m->vdisplay);
1824 hdmi_set_reg(core->v_blank_f0, 2, 0xffff);
1825 hdmi_set_reg(core->v_blank_f1, 2, 0xffff);
1826 hdmi_set_reg(core->v_sync_line_aft_2, 2, 0xffff);
1827 hdmi_set_reg(core->v_sync_line_aft_1, 2, 0xffff);
1828 hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2, 0xffff);
1829 hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2, 0xffff);
1830 hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1831 hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1832 hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1833 hdmi_set_reg(tg->vact_st3, 2, 0x47b); /* Reset value */
1834 hdmi_set_reg(tg->vact_st4, 2, 0x6ae); /* Reset value */
1837 /* Following values & calculations are same irrespective of mode type */
1838 hdmi_set_reg(core->h_sync_start, 2, m->hsync_start - m->hdisplay - 2);
1839 hdmi_set_reg(core->h_sync_end, 2, m->hsync_end - m->hdisplay - 2);
1840 hdmi_set_reg(core->vact_space_1, 2, 0xffff);
1841 hdmi_set_reg(core->vact_space_2, 2, 0xffff);
1842 hdmi_set_reg(core->vact_space_3, 2, 0xffff);
1843 hdmi_set_reg(core->vact_space_4, 2, 0xffff);
1844 hdmi_set_reg(core->vact_space_5, 2, 0xffff);
1845 hdmi_set_reg(core->vact_space_6, 2, 0xffff);
1846 hdmi_set_reg(core->v_blank_f2, 2, 0xffff);
1847 hdmi_set_reg(core->v_blank_f3, 2, 0xffff);
1848 hdmi_set_reg(core->v_blank_f4, 2, 0xffff);
1849 hdmi_set_reg(core->v_blank_f5, 2, 0xffff);
1850 hdmi_set_reg(core->v_sync_line_aft_3, 2, 0xffff);
1851 hdmi_set_reg(core->v_sync_line_aft_4, 2, 0xffff);
1852 hdmi_set_reg(core->v_sync_line_aft_5, 2, 0xffff);
1853 hdmi_set_reg(core->v_sync_line_aft_6, 2, 0xffff);
1854 hdmi_set_reg(core->v_sync_line_aft_pxl_3, 2, 0xffff);
1855 hdmi_set_reg(core->v_sync_line_aft_pxl_4, 2, 0xffff);
1856 hdmi_set_reg(core->v_sync_line_aft_pxl_5, 2, 0xffff);
1857 hdmi_set_reg(core->v_sync_line_aft_pxl_6, 2, 0xffff);
1859 /* Timing generator registers */
1860 hdmi_set_reg(tg->cmd, 1, 0x0);
1861 hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1862 hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1863 hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1864 hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1865 hdmi_set_reg(tg->vsync, 2, 0x1);
1866 hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1867 hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1868 hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1869 hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1870 hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1871 hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1872 hdmi_set_reg(tg->tg_3d, 1, 0x0);
1874 /* Workaround 4 implementation for 1440x900 resolution support */
1875 if (hdata->is_soc_exynos5) {
1876 if (m->hdisplay == 1440 && m->vdisplay == 900 && m->clock == 106500) {
1877 hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay - 0xe0);
1878 hdmi_set_reg(tg->hact_sz, 2, m->hdisplay + 0xe0);
1883 static void hdmi_mode_set(void *ctx, struct drm_display_mode *mode)
1885 struct hdmi_context *hdata = ctx;
1887 DRM_DEBUG_KMS("[MODE:%d:%s]\n", DRM_BASE_ID(mode), mode->name);
1890 hdata->cur_conf = hdmi_v13_conf_index(mode);
1892 hdmi_v14_mode_set(hdata, mode);
1895 static int hdmiphy_update_bits(struct i2c_client *client, u8 *reg_cache,
1896 u8 reg, u8 mask, u8 val)
1902 buffer[1] = (reg_cache[reg] & ~mask) | (val & mask);
1903 reg_cache[reg] = buffer[1];
1905 ret = i2c_master_send(client, buffer, 2);
1912 static int hdmiphy_s_power(struct i2c_client *client, bool on)
1914 u8 reg_cache[32] = { 0 };
1918 DRM_DEBUG_KMS("%s\n", on ? "on" : "off");
1920 /* Cache all 32 registers to make the code below faster */
1922 ret = i2c_master_send(client, buffer, 1);
1927 ret = i2c_master_recv(client, reg_cache, 32);
1933 /* Go to/from configuration from/to operation mode */
1934 ret = hdmiphy_update_bits(client, reg_cache, 0x1f, 0xff,
1940 * Turn off undocumented "oscpad" if !on; it turns on again in
1941 * hdmiphy_conf_apply()
1944 ret = hdmiphy_update_bits(client, reg_cache, 0x0b, 0xc0, 0x00);
1948 /* Disable powerdown if on; enable if !on */
1949 ret = hdmiphy_update_bits(client, reg_cache, 0x1d, 0x80,
1953 ret = hdmiphy_update_bits(client, reg_cache, 0x1d, 0x77,
1959 * Turn off bit 3 of reg 4 if !on; it turns on again in
1960 * hdmiphy_conf_apply(). It's unclear what this bit does.
1963 ret = hdmiphy_update_bits(client, reg_cache, 0x04, BIT(3), 0);
1968 /* Don't expect any errors so just do a single warn */
1974 static void hdmi_resource_poweron(struct hdmi_context *hdata)
1976 struct hdmi_resources *res = &hdata->res;
1978 hdata->is_hdmi_powered_on = true;
1979 hdmi_cfg_hpd(hdata, false);
1981 /* irq change by TV power status */
1982 if (hdata->curr_irq == hdata->internal_irq)
1985 disable_irq(hdata->curr_irq);
1987 hdata->curr_irq = hdata->internal_irq;
1989 enable_irq(hdata->curr_irq);
1991 /* turn HDMI power on */
1992 regulator_bulk_enable(res->regul_count, res->regul_bulk);
1994 /* power-on hdmi clocks */
1995 clk_enable(res->hdmiphy);
1997 hdmiphy_s_power(hdata->hdmiphy_port, 1);
1998 hdmiphy_conf_reset(hdata);
1999 hdmi_conf_reset(hdata);
2000 hdmi_conf_init(hdata);
2001 if (!hdata->is_soc_exynos5)
2002 hdmi_audio_init(hdata);
2003 hdmi_conf_apply(hdata);
2006 static void hdmi_resource_poweroff(struct hdmi_context *hdata)
2008 struct hdmi_resources *res = &hdata->res;
2010 hdmi_cfg_hpd(hdata, true);
2012 if (hdata->curr_irq == hdata->external_irq)
2015 disable_irq(hdata->curr_irq);
2016 hdata->curr_irq = hdata->external_irq;
2018 enable_irq(hdata->curr_irq);
2019 hdata->is_hdmi_powered_on = false;
2021 hdmiphy_s_power(hdata->hdmiphy_port, 0);
2022 hdmiphy_conf_reset(hdata);
2024 /* power-off hdmi clocks */
2025 clk_disable(res->hdmiphy);
2027 /* turn HDMI power off */
2028 regulator_bulk_disable(res->regul_count, res->regul_bulk);
2031 static int hdmi_dpms(void *ctx, int mode)
2033 struct hdmi_context *hdata = ctx;
2035 DRM_DEBUG_KMS("[DPMS:%s]\n", drm_get_dpms_name(mode));
2038 case DRM_MODE_DPMS_ON:
2039 if (!hdata->is_hdmi_powered_on)
2040 hdmi_resource_poweron(hdata);
2041 hdmi_enable_video(hdata);
2043 case DRM_MODE_DPMS_STANDBY:
2044 hdmi_disable_video(hdata);
2046 case DRM_MODE_DPMS_OFF:
2047 case DRM_MODE_DPMS_SUSPEND:
2048 if (hdata->is_hdmi_powered_on)
2049 hdmi_resource_poweroff(hdata);
2052 DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
2059 static int hdmi_subdrv_probe(void *ctx, struct drm_device *drm_dev)
2061 struct hdmi_context *hdata = ctx;
2063 DRM_DEBUG_KMS("[DEV:%s]\n", drm_dev->devname);
2065 hdata->drm_dev = drm_dev;
2070 static struct exynos_panel_ops hdmi_ops = {
2072 .subdrv_probe = hdmi_subdrv_probe,
2073 .is_connected = hdmi_is_connected,
2074 .get_edid = hdmi_get_edid,
2075 .check_timing = hdmi_check_timing,
2079 .mode_fixup = hdmi_mode_fixup,
2080 .mode_set = hdmi_mode_set,
2084 * Handle hotplug events outside the interrupt handler proper.
2086 static void hdmi_hotplug_func(struct work_struct *work)
2088 struct hdmi_context *hdata =
2089 container_of(work, struct hdmi_context, hotplug_work);
2091 drm_helper_hpd_irq_event(hdata->drm_dev);
2094 static irqreturn_t hdmi_irq_handler(int irq, void *arg)
2096 struct hdmi_context *hdata = arg;
2098 if (hdata->is_hdmi_powered_on) {
2099 intc_flag = hdmi_reg_read(hdata, HDMI_INTC_FLAG);
2100 /* clearing flags for HPD plug/unplug */
2101 if (intc_flag & HDMI_INTC_FLAG_HPD_UNPLUG) {
2102 DRM_DEBUG_KMS("int unplugged, handling:%d\n",
2104 hdmi_reg_writemask(hdata, HDMI_INTC_FLAG, ~0,
2105 HDMI_INTC_FLAG_HPD_UNPLUG);
2107 if (intc_flag & HDMI_INTC_FLAG_HPD_PLUG) {
2108 DRM_DEBUG_KMS("int plugged, handling:%d\n",
2110 hdmi_reg_writemask(hdata, HDMI_INTC_FLAG, ~0,
2111 HDMI_INTC_FLAG_HPD_PLUG);
2115 if (hdata->drm_dev && hdata->hpd_handle)
2116 queue_work(hdata->wq, &hdata->hotplug_work);
2121 static int __devinit hdmi_resources_init(struct hdmi_context *hdata)
2123 struct device *dev = hdata->dev;
2124 struct hdmi_resources *res = &hdata->res;
2125 #ifndef CONFIG_ARCH_EXYNOS5
2126 static char *supply[] = {
2135 DRM_DEBUG_KMS("HDMI resource init\n");
2137 memset(res, 0, sizeof *res);
2139 /* get clocks, power */
2140 res->hdmi = clk_get(dev, "hdmi");
2141 if (IS_ERR_OR_NULL(res->hdmi)) {
2142 DRM_ERROR("failed to get clock 'hdmi'\n");
2145 res->sclk_hdmi = clk_get(dev, "sclk_hdmi");
2146 if (IS_ERR_OR_NULL(res->sclk_hdmi)) {
2147 DRM_ERROR("failed to get clock 'sclk_hdmi'\n");
2150 res->sclk_pixel = clk_get(dev, "sclk_pixel");
2151 if (IS_ERR_OR_NULL(res->sclk_pixel)) {
2152 DRM_ERROR("failed to get clock 'sclk_pixel'\n");
2155 res->sclk_hdmiphy = clk_get(dev, "sclk_hdmiphy");
2156 if (IS_ERR_OR_NULL(res->sclk_hdmiphy)) {
2157 DRM_ERROR("failed to get clock 'sclk_hdmiphy'\n");
2160 res->hdmiphy = clk_get(dev, "hdmiphy");
2161 if (IS_ERR_OR_NULL(res->hdmiphy)) {
2162 DRM_ERROR("failed to get clock 'hdmiphy'\n");
2166 clk_set_parent(res->sclk_hdmi, res->sclk_pixel);
2168 #ifndef CONFIG_ARCH_EXYNOS5
2169 res->regul_bulk = kzalloc(ARRAY_SIZE(supply) *
2170 sizeof res->regul_bulk[0], GFP_KERNEL);
2171 if (!res->regul_bulk) {
2172 DRM_ERROR("failed to get memory for regulators\n");
2175 for (i = 0; i < ARRAY_SIZE(supply); ++i) {
2176 res->regul_bulk[i].supply = supply[i];
2177 res->regul_bulk[i].consumer = NULL;
2179 ret = regulator_bulk_get(dev, ARRAY_SIZE(supply), res->regul_bulk);
2181 DRM_ERROR("failed to get regulators\n");
2184 res->regul_count = ARRAY_SIZE(supply);
2187 * These clocks also should be added in
2188 * runtime resume and runtime suspend
2190 clk_enable(res->hdmi);
2191 clk_enable(res->sclk_hdmi);
2195 DRM_ERROR("HDMI resource init - failed\n");
2199 static int hdmi_resources_cleanup(struct hdmi_context *hdata)
2201 struct hdmi_resources *res = &hdata->res;
2203 regulator_bulk_free(res->regul_count, res->regul_bulk);
2204 /* kfree is NULL-safe */
2205 kfree(res->regul_bulk);
2206 if (!IS_ERR_OR_NULL(res->hdmiphy))
2207 clk_put(res->hdmiphy);
2208 if (!IS_ERR_OR_NULL(res->sclk_hdmiphy))
2209 clk_put(res->sclk_hdmiphy);
2210 if (!IS_ERR_OR_NULL(res->sclk_pixel))
2211 clk_put(res->sclk_pixel);
2212 if (!IS_ERR_OR_NULL(res->sclk_hdmi))
2213 clk_put(res->sclk_hdmi);
2214 if (!IS_ERR_OR_NULL(res->hdmi))
2216 memset(res, 0, sizeof *res);
2221 struct platform_device *hdmi_audio_device;
2223 int hdmi_register_audio_device(struct platform_device *pdev)
2225 struct hdmi_context *hdata = platform_get_drvdata(pdev);
2226 struct platform_device *audio_dev;
2229 DRM_DEBUG_KMS("[PDEV:%s]\n", pdev->name);
2231 audio_dev = platform_device_alloc("exynos-hdmi-audio", -1);
2233 DRM_ERROR("hdmi audio device allocation failed.\n");
2238 ret = platform_device_add_resources(audio_dev, pdev->resource,
2239 pdev->num_resources);
2245 audio_dev->dev.of_node = of_get_next_child(pdev->dev.of_node, NULL);
2246 audio_dev->dev.platform_data = (void *)hdata->hpd_gpio;
2248 ret = platform_device_add(audio_dev);
2250 DRM_ERROR("hdmi audio device add failed.\n");
2254 hdmi_audio_device = audio_dev;
2258 platform_device_put(audio_dev);
2264 void hdmi_unregister_audio_device(void)
2266 DRM_DEBUG_KMS("\n");
2267 platform_device_unregister(hdmi_audio_device);
2270 static int __devinit hdmi_probe(struct platform_device *pdev)
2272 struct device *dev = &pdev->dev;
2273 struct hdmi_context *hdata;
2274 struct exynos_drm_hdmi_pdata *pdata;
2275 struct resource *res;
2276 struct device_node *ddc_node, *phy_node;
2278 enum of_gpio_flags flags;
2280 DRM_DEBUG_KMS("[PDEV:%s]\n", pdev->name);
2282 pdata = pdev->dev.platform_data;
2284 DRM_ERROR("no platform data specified\n");
2288 hdata = kzalloc(sizeof(struct hdmi_context), GFP_KERNEL);
2290 DRM_ERROR("out of memory\n");
2294 platform_set_drvdata(pdev, hdata);
2296 hdata->is_v13 = pdata->is_v13;
2297 hdata->default_win = pdata->default_win;
2298 hdata->default_timing = &pdata->timing;
2299 hdata->default_bpp = pdata->bpp;
2301 hdata->is_soc_exynos5 = of_device_is_compatible(dev->of_node,
2302 "samsung,exynos5-hdmi");
2304 ret = hdmi_resources_init(hdata);
2310 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2312 DRM_ERROR("failed to find registers\n");
2317 hdata->regs_res = request_mem_region(res->start, resource_size(res),
2319 if (!hdata->regs_res) {
2320 DRM_ERROR("failed to claim register region\n");
2325 hdata->regs = ioremap(res->start, resource_size(res));
2327 DRM_ERROR("failed to map registers\n");
2329 goto err_req_region;
2332 /* DDC i2c driver */
2333 ddc_node = of_find_node_by_name(NULL, "exynos_ddc");
2335 DRM_ERROR("Failed to find ddc node in device tree\n");
2339 hdata->ddc_port = of_find_i2c_device_by_node(ddc_node);
2340 if (!hdata->ddc_port) {
2341 DRM_ERROR("Failed to get ddc i2c client by node\n");
2346 /* hdmiphy i2c driver */
2347 phy_node = of_find_node_by_name(NULL, "exynos_hdmiphy");
2349 DRM_ERROR("Failed to find hdmiphy node in device tree\n");
2353 hdata->hdmiphy_port = of_find_i2c_device_by_node(phy_node);
2354 if (!hdata->hdmiphy_port) {
2355 DRM_ERROR("Failed to get hdmi phy i2c client from node\n");
2360 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
2362 DRM_ERROR("get interrupt resource failed.\n");
2367 hdata->internal_irq = res->start;
2369 hdata->hpd_gpio = of_get_named_gpio_flags(dev->of_node,
2370 "hpd-gpio", 0, &flags);
2372 if (!gpio_is_valid(hdata->hpd_gpio)) {
2373 DRM_ERROR("failed to get hpd gpio.");
2378 hdata->external_irq = gpio_to_irq(hdata->hpd_gpio);
2380 /* create workqueue and hotplug work */
2381 hdata->wq = alloc_workqueue("exynos-drm-hdmi",
2382 WQ_UNBOUND | WQ_NON_REENTRANT, 1);
2383 if (hdata->wq == NULL) {
2384 DRM_ERROR("Failed to create workqueue.\n");
2388 INIT_WORK(&hdata->hotplug_work, hdmi_hotplug_func);
2390 ret = request_irq(hdata->internal_irq, hdmi_irq_handler,
2391 IRQF_SHARED, "int_hdmi", hdata);
2393 DRM_ERROR("request int interrupt failed.\n");
2396 disable_irq(hdata->internal_irq);
2398 ret = request_irq(hdata->external_irq, hdmi_irq_handler,
2399 IRQ_TYPE_EDGE_BOTH | IRQF_SHARED, "ext_hdmi",
2402 DRM_ERROR("request ext interrupt failed.\n");
2405 disable_irq(hdata->external_irq);
2407 if (of_device_is_compatible(dev->of_node,
2408 "samsung,exynos5-hdmi")) {
2409 ret = hdmi_register_audio_device(pdev);
2411 DRM_ERROR("hdmi-audio device registering failed.\n");
2416 hdmi_resource_poweron(hdata);
2418 if (!hdmi_is_connected(hdata)) {
2419 hdmi_resource_poweroff(hdata);
2420 DRM_DEBUG_KMS("gpio state is low. powering off!\n");
2423 exynos_display_attach_panel(EXYNOS_DRM_DISPLAY_TYPE_MIXER, &hdmi_ops,
2429 free_irq(hdata->external_irq, hdata);
2431 free_irq(hdata->internal_irq, hdata);
2433 destroy_workqueue(hdata->wq);
2435 put_device(&hdata->hdmiphy_port->dev);
2437 put_device(&hdata->ddc_port->dev);
2439 iounmap(hdata->regs);
2441 release_mem_region(hdata->regs_res->start,
2442 resource_size(hdata->regs_res));
2444 hdmi_resources_cleanup(hdata);
2450 static int __devexit hdmi_remove(struct platform_device *pdev)
2452 struct hdmi_context *hdata = platform_get_drvdata(pdev);
2453 struct hdmi_resources *res = &hdata->res;
2455 DRM_DEBUG_KMS("[PDEV:%s]\n", pdev->name);
2457 hdmi_resource_poweroff(hdata);
2459 hdmi_unregister_audio_device();
2461 disable_irq(hdata->curr_irq);
2462 free_irq(hdata->internal_irq, hdata);
2463 free_irq(hdata->external_irq, hdata);
2465 cancel_work_sync(&hdata->hotplug_work);
2466 destroy_workqueue(hdata->wq);
2468 clk_disable(res->hdmi);
2469 clk_disable(res->sclk_hdmi);
2470 hdmi_resources_cleanup(hdata);
2472 iounmap(hdata->regs);
2474 release_mem_region(hdata->regs_res->start,
2475 resource_size(hdata->regs_res));
2477 put_device(&hdata->hdmiphy_port->dev);
2478 put_device(&hdata->ddc_port->dev);
2485 struct platform_driver hdmi_driver = {
2486 .probe = hdmi_probe,
2487 .remove = __devexit_p(hdmi_remove),
2489 #ifdef CONFIG_ARCH_EXYNOS5
2490 .name = "exynos5-hdmi",
2492 .name = "exynos4-hdmi",
2494 .owner = THIS_MODULE,