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 #define HOTPLUG_DEBOUNCE_MS 1100
52 struct hdmi_resources {
54 struct clk *sclk_hdmi;
55 struct clk *sclk_pixel;
56 struct clk *sclk_hdmiphy;
58 struct regulator_bulk_data *regul_bulk;
83 struct hdmi_core_regs {
96 u8 v_sync_line_bef_2[2];
97 u8 v_sync_line_bef_1[2];
98 u8 v_sync_line_aft_2[2];
99 u8 v_sync_line_aft_1[2];
100 u8 v_sync_line_aft_pxl_2[2];
101 u8 v_sync_line_aft_pxl_1[2];
102 u8 v_blank_f2[2]; /* for 3D mode */
103 u8 v_blank_f3[2]; /* for 3D mode */
104 u8 v_blank_f4[2]; /* for 3D mode */
105 u8 v_blank_f5[2]; /* for 3D mode */
106 u8 v_sync_line_aft_3[2];
107 u8 v_sync_line_aft_4[2];
108 u8 v_sync_line_aft_5[2];
109 u8 v_sync_line_aft_6[2];
110 u8 v_sync_line_aft_pxl_3[2];
111 u8 v_sync_line_aft_pxl_4[2];
112 u8 v_sync_line_aft_pxl_5[2];
113 u8 v_sync_line_aft_pxl_6[2];
122 struct hdmi_mode_conf {
124 struct hdmi_core_regs core;
125 struct hdmi_tg_regs tg;
129 struct hdmi_context {
131 struct drm_device *drm_dev;
132 struct fb_videomode *default_timing;
133 struct hdmi_mode_conf mode_conf;
134 unsigned int is_v13:1;
135 unsigned int default_win;
136 unsigned int default_bpp;
141 bool is_hdmi_powered_on;
144 struct resource *regs_res;
146 unsigned int external_irq;
147 unsigned int internal_irq;
148 unsigned int curr_irq;
149 struct timer_list hotplug_timer;
151 struct i2c_client *ddc_port;
152 struct i2c_client *hdmiphy_port;
154 /* current hdmiphy conf index */
157 struct hdmi_resources res;
160 /* HDMI Version 1.3 */
161 static const u8 hdmiphy_v13_conf27[32] = {
162 0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
163 0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
164 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
165 0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
168 static const u8 hdmiphy_v13_conf27_027[32] = {
169 0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
170 0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
171 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
172 0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
175 static const u8 hdmiphy_v13_conf74_175[32] = {
176 0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
177 0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
178 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
179 0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x00,
182 static const u8 hdmiphy_v13_conf74_25[32] = {
183 0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
184 0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
185 0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0,
186 0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x00,
189 static const u8 hdmiphy_v13_conf148_5[32] = {
190 0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
191 0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
192 0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
193 0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x00,
196 struct hdmi_v13_tg_regs {
228 struct hdmi_v13_core_regs {
241 struct hdmi_v13_preset_conf {
242 struct hdmi_v13_core_regs core;
243 struct hdmi_v13_tg_regs tg;
246 struct hdmi_v13_conf {
251 const u8 *hdmiphy_data;
252 const struct hdmi_v13_preset_conf *conf;
255 static const struct hdmi_v13_preset_conf hdmi_v13_conf_480p = {
257 .h_blank = {0x8a, 0x00},
258 .v_blank = {0x0d, 0x6a, 0x01},
259 .h_v_line = {0x0d, 0xa2, 0x35},
261 .int_pro_mode = {0x00},
262 .v_blank_f = {0x00, 0x00, 0x00},
263 .h_sync_gen = {0x0e, 0x30, 0x11},
264 .v_sync_gen1 = {0x0f, 0x90, 0x00},
265 /* other don't care */
269 0x5a, 0x03, /* h_fsz */
270 0x8a, 0x00, 0xd0, 0x02, /* hact */
271 0x0d, 0x02, /* v_fsz */
272 0x01, 0x00, 0x33, 0x02, /* vsync */
273 0x2d, 0x00, 0xe0, 0x01, /* vact */
274 0x33, 0x02, /* field_chg */
275 0x49, 0x02, /* vact_st2 */
276 0x01, 0x00, 0x33, 0x02, /* vsync top/bot */
277 0x01, 0x00, 0x33, 0x02, /* field top/bot */
281 static const struct hdmi_v13_preset_conf hdmi_v13_conf_720p60 = {
283 .h_blank = {0x72, 0x01},
284 .v_blank = {0xee, 0xf2, 0x00},
285 .h_v_line = {0xee, 0x22, 0x67},
287 .int_pro_mode = {0x00},
288 .v_blank_f = {0x00, 0x00, 0x00}, /* don't care */
289 .h_sync_gen = {0x6c, 0x50, 0x02},
290 .v_sync_gen1 = {0x0a, 0x50, 0x00},
291 .v_sync_gen2 = {0x01, 0x10, 0x00},
292 .v_sync_gen3 = {0x01, 0x10, 0x00},
293 /* other don't care */
297 0x72, 0x06, /* h_fsz */
298 0x71, 0x01, 0x01, 0x05, /* hact */
299 0xee, 0x02, /* v_fsz */
300 0x01, 0x00, 0x33, 0x02, /* vsync */
301 0x1e, 0x00, 0xd0, 0x02, /* vact */
302 0x33, 0x02, /* field_chg */
303 0x49, 0x02, /* vact_st2 */
304 0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
305 0x01, 0x00, 0x33, 0x02, /* field top/bot */
309 static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080i50 = {
311 .h_blank = {0xd0, 0x02},
312 .v_blank = {0x32, 0xB2, 0x00},
313 .h_v_line = {0x65, 0x04, 0xa5},
315 .int_pro_mode = {0x01},
316 .v_blank_f = {0x49, 0x2A, 0x23},
317 .h_sync_gen = {0x0E, 0xEA, 0x08},
318 .v_sync_gen1 = {0x07, 0x20, 0x00},
319 .v_sync_gen2 = {0x39, 0x42, 0x23},
320 .v_sync_gen3 = {0x38, 0x87, 0x73},
321 /* other don't care */
325 0x50, 0x0A, /* h_fsz */
326 0xCF, 0x02, 0x81, 0x07, /* hact */
327 0x65, 0x04, /* v_fsz */
328 0x01, 0x00, 0x33, 0x02, /* vsync */
329 0x16, 0x00, 0x1c, 0x02, /* vact */
330 0x33, 0x02, /* field_chg */
331 0x49, 0x02, /* vact_st2 */
332 0x01, 0x00, 0x33, 0x02, /* vsync top/bot */
333 0x01, 0x00, 0x33, 0x02, /* field top/bot */
337 static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080p50 = {
339 .h_blank = {0xd0, 0x02},
340 .v_blank = {0x65, 0x6c, 0x01},
341 .h_v_line = {0x65, 0x04, 0xa5},
343 .int_pro_mode = {0x00},
344 .v_blank_f = {0x00, 0x00, 0x00}, /* don't care */
345 .h_sync_gen = {0x0e, 0xea, 0x08},
346 .v_sync_gen1 = {0x09, 0x40, 0x00},
347 .v_sync_gen2 = {0x01, 0x10, 0x00},
348 .v_sync_gen3 = {0x01, 0x10, 0x00},
349 /* other don't care */
353 0x50, 0x0A, /* h_fsz */
354 0xCF, 0x02, 0x81, 0x07, /* hact */
355 0x65, 0x04, /* v_fsz */
356 0x01, 0x00, 0x33, 0x02, /* vsync */
357 0x2d, 0x00, 0x38, 0x04, /* vact */
358 0x33, 0x02, /* field_chg */
359 0x48, 0x02, /* vact_st2 */
360 0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
361 0x01, 0x00, 0x33, 0x02, /* field top/bot */
365 static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080i60 = {
367 .h_blank = {0x18, 0x01},
368 .v_blank = {0x32, 0xB2, 0x00},
369 .h_v_line = {0x65, 0x84, 0x89},
371 .int_pro_mode = {0x01},
372 .v_blank_f = {0x49, 0x2A, 0x23},
373 .h_sync_gen = {0x56, 0x08, 0x02},
374 .v_sync_gen1 = {0x07, 0x20, 0x00},
375 .v_sync_gen2 = {0x39, 0x42, 0x23},
376 .v_sync_gen3 = {0xa4, 0x44, 0x4a},
377 /* other don't care */
381 0x98, 0x08, /* h_fsz */
382 0x17, 0x01, 0x81, 0x07, /* hact */
383 0x65, 0x04, /* v_fsz */
384 0x01, 0x00, 0x33, 0x02, /* vsync */
385 0x16, 0x00, 0x1c, 0x02, /* vact */
386 0x33, 0x02, /* field_chg */
387 0x49, 0x02, /* vact_st2 */
388 0x01, 0x00, 0x33, 0x02, /* vsync top/bot */
389 0x01, 0x00, 0x33, 0x02, /* field top/bot */
393 static const struct hdmi_v13_preset_conf hdmi_v13_conf_1080p60 = {
395 .h_blank = {0x18, 0x01},
396 .v_blank = {0x65, 0x6c, 0x01},
397 .h_v_line = {0x65, 0x84, 0x89},
399 .int_pro_mode = {0x00},
400 .v_blank_f = {0x00, 0x00, 0x00}, /* don't care */
401 .h_sync_gen = {0x56, 0x08, 0x02},
402 .v_sync_gen1 = {0x09, 0x40, 0x00},
403 .v_sync_gen2 = {0x01, 0x10, 0x00},
404 .v_sync_gen3 = {0x01, 0x10, 0x00},
405 /* other don't care */
409 0x98, 0x08, /* h_fsz */
410 0x17, 0x01, 0x81, 0x07, /* hact */
411 0x65, 0x04, /* v_fsz */
412 0x01, 0x00, 0x33, 0x02, /* vsync */
413 0x2d, 0x00, 0x38, 0x04, /* vact */
414 0x33, 0x02, /* field_chg */
415 0x48, 0x02, /* vact_st2 */
416 0x01, 0x00, 0x01, 0x00, /* vsync top/bot */
417 0x01, 0x00, 0x33, 0x02, /* field top/bot */
421 static const struct hdmi_v13_conf hdmi_v13_confs[] = {
422 { 1280, 720, 60, false, hdmiphy_v13_conf74_25, &hdmi_v13_conf_720p60 },
423 { 1280, 720, 50, false, hdmiphy_v13_conf74_25, &hdmi_v13_conf_720p60 },
424 { 720, 480, 60, false, hdmiphy_v13_conf27_027, &hdmi_v13_conf_480p },
425 { 1920, 1080, 50, true, hdmiphy_v13_conf74_25, &hdmi_v13_conf_1080i50 },
426 { 1920, 1080, 50, false, hdmiphy_v13_conf148_5,
427 &hdmi_v13_conf_1080p50 },
428 { 1920, 1080, 60, true, hdmiphy_v13_conf74_25, &hdmi_v13_conf_1080i60 },
429 { 1920, 1080, 60, false, hdmiphy_v13_conf148_5,
430 &hdmi_v13_conf_1080p60 },
433 struct hdmiphy_config {
438 static const struct hdmiphy_config phy_configs[] = {
440 .pixel_clock = 25200000,
442 0x01, 0x51, 0x2A, 0x75, 0x40, 0x01, 0x00, 0x08,
443 0x82, 0x80, 0xfc, 0xd8, 0x45, 0xa0, 0xac, 0x80,
444 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
445 0x54, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
449 .pixel_clock = 27000000,
451 0x01, 0xd1, 0x22, 0x51, 0x40, 0x08, 0xfc, 0x20,
452 0x98, 0xa0, 0xcb, 0xd8, 0x45, 0xa0, 0xac, 0x80,
453 0x06, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
454 0x54, 0xe4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
458 .pixel_clock = 27027000,
460 0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08,
461 0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
462 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
463 0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00,
467 .pixel_clock = 36000000,
469 0x01, 0x51, 0x2d, 0x55, 0x40, 0x01, 0x00, 0x08,
470 0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
471 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
472 0x54, 0xab, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
476 .pixel_clock = 40000000,
478 0x01, 0x51, 0x32, 0x55, 0x40, 0x01, 0x00, 0x08,
479 0x82, 0x80, 0x2c, 0xd9, 0x45, 0xa0, 0xac, 0x80,
480 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
481 0x54, 0x9a, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
485 .pixel_clock = 65000000,
487 0x01, 0xd1, 0x36, 0x34, 0x40, 0x1e, 0x0a, 0x08,
488 0x82, 0xa0, 0x45, 0xd9, 0x45, 0xa0, 0xac, 0x80,
489 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
490 0x54, 0xbd, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
494 .pixel_clock = 74176000,
496 0x01, 0xd1, 0x3e, 0x35, 0x40, 0x5b, 0xde, 0x08,
497 0x82, 0xa0, 0x73, 0xd9, 0x45, 0xa0, 0xac, 0x80,
498 0x56, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
499 0x54, 0xa6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
503 .pixel_clock = 74250000,
505 0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08,
506 0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
507 0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
508 0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00,
512 .pixel_clock = 83500000,
514 0x01, 0xd1, 0x23, 0x11, 0x40, 0x0c, 0xfb, 0x08,
515 0x85, 0xa0, 0xd1, 0xd8, 0x45, 0xa0, 0xac, 0x80,
516 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
517 0x54, 0x93, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
521 .pixel_clock = 106500000,
523 0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08,
524 0x84, 0xa0, 0x0a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
525 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
526 0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
530 .pixel_clock = 108000000,
532 0x01, 0x51, 0x2d, 0x15, 0x40, 0x01, 0x00, 0x08,
533 0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
534 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
535 0x54, 0xc7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
539 .pixel_clock = 146250000,
541 0x01, 0xd1, 0x3d, 0x15, 0x40, 0x18, 0xfd, 0x08,
542 0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
543 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
544 0x54, 0x50, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
548 .pixel_clock = 148500000,
550 0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08,
551 0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
552 0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
553 0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x00,
558 struct hdmi_infoframe {
559 enum HDMI_PACKET_TYPE type;
564 static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id)
566 return readl(hdata->regs + reg_id);
569 static inline void hdmi_reg_writeb(struct hdmi_context *hdata,
570 u32 reg_id, u8 value)
572 writeb(value, hdata->regs + reg_id);
575 static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
576 u32 reg_id, u32 value, u32 mask)
578 u32 old = readl(hdata->regs + reg_id);
579 value = (value & mask) | (old & ~mask);
580 writel(value, hdata->regs + reg_id);
583 static void hdmi_cfg_hpd(struct hdmi_context *hdata, bool external)
586 s3c_gpio_cfgpin(hdata->hpd_gpio, S3C_GPIO_SFN(0xf));
587 s3c_gpio_setpull(hdata->hpd_gpio, S3C_GPIO_PULL_DOWN);
589 s3c_gpio_cfgpin(hdata->hpd_gpio, S3C_GPIO_SFN(3));
590 s3c_gpio_setpull(hdata->hpd_gpio, S3C_GPIO_PULL_NONE);
594 static int hdmi_get_hpd(struct hdmi_context *hdata)
596 return gpio_get_value(hdata->hpd_gpio);
599 static void hdmi_v13_regs_dump(struct hdmi_context *hdata, char *prefix)
601 #define DUMPREG(reg_id) \
602 DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
603 readl(hdata->regs + reg_id))
604 DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
605 DUMPREG(HDMI_INTC_FLAG);
606 DUMPREG(HDMI_INTC_CON);
607 DUMPREG(HDMI_HPD_STATUS);
608 DUMPREG(HDMI_V13_PHY_RSTOUT);
609 DUMPREG(HDMI_V13_PHY_VPLL);
610 DUMPREG(HDMI_V13_PHY_CMU);
611 DUMPREG(HDMI_V13_CORE_RSTOUT);
613 DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
617 DUMPREG(HDMI_SYS_STATUS);
618 DUMPREG(HDMI_V13_PHY_STATUS);
619 DUMPREG(HDMI_STATUS_EN);
621 DUMPREG(HDMI_MODE_SEL);
622 DUMPREG(HDMI_V13_HPD_GEN);
623 DUMPREG(HDMI_V13_DC_CONTROL);
624 DUMPREG(HDMI_V13_VIDEO_PATTERN_GEN);
626 DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
627 DUMPREG(HDMI_H_BLANK_0);
628 DUMPREG(HDMI_H_BLANK_1);
629 DUMPREG(HDMI_V13_V_BLANK_0);
630 DUMPREG(HDMI_V13_V_BLANK_1);
631 DUMPREG(HDMI_V13_V_BLANK_2);
632 DUMPREG(HDMI_V13_H_V_LINE_0);
633 DUMPREG(HDMI_V13_H_V_LINE_1);
634 DUMPREG(HDMI_V13_H_V_LINE_2);
635 DUMPREG(HDMI_VSYNC_POL);
636 DUMPREG(HDMI_INT_PRO_MODE);
637 DUMPREG(HDMI_V13_V_BLANK_F_0);
638 DUMPREG(HDMI_V13_V_BLANK_F_1);
639 DUMPREG(HDMI_V13_V_BLANK_F_2);
640 DUMPREG(HDMI_V13_H_SYNC_GEN_0);
641 DUMPREG(HDMI_V13_H_SYNC_GEN_1);
642 DUMPREG(HDMI_V13_H_SYNC_GEN_2);
643 DUMPREG(HDMI_V13_V_SYNC_GEN_1_0);
644 DUMPREG(HDMI_V13_V_SYNC_GEN_1_1);
645 DUMPREG(HDMI_V13_V_SYNC_GEN_1_2);
646 DUMPREG(HDMI_V13_V_SYNC_GEN_2_0);
647 DUMPREG(HDMI_V13_V_SYNC_GEN_2_1);
648 DUMPREG(HDMI_V13_V_SYNC_GEN_2_2);
649 DUMPREG(HDMI_V13_V_SYNC_GEN_3_0);
650 DUMPREG(HDMI_V13_V_SYNC_GEN_3_1);
651 DUMPREG(HDMI_V13_V_SYNC_GEN_3_2);
653 DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
654 DUMPREG(HDMI_TG_CMD);
655 DUMPREG(HDMI_TG_H_FSZ_L);
656 DUMPREG(HDMI_TG_H_FSZ_H);
657 DUMPREG(HDMI_TG_HACT_ST_L);
658 DUMPREG(HDMI_TG_HACT_ST_H);
659 DUMPREG(HDMI_TG_HACT_SZ_L);
660 DUMPREG(HDMI_TG_HACT_SZ_H);
661 DUMPREG(HDMI_TG_V_FSZ_L);
662 DUMPREG(HDMI_TG_V_FSZ_H);
663 DUMPREG(HDMI_TG_VSYNC_L);
664 DUMPREG(HDMI_TG_VSYNC_H);
665 DUMPREG(HDMI_TG_VSYNC2_L);
666 DUMPREG(HDMI_TG_VSYNC2_H);
667 DUMPREG(HDMI_TG_VACT_ST_L);
668 DUMPREG(HDMI_TG_VACT_ST_H);
669 DUMPREG(HDMI_TG_VACT_SZ_L);
670 DUMPREG(HDMI_TG_VACT_SZ_H);
671 DUMPREG(HDMI_TG_FIELD_CHG_L);
672 DUMPREG(HDMI_TG_FIELD_CHG_H);
673 DUMPREG(HDMI_TG_VACT_ST2_L);
674 DUMPREG(HDMI_TG_VACT_ST2_H);
675 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
676 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
677 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
678 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
679 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
680 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
681 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
682 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
686 static void hdmi_v14_regs_dump(struct hdmi_context *hdata, char *prefix)
690 #define DUMPREG(reg_id) \
691 DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
692 readl(hdata->regs + reg_id))
694 DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
695 DUMPREG(HDMI_INTC_CON);
696 DUMPREG(HDMI_INTC_FLAG);
697 DUMPREG(HDMI_HPD_STATUS);
698 DUMPREG(HDMI_INTC_CON_1);
699 DUMPREG(HDMI_INTC_FLAG_1);
700 DUMPREG(HDMI_PHY_STATUS_0);
701 DUMPREG(HDMI_PHY_STATUS_PLL);
702 DUMPREG(HDMI_PHY_CON_0);
703 DUMPREG(HDMI_PHY_RSTOUT);
704 DUMPREG(HDMI_PHY_VPLL);
705 DUMPREG(HDMI_PHY_CMU);
706 DUMPREG(HDMI_CORE_RSTOUT);
708 DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
712 DUMPREG(HDMI_SYS_STATUS);
713 DUMPREG(HDMI_PHY_STATUS_0);
714 DUMPREG(HDMI_STATUS_EN);
716 DUMPREG(HDMI_MODE_SEL);
717 DUMPREG(HDMI_ENC_EN);
718 DUMPREG(HDMI_DC_CONTROL);
719 DUMPREG(HDMI_VIDEO_PATTERN_GEN);
721 DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
722 DUMPREG(HDMI_H_BLANK_0);
723 DUMPREG(HDMI_H_BLANK_1);
724 DUMPREG(HDMI_V2_BLANK_0);
725 DUMPREG(HDMI_V2_BLANK_1);
726 DUMPREG(HDMI_V1_BLANK_0);
727 DUMPREG(HDMI_V1_BLANK_1);
728 DUMPREG(HDMI_V_LINE_0);
729 DUMPREG(HDMI_V_LINE_1);
730 DUMPREG(HDMI_H_LINE_0);
731 DUMPREG(HDMI_H_LINE_1);
732 DUMPREG(HDMI_HSYNC_POL);
734 DUMPREG(HDMI_VSYNC_POL);
735 DUMPREG(HDMI_INT_PRO_MODE);
736 DUMPREG(HDMI_V_BLANK_F0_0);
737 DUMPREG(HDMI_V_BLANK_F0_1);
738 DUMPREG(HDMI_V_BLANK_F1_0);
739 DUMPREG(HDMI_V_BLANK_F1_1);
741 DUMPREG(HDMI_H_SYNC_START_0);
742 DUMPREG(HDMI_H_SYNC_START_1);
743 DUMPREG(HDMI_H_SYNC_END_0);
744 DUMPREG(HDMI_H_SYNC_END_1);
746 DUMPREG(HDMI_V_SYNC_LINE_BEF_2_0);
747 DUMPREG(HDMI_V_SYNC_LINE_BEF_2_1);
748 DUMPREG(HDMI_V_SYNC_LINE_BEF_1_0);
749 DUMPREG(HDMI_V_SYNC_LINE_BEF_1_1);
751 DUMPREG(HDMI_V_SYNC_LINE_AFT_2_0);
752 DUMPREG(HDMI_V_SYNC_LINE_AFT_2_1);
753 DUMPREG(HDMI_V_SYNC_LINE_AFT_1_0);
754 DUMPREG(HDMI_V_SYNC_LINE_AFT_1_1);
756 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_0);
757 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_1);
758 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_0);
759 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_1);
761 DUMPREG(HDMI_V_BLANK_F2_0);
762 DUMPREG(HDMI_V_BLANK_F2_1);
763 DUMPREG(HDMI_V_BLANK_F3_0);
764 DUMPREG(HDMI_V_BLANK_F3_1);
765 DUMPREG(HDMI_V_BLANK_F4_0);
766 DUMPREG(HDMI_V_BLANK_F4_1);
767 DUMPREG(HDMI_V_BLANK_F5_0);
768 DUMPREG(HDMI_V_BLANK_F5_1);
770 DUMPREG(HDMI_V_SYNC_LINE_AFT_3_0);
771 DUMPREG(HDMI_V_SYNC_LINE_AFT_3_1);
772 DUMPREG(HDMI_V_SYNC_LINE_AFT_4_0);
773 DUMPREG(HDMI_V_SYNC_LINE_AFT_4_1);
774 DUMPREG(HDMI_V_SYNC_LINE_AFT_5_0);
775 DUMPREG(HDMI_V_SYNC_LINE_AFT_5_1);
776 DUMPREG(HDMI_V_SYNC_LINE_AFT_6_0);
777 DUMPREG(HDMI_V_SYNC_LINE_AFT_6_1);
779 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_0);
780 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_1);
781 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_0);
782 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_1);
783 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_0);
784 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_1);
785 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_0);
786 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_1);
788 DUMPREG(HDMI_VACT_SPACE_1_0);
789 DUMPREG(HDMI_VACT_SPACE_1_1);
790 DUMPREG(HDMI_VACT_SPACE_2_0);
791 DUMPREG(HDMI_VACT_SPACE_2_1);
792 DUMPREG(HDMI_VACT_SPACE_3_0);
793 DUMPREG(HDMI_VACT_SPACE_3_1);
794 DUMPREG(HDMI_VACT_SPACE_4_0);
795 DUMPREG(HDMI_VACT_SPACE_4_1);
796 DUMPREG(HDMI_VACT_SPACE_5_0);
797 DUMPREG(HDMI_VACT_SPACE_5_1);
798 DUMPREG(HDMI_VACT_SPACE_6_0);
799 DUMPREG(HDMI_VACT_SPACE_6_1);
801 DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
802 DUMPREG(HDMI_TG_CMD);
803 DUMPREG(HDMI_TG_H_FSZ_L);
804 DUMPREG(HDMI_TG_H_FSZ_H);
805 DUMPREG(HDMI_TG_HACT_ST_L);
806 DUMPREG(HDMI_TG_HACT_ST_H);
807 DUMPREG(HDMI_TG_HACT_SZ_L);
808 DUMPREG(HDMI_TG_HACT_SZ_H);
809 DUMPREG(HDMI_TG_V_FSZ_L);
810 DUMPREG(HDMI_TG_V_FSZ_H);
811 DUMPREG(HDMI_TG_VSYNC_L);
812 DUMPREG(HDMI_TG_VSYNC_H);
813 DUMPREG(HDMI_TG_VSYNC2_L);
814 DUMPREG(HDMI_TG_VSYNC2_H);
815 DUMPREG(HDMI_TG_VACT_ST_L);
816 DUMPREG(HDMI_TG_VACT_ST_H);
817 DUMPREG(HDMI_TG_VACT_SZ_L);
818 DUMPREG(HDMI_TG_VACT_SZ_H);
819 DUMPREG(HDMI_TG_FIELD_CHG_L);
820 DUMPREG(HDMI_TG_FIELD_CHG_H);
821 DUMPREG(HDMI_TG_VACT_ST2_L);
822 DUMPREG(HDMI_TG_VACT_ST2_H);
823 DUMPREG(HDMI_TG_VACT_ST3_L);
824 DUMPREG(HDMI_TG_VACT_ST3_H);
825 DUMPREG(HDMI_TG_VACT_ST4_L);
826 DUMPREG(HDMI_TG_VACT_ST4_H);
827 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
828 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
829 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
830 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
831 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
832 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
833 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
834 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
837 DRM_DEBUG_KMS("%s: ---- PACKET REGISTERS ----\n", prefix);
838 DUMPREG(HDMI_AVI_CON);
839 DUMPREG(HDMI_AVI_HEADER0);
840 DUMPREG(HDMI_AVI_HEADER1);
841 DUMPREG(HDMI_AVI_HEADER2);
842 DUMPREG(HDMI_AVI_CHECK_SUM);
843 DUMPREG(HDMI_VSI_CON);
844 DUMPREG(HDMI_VSI_HEADER0);
845 DUMPREG(HDMI_VSI_HEADER1);
846 DUMPREG(HDMI_VSI_HEADER2);
847 for (i = 0; i < 7; ++i)
848 DUMPREG(HDMI_VSI_DATA(i));
853 static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
856 hdmi_v13_regs_dump(hdata, prefix);
858 hdmi_v14_regs_dump(hdata, prefix);
861 static int hdmi_v13_conf_index(struct drm_display_mode *mode)
865 for (i = 0; i < ARRAY_SIZE(hdmi_v13_confs); ++i)
866 if (hdmi_v13_confs[i].width == mode->crtc_hdisplay &&
867 hdmi_v13_confs[i].height == mode->crtc_vdisplay &&
868 hdmi_v13_confs[i].vrefresh == mode->vrefresh &&
869 hdmi_v13_confs[i].interlace ==
870 ((mode->flags & DRM_MODE_FLAG_INTERLACE) ?
877 static bool hdmi_is_connected(void *ctx)
879 struct hdmi_context *hdata = ctx;
880 if (hdata->is_hdmi_powered_on) {
881 if (!hdmi_reg_read(hdata, HDMI_HPD_STATUS)) {
882 DRM_DEBUG_KMS("hdmi is not connected\n");
885 } else if (!hdmi_get_hpd(hdata)) {
886 DRM_DEBUG_KMS("hdmi is not connected\n");
893 static struct edid *hdmi_get_edid(void *ctx, struct drm_connector *connector)
895 struct hdmi_context *hdata = ctx;
898 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", DRM_BASE_ID(connector),
899 drm_get_connector_name(connector));
901 if (!hdata->ddc_port)
902 return ERR_PTR(-ENODEV);
904 edid = drm_get_edid(connector, hdata->ddc_port->adapter);
906 return ERR_PTR(-ENODEV);
909 * TODO : Need to call this in exynos_drm_connector.c, do a drm_get_edid
910 * to get the edid and then call drm_detect_hdmi_monitor.
912 hdata->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
913 hdata->has_hdmi_audio = drm_detect_monitor_audio(edid);
914 DRM_DEBUG_KMS("%s monitor\n", hdata->has_hdmi_sink ? "hdmi" : "dvi");
919 static int hdmi_v13_check_timing(struct fb_videomode *check_timing)
923 DRM_DEBUG_KMS("valid mode : xres=%d, yres=%d, refresh=%d, intl=%d\n",
924 check_timing->xres, check_timing->yres,
925 check_timing->refresh, (check_timing->vmode &
926 FB_VMODE_INTERLACED) ? true : false);
928 for (i = 0; i < ARRAY_SIZE(hdmi_v13_confs); ++i)
929 if (hdmi_v13_confs[i].width == check_timing->xres &&
930 hdmi_v13_confs[i].height == check_timing->yres &&
931 hdmi_v13_confs[i].vrefresh == check_timing->refresh &&
932 hdmi_v13_confs[i].interlace ==
933 ((check_timing->vmode & FB_VMODE_INTERLACED) ?
942 static int find_hdmiphy_conf(int pixel_clock)
946 for (i = 0; i < ARRAY_SIZE(phy_configs); i++) {
947 if (phy_configs[i].pixel_clock == pixel_clock)
950 DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
954 static int hdmi_v14_check_timing(struct fb_videomode *mode)
957 enum exynos_mixer_mode_type mode_type;
959 /* Make sure the mixer can generate this mode */
960 mode_type = exynos_mixer_get_mode_type(mode->xres, mode->yres);
961 if (mode_type == EXYNOS_MIXER_MODE_INVALID)
964 ret = find_hdmiphy_conf(mode->pixclock);
965 return ret < 0 ? ret : 0;
968 static u8 hdmi_chksum(struct hdmi_context *hdata,
969 u32 start, u8 len, u32 hdr_sum)
972 /* hdr_sum : header0 + header1 + header2
973 * start : start address of packet byte1
974 * len : packet bytes - 1 */
975 for (i = 0; i < len; ++i)
976 hdr_sum += hdmi_reg_read(hdata, start + i * 4);
978 return (u8)(0x100 - (hdr_sum & 0xff));
981 void hdmi_reg_infoframe(struct hdmi_context *hdata,
982 struct hdmi_infoframe *infoframe)
989 /* TODO: stringify HDMI_PACKET_TYPE */
990 DRM_DEBUG_KMS("type: %d ver: %d len: %d\n", infoframe->type,
991 infoframe->ver, infoframe->len);
992 mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
993 if (!hdata->has_hdmi_sink) {
994 hdmi_reg_writeb(hdata, HDMI_VSI_CON,
995 HDMI_VSI_CON_DO_NOT_TRANSMIT);
996 hdmi_reg_writeb(hdata, HDMI_AVI_CON,
997 HDMI_AVI_CON_DO_NOT_TRANSMIT);
998 hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN);
1002 switch (infoframe->type) {
1004 case HDMI_PACKET_TYPE_AVI:
1005 hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC);
1006 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER0, infoframe->type);
1007 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER1, infoframe->ver);
1008 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER2, infoframe->len);
1009 hdr_sum = infoframe->type + infoframe->ver + infoframe->len;
1010 /* Output format zero hardcoded ,RGB YBCR selection */
1011 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 0 << 5 |
1012 AVI_ACTIVE_FORMAT_VALID | AVI_UNDERSCANNED_DISPLAY_VALID);
1014 aspect_ratio = AVI_PIC_ASPECT_RATIO_16_9;
1016 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), aspect_ratio |
1017 AVI_SAME_AS_PIC_ASPECT_RATIO);
1018 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), hdata->mode_conf.vic);
1020 chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1),
1021 infoframe->len, hdr_sum);
1022 DRM_DEBUG_KMS("AVI checksum = 0x%x\n", chksum);
1023 hdmi_reg_writeb(hdata, HDMI_AVI_CHECK_SUM, chksum);
1026 case HDMI_PACKET_TYPE_AUI:
1027 hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02);
1028 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER0, infoframe->type);
1029 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER1, infoframe->ver);
1030 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER2, infoframe->len);
1031 hdr_sum = infoframe->type + infoframe->ver + infoframe->len;
1032 chksum = hdmi_chksum(hdata, HDMI_AUI_BYTE(1),
1033 infoframe->len, hdr_sum);
1034 DRM_DEBUG_KMS("AUI checksum = 0x%x\n", chksum);
1035 hdmi_reg_writeb(hdata, HDMI_AUI_CHECK_SUM, chksum);
1043 static int hdmi_check_timing(void *ctx, void *timing)
1045 struct hdmi_context *hdata = ctx;
1046 struct fb_videomode *check_timing = timing;
1048 DRM_DEBUG_KMS("[%d]x[%d] [%d]Hz [%x]\n", check_timing->xres,
1049 check_timing->yres, check_timing->refresh,
1050 check_timing->vmode);
1053 return hdmi_v13_check_timing(check_timing);
1055 return hdmi_v14_check_timing(check_timing);
1058 static void hdmi_set_acr(u32 freq, u8 *acr)
1098 acr[2] = cts >> 8 & 0xff;
1099 acr[3] = cts & 0xff;
1102 acr[5] = n >> 8 & 0xff;
1106 static void hdmi_reg_acr(struct hdmi_context *hdata, u8 *acr)
1108 hdmi_reg_writeb(hdata, HDMI_ACR_N0, acr[6]);
1109 hdmi_reg_writeb(hdata, HDMI_ACR_N1, acr[5]);
1110 hdmi_reg_writeb(hdata, HDMI_ACR_N2, acr[4]);
1111 hdmi_reg_writeb(hdata, HDMI_ACR_MCTS0, acr[3]);
1112 hdmi_reg_writeb(hdata, HDMI_ACR_MCTS1, acr[2]);
1113 hdmi_reg_writeb(hdata, HDMI_ACR_MCTS2, acr[1]);
1114 hdmi_reg_writeb(hdata, HDMI_ACR_CTS0, acr[3]);
1115 hdmi_reg_writeb(hdata, HDMI_ACR_CTS1, acr[2]);
1116 hdmi_reg_writeb(hdata, HDMI_ACR_CTS2, acr[1]);
1119 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 4);
1121 hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
1124 static void hdmi_audio_init(struct hdmi_context *hdata)
1126 u32 sample_rate, bits_per_sample, frame_size_code;
1127 u32 data_num, bit_ch, sample_frq;
1131 sample_rate = 44100;
1132 bits_per_sample = 16;
1133 frame_size_code = 0;
1135 switch (bits_per_sample) {
1150 hdmi_set_acr(sample_rate, acr);
1151 hdmi_reg_acr(hdata, acr);
1153 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
1154 | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
1155 | HDMI_I2S_MUX_ENABLE);
1157 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
1158 | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
1160 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
1162 sample_frq = (sample_rate == 44100) ? 0 :
1163 (sample_rate == 48000) ? 2 :
1164 (sample_rate == 32000) ? 3 :
1165 (sample_rate == 96000) ? 0xa : 0x0;
1167 hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
1168 hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
1170 val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
1171 hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
1173 /* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
1174 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
1175 | HDMI_I2S_SEL_LRCK(6));
1176 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(1)
1177 | HDMI_I2S_SEL_SDATA2(4));
1178 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
1179 | HDMI_I2S_SEL_SDATA2(2));
1180 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
1183 hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
1184 | HDMI_I2S_L_CH_LOW_POL);
1185 hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
1186 | HDMI_I2S_SET_BIT_CH(bit_ch)
1187 | HDMI_I2S_SET_SDATA_BIT(data_num)
1188 | HDMI_I2S_BASIC_FORMAT);
1190 /* Configure register related to CUV information */
1191 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0
1192 | HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH
1193 | HDMI_I2S_COPYRIGHT
1194 | HDMI_I2S_LINEAR_PCM
1195 | HDMI_I2S_CONSUMER_FORMAT);
1196 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER);
1197 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0));
1198 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2
1199 | HDMI_I2S_SET_SMP_FREQ(sample_frq));
1200 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4,
1201 HDMI_I2S_ORG_SMP_FREQ_44_1
1202 | HDMI_I2S_WORD_LEN_MAX24_24BITS
1203 | HDMI_I2S_WORD_LEN_MAX_24BITS);
1205 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
1208 static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
1210 if (!hdata->has_hdmi_audio)
1213 hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
1214 hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ?
1215 HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
1218 static void hdmi_conf_reset(struct hdmi_context *hdata)
1222 /* disable hpd handle for drm */
1223 hdata->hpd_handle = false;
1226 reg = HDMI_V13_CORE_RSTOUT;
1228 reg = HDMI_CORE_RSTOUT;
1230 /* resetting HDMI core */
1231 hdmi_reg_writemask(hdata, reg, 0, HDMI_CORE_SW_RSTOUT);
1233 hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
1236 /* enable hpd handle for drm */
1237 hdata->hpd_handle = true;
1240 static void hdmi_enable_video(struct hdmi_context *hdata)
1245 hdata->video_enabled = true;
1246 hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
1249 static void hdmi_disable_video(struct hdmi_context *hdata)
1254 /* Set the blue screen color to black */
1255 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_R_0, 0);
1256 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_R_1, 0);
1257 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_G_0, 0);
1258 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_G_1, 0);
1259 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_B_0, 0);
1260 hdmi_reg_writeb(hdata, HDMI_BLUE_SCREEN_B_1, 0);
1262 /* Enable the "blue screen", which effectively disconnects the mixer */
1263 hdata->video_enabled = false;
1264 hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_BLUE_SCR_EN);
1267 static void hdmi_conf_init(struct hdmi_context *hdata)
1269 struct hdmi_infoframe infoframe;
1270 /* disable hpd handle for drm */
1271 hdata->hpd_handle = false;
1273 /* enable HPD interrupts */
1274 hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
1275 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
1277 hdmi_reg_writemask(hdata, HDMI_INTC_CON, ~0, HDMI_INTC_EN_GLOBAL |
1278 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
1280 /* choose HDMI mode */
1281 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1282 HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
1284 if (hdata->video_enabled)
1285 hdmi_enable_video(hdata);
1287 hdmi_disable_video(hdata);
1289 if (!hdata->has_hdmi_sink) {
1290 /* choose DVI mode */
1291 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1292 HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1293 hdmi_reg_writeb(hdata, HDMI_CON_2,
1294 HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1297 if (hdata->is_v13) {
1298 /* choose bluescreen (fecal) color */
1299 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
1300 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
1301 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1303 /* enable AVI packet every vsync, fixes purple line problem */
1304 hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1305 /* force RGB, look to CEA-861-D, table 7 for more detail */
1306 hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1307 hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1309 hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1310 hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1311 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1313 /* enable AVI packet every vsync, fixes purple line problem */
1314 hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1316 infoframe.type = HDMI_PACKET_TYPE_AVI;
1317 infoframe.ver = HDMI_AVI_VERSION;
1318 infoframe.len = HDMI_AVI_LENGTH;
1319 hdmi_reg_infoframe(hdata, &infoframe);
1321 infoframe.type = HDMI_PACKET_TYPE_AUI;
1322 infoframe.ver = HDMI_AUI_VERSION;
1323 infoframe.len = HDMI_AUI_LENGTH;
1324 hdmi_reg_infoframe(hdata, &infoframe);
1328 /* enable hpd handle for drm */
1329 hdata->hpd_handle = true;
1332 static void hdmi_v13_timing_apply(struct hdmi_context *hdata)
1334 const struct hdmi_v13_preset_conf *conf =
1335 hdmi_v13_confs[hdata->cur_conf].conf;
1336 const struct hdmi_v13_core_regs *core = &conf->core;
1337 const struct hdmi_v13_tg_regs *tg = &conf->tg;
1340 /* setting core registers */
1341 hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1342 hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1343 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_0, core->v_blank[0]);
1344 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_1, core->v_blank[1]);
1345 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_2, core->v_blank[2]);
1346 hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_0, core->h_v_line[0]);
1347 hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_1, core->h_v_line[1]);
1348 hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_2, core->h_v_line[2]);
1349 hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1350 hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1351 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_0, core->v_blank_f[0]);
1352 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_1, core->v_blank_f[1]);
1353 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_2, core->v_blank_f[2]);
1354 hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_0, core->h_sync_gen[0]);
1355 hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_1, core->h_sync_gen[1]);
1356 hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_2, core->h_sync_gen[2]);
1357 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_0, core->v_sync_gen1[0]);
1358 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_1, core->v_sync_gen1[1]);
1359 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_2, core->v_sync_gen1[2]);
1360 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_0, core->v_sync_gen2[0]);
1361 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_1, core->v_sync_gen2[1]);
1362 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_2, core->v_sync_gen2[2]);
1363 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_0, core->v_sync_gen3[0]);
1364 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_1, core->v_sync_gen3[1]);
1365 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_2, core->v_sync_gen3[2]);
1366 /* Timing generator registers */
1367 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz_l);
1368 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz_h);
1369 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st_l);
1370 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st_h);
1371 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz_l);
1372 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz_h);
1373 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz_l);
1374 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz_h);
1375 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync_l);
1376 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync_h);
1377 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2_l);
1378 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2_h);
1379 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st_l);
1380 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st_h);
1381 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz_l);
1382 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz_h);
1383 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg_l);
1384 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg_h);
1385 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2_l);
1386 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2_h);
1387 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi_l);
1388 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi_h);
1389 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi_l);
1390 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi_h);
1391 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi_l);
1392 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi_h);
1393 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi_l);
1394 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi_h);
1396 /* waiting for HDMIPHY's PLL to get to steady state */
1397 for (tries = 100; tries; --tries) {
1398 u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
1399 if (val & HDMI_PHY_STATUS_READY)
1403 /* steady state not achieved */
1405 DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1406 hdmi_regs_dump(hdata, "timing apply");
1409 clk_disable(hdata->res.sclk_hdmi);
1410 clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_hdmiphy);
1411 clk_enable(hdata->res.sclk_hdmi);
1413 /* enable HDMI and timing generator */
1414 hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
1415 if (core->int_pro_mode[0])
1416 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
1419 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
1422 static void hdmi_v14_timing_apply(struct hdmi_context *hdata)
1424 struct hdmi_core_regs *core = &hdata->mode_conf.core;
1425 struct hdmi_tg_regs *tg = &hdata->mode_conf.tg;
1428 hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1429 hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1430 hdmi_reg_writeb(hdata, HDMI_V2_BLANK_0, core->v2_blank[0]);
1431 hdmi_reg_writeb(hdata, HDMI_V2_BLANK_1, core->v2_blank[1]);
1432 hdmi_reg_writeb(hdata, HDMI_V1_BLANK_0, core->v1_blank[0]);
1433 hdmi_reg_writeb(hdata, HDMI_V1_BLANK_1, core->v1_blank[1]);
1434 hdmi_reg_writeb(hdata, HDMI_V_LINE_0, core->v_line[0]);
1435 hdmi_reg_writeb(hdata, HDMI_V_LINE_1, core->v_line[1]);
1436 hdmi_reg_writeb(hdata, HDMI_H_LINE_0, core->h_line[0]);
1437 hdmi_reg_writeb(hdata, HDMI_H_LINE_1, core->h_line[1]);
1438 hdmi_reg_writeb(hdata, HDMI_HSYNC_POL, core->hsync_pol[0]);
1439 hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1440 hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1441 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_0, core->v_blank_f0[0]);
1442 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_1, core->v_blank_f0[1]);
1443 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_0, core->v_blank_f1[0]);
1444 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_1, core->v_blank_f1[1]);
1445 hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_0, core->h_sync_start[0]);
1446 hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_1, core->h_sync_start[1]);
1447 hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_0, core->h_sync_end[0]);
1448 hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_1, core->h_sync_end[1]);
1449 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_0,
1450 core->v_sync_line_bef_2[0]);
1451 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_1,
1452 core->v_sync_line_bef_2[1]);
1453 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_0,
1454 core->v_sync_line_bef_1[0]);
1455 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_1,
1456 core->v_sync_line_bef_1[1]);
1457 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_0,
1458 core->v_sync_line_aft_2[0]);
1459 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_1,
1460 core->v_sync_line_aft_2[1]);
1461 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_0,
1462 core->v_sync_line_aft_1[0]);
1463 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_1,
1464 core->v_sync_line_aft_1[1]);
1465 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0,
1466 core->v_sync_line_aft_pxl_2[0]);
1467 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_1,
1468 core->v_sync_line_aft_pxl_2[1]);
1469 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0,
1470 core->v_sync_line_aft_pxl_1[0]);
1471 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_1,
1472 core->v_sync_line_aft_pxl_1[1]);
1473 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_0, core->v_blank_f2[0]);
1474 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_1, core->v_blank_f2[1]);
1475 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_0, core->v_blank_f3[0]);
1476 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_1, core->v_blank_f3[1]);
1477 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_0, core->v_blank_f4[0]);
1478 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_1, core->v_blank_f4[1]);
1479 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_0, core->v_blank_f5[0]);
1480 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_1, core->v_blank_f5[1]);
1481 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_0,
1482 core->v_sync_line_aft_3[0]);
1483 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_1,
1484 core->v_sync_line_aft_3[1]);
1485 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_0,
1486 core->v_sync_line_aft_4[0]);
1487 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_1,
1488 core->v_sync_line_aft_4[1]);
1489 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_0,
1490 core->v_sync_line_aft_5[0]);
1491 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_1,
1492 core->v_sync_line_aft_5[1]);
1493 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_0,
1494 core->v_sync_line_aft_6[0]);
1495 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_1,
1496 core->v_sync_line_aft_6[1]);
1497 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0,
1498 core->v_sync_line_aft_pxl_3[0]);
1499 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_1,
1500 core->v_sync_line_aft_pxl_3[1]);
1501 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0,
1502 core->v_sync_line_aft_pxl_4[0]);
1503 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_1,
1504 core->v_sync_line_aft_pxl_4[1]);
1505 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0,
1506 core->v_sync_line_aft_pxl_5[0]);
1507 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_1,
1508 core->v_sync_line_aft_pxl_5[1]);
1509 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0,
1510 core->v_sync_line_aft_pxl_6[0]);
1511 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_1,
1512 core->v_sync_line_aft_pxl_6[1]);
1513 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_0, core->vact_space_1[0]);
1514 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_1, core->vact_space_1[1]);
1515 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_0, core->vact_space_2[0]);
1516 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_1, core->vact_space_2[1]);
1517 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_0, core->vact_space_3[0]);
1518 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_1, core->vact_space_3[1]);
1519 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_0, core->vact_space_4[0]);
1520 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_1, core->vact_space_4[1]);
1521 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_0, core->vact_space_5[0]);
1522 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_1, core->vact_space_5[1]);
1523 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_0, core->vact_space_6[0]);
1524 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_1, core->vact_space_6[1]);
1526 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1527 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1528 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1529 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1530 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1531 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1532 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1533 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1534 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1535 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1536 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1537 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1538 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1539 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1540 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1541 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1542 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1543 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1544 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1545 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1546 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_L, tg->vact_st3[0]);
1547 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_H, tg->vact_st3[1]);
1548 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_L, tg->vact_st4[0]);
1549 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_H, tg->vact_st4[1]);
1550 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1551 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1552 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1553 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1554 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1555 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1556 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1557 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1558 hdmi_reg_writeb(hdata, HDMI_TG_3D, tg->tg_3d[0]);
1560 /* waiting for HDMIPHY's PLL to get to steady state */
1561 for (tries = 100; tries; --tries) {
1562 u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
1563 if (val & HDMI_PHY_STATUS_READY)
1567 /* steady state not achieved */
1569 DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1570 hdmi_regs_dump(hdata, "timing apply");
1573 clk_disable(hdata->res.sclk_hdmi);
1574 clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_hdmiphy);
1575 clk_enable(hdata->res.sclk_hdmi);
1577 /* enable HDMI and timing generator */
1578 hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
1579 if (core->int_pro_mode[0])
1580 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
1583 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
1586 static void hdmi_timing_apply(struct hdmi_context *hdata)
1589 hdmi_v13_timing_apply(hdata);
1591 hdmi_v14_timing_apply(hdata);
1594 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1599 clk_disable(hdata->res.sclk_hdmi);
1600 clk_set_parent(hdata->res.sclk_hdmi, hdata->res.sclk_pixel);
1601 clk_enable(hdata->res.sclk_hdmi);
1603 /* operation mode */
1607 if (hdata->hdmiphy_port)
1608 i2c_master_send(hdata->hdmiphy_port, buffer, 2);
1611 reg = HDMI_V13_PHY_RSTOUT;
1613 reg = HDMI_PHY_RSTOUT;
1616 hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
1618 hdmi_reg_writemask(hdata, reg, 0, HDMI_PHY_SW_RSTOUT);
1622 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1624 const u8 *hdmiphy_data;
1627 u8 read_buffer[32] = {0, };
1631 DRM_DEBUG_KMS("\n");
1633 if (!hdata->hdmiphy_port) {
1634 DRM_ERROR("hdmiphy is not attached\n");
1639 if (hdata->is_v13) {
1640 hdmiphy_data = hdmi_v13_confs[hdata->cur_conf].hdmiphy_data;
1642 i = find_hdmiphy_conf(hdata->mode_conf.pixel_clock);
1643 hdmiphy_data = phy_configs[i].conf;
1646 memcpy(buffer, hdmiphy_data, 32);
1647 ret = i2c_master_send(hdata->hdmiphy_port, buffer, 32);
1649 DRM_ERROR("failed to configure HDMIPHY via I2C\n");
1655 /* operation mode */
1656 operation[0] = 0x1f;
1657 operation[1] = 0x80;
1659 ret = i2c_master_send(hdata->hdmiphy_port, operation, 2);
1661 DRM_ERROR("failed to enable hdmiphy\n");
1665 ret = i2c_master_recv(hdata->hdmiphy_port, read_buffer, 32);
1667 DRM_ERROR("failed to read hdmiphy config\n");
1671 for (i = 0; i < ret; i++)
1672 DRM_DEBUG_KMS("hdmiphy[0x%02x] write[0x%02x] - "
1673 "recv [0x%02x]\n", i, buffer[i], read_buffer[i]);
1676 static void hdmi_conf_apply(struct hdmi_context *hdata)
1678 DRM_DEBUG_KMS("\n");
1680 hdmiphy_conf_reset(hdata);
1681 hdmiphy_conf_apply(hdata);
1683 hdmi_conf_reset(hdata);
1684 hdmi_conf_init(hdata);
1685 if (!hdata->is_soc_exynos5)
1686 hdmi_audio_init(hdata);
1688 /* setting core registers */
1689 hdmi_timing_apply(hdata);
1690 if (!hdata->is_soc_exynos5)
1691 hdmi_audio_control(hdata, true);
1693 hdmi_regs_dump(hdata, "start");
1696 static void hdmi_mode_copy(struct drm_display_mode *dst,
1697 struct drm_display_mode *src)
1699 struct drm_mode_object base;
1701 DRM_DEBUG_KMS("[MODE:%d:%s]\n", DRM_BASE_ID(src), src->name);
1703 /* following information should be preserved,
1704 * required for releasing the drm_display_mode node,
1705 * duplicated to recieve adjustment info. */
1707 base.id = dst->base.id;
1708 base.type = dst->base.type;
1710 memcpy(dst, src, sizeof(struct drm_display_mode));
1712 dst->base.id = base.id;
1713 dst->base.type = base.type;
1716 static void hdmi_mode_fixup(void *ctx, struct drm_connector *connector,
1717 struct drm_display_mode *mode,
1718 struct drm_display_mode *adjusted_mode)
1720 struct drm_display_mode *t, *con_mode;
1721 struct hdmi_context *hdata = ctx;
1724 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] [MODE:%d:%s]\n",
1725 DRM_BASE_ID(connector),
1726 drm_get_connector_name(connector),
1727 DRM_BASE_ID(mode), mode->name);
1730 * Match the incoming mode to a mode in the connector list and copy it
1731 * over. This is important since this might be an adjusted mode from the
1732 * mixer and those have differing crtc_* values.
1734 list_for_each_entry_safe(con_mode, t, &connector->modes, head) {
1735 if (mode->hdisplay == con_mode->hdisplay &&
1736 mode->vdisplay == con_mode->vdisplay &&
1737 mode->clock == con_mode->clock) {
1738 hdmi_mode_copy(adjusted_mode, con_mode);
1744 * We didn't find a mode which matched the desired resolution, so just
1745 * find something with the same clock.
1747 list_for_each_entry_safe(con_mode, t, &connector->modes, head) {
1749 index = hdmi_v13_conf_index(con_mode);
1751 index = find_hdmiphy_conf(con_mode->clock * 1000);
1754 DRM_INFO("desired mode doesn't exist so\n");
1755 DRM_INFO("use the most suitable mode among modes.\n");
1756 hdmi_mode_copy(adjusted_mode, con_mode);
1762 static void hdmi_set_reg(u8 *reg_pair, int num_bytes, u32 value)
1765 BUG_ON(num_bytes > 4);
1766 for (i = 0; i < num_bytes; i++)
1767 reg_pair[i] = (value >> (8 * i)) & 0xff;
1770 static void hdmi_v14_mode_set(struct hdmi_context *hdata,
1771 struct drm_display_mode *m)
1773 struct hdmi_core_regs *core = &hdata->mode_conf.core;
1774 struct hdmi_tg_regs *tg = &hdata->mode_conf.tg;
1776 DRM_DEBUG_KMS("[MODE:%d:%s]\n", DRM_BASE_ID(m), m->name);
1778 hdata->mode_conf.vic = drm_match_cea_mode(m);
1780 hdata->mode_conf.pixel_clock = m->clock * 1000;
1781 hdmi_set_reg(core->h_blank, 2, m->crtc_htotal - m->crtc_hdisplay);
1782 hdmi_set_reg(core->v_line, 2, m->crtc_vtotal);
1783 hdmi_set_reg(core->h_line, 2, m->crtc_htotal);
1784 hdmi_set_reg(core->hsync_pol, 1,
1785 (m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0);
1786 hdmi_set_reg(core->vsync_pol, 1,
1787 (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1788 hdmi_set_reg(core->int_pro_mode, 1,
1789 (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1792 * Quirk requirement for exynos 5 HDMI IP design,
1793 * 2 pixels less than the actual calculation for hsync_start
1797 /* Following values & calculations differ for different type of modes */
1798 if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1799 /* Interlaced Mode */
1800 hdmi_set_reg(core->v_sync_line_bef_2, 2,
1801 (m->crtc_vsync_end - m->crtc_vdisplay) / 2);
1802 hdmi_set_reg(core->v_sync_line_bef_1, 2,
1803 (m->crtc_vsync_start - m->crtc_vdisplay) / 2);
1804 hdmi_set_reg(core->v2_blank, 2, m->crtc_vtotal / 2);
1805 hdmi_set_reg(core->v1_blank, 2,
1806 (m->crtc_vtotal - m->crtc_vdisplay) / 2);
1807 hdmi_set_reg(core->v_blank_f0, 2,
1809 ((m->crtc_vsync_end - m->crtc_vsync_start) * 4) + 5)
1811 hdmi_set_reg(core->v_blank_f1, 2, m->crtc_vtotal);
1812 hdmi_set_reg(core->v_sync_line_aft_2, 2,
1813 (m->crtc_vtotal / 2) + 7);
1814 hdmi_set_reg(core->v_sync_line_aft_1, 2,
1815 (m->crtc_vtotal / 2) + 2);
1816 hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2,
1817 (m->crtc_htotal / 2) +
1818 (m->crtc_hsync_start - m->crtc_hdisplay));
1819 hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2,
1820 (m->crtc_htotal / 2) +
1821 (m->crtc_hsync_start - m->crtc_hdisplay));
1822 hdmi_set_reg(tg->vact_st, 2,
1823 (m->crtc_vtotal - m->crtc_vdisplay) / 2);
1824 hdmi_set_reg(tg->vact_sz, 2, m->crtc_vdisplay / 2);
1825 hdmi_set_reg(tg->vact_st2, 2, 0x249);/* Reset value + 1*/
1826 hdmi_set_reg(tg->vact_st3, 2, 0x0);
1827 hdmi_set_reg(tg->vact_st4, 2, 0x0);
1829 /* Progressive Mode */
1830 hdmi_set_reg(core->v_sync_line_bef_2, 2,
1831 m->crtc_vsync_end - m->crtc_vdisplay);
1832 hdmi_set_reg(core->v_sync_line_bef_1, 2,
1833 m->crtc_vsync_start - m->crtc_vdisplay);
1834 hdmi_set_reg(core->v2_blank, 2, m->crtc_vtotal);
1835 hdmi_set_reg(core->v1_blank, 2,
1836 m->crtc_vtotal - m->crtc_vdisplay);
1837 hdmi_set_reg(core->v_blank_f0, 2, 0xffff);
1838 hdmi_set_reg(core->v_blank_f1, 2, 0xffff);
1839 hdmi_set_reg(core->v_sync_line_aft_2, 2, 0xffff);
1840 hdmi_set_reg(core->v_sync_line_aft_1, 2, 0xffff);
1841 hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2, 0xffff);
1842 hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2, 0xffff);
1843 hdmi_set_reg(tg->vact_st, 2, m->crtc_vtotal - m->crtc_vdisplay);
1844 hdmi_set_reg(tg->vact_sz, 2, m->crtc_vdisplay);
1845 hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1846 hdmi_set_reg(tg->vact_st3, 2, 0x47b); /* Reset value */
1847 hdmi_set_reg(tg->vact_st4, 2, 0x6ae); /* Reset value */
1850 /* Following values & calculations are same irrespective of mode type */
1851 hdmi_set_reg(core->h_sync_start, 2,
1852 m->crtc_hsync_start - m->crtc_hdisplay - 2);
1853 hdmi_set_reg(core->h_sync_end, 2,
1854 m->crtc_hsync_end - m->crtc_hdisplay - 2);
1855 hdmi_set_reg(core->vact_space_1, 2, 0xffff);
1856 hdmi_set_reg(core->vact_space_2, 2, 0xffff);
1857 hdmi_set_reg(core->vact_space_3, 2, 0xffff);
1858 hdmi_set_reg(core->vact_space_4, 2, 0xffff);
1859 hdmi_set_reg(core->vact_space_5, 2, 0xffff);
1860 hdmi_set_reg(core->vact_space_6, 2, 0xffff);
1861 hdmi_set_reg(core->v_blank_f2, 2, 0xffff);
1862 hdmi_set_reg(core->v_blank_f3, 2, 0xffff);
1863 hdmi_set_reg(core->v_blank_f4, 2, 0xffff);
1864 hdmi_set_reg(core->v_blank_f5, 2, 0xffff);
1865 hdmi_set_reg(core->v_sync_line_aft_3, 2, 0xffff);
1866 hdmi_set_reg(core->v_sync_line_aft_4, 2, 0xffff);
1867 hdmi_set_reg(core->v_sync_line_aft_5, 2, 0xffff);
1868 hdmi_set_reg(core->v_sync_line_aft_6, 2, 0xffff);
1869 hdmi_set_reg(core->v_sync_line_aft_pxl_3, 2, 0xffff);
1870 hdmi_set_reg(core->v_sync_line_aft_pxl_4, 2, 0xffff);
1871 hdmi_set_reg(core->v_sync_line_aft_pxl_5, 2, 0xffff);
1872 hdmi_set_reg(core->v_sync_line_aft_pxl_6, 2, 0xffff);
1874 /* Timing generator registers */
1875 hdmi_set_reg(tg->cmd, 1, 0x0);
1876 hdmi_set_reg(tg->h_fsz, 2, m->crtc_htotal);
1877 hdmi_set_reg(tg->hact_st, 2, m->crtc_htotal - m->crtc_hdisplay);
1878 hdmi_set_reg(tg->hact_sz, 2, m->crtc_hdisplay);
1879 hdmi_set_reg(tg->v_fsz, 2, m->crtc_vtotal);
1880 hdmi_set_reg(tg->vsync, 2, 0x1);
1881 hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1882 hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1883 hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1884 hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1885 hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1886 hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1887 hdmi_set_reg(tg->tg_3d, 1, 0x0);
1889 /* Workaround 4 implementation for 1440x900 resolution support */
1890 if (hdata->is_soc_exynos5) {
1891 if (m->crtc_hdisplay == 1440 && m->crtc_vdisplay == 900 &&
1892 m->clock == 106500) {
1893 hdmi_set_reg(tg->hact_st, 2,
1894 m->crtc_htotal - m->crtc_hdisplay - 0xe0);
1895 hdmi_set_reg(tg->hact_sz, 2, m->crtc_hdisplay + 0xe0);
1900 static void hdmi_mode_set(void *ctx, struct drm_display_mode *mode)
1902 struct hdmi_context *hdata = ctx;
1904 DRM_DEBUG_KMS("[MODE:%d:%s]\n", DRM_BASE_ID(mode), mode->name);
1907 hdata->cur_conf = hdmi_v13_conf_index(mode);
1909 hdmi_v14_mode_set(hdata, mode);
1912 static int hdmiphy_update_bits(struct i2c_client *client, u8 *reg_cache,
1913 u8 reg, u8 mask, u8 val)
1919 buffer[1] = (reg_cache[reg] & ~mask) | (val & mask);
1920 reg_cache[reg] = buffer[1];
1922 ret = i2c_master_send(client, buffer, 2);
1929 static int hdmiphy_s_power(struct i2c_client *client, bool on)
1931 u8 reg_cache[32] = { 0 };
1935 DRM_DEBUG_KMS("%s\n", on ? "on" : "off");
1937 /* Cache all 32 registers to make the code below faster */
1939 ret = i2c_master_send(client, buffer, 1);
1944 ret = i2c_master_recv(client, reg_cache, 32);
1950 /* Go to/from configuration from/to operation mode */
1951 ret = hdmiphy_update_bits(client, reg_cache, 0x1f, 0xff,
1957 * Turn off undocumented "oscpad" if !on; it turns on again in
1958 * hdmiphy_conf_apply()
1961 ret = hdmiphy_update_bits(client, reg_cache, 0x0b, 0xc0, 0x00);
1965 /* Disable powerdown if on; enable if !on */
1966 ret = hdmiphy_update_bits(client, reg_cache, 0x1d, 0x80,
1970 ret = hdmiphy_update_bits(client, reg_cache, 0x1d, 0x77,
1976 * Turn off bit 3 of reg 4 if !on; it turns on again in
1977 * hdmiphy_conf_apply(). It's unclear what this bit does.
1980 ret = hdmiphy_update_bits(client, reg_cache, 0x04, BIT(3), 0);
1985 /* Don't expect any errors so just do a single warn */
1991 static void hdmi_resource_poweron(struct hdmi_context *hdata)
1993 struct hdmi_resources *res = &hdata->res;
1995 hdata->is_hdmi_powered_on = true;
1996 hdmi_cfg_hpd(hdata, false);
1998 /* irq change by TV power status */
1999 if (hdata->curr_irq == hdata->internal_irq)
2002 disable_irq(hdata->curr_irq);
2004 hdata->curr_irq = hdata->internal_irq;
2006 enable_irq(hdata->curr_irq);
2008 /* turn HDMI power on */
2009 regulator_bulk_enable(res->regul_count, res->regul_bulk);
2011 /* power-on hdmi clocks */
2012 clk_enable(res->hdmiphy);
2014 hdmiphy_s_power(hdata->hdmiphy_port, 1);
2015 hdmiphy_conf_reset(hdata);
2016 hdmi_conf_reset(hdata);
2017 hdmi_conf_init(hdata);
2018 if (!hdata->is_soc_exynos5)
2019 hdmi_audio_init(hdata);
2020 hdmi_conf_apply(hdata);
2023 static void hdmi_resource_poweroff(struct hdmi_context *hdata)
2025 struct hdmi_resources *res = &hdata->res;
2027 hdmi_cfg_hpd(hdata, true);
2029 if (hdata->curr_irq == hdata->external_irq)
2032 disable_irq(hdata->curr_irq);
2033 hdata->curr_irq = hdata->external_irq;
2035 enable_irq(hdata->curr_irq);
2036 hdata->is_hdmi_powered_on = false;
2038 hdmiphy_s_power(hdata->hdmiphy_port, 0);
2039 hdmiphy_conf_reset(hdata);
2041 /* power-off hdmi clocks */
2042 clk_disable(res->hdmiphy);
2044 /* turn HDMI power off */
2045 regulator_bulk_disable(res->regul_count, res->regul_bulk);
2048 static int hdmi_dpms(void *ctx, int mode)
2050 struct hdmi_context *hdata = ctx;
2052 DRM_DEBUG_KMS("[DPMS:%s]\n", drm_get_dpms_name(mode));
2055 case DRM_MODE_DPMS_ON:
2056 if (!hdata->is_hdmi_powered_on)
2057 hdmi_resource_poweron(hdata);
2058 hdmi_enable_video(hdata);
2060 case DRM_MODE_DPMS_STANDBY:
2061 hdmi_disable_video(hdata);
2063 case DRM_MODE_DPMS_OFF:
2064 case DRM_MODE_DPMS_SUSPEND:
2065 if (hdata->is_hdmi_powered_on)
2066 hdmi_resource_poweroff(hdata);
2069 DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
2076 static int hdmi_subdrv_probe(void *ctx, struct drm_device *drm_dev)
2078 struct hdmi_context *hdata = ctx;
2080 DRM_DEBUG_KMS("[DEV:%s]\n", drm_dev->devname);
2082 hdata->drm_dev = drm_dev;
2087 static struct exynos_panel_ops hdmi_ops = {
2089 .subdrv_probe = hdmi_subdrv_probe,
2090 .is_connected = hdmi_is_connected,
2091 .get_edid = hdmi_get_edid,
2092 .check_timing = hdmi_check_timing,
2096 .mode_fixup = hdmi_mode_fixup,
2097 .mode_set = hdmi_mode_set,
2101 * Handle hotplug events outside the interrupt handler proper.
2103 static void hdmi_hotplug_timer_func(unsigned long data)
2105 struct hdmi_context *hdata = (struct hdmi_context *)data;
2107 drm_helper_hpd_irq_event(hdata->drm_dev);
2110 static irqreturn_t hdmi_irq_handler(int irq, void *arg)
2112 struct hdmi_context *hdata = arg;
2113 u32 intc_flag, time_ms = HOTPLUG_DEBOUNCE_MS;
2115 if (hdata->is_hdmi_powered_on) {
2116 intc_flag = hdmi_reg_read(hdata, HDMI_INTC_FLAG);
2117 /* clearing flags for HPD plug/unplug */
2118 if (intc_flag & HDMI_INTC_FLAG_HPD_UNPLUG) {
2119 DRM_DEBUG_KMS("int unplugged, handling:%d\n",
2121 hdmi_reg_writemask(hdata, HDMI_INTC_FLAG, ~0,
2122 HDMI_INTC_FLAG_HPD_UNPLUG);
2124 if (intc_flag & HDMI_INTC_FLAG_HPD_PLUG) {
2125 DRM_DEBUG_KMS("int plugged, handling:%d\n",
2127 hdmi_reg_writemask(hdata, HDMI_INTC_FLAG, ~0,
2128 HDMI_INTC_FLAG_HPD_PLUG);
2132 * No need to debounce if we're powered on, the hardware
2133 * has already done it for us.
2138 if (hdata->drm_dev && hdata->hpd_handle)
2139 mod_timer(&hdata->hotplug_timer,
2140 jiffies + msecs_to_jiffies(time_ms));
2145 static int __devinit hdmi_resources_init(struct hdmi_context *hdata)
2147 struct device *dev = hdata->dev;
2148 struct hdmi_resources *res = &hdata->res;
2149 #ifndef CONFIG_ARCH_EXYNOS5
2150 static char *supply[] = {
2159 DRM_DEBUG_KMS("HDMI resource init\n");
2161 memset(res, 0, sizeof *res);
2163 /* get clocks, power */
2164 res->hdmi = clk_get(dev, "hdmi");
2165 if (IS_ERR_OR_NULL(res->hdmi)) {
2166 DRM_ERROR("failed to get clock 'hdmi'\n");
2169 res->sclk_hdmi = clk_get(dev, "sclk_hdmi");
2170 if (IS_ERR_OR_NULL(res->sclk_hdmi)) {
2171 DRM_ERROR("failed to get clock 'sclk_hdmi'\n");
2174 res->sclk_pixel = clk_get(dev, "sclk_pixel");
2175 if (IS_ERR_OR_NULL(res->sclk_pixel)) {
2176 DRM_ERROR("failed to get clock 'sclk_pixel'\n");
2179 res->sclk_hdmiphy = clk_get(dev, "sclk_hdmiphy");
2180 if (IS_ERR_OR_NULL(res->sclk_hdmiphy)) {
2181 DRM_ERROR("failed to get clock 'sclk_hdmiphy'\n");
2184 res->hdmiphy = clk_get(dev, "hdmiphy");
2185 if (IS_ERR_OR_NULL(res->hdmiphy)) {
2186 DRM_ERROR("failed to get clock 'hdmiphy'\n");
2190 clk_set_parent(res->sclk_hdmi, res->sclk_pixel);
2192 #ifndef CONFIG_ARCH_EXYNOS5
2193 res->regul_bulk = kzalloc(ARRAY_SIZE(supply) *
2194 sizeof res->regul_bulk[0], GFP_KERNEL);
2195 if (!res->regul_bulk) {
2196 DRM_ERROR("failed to get memory for regulators\n");
2199 for (i = 0; i < ARRAY_SIZE(supply); ++i) {
2200 res->regul_bulk[i].supply = supply[i];
2201 res->regul_bulk[i].consumer = NULL;
2203 ret = regulator_bulk_get(dev, ARRAY_SIZE(supply), res->regul_bulk);
2205 DRM_ERROR("failed to get regulators\n");
2208 res->regul_count = ARRAY_SIZE(supply);
2211 * These clocks also should be added in
2212 * runtime resume and runtime suspend
2214 clk_enable(res->hdmi);
2215 clk_enable(res->sclk_hdmi);
2219 DRM_ERROR("HDMI resource init - failed\n");
2223 static int hdmi_resources_cleanup(struct hdmi_context *hdata)
2225 struct hdmi_resources *res = &hdata->res;
2227 regulator_bulk_free(res->regul_count, res->regul_bulk);
2228 /* kfree is NULL-safe */
2229 kfree(res->regul_bulk);
2230 if (!IS_ERR_OR_NULL(res->hdmiphy))
2231 clk_put(res->hdmiphy);
2232 if (!IS_ERR_OR_NULL(res->sclk_hdmiphy))
2233 clk_put(res->sclk_hdmiphy);
2234 if (!IS_ERR_OR_NULL(res->sclk_pixel))
2235 clk_put(res->sclk_pixel);
2236 if (!IS_ERR_OR_NULL(res->sclk_hdmi))
2237 clk_put(res->sclk_hdmi);
2238 if (!IS_ERR_OR_NULL(res->hdmi))
2240 memset(res, 0, sizeof *res);
2245 struct platform_device *hdmi_audio_device;
2247 int hdmi_register_audio_device(struct platform_device *pdev)
2249 struct hdmi_context *hdata = platform_get_drvdata(pdev);
2250 struct platform_device *audio_dev;
2253 DRM_DEBUG_KMS("[PDEV:%s]\n", pdev->name);
2255 audio_dev = platform_device_alloc("exynos-hdmi-audio", -1);
2257 DRM_ERROR("hdmi audio device allocation failed.\n");
2262 ret = platform_device_add_resources(audio_dev, pdev->resource,
2263 pdev->num_resources);
2269 audio_dev->dev.of_node = of_get_next_child(pdev->dev.of_node, NULL);
2270 audio_dev->dev.platform_data = (void *)hdata->hpd_gpio;
2272 ret = platform_device_add(audio_dev);
2274 DRM_ERROR("hdmi audio device add failed.\n");
2278 hdmi_audio_device = audio_dev;
2282 platform_device_put(audio_dev);
2288 void hdmi_unregister_audio_device(void)
2290 DRM_DEBUG_KMS("\n");
2291 platform_device_unregister(hdmi_audio_device);
2294 static int __devinit hdmi_probe(struct platform_device *pdev)
2296 struct device *dev = &pdev->dev;
2297 struct hdmi_context *hdata;
2298 struct exynos_drm_hdmi_pdata *pdata;
2299 struct resource *res;
2300 struct device_node *ddc_node, *phy_node;
2302 enum of_gpio_flags flags;
2304 DRM_DEBUG_KMS("[PDEV:%s]\n", pdev->name);
2306 pdata = pdev->dev.platform_data;
2308 DRM_ERROR("no platform data specified\n");
2312 hdata = kzalloc(sizeof(struct hdmi_context), GFP_KERNEL);
2314 DRM_ERROR("out of memory\n");
2318 platform_set_drvdata(pdev, hdata);
2320 hdata->is_v13 = pdata->is_v13;
2321 hdata->default_win = pdata->default_win;
2322 hdata->default_timing = &pdata->timing;
2323 hdata->default_bpp = pdata->bpp;
2325 hdata->is_soc_exynos5 = of_device_is_compatible(dev->of_node,
2326 "samsung,exynos5-hdmi");
2328 ret = hdmi_resources_init(hdata);
2334 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2336 DRM_ERROR("failed to find registers\n");
2341 hdata->regs_res = request_mem_region(res->start, resource_size(res),
2343 if (!hdata->regs_res) {
2344 DRM_ERROR("failed to claim register region\n");
2349 hdata->regs = ioremap(res->start, resource_size(res));
2351 DRM_ERROR("failed to map registers\n");
2353 goto err_req_region;
2356 /* DDC i2c driver */
2357 ddc_node = of_find_node_by_name(NULL, "exynos_ddc");
2359 DRM_ERROR("Failed to find ddc node in device tree\n");
2363 hdata->ddc_port = of_find_i2c_device_by_node(ddc_node);
2364 if (!hdata->ddc_port) {
2365 DRM_ERROR("Failed to get ddc i2c client by node\n");
2370 /* hdmiphy i2c driver */
2371 phy_node = of_find_node_by_name(NULL, "exynos_hdmiphy");
2373 DRM_ERROR("Failed to find hdmiphy node in device tree\n");
2377 hdata->hdmiphy_port = of_find_i2c_device_by_node(phy_node);
2378 if (!hdata->hdmiphy_port) {
2379 DRM_ERROR("Failed to get hdmi phy i2c client from node\n");
2384 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
2386 DRM_ERROR("get interrupt resource failed.\n");
2391 hdata->internal_irq = res->start;
2393 hdata->hpd_gpio = of_get_named_gpio_flags(dev->of_node,
2394 "hpd-gpio", 0, &flags);
2396 if (!gpio_is_valid(hdata->hpd_gpio)) {
2397 DRM_ERROR("failed to get hpd gpio.");
2402 hdata->external_irq = gpio_to_irq(hdata->hpd_gpio);
2404 ret = request_irq(hdata->internal_irq, hdmi_irq_handler,
2405 IRQF_SHARED, "int_hdmi", hdata);
2407 DRM_ERROR("request int interrupt failed.\n");
2410 disable_irq(hdata->internal_irq);
2412 ret = request_irq(hdata->external_irq, hdmi_irq_handler,
2413 IRQ_TYPE_EDGE_BOTH | IRQF_SHARED, "ext_hdmi",
2416 DRM_ERROR("request ext interrupt failed.\n");
2419 disable_irq(hdata->external_irq);
2421 setup_timer(&hdata->hotplug_timer, hdmi_hotplug_timer_func,
2422 (unsigned long)hdata);
2424 if (of_device_is_compatible(dev->of_node,
2425 "samsung,exynos5-hdmi")) {
2426 ret = hdmi_register_audio_device(pdev);
2428 DRM_ERROR("hdmi-audio device registering failed.\n");
2433 hdmi_resource_poweron(hdata);
2435 if (!hdmi_is_connected(hdata)) {
2436 hdmi_resource_poweroff(hdata);
2437 DRM_DEBUG_KMS("gpio state is low. powering off!\n");
2440 exynos_display_attach_panel(EXYNOS_DRM_DISPLAY_TYPE_MIXER, &hdmi_ops,
2446 free_irq(hdata->external_irq, hdata);
2448 free_irq(hdata->internal_irq, hdata);
2450 put_device(&hdata->hdmiphy_port->dev);
2452 put_device(&hdata->ddc_port->dev);
2454 iounmap(hdata->regs);
2456 release_mem_region(hdata->regs_res->start,
2457 resource_size(hdata->regs_res));
2459 hdmi_resources_cleanup(hdata);
2465 static int __devexit hdmi_remove(struct platform_device *pdev)
2467 struct hdmi_context *hdata = platform_get_drvdata(pdev);
2468 struct hdmi_resources *res = &hdata->res;
2470 DRM_DEBUG_KMS("[PDEV:%s]\n", pdev->name);
2472 hdmi_resource_poweroff(hdata);
2474 hdmi_unregister_audio_device();
2476 disable_irq(hdata->curr_irq);
2477 free_irq(hdata->internal_irq, hdata);
2478 free_irq(hdata->external_irq, hdata);
2480 del_timer(&hdata->hotplug_timer);
2482 clk_disable(res->hdmi);
2483 clk_disable(res->sclk_hdmi);
2484 hdmi_resources_cleanup(hdata);
2486 iounmap(hdata->regs);
2488 release_mem_region(hdata->regs_res->start,
2489 resource_size(hdata->regs_res));
2491 put_device(&hdata->hdmiphy_port->dev);
2492 put_device(&hdata->ddc_port->dev);
2499 struct platform_driver hdmi_driver = {
2500 .probe = hdmi_probe,
2501 .remove = __devexit_p(hdmi_remove),
2503 #ifdef CONFIG_ARCH_EXYNOS5
2504 .name = "exynos5-hdmi",
2506 .name = "exynos4-hdmi",
2508 .owner = THIS_MODULE,