PM / sleep: Asynchronous threads for suspend_noirq
[linux/fpc-iii.git] / drivers / gpu / drm / exynos / exynos_hdmi.c
blobc021ddc1ffb4b4e982ac01874953dbb7239ddc31
1 /*
2 * Copyright (C) 2011 Samsung Electronics Co.Ltd
3 * Authors:
4 * Seung-Woo Kim <sw0312.kim@samsung.com>
5 * Inki Dae <inki.dae@samsung.com>
6 * Joonyoung Shim <jy0922.shim@samsung.com>
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.
17 #include <drm/drmP.h>
18 #include <drm/drm_edid.h>
19 #include <drm/drm_crtc_helper.h>
21 #include "regs-hdmi.h"
23 #include <linux/kernel.h>
24 #include <linux/spinlock.h>
25 #include <linux/wait.h>
26 #include <linux/i2c.h>
27 #include <linux/platform_device.h>
28 #include <linux/interrupt.h>
29 #include <linux/irq.h>
30 #include <linux/delay.h>
31 #include <linux/pm_runtime.h>
32 #include <linux/clk.h>
33 #include <linux/regulator/consumer.h>
34 #include <linux/io.h>
35 #include <linux/of.h>
36 #include <linux/of_gpio.h>
37 #include <linux/hdmi.h>
39 #include <drm/exynos_drm.h>
41 #include "exynos_drm_drv.h"
42 #include "exynos_drm_hdmi.h"
44 #include "exynos_hdmi.h"
46 #include <linux/gpio.h>
47 #include <media/s5p_hdmi.h>
49 #define MAX_WIDTH 1920
50 #define MAX_HEIGHT 1080
51 #define get_hdmi_context(dev) platform_get_drvdata(to_platform_device(dev))
53 /* AVI header and aspect ratio */
54 #define HDMI_AVI_VERSION 0x02
55 #define HDMI_AVI_LENGTH 0x0D
56 #define AVI_PIC_ASPECT_RATIO_16_9 (2 << 4)
57 #define AVI_SAME_AS_PIC_ASPECT_RATIO 8
59 /* AUI header info */
60 #define HDMI_AUI_VERSION 0x01
61 #define HDMI_AUI_LENGTH 0x0A
63 enum hdmi_type {
64 HDMI_TYPE13,
65 HDMI_TYPE14,
68 struct hdmi_resources {
69 struct clk *hdmi;
70 struct clk *sclk_hdmi;
71 struct clk *sclk_pixel;
72 struct clk *sclk_hdmiphy;
73 struct clk *hdmiphy;
74 struct clk *mout_hdmi;
75 struct regulator_bulk_data *regul_bulk;
76 int regul_count;
79 struct hdmi_tg_regs {
80 u8 cmd[1];
81 u8 h_fsz[2];
82 u8 hact_st[2];
83 u8 hact_sz[2];
84 u8 v_fsz[2];
85 u8 vsync[2];
86 u8 vsync2[2];
87 u8 vact_st[2];
88 u8 vact_sz[2];
89 u8 field_chg[2];
90 u8 vact_st2[2];
91 u8 vact_st3[2];
92 u8 vact_st4[2];
93 u8 vsync_top_hdmi[2];
94 u8 vsync_bot_hdmi[2];
95 u8 field_top_hdmi[2];
96 u8 field_bot_hdmi[2];
97 u8 tg_3d[1];
100 struct hdmi_v13_core_regs {
101 u8 h_blank[2];
102 u8 v_blank[3];
103 u8 h_v_line[3];
104 u8 vsync_pol[1];
105 u8 int_pro_mode[1];
106 u8 v_blank_f[3];
107 u8 h_sync_gen[3];
108 u8 v_sync_gen1[3];
109 u8 v_sync_gen2[3];
110 u8 v_sync_gen3[3];
113 struct hdmi_v14_core_regs {
114 u8 h_blank[2];
115 u8 v2_blank[2];
116 u8 v1_blank[2];
117 u8 v_line[2];
118 u8 h_line[2];
119 u8 hsync_pol[1];
120 u8 vsync_pol[1];
121 u8 int_pro_mode[1];
122 u8 v_blank_f0[2];
123 u8 v_blank_f1[2];
124 u8 h_sync_start[2];
125 u8 h_sync_end[2];
126 u8 v_sync_line_bef_2[2];
127 u8 v_sync_line_bef_1[2];
128 u8 v_sync_line_aft_2[2];
129 u8 v_sync_line_aft_1[2];
130 u8 v_sync_line_aft_pxl_2[2];
131 u8 v_sync_line_aft_pxl_1[2];
132 u8 v_blank_f2[2]; /* for 3D mode */
133 u8 v_blank_f3[2]; /* for 3D mode */
134 u8 v_blank_f4[2]; /* for 3D mode */
135 u8 v_blank_f5[2]; /* for 3D mode */
136 u8 v_sync_line_aft_3[2];
137 u8 v_sync_line_aft_4[2];
138 u8 v_sync_line_aft_5[2];
139 u8 v_sync_line_aft_6[2];
140 u8 v_sync_line_aft_pxl_3[2];
141 u8 v_sync_line_aft_pxl_4[2];
142 u8 v_sync_line_aft_pxl_5[2];
143 u8 v_sync_line_aft_pxl_6[2];
144 u8 vact_space_1[2];
145 u8 vact_space_2[2];
146 u8 vact_space_3[2];
147 u8 vact_space_4[2];
148 u8 vact_space_5[2];
149 u8 vact_space_6[2];
152 struct hdmi_v13_conf {
153 struct hdmi_v13_core_regs core;
154 struct hdmi_tg_regs tg;
157 struct hdmi_v14_conf {
158 struct hdmi_v14_core_regs core;
159 struct hdmi_tg_regs tg;
162 struct hdmi_conf_regs {
163 int pixel_clock;
164 int cea_video_id;
165 union {
166 struct hdmi_v13_conf v13_conf;
167 struct hdmi_v14_conf v14_conf;
168 } conf;
171 struct hdmi_context {
172 struct device *dev;
173 struct drm_device *drm_dev;
174 bool hpd;
175 bool powered;
176 bool dvi_mode;
177 struct mutex hdmi_mutex;
179 void __iomem *regs;
180 void *parent_ctx;
181 int irq;
183 struct i2c_client *ddc_port;
184 struct i2c_client *hdmiphy_port;
186 /* current hdmiphy conf regs */
187 struct hdmi_conf_regs mode_conf;
189 struct hdmi_resources res;
191 int hpd_gpio;
193 enum hdmi_type type;
196 struct hdmiphy_config {
197 int pixel_clock;
198 u8 conf[32];
201 /* list of phy config settings */
202 static const struct hdmiphy_config hdmiphy_v13_configs[] = {
204 .pixel_clock = 27000000,
205 .conf = {
206 0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
207 0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
208 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
209 0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
213 .pixel_clock = 27027000,
214 .conf = {
215 0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
216 0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
217 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
218 0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
222 .pixel_clock = 74176000,
223 .conf = {
224 0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
225 0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
226 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
227 0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x00,
231 .pixel_clock = 74250000,
232 .conf = {
233 0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
234 0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
235 0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0,
236 0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x00,
240 .pixel_clock = 148500000,
241 .conf = {
242 0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
243 0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
244 0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
245 0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x00,
250 static const struct hdmiphy_config hdmiphy_v14_configs[] = {
252 .pixel_clock = 25200000,
253 .conf = {
254 0x01, 0x51, 0x2A, 0x75, 0x40, 0x01, 0x00, 0x08,
255 0x82, 0x80, 0xfc, 0xd8, 0x45, 0xa0, 0xac, 0x80,
256 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
257 0x54, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
261 .pixel_clock = 27000000,
262 .conf = {
263 0x01, 0xd1, 0x22, 0x51, 0x40, 0x08, 0xfc, 0x20,
264 0x98, 0xa0, 0xcb, 0xd8, 0x45, 0xa0, 0xac, 0x80,
265 0x06, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
266 0x54, 0xe4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
270 .pixel_clock = 27027000,
271 .conf = {
272 0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08,
273 0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
274 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
275 0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00,
279 .pixel_clock = 36000000,
280 .conf = {
281 0x01, 0x51, 0x2d, 0x55, 0x40, 0x01, 0x00, 0x08,
282 0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
283 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
284 0x54, 0xab, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
288 .pixel_clock = 40000000,
289 .conf = {
290 0x01, 0x51, 0x32, 0x55, 0x40, 0x01, 0x00, 0x08,
291 0x82, 0x80, 0x2c, 0xd9, 0x45, 0xa0, 0xac, 0x80,
292 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
293 0x54, 0x9a, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
297 .pixel_clock = 65000000,
298 .conf = {
299 0x01, 0xd1, 0x36, 0x34, 0x40, 0x1e, 0x0a, 0x08,
300 0x82, 0xa0, 0x45, 0xd9, 0x45, 0xa0, 0xac, 0x80,
301 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
302 0x54, 0xbd, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
306 .pixel_clock = 74176000,
307 .conf = {
308 0x01, 0xd1, 0x3e, 0x35, 0x40, 0x5b, 0xde, 0x08,
309 0x82, 0xa0, 0x73, 0xd9, 0x45, 0xa0, 0xac, 0x80,
310 0x56, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
311 0x54, 0xa6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
315 .pixel_clock = 74250000,
316 .conf = {
317 0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08,
318 0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
319 0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
320 0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00,
324 .pixel_clock = 83500000,
325 .conf = {
326 0x01, 0xd1, 0x23, 0x11, 0x40, 0x0c, 0xfb, 0x08,
327 0x85, 0xa0, 0xd1, 0xd8, 0x45, 0xa0, 0xac, 0x80,
328 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
329 0x54, 0x93, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
333 .pixel_clock = 106500000,
334 .conf = {
335 0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08,
336 0x84, 0xa0, 0x0a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
337 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
338 0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
342 .pixel_clock = 108000000,
343 .conf = {
344 0x01, 0x51, 0x2d, 0x15, 0x40, 0x01, 0x00, 0x08,
345 0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
346 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
347 0x54, 0xc7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
351 .pixel_clock = 146250000,
352 .conf = {
353 0x01, 0xd1, 0x3d, 0x15, 0x40, 0x18, 0xfd, 0x08,
354 0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
355 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
356 0x54, 0x50, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
360 .pixel_clock = 148500000,
361 .conf = {
362 0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08,
363 0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
364 0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
365 0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x00,
370 static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id)
372 return readl(hdata->regs + reg_id);
375 static inline void hdmi_reg_writeb(struct hdmi_context *hdata,
376 u32 reg_id, u8 value)
378 writeb(value, hdata->regs + reg_id);
381 static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
382 u32 reg_id, u32 value, u32 mask)
384 u32 old = readl(hdata->regs + reg_id);
385 value = (value & mask) | (old & ~mask);
386 writel(value, hdata->regs + reg_id);
389 static void hdmi_v13_regs_dump(struct hdmi_context *hdata, char *prefix)
391 #define DUMPREG(reg_id) \
392 DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
393 readl(hdata->regs + reg_id))
394 DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
395 DUMPREG(HDMI_INTC_FLAG);
396 DUMPREG(HDMI_INTC_CON);
397 DUMPREG(HDMI_HPD_STATUS);
398 DUMPREG(HDMI_V13_PHY_RSTOUT);
399 DUMPREG(HDMI_V13_PHY_VPLL);
400 DUMPREG(HDMI_V13_PHY_CMU);
401 DUMPREG(HDMI_V13_CORE_RSTOUT);
403 DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
404 DUMPREG(HDMI_CON_0);
405 DUMPREG(HDMI_CON_1);
406 DUMPREG(HDMI_CON_2);
407 DUMPREG(HDMI_SYS_STATUS);
408 DUMPREG(HDMI_V13_PHY_STATUS);
409 DUMPREG(HDMI_STATUS_EN);
410 DUMPREG(HDMI_HPD);
411 DUMPREG(HDMI_MODE_SEL);
412 DUMPREG(HDMI_V13_HPD_GEN);
413 DUMPREG(HDMI_V13_DC_CONTROL);
414 DUMPREG(HDMI_V13_VIDEO_PATTERN_GEN);
416 DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
417 DUMPREG(HDMI_H_BLANK_0);
418 DUMPREG(HDMI_H_BLANK_1);
419 DUMPREG(HDMI_V13_V_BLANK_0);
420 DUMPREG(HDMI_V13_V_BLANK_1);
421 DUMPREG(HDMI_V13_V_BLANK_2);
422 DUMPREG(HDMI_V13_H_V_LINE_0);
423 DUMPREG(HDMI_V13_H_V_LINE_1);
424 DUMPREG(HDMI_V13_H_V_LINE_2);
425 DUMPREG(HDMI_VSYNC_POL);
426 DUMPREG(HDMI_INT_PRO_MODE);
427 DUMPREG(HDMI_V13_V_BLANK_F_0);
428 DUMPREG(HDMI_V13_V_BLANK_F_1);
429 DUMPREG(HDMI_V13_V_BLANK_F_2);
430 DUMPREG(HDMI_V13_H_SYNC_GEN_0);
431 DUMPREG(HDMI_V13_H_SYNC_GEN_1);
432 DUMPREG(HDMI_V13_H_SYNC_GEN_2);
433 DUMPREG(HDMI_V13_V_SYNC_GEN_1_0);
434 DUMPREG(HDMI_V13_V_SYNC_GEN_1_1);
435 DUMPREG(HDMI_V13_V_SYNC_GEN_1_2);
436 DUMPREG(HDMI_V13_V_SYNC_GEN_2_0);
437 DUMPREG(HDMI_V13_V_SYNC_GEN_2_1);
438 DUMPREG(HDMI_V13_V_SYNC_GEN_2_2);
439 DUMPREG(HDMI_V13_V_SYNC_GEN_3_0);
440 DUMPREG(HDMI_V13_V_SYNC_GEN_3_1);
441 DUMPREG(HDMI_V13_V_SYNC_GEN_3_2);
443 DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
444 DUMPREG(HDMI_TG_CMD);
445 DUMPREG(HDMI_TG_H_FSZ_L);
446 DUMPREG(HDMI_TG_H_FSZ_H);
447 DUMPREG(HDMI_TG_HACT_ST_L);
448 DUMPREG(HDMI_TG_HACT_ST_H);
449 DUMPREG(HDMI_TG_HACT_SZ_L);
450 DUMPREG(HDMI_TG_HACT_SZ_H);
451 DUMPREG(HDMI_TG_V_FSZ_L);
452 DUMPREG(HDMI_TG_V_FSZ_H);
453 DUMPREG(HDMI_TG_VSYNC_L);
454 DUMPREG(HDMI_TG_VSYNC_H);
455 DUMPREG(HDMI_TG_VSYNC2_L);
456 DUMPREG(HDMI_TG_VSYNC2_H);
457 DUMPREG(HDMI_TG_VACT_ST_L);
458 DUMPREG(HDMI_TG_VACT_ST_H);
459 DUMPREG(HDMI_TG_VACT_SZ_L);
460 DUMPREG(HDMI_TG_VACT_SZ_H);
461 DUMPREG(HDMI_TG_FIELD_CHG_L);
462 DUMPREG(HDMI_TG_FIELD_CHG_H);
463 DUMPREG(HDMI_TG_VACT_ST2_L);
464 DUMPREG(HDMI_TG_VACT_ST2_H);
465 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
466 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
467 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
468 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
469 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
470 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
471 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
472 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
473 #undef DUMPREG
476 static void hdmi_v14_regs_dump(struct hdmi_context *hdata, char *prefix)
478 int i;
480 #define DUMPREG(reg_id) \
481 DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
482 readl(hdata->regs + reg_id))
484 DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
485 DUMPREG(HDMI_INTC_CON);
486 DUMPREG(HDMI_INTC_FLAG);
487 DUMPREG(HDMI_HPD_STATUS);
488 DUMPREG(HDMI_INTC_CON_1);
489 DUMPREG(HDMI_INTC_FLAG_1);
490 DUMPREG(HDMI_PHY_STATUS_0);
491 DUMPREG(HDMI_PHY_STATUS_PLL);
492 DUMPREG(HDMI_PHY_CON_0);
493 DUMPREG(HDMI_PHY_RSTOUT);
494 DUMPREG(HDMI_PHY_VPLL);
495 DUMPREG(HDMI_PHY_CMU);
496 DUMPREG(HDMI_CORE_RSTOUT);
498 DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
499 DUMPREG(HDMI_CON_0);
500 DUMPREG(HDMI_CON_1);
501 DUMPREG(HDMI_CON_2);
502 DUMPREG(HDMI_SYS_STATUS);
503 DUMPREG(HDMI_PHY_STATUS_0);
504 DUMPREG(HDMI_STATUS_EN);
505 DUMPREG(HDMI_HPD);
506 DUMPREG(HDMI_MODE_SEL);
507 DUMPREG(HDMI_ENC_EN);
508 DUMPREG(HDMI_DC_CONTROL);
509 DUMPREG(HDMI_VIDEO_PATTERN_GEN);
511 DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
512 DUMPREG(HDMI_H_BLANK_0);
513 DUMPREG(HDMI_H_BLANK_1);
514 DUMPREG(HDMI_V2_BLANK_0);
515 DUMPREG(HDMI_V2_BLANK_1);
516 DUMPREG(HDMI_V1_BLANK_0);
517 DUMPREG(HDMI_V1_BLANK_1);
518 DUMPREG(HDMI_V_LINE_0);
519 DUMPREG(HDMI_V_LINE_1);
520 DUMPREG(HDMI_H_LINE_0);
521 DUMPREG(HDMI_H_LINE_1);
522 DUMPREG(HDMI_HSYNC_POL);
524 DUMPREG(HDMI_VSYNC_POL);
525 DUMPREG(HDMI_INT_PRO_MODE);
526 DUMPREG(HDMI_V_BLANK_F0_0);
527 DUMPREG(HDMI_V_BLANK_F0_1);
528 DUMPREG(HDMI_V_BLANK_F1_0);
529 DUMPREG(HDMI_V_BLANK_F1_1);
531 DUMPREG(HDMI_H_SYNC_START_0);
532 DUMPREG(HDMI_H_SYNC_START_1);
533 DUMPREG(HDMI_H_SYNC_END_0);
534 DUMPREG(HDMI_H_SYNC_END_1);
536 DUMPREG(HDMI_V_SYNC_LINE_BEF_2_0);
537 DUMPREG(HDMI_V_SYNC_LINE_BEF_2_1);
538 DUMPREG(HDMI_V_SYNC_LINE_BEF_1_0);
539 DUMPREG(HDMI_V_SYNC_LINE_BEF_1_1);
541 DUMPREG(HDMI_V_SYNC_LINE_AFT_2_0);
542 DUMPREG(HDMI_V_SYNC_LINE_AFT_2_1);
543 DUMPREG(HDMI_V_SYNC_LINE_AFT_1_0);
544 DUMPREG(HDMI_V_SYNC_LINE_AFT_1_1);
546 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_0);
547 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_1);
548 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_0);
549 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_1);
551 DUMPREG(HDMI_V_BLANK_F2_0);
552 DUMPREG(HDMI_V_BLANK_F2_1);
553 DUMPREG(HDMI_V_BLANK_F3_0);
554 DUMPREG(HDMI_V_BLANK_F3_1);
555 DUMPREG(HDMI_V_BLANK_F4_0);
556 DUMPREG(HDMI_V_BLANK_F4_1);
557 DUMPREG(HDMI_V_BLANK_F5_0);
558 DUMPREG(HDMI_V_BLANK_F5_1);
560 DUMPREG(HDMI_V_SYNC_LINE_AFT_3_0);
561 DUMPREG(HDMI_V_SYNC_LINE_AFT_3_1);
562 DUMPREG(HDMI_V_SYNC_LINE_AFT_4_0);
563 DUMPREG(HDMI_V_SYNC_LINE_AFT_4_1);
564 DUMPREG(HDMI_V_SYNC_LINE_AFT_5_0);
565 DUMPREG(HDMI_V_SYNC_LINE_AFT_5_1);
566 DUMPREG(HDMI_V_SYNC_LINE_AFT_6_0);
567 DUMPREG(HDMI_V_SYNC_LINE_AFT_6_1);
569 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_0);
570 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_1);
571 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_0);
572 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_1);
573 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_0);
574 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_1);
575 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_0);
576 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_1);
578 DUMPREG(HDMI_VACT_SPACE_1_0);
579 DUMPREG(HDMI_VACT_SPACE_1_1);
580 DUMPREG(HDMI_VACT_SPACE_2_0);
581 DUMPREG(HDMI_VACT_SPACE_2_1);
582 DUMPREG(HDMI_VACT_SPACE_3_0);
583 DUMPREG(HDMI_VACT_SPACE_3_1);
584 DUMPREG(HDMI_VACT_SPACE_4_0);
585 DUMPREG(HDMI_VACT_SPACE_4_1);
586 DUMPREG(HDMI_VACT_SPACE_5_0);
587 DUMPREG(HDMI_VACT_SPACE_5_1);
588 DUMPREG(HDMI_VACT_SPACE_6_0);
589 DUMPREG(HDMI_VACT_SPACE_6_1);
591 DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
592 DUMPREG(HDMI_TG_CMD);
593 DUMPREG(HDMI_TG_H_FSZ_L);
594 DUMPREG(HDMI_TG_H_FSZ_H);
595 DUMPREG(HDMI_TG_HACT_ST_L);
596 DUMPREG(HDMI_TG_HACT_ST_H);
597 DUMPREG(HDMI_TG_HACT_SZ_L);
598 DUMPREG(HDMI_TG_HACT_SZ_H);
599 DUMPREG(HDMI_TG_V_FSZ_L);
600 DUMPREG(HDMI_TG_V_FSZ_H);
601 DUMPREG(HDMI_TG_VSYNC_L);
602 DUMPREG(HDMI_TG_VSYNC_H);
603 DUMPREG(HDMI_TG_VSYNC2_L);
604 DUMPREG(HDMI_TG_VSYNC2_H);
605 DUMPREG(HDMI_TG_VACT_ST_L);
606 DUMPREG(HDMI_TG_VACT_ST_H);
607 DUMPREG(HDMI_TG_VACT_SZ_L);
608 DUMPREG(HDMI_TG_VACT_SZ_H);
609 DUMPREG(HDMI_TG_FIELD_CHG_L);
610 DUMPREG(HDMI_TG_FIELD_CHG_H);
611 DUMPREG(HDMI_TG_VACT_ST2_L);
612 DUMPREG(HDMI_TG_VACT_ST2_H);
613 DUMPREG(HDMI_TG_VACT_ST3_L);
614 DUMPREG(HDMI_TG_VACT_ST3_H);
615 DUMPREG(HDMI_TG_VACT_ST4_L);
616 DUMPREG(HDMI_TG_VACT_ST4_H);
617 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
618 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
619 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
620 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
621 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
622 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
623 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
624 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
625 DUMPREG(HDMI_TG_3D);
627 DRM_DEBUG_KMS("%s: ---- PACKET REGISTERS ----\n", prefix);
628 DUMPREG(HDMI_AVI_CON);
629 DUMPREG(HDMI_AVI_HEADER0);
630 DUMPREG(HDMI_AVI_HEADER1);
631 DUMPREG(HDMI_AVI_HEADER2);
632 DUMPREG(HDMI_AVI_CHECK_SUM);
633 DUMPREG(HDMI_VSI_CON);
634 DUMPREG(HDMI_VSI_HEADER0);
635 DUMPREG(HDMI_VSI_HEADER1);
636 DUMPREG(HDMI_VSI_HEADER2);
637 for (i = 0; i < 7; ++i)
638 DUMPREG(HDMI_VSI_DATA(i));
640 #undef DUMPREG
643 static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
645 if (hdata->type == HDMI_TYPE13)
646 hdmi_v13_regs_dump(hdata, prefix);
647 else
648 hdmi_v14_regs_dump(hdata, prefix);
651 static u8 hdmi_chksum(struct hdmi_context *hdata,
652 u32 start, u8 len, u32 hdr_sum)
654 int i;
656 /* hdr_sum : header0 + header1 + header2
657 * start : start address of packet byte1
658 * len : packet bytes - 1 */
659 for (i = 0; i < len; ++i)
660 hdr_sum += 0xff & hdmi_reg_read(hdata, start + i * 4);
662 /* return 2's complement of 8 bit hdr_sum */
663 return (u8)(~(hdr_sum & 0xff) + 1);
666 static void hdmi_reg_infoframe(struct hdmi_context *hdata,
667 union hdmi_infoframe *infoframe)
669 u32 hdr_sum;
670 u8 chksum;
671 u32 aspect_ratio;
672 u32 mod;
673 u32 vic;
675 mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
676 if (hdata->dvi_mode) {
677 hdmi_reg_writeb(hdata, HDMI_VSI_CON,
678 HDMI_VSI_CON_DO_NOT_TRANSMIT);
679 hdmi_reg_writeb(hdata, HDMI_AVI_CON,
680 HDMI_AVI_CON_DO_NOT_TRANSMIT);
681 hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN);
682 return;
685 switch (infoframe->any.type) {
686 case HDMI_INFOFRAME_TYPE_AVI:
687 hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC);
688 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER0, infoframe->any.type);
689 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER1,
690 infoframe->any.version);
691 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER2, infoframe->any.length);
692 hdr_sum = infoframe->any.type + infoframe->any.version +
693 infoframe->any.length;
695 /* Output format zero hardcoded ,RGB YBCR selection */
696 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 0 << 5 |
697 AVI_ACTIVE_FORMAT_VALID |
698 AVI_UNDERSCANNED_DISPLAY_VALID);
700 aspect_ratio = AVI_PIC_ASPECT_RATIO_16_9;
702 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), aspect_ratio |
703 AVI_SAME_AS_PIC_ASPECT_RATIO);
705 vic = hdata->mode_conf.cea_video_id;
706 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), vic);
708 chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1),
709 infoframe->any.length, hdr_sum);
710 DRM_DEBUG_KMS("AVI checksum = 0x%x\n", chksum);
711 hdmi_reg_writeb(hdata, HDMI_AVI_CHECK_SUM, chksum);
712 break;
713 case HDMI_INFOFRAME_TYPE_AUDIO:
714 hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02);
715 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER0, infoframe->any.type);
716 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER1,
717 infoframe->any.version);
718 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER2, infoframe->any.length);
719 hdr_sum = infoframe->any.type + infoframe->any.version +
720 infoframe->any.length;
721 chksum = hdmi_chksum(hdata, HDMI_AUI_BYTE(1),
722 infoframe->any.length, hdr_sum);
723 DRM_DEBUG_KMS("AUI checksum = 0x%x\n", chksum);
724 hdmi_reg_writeb(hdata, HDMI_AUI_CHECK_SUM, chksum);
725 break;
726 default:
727 break;
731 static bool hdmi_is_connected(void *ctx)
733 struct hdmi_context *hdata = ctx;
735 return hdata->hpd;
738 static struct edid *hdmi_get_edid(void *ctx, struct drm_connector *connector)
740 struct edid *raw_edid;
741 struct hdmi_context *hdata = ctx;
743 if (!hdata->ddc_port)
744 return ERR_PTR(-ENODEV);
746 raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter);
747 if (!raw_edid)
748 return ERR_PTR(-ENODEV);
750 hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid);
751 DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
752 (hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
753 raw_edid->width_cm, raw_edid->height_cm);
755 return raw_edid;
758 static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
760 const struct hdmiphy_config *confs;
761 int count, i;
763 if (hdata->type == HDMI_TYPE13) {
764 confs = hdmiphy_v13_configs;
765 count = ARRAY_SIZE(hdmiphy_v13_configs);
766 } else if (hdata->type == HDMI_TYPE14) {
767 confs = hdmiphy_v14_configs;
768 count = ARRAY_SIZE(hdmiphy_v14_configs);
769 } else
770 return -EINVAL;
772 for (i = 0; i < count; i++)
773 if (confs[i].pixel_clock == pixel_clock)
774 return i;
776 DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
777 return -EINVAL;
780 static int hdmi_check_mode(void *ctx, struct drm_display_mode *mode)
782 struct hdmi_context *hdata = ctx;
783 int ret;
785 DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d clock=%d\n",
786 mode->hdisplay, mode->vdisplay, mode->vrefresh,
787 (mode->flags & DRM_MODE_FLAG_INTERLACE) ? true :
788 false, mode->clock * 1000);
790 ret = hdmi_find_phy_conf(hdata, mode->clock * 1000);
791 if (ret < 0)
792 return ret;
793 return 0;
796 static void hdmi_set_acr(u32 freq, u8 *acr)
798 u32 n, cts;
800 switch (freq) {
801 case 32000:
802 n = 4096;
803 cts = 27000;
804 break;
805 case 44100:
806 n = 6272;
807 cts = 30000;
808 break;
809 case 88200:
810 n = 12544;
811 cts = 30000;
812 break;
813 case 176400:
814 n = 25088;
815 cts = 30000;
816 break;
817 case 48000:
818 n = 6144;
819 cts = 27000;
820 break;
821 case 96000:
822 n = 12288;
823 cts = 27000;
824 break;
825 case 192000:
826 n = 24576;
827 cts = 27000;
828 break;
829 default:
830 n = 0;
831 cts = 0;
832 break;
835 acr[1] = cts >> 16;
836 acr[2] = cts >> 8 & 0xff;
837 acr[3] = cts & 0xff;
839 acr[4] = n >> 16;
840 acr[5] = n >> 8 & 0xff;
841 acr[6] = n & 0xff;
844 static void hdmi_reg_acr(struct hdmi_context *hdata, u8 *acr)
846 hdmi_reg_writeb(hdata, HDMI_ACR_N0, acr[6]);
847 hdmi_reg_writeb(hdata, HDMI_ACR_N1, acr[5]);
848 hdmi_reg_writeb(hdata, HDMI_ACR_N2, acr[4]);
849 hdmi_reg_writeb(hdata, HDMI_ACR_MCTS0, acr[3]);
850 hdmi_reg_writeb(hdata, HDMI_ACR_MCTS1, acr[2]);
851 hdmi_reg_writeb(hdata, HDMI_ACR_MCTS2, acr[1]);
852 hdmi_reg_writeb(hdata, HDMI_ACR_CTS0, acr[3]);
853 hdmi_reg_writeb(hdata, HDMI_ACR_CTS1, acr[2]);
854 hdmi_reg_writeb(hdata, HDMI_ACR_CTS2, acr[1]);
856 if (hdata->type == HDMI_TYPE13)
857 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 4);
858 else
859 hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
862 static void hdmi_audio_init(struct hdmi_context *hdata)
864 u32 sample_rate, bits_per_sample, frame_size_code;
865 u32 data_num, bit_ch, sample_frq;
866 u32 val;
867 u8 acr[7];
869 sample_rate = 44100;
870 bits_per_sample = 16;
871 frame_size_code = 0;
873 switch (bits_per_sample) {
874 case 20:
875 data_num = 2;
876 bit_ch = 1;
877 break;
878 case 24:
879 data_num = 3;
880 bit_ch = 1;
881 break;
882 default:
883 data_num = 1;
884 bit_ch = 0;
885 break;
888 hdmi_set_acr(sample_rate, acr);
889 hdmi_reg_acr(hdata, acr);
891 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
892 | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
893 | HDMI_I2S_MUX_ENABLE);
895 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
896 | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
898 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
900 sample_frq = (sample_rate == 44100) ? 0 :
901 (sample_rate == 48000) ? 2 :
902 (sample_rate == 32000) ? 3 :
903 (sample_rate == 96000) ? 0xa : 0x0;
905 hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
906 hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
908 val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
909 hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
911 /* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
912 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
913 | HDMI_I2S_SEL_LRCK(6));
914 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(1)
915 | HDMI_I2S_SEL_SDATA2(4));
916 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
917 | HDMI_I2S_SEL_SDATA2(2));
918 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
920 /* I2S_CON_1 & 2 */
921 hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
922 | HDMI_I2S_L_CH_LOW_POL);
923 hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
924 | HDMI_I2S_SET_BIT_CH(bit_ch)
925 | HDMI_I2S_SET_SDATA_BIT(data_num)
926 | HDMI_I2S_BASIC_FORMAT);
928 /* Configure register related to CUV information */
929 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0
930 | HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH
931 | HDMI_I2S_COPYRIGHT
932 | HDMI_I2S_LINEAR_PCM
933 | HDMI_I2S_CONSUMER_FORMAT);
934 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER);
935 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0));
936 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2
937 | HDMI_I2S_SET_SMP_FREQ(sample_frq));
938 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4,
939 HDMI_I2S_ORG_SMP_FREQ_44_1
940 | HDMI_I2S_WORD_LEN_MAX24_24BITS
941 | HDMI_I2S_WORD_LEN_MAX_24BITS);
943 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
946 static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
948 if (hdata->dvi_mode)
949 return;
951 hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
952 hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ?
953 HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
956 static void hdmi_conf_reset(struct hdmi_context *hdata)
958 u32 reg;
960 if (hdata->type == HDMI_TYPE13)
961 reg = HDMI_V13_CORE_RSTOUT;
962 else
963 reg = HDMI_CORE_RSTOUT;
965 /* resetting HDMI core */
966 hdmi_reg_writemask(hdata, reg, 0, HDMI_CORE_SW_RSTOUT);
967 usleep_range(10000, 12000);
968 hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
969 usleep_range(10000, 12000);
972 static void hdmi_conf_init(struct hdmi_context *hdata)
974 union hdmi_infoframe infoframe;
976 /* disable HPD interrupts from HDMI IP block, use GPIO instead */
977 hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
978 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
980 /* choose HDMI mode */
981 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
982 HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
983 /* disable bluescreen */
984 hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
986 if (hdata->dvi_mode) {
987 /* choose DVI mode */
988 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
989 HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
990 hdmi_reg_writeb(hdata, HDMI_CON_2,
991 HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
994 if (hdata->type == HDMI_TYPE13) {
995 /* choose bluescreen (fecal) color */
996 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
997 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
998 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1000 /* enable AVI packet every vsync, fixes purple line problem */
1001 hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1002 /* force RGB, look to CEA-861-D, table 7 for more detail */
1003 hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1004 hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1006 hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1007 hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1008 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1009 } else {
1010 infoframe.any.type = HDMI_INFOFRAME_TYPE_AVI;
1011 infoframe.any.version = HDMI_AVI_VERSION;
1012 infoframe.any.length = HDMI_AVI_LENGTH;
1013 hdmi_reg_infoframe(hdata, &infoframe);
1015 infoframe.any.type = HDMI_INFOFRAME_TYPE_AUDIO;
1016 infoframe.any.version = HDMI_AUI_VERSION;
1017 infoframe.any.length = HDMI_AUI_LENGTH;
1018 hdmi_reg_infoframe(hdata, &infoframe);
1020 /* enable AVI packet every vsync, fixes purple line problem */
1021 hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1025 static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
1027 const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg;
1028 const struct hdmi_v13_core_regs *core =
1029 &hdata->mode_conf.conf.v13_conf.core;
1030 int tries;
1032 /* setting core registers */
1033 hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1034 hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1035 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_0, core->v_blank[0]);
1036 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_1, core->v_blank[1]);
1037 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_2, core->v_blank[2]);
1038 hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_0, core->h_v_line[0]);
1039 hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_1, core->h_v_line[1]);
1040 hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_2, core->h_v_line[2]);
1041 hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1042 hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1043 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_0, core->v_blank_f[0]);
1044 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_1, core->v_blank_f[1]);
1045 hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_2, core->v_blank_f[2]);
1046 hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_0, core->h_sync_gen[0]);
1047 hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_1, core->h_sync_gen[1]);
1048 hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_2, core->h_sync_gen[2]);
1049 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_0, core->v_sync_gen1[0]);
1050 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_1, core->v_sync_gen1[1]);
1051 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_2, core->v_sync_gen1[2]);
1052 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_0, core->v_sync_gen2[0]);
1053 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_1, core->v_sync_gen2[1]);
1054 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_2, core->v_sync_gen2[2]);
1055 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_0, core->v_sync_gen3[0]);
1056 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_1, core->v_sync_gen3[1]);
1057 hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_2, core->v_sync_gen3[2]);
1058 /* Timing generator registers */
1059 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1060 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1061 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1062 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1063 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1064 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1065 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1066 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1067 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1068 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1069 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1070 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1071 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1072 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1073 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1074 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1075 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1076 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1077 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1078 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1079 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1080 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1081 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1082 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1083 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1084 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1085 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1086 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1088 /* waiting for HDMIPHY's PLL to get to steady state */
1089 for (tries = 100; tries; --tries) {
1090 u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
1091 if (val & HDMI_PHY_STATUS_READY)
1092 break;
1093 usleep_range(1000, 2000);
1095 /* steady state not achieved */
1096 if (tries == 0) {
1097 DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1098 hdmi_regs_dump(hdata, "timing apply");
1101 clk_disable_unprepare(hdata->res.sclk_hdmi);
1102 clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_hdmiphy);
1103 clk_prepare_enable(hdata->res.sclk_hdmi);
1105 /* enable HDMI and timing generator */
1106 hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
1107 if (core->int_pro_mode[0])
1108 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
1109 HDMI_FIELD_EN);
1110 else
1111 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
1114 static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
1116 const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg;
1117 const struct hdmi_v14_core_regs *core =
1118 &hdata->mode_conf.conf.v14_conf.core;
1119 int tries;
1121 /* setting core registers */
1122 hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1123 hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1124 hdmi_reg_writeb(hdata, HDMI_V2_BLANK_0, core->v2_blank[0]);
1125 hdmi_reg_writeb(hdata, HDMI_V2_BLANK_1, core->v2_blank[1]);
1126 hdmi_reg_writeb(hdata, HDMI_V1_BLANK_0, core->v1_blank[0]);
1127 hdmi_reg_writeb(hdata, HDMI_V1_BLANK_1, core->v1_blank[1]);
1128 hdmi_reg_writeb(hdata, HDMI_V_LINE_0, core->v_line[0]);
1129 hdmi_reg_writeb(hdata, HDMI_V_LINE_1, core->v_line[1]);
1130 hdmi_reg_writeb(hdata, HDMI_H_LINE_0, core->h_line[0]);
1131 hdmi_reg_writeb(hdata, HDMI_H_LINE_1, core->h_line[1]);
1132 hdmi_reg_writeb(hdata, HDMI_HSYNC_POL, core->hsync_pol[0]);
1133 hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1134 hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1135 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_0, core->v_blank_f0[0]);
1136 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_1, core->v_blank_f0[1]);
1137 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_0, core->v_blank_f1[0]);
1138 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_1, core->v_blank_f1[1]);
1139 hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_0, core->h_sync_start[0]);
1140 hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_1, core->h_sync_start[1]);
1141 hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_0, core->h_sync_end[0]);
1142 hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_1, core->h_sync_end[1]);
1143 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_0,
1144 core->v_sync_line_bef_2[0]);
1145 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_1,
1146 core->v_sync_line_bef_2[1]);
1147 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_0,
1148 core->v_sync_line_bef_1[0]);
1149 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_1,
1150 core->v_sync_line_bef_1[1]);
1151 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_0,
1152 core->v_sync_line_aft_2[0]);
1153 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_1,
1154 core->v_sync_line_aft_2[1]);
1155 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_0,
1156 core->v_sync_line_aft_1[0]);
1157 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_1,
1158 core->v_sync_line_aft_1[1]);
1159 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0,
1160 core->v_sync_line_aft_pxl_2[0]);
1161 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_1,
1162 core->v_sync_line_aft_pxl_2[1]);
1163 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0,
1164 core->v_sync_line_aft_pxl_1[0]);
1165 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_1,
1166 core->v_sync_line_aft_pxl_1[1]);
1167 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_0, core->v_blank_f2[0]);
1168 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_1, core->v_blank_f2[1]);
1169 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_0, core->v_blank_f3[0]);
1170 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_1, core->v_blank_f3[1]);
1171 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_0, core->v_blank_f4[0]);
1172 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_1, core->v_blank_f4[1]);
1173 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_0, core->v_blank_f5[0]);
1174 hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_1, core->v_blank_f5[1]);
1175 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_0,
1176 core->v_sync_line_aft_3[0]);
1177 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_1,
1178 core->v_sync_line_aft_3[1]);
1179 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_0,
1180 core->v_sync_line_aft_4[0]);
1181 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_1,
1182 core->v_sync_line_aft_4[1]);
1183 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_0,
1184 core->v_sync_line_aft_5[0]);
1185 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_1,
1186 core->v_sync_line_aft_5[1]);
1187 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_0,
1188 core->v_sync_line_aft_6[0]);
1189 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_1,
1190 core->v_sync_line_aft_6[1]);
1191 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0,
1192 core->v_sync_line_aft_pxl_3[0]);
1193 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_1,
1194 core->v_sync_line_aft_pxl_3[1]);
1195 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0,
1196 core->v_sync_line_aft_pxl_4[0]);
1197 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_1,
1198 core->v_sync_line_aft_pxl_4[1]);
1199 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0,
1200 core->v_sync_line_aft_pxl_5[0]);
1201 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_1,
1202 core->v_sync_line_aft_pxl_5[1]);
1203 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0,
1204 core->v_sync_line_aft_pxl_6[0]);
1205 hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_1,
1206 core->v_sync_line_aft_pxl_6[1]);
1207 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_0, core->vact_space_1[0]);
1208 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_1, core->vact_space_1[1]);
1209 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_0, core->vact_space_2[0]);
1210 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_1, core->vact_space_2[1]);
1211 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_0, core->vact_space_3[0]);
1212 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_1, core->vact_space_3[1]);
1213 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_0, core->vact_space_4[0]);
1214 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_1, core->vact_space_4[1]);
1215 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_0, core->vact_space_5[0]);
1216 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_1, core->vact_space_5[1]);
1217 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_0, core->vact_space_6[0]);
1218 hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_1, core->vact_space_6[1]);
1220 /* Timing generator registers */
1221 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1222 hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1223 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1224 hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1225 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1226 hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1227 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1228 hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1229 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1230 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1231 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1232 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1233 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1234 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1235 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1236 hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1237 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1238 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1239 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1240 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1241 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_L, tg->vact_st3[0]);
1242 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_H, tg->vact_st3[1]);
1243 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_L, tg->vact_st4[0]);
1244 hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_H, tg->vact_st4[1]);
1245 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1246 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1247 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1248 hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1249 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1250 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1251 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1252 hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1253 hdmi_reg_writeb(hdata, HDMI_TG_3D, tg->tg_3d[0]);
1255 /* waiting for HDMIPHY's PLL to get to steady state */
1256 for (tries = 100; tries; --tries) {
1257 u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
1258 if (val & HDMI_PHY_STATUS_READY)
1259 break;
1260 usleep_range(1000, 2000);
1262 /* steady state not achieved */
1263 if (tries == 0) {
1264 DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1265 hdmi_regs_dump(hdata, "timing apply");
1268 clk_disable_unprepare(hdata->res.sclk_hdmi);
1269 clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_hdmiphy);
1270 clk_prepare_enable(hdata->res.sclk_hdmi);
1272 /* enable HDMI and timing generator */
1273 hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
1274 if (core->int_pro_mode[0])
1275 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
1276 HDMI_FIELD_EN);
1277 else
1278 hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
1281 static void hdmi_mode_apply(struct hdmi_context *hdata)
1283 if (hdata->type == HDMI_TYPE13)
1284 hdmi_v13_mode_apply(hdata);
1285 else
1286 hdmi_v14_mode_apply(hdata);
1289 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1291 u8 buffer[2];
1292 u32 reg;
1294 clk_disable_unprepare(hdata->res.sclk_hdmi);
1295 clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_pixel);
1296 clk_prepare_enable(hdata->res.sclk_hdmi);
1298 /* operation mode */
1299 buffer[0] = 0x1f;
1300 buffer[1] = 0x00;
1302 if (hdata->hdmiphy_port)
1303 i2c_master_send(hdata->hdmiphy_port, buffer, 2);
1305 if (hdata->type == HDMI_TYPE13)
1306 reg = HDMI_V13_PHY_RSTOUT;
1307 else
1308 reg = HDMI_PHY_RSTOUT;
1310 /* reset hdmiphy */
1311 hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
1312 usleep_range(10000, 12000);
1313 hdmi_reg_writemask(hdata, reg, 0, HDMI_PHY_SW_RSTOUT);
1314 usleep_range(10000, 12000);
1317 static void hdmiphy_poweron(struct hdmi_context *hdata)
1319 if (hdata->type == HDMI_TYPE14)
1320 hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, 0,
1321 HDMI_PHY_POWER_OFF_EN);
1324 static void hdmiphy_poweroff(struct hdmi_context *hdata)
1326 if (hdata->type == HDMI_TYPE14)
1327 hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, ~0,
1328 HDMI_PHY_POWER_OFF_EN);
1331 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1333 const u8 *hdmiphy_data;
1334 u8 buffer[32];
1335 u8 operation[2];
1336 u8 read_buffer[32] = {0, };
1337 int ret;
1338 int i;
1340 if (!hdata->hdmiphy_port) {
1341 DRM_ERROR("hdmiphy is not attached\n");
1342 return;
1345 /* pixel clock */
1346 i = hdmi_find_phy_conf(hdata, hdata->mode_conf.pixel_clock);
1347 if (i < 0) {
1348 DRM_ERROR("failed to find hdmiphy conf\n");
1349 return;
1352 if (hdata->type == HDMI_TYPE13)
1353 hdmiphy_data = hdmiphy_v13_configs[i].conf;
1354 else
1355 hdmiphy_data = hdmiphy_v14_configs[i].conf;
1357 memcpy(buffer, hdmiphy_data, 32);
1358 ret = i2c_master_send(hdata->hdmiphy_port, buffer, 32);
1359 if (ret != 32) {
1360 DRM_ERROR("failed to configure HDMIPHY via I2C\n");
1361 return;
1364 usleep_range(10000, 12000);
1366 /* operation mode */
1367 operation[0] = 0x1f;
1368 operation[1] = 0x80;
1370 ret = i2c_master_send(hdata->hdmiphy_port, operation, 2);
1371 if (ret != 2) {
1372 DRM_ERROR("failed to enable hdmiphy\n");
1373 return;
1376 ret = i2c_master_recv(hdata->hdmiphy_port, read_buffer, 32);
1377 if (ret < 0) {
1378 DRM_ERROR("failed to read hdmiphy config\n");
1379 return;
1382 for (i = 0; i < ret; i++)
1383 DRM_DEBUG_KMS("hdmiphy[0x%02x] write[0x%02x] - "
1384 "recv [0x%02x]\n", i, buffer[i], read_buffer[i]);
1387 static void hdmi_conf_apply(struct hdmi_context *hdata)
1389 hdmiphy_conf_reset(hdata);
1390 hdmiphy_conf_apply(hdata);
1392 mutex_lock(&hdata->hdmi_mutex);
1393 hdmi_conf_reset(hdata);
1394 hdmi_conf_init(hdata);
1395 mutex_unlock(&hdata->hdmi_mutex);
1397 hdmi_audio_init(hdata);
1399 /* setting core registers */
1400 hdmi_mode_apply(hdata);
1401 hdmi_audio_control(hdata, true);
1403 hdmi_regs_dump(hdata, "start");
1406 static void hdmi_set_reg(u8 *reg_pair, int num_bytes, u32 value)
1408 int i;
1409 BUG_ON(num_bytes > 4);
1410 for (i = 0; i < num_bytes; i++)
1411 reg_pair[i] = (value >> (8 * i)) & 0xff;
1414 static void hdmi_v13_mode_set(struct hdmi_context *hdata,
1415 struct drm_display_mode *m)
1417 struct hdmi_v13_core_regs *core = &hdata->mode_conf.conf.v13_conf.core;
1418 struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg;
1419 unsigned int val;
1421 hdata->mode_conf.cea_video_id =
1422 drm_match_cea_mode((struct drm_display_mode *)m);
1423 hdata->mode_conf.pixel_clock = m->clock * 1000;
1425 hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1426 hdmi_set_reg(core->h_v_line, 3, (m->htotal << 12) | m->vtotal);
1428 val = (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0;
1429 hdmi_set_reg(core->vsync_pol, 1, val);
1431 val = (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0;
1432 hdmi_set_reg(core->int_pro_mode, 1, val);
1434 val = (m->hsync_start - m->hdisplay - 2);
1435 val |= ((m->hsync_end - m->hdisplay - 2) << 10);
1436 val |= ((m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0)<<20;
1437 hdmi_set_reg(core->h_sync_gen, 3, val);
1440 * Quirk requirement for exynos HDMI IP design,
1441 * 2 pixels less than the actual calculation for hsync_start
1442 * and end.
1445 /* Following values & calculations differ for different type of modes */
1446 if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1447 /* Interlaced Mode */
1448 val = ((m->vsync_end - m->vdisplay) / 2);
1449 val |= ((m->vsync_start - m->vdisplay) / 2) << 12;
1450 hdmi_set_reg(core->v_sync_gen1, 3, val);
1452 val = m->vtotal / 2;
1453 val |= ((m->vtotal - m->vdisplay) / 2) << 11;
1454 hdmi_set_reg(core->v_blank, 3, val);
1456 val = (m->vtotal +
1457 ((m->vsync_end - m->vsync_start) * 4) + 5) / 2;
1458 val |= m->vtotal << 11;
1459 hdmi_set_reg(core->v_blank_f, 3, val);
1461 val = ((m->vtotal / 2) + 7);
1462 val |= ((m->vtotal / 2) + 2) << 12;
1463 hdmi_set_reg(core->v_sync_gen2, 3, val);
1465 val = ((m->htotal / 2) + (m->hsync_start - m->hdisplay));
1466 val |= ((m->htotal / 2) +
1467 (m->hsync_start - m->hdisplay)) << 12;
1468 hdmi_set_reg(core->v_sync_gen3, 3, val);
1470 hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1471 hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1473 hdmi_set_reg(tg->vact_st2, 2, 0x249);/* Reset value + 1*/
1474 } else {
1475 /* Progressive Mode */
1477 val = m->vtotal;
1478 val |= (m->vtotal - m->vdisplay) << 11;
1479 hdmi_set_reg(core->v_blank, 3, val);
1481 hdmi_set_reg(core->v_blank_f, 3, 0);
1483 val = (m->vsync_end - m->vdisplay);
1484 val |= ((m->vsync_start - m->vdisplay) << 12);
1485 hdmi_set_reg(core->v_sync_gen1, 3, val);
1487 hdmi_set_reg(core->v_sync_gen2, 3, 0x1001);/* Reset value */
1488 hdmi_set_reg(core->v_sync_gen3, 3, 0x1001);/* Reset value */
1489 hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1490 hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1491 hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1494 /* Timing generator registers */
1495 hdmi_set_reg(tg->cmd, 1, 0x0);
1496 hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1497 hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1498 hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1499 hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1500 hdmi_set_reg(tg->vsync, 2, 0x1);
1501 hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1502 hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1503 hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1504 hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1505 hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1506 hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1507 hdmi_set_reg(tg->tg_3d, 1, 0x0); /* Not used */
1510 static void hdmi_v14_mode_set(struct hdmi_context *hdata,
1511 struct drm_display_mode *m)
1513 struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg;
1514 struct hdmi_v14_core_regs *core =
1515 &hdata->mode_conf.conf.v14_conf.core;
1517 hdata->mode_conf.cea_video_id =
1518 drm_match_cea_mode((struct drm_display_mode *)m);
1519 hdata->mode_conf.pixel_clock = m->clock * 1000;
1521 hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1522 hdmi_set_reg(core->v_line, 2, m->vtotal);
1523 hdmi_set_reg(core->h_line, 2, m->htotal);
1524 hdmi_set_reg(core->hsync_pol, 1,
1525 (m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0);
1526 hdmi_set_reg(core->vsync_pol, 1,
1527 (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1528 hdmi_set_reg(core->int_pro_mode, 1,
1529 (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1532 * Quirk requirement for exynos 5 HDMI IP design,
1533 * 2 pixels less than the actual calculation for hsync_start
1534 * and end.
1537 /* Following values & calculations differ for different type of modes */
1538 if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1539 /* Interlaced Mode */
1540 hdmi_set_reg(core->v_sync_line_bef_2, 2,
1541 (m->vsync_end - m->vdisplay) / 2);
1542 hdmi_set_reg(core->v_sync_line_bef_1, 2,
1543 (m->vsync_start - m->vdisplay) / 2);
1544 hdmi_set_reg(core->v2_blank, 2, m->vtotal / 2);
1545 hdmi_set_reg(core->v1_blank, 2, (m->vtotal - m->vdisplay) / 2);
1546 hdmi_set_reg(core->v_blank_f0, 2, m->vtotal - m->vdisplay / 2);
1547 hdmi_set_reg(core->v_blank_f1, 2, m->vtotal);
1548 hdmi_set_reg(core->v_sync_line_aft_2, 2, (m->vtotal / 2) + 7);
1549 hdmi_set_reg(core->v_sync_line_aft_1, 2, (m->vtotal / 2) + 2);
1550 hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2,
1551 (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1552 hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2,
1553 (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1554 hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1555 hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1556 hdmi_set_reg(tg->vact_st2, 2, m->vtotal - m->vdisplay / 2);
1557 hdmi_set_reg(tg->vsync2, 2, (m->vtotal / 2) + 1);
1558 hdmi_set_reg(tg->vsync_bot_hdmi, 2, (m->vtotal / 2) + 1);
1559 hdmi_set_reg(tg->field_bot_hdmi, 2, (m->vtotal / 2) + 1);
1560 hdmi_set_reg(tg->vact_st3, 2, 0x0);
1561 hdmi_set_reg(tg->vact_st4, 2, 0x0);
1562 } else {
1563 /* Progressive Mode */
1564 hdmi_set_reg(core->v_sync_line_bef_2, 2,
1565 m->vsync_end - m->vdisplay);
1566 hdmi_set_reg(core->v_sync_line_bef_1, 2,
1567 m->vsync_start - m->vdisplay);
1568 hdmi_set_reg(core->v2_blank, 2, m->vtotal);
1569 hdmi_set_reg(core->v1_blank, 2, m->vtotal - m->vdisplay);
1570 hdmi_set_reg(core->v_blank_f0, 2, 0xffff);
1571 hdmi_set_reg(core->v_blank_f1, 2, 0xffff);
1572 hdmi_set_reg(core->v_sync_line_aft_2, 2, 0xffff);
1573 hdmi_set_reg(core->v_sync_line_aft_1, 2, 0xffff);
1574 hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2, 0xffff);
1575 hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2, 0xffff);
1576 hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1577 hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1578 hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1579 hdmi_set_reg(tg->vact_st3, 2, 0x47b); /* Reset value */
1580 hdmi_set_reg(tg->vact_st4, 2, 0x6ae); /* Reset value */
1581 hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1582 hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1583 hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1586 /* Following values & calculations are same irrespective of mode type */
1587 hdmi_set_reg(core->h_sync_start, 2, m->hsync_start - m->hdisplay - 2);
1588 hdmi_set_reg(core->h_sync_end, 2, m->hsync_end - m->hdisplay - 2);
1589 hdmi_set_reg(core->vact_space_1, 2, 0xffff);
1590 hdmi_set_reg(core->vact_space_2, 2, 0xffff);
1591 hdmi_set_reg(core->vact_space_3, 2, 0xffff);
1592 hdmi_set_reg(core->vact_space_4, 2, 0xffff);
1593 hdmi_set_reg(core->vact_space_5, 2, 0xffff);
1594 hdmi_set_reg(core->vact_space_6, 2, 0xffff);
1595 hdmi_set_reg(core->v_blank_f2, 2, 0xffff);
1596 hdmi_set_reg(core->v_blank_f3, 2, 0xffff);
1597 hdmi_set_reg(core->v_blank_f4, 2, 0xffff);
1598 hdmi_set_reg(core->v_blank_f5, 2, 0xffff);
1599 hdmi_set_reg(core->v_sync_line_aft_3, 2, 0xffff);
1600 hdmi_set_reg(core->v_sync_line_aft_4, 2, 0xffff);
1601 hdmi_set_reg(core->v_sync_line_aft_5, 2, 0xffff);
1602 hdmi_set_reg(core->v_sync_line_aft_6, 2, 0xffff);
1603 hdmi_set_reg(core->v_sync_line_aft_pxl_3, 2, 0xffff);
1604 hdmi_set_reg(core->v_sync_line_aft_pxl_4, 2, 0xffff);
1605 hdmi_set_reg(core->v_sync_line_aft_pxl_5, 2, 0xffff);
1606 hdmi_set_reg(core->v_sync_line_aft_pxl_6, 2, 0xffff);
1608 /* Timing generator registers */
1609 hdmi_set_reg(tg->cmd, 1, 0x0);
1610 hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1611 hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1612 hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1613 hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1614 hdmi_set_reg(tg->vsync, 2, 0x1);
1615 hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1616 hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1617 hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1618 hdmi_set_reg(tg->tg_3d, 1, 0x0);
1621 static void hdmi_mode_set(void *ctx, struct drm_display_mode *mode)
1623 struct hdmi_context *hdata = ctx;
1624 struct drm_display_mode *m = mode;
1626 DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%s\n",
1627 m->hdisplay, m->vdisplay,
1628 m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ?
1629 "INTERLACED" : "PROGERESSIVE");
1631 if (hdata->type == HDMI_TYPE13)
1632 hdmi_v13_mode_set(hdata, mode);
1633 else
1634 hdmi_v14_mode_set(hdata, mode);
1637 static void hdmi_get_max_resol(void *ctx, unsigned int *width,
1638 unsigned int *height)
1640 *width = MAX_WIDTH;
1641 *height = MAX_HEIGHT;
1644 static void hdmi_commit(void *ctx)
1646 struct hdmi_context *hdata = ctx;
1648 mutex_lock(&hdata->hdmi_mutex);
1649 if (!hdata->powered) {
1650 mutex_unlock(&hdata->hdmi_mutex);
1651 return;
1653 mutex_unlock(&hdata->hdmi_mutex);
1655 hdmi_conf_apply(hdata);
1658 static void hdmi_poweron(struct hdmi_context *hdata)
1660 struct hdmi_resources *res = &hdata->res;
1662 mutex_lock(&hdata->hdmi_mutex);
1663 if (hdata->powered) {
1664 mutex_unlock(&hdata->hdmi_mutex);
1665 return;
1668 hdata->powered = true;
1670 mutex_unlock(&hdata->hdmi_mutex);
1672 if (regulator_bulk_enable(res->regul_count, res->regul_bulk))
1673 DRM_DEBUG_KMS("failed to enable regulator bulk\n");
1675 clk_prepare_enable(res->hdmiphy);
1676 clk_prepare_enable(res->hdmi);
1677 clk_prepare_enable(res->sclk_hdmi);
1679 hdmiphy_poweron(hdata);
1682 static void hdmi_poweroff(struct hdmi_context *hdata)
1684 struct hdmi_resources *res = &hdata->res;
1686 mutex_lock(&hdata->hdmi_mutex);
1687 if (!hdata->powered)
1688 goto out;
1689 mutex_unlock(&hdata->hdmi_mutex);
1692 * The TV power domain needs any condition of hdmiphy to turn off and
1693 * its reset state seems to meet the condition.
1695 hdmiphy_conf_reset(hdata);
1696 hdmiphy_poweroff(hdata);
1698 clk_disable_unprepare(res->sclk_hdmi);
1699 clk_disable_unprepare(res->hdmi);
1700 clk_disable_unprepare(res->hdmiphy);
1701 regulator_bulk_disable(res->regul_count, res->regul_bulk);
1703 mutex_lock(&hdata->hdmi_mutex);
1705 hdata->powered = false;
1707 out:
1708 mutex_unlock(&hdata->hdmi_mutex);
1711 static void hdmi_dpms(void *ctx, int mode)
1713 struct hdmi_context *hdata = ctx;
1715 DRM_DEBUG_KMS("mode %d\n", mode);
1717 switch (mode) {
1718 case DRM_MODE_DPMS_ON:
1719 if (pm_runtime_suspended(hdata->dev))
1720 pm_runtime_get_sync(hdata->dev);
1721 break;
1722 case DRM_MODE_DPMS_STANDBY:
1723 case DRM_MODE_DPMS_SUSPEND:
1724 case DRM_MODE_DPMS_OFF:
1725 if (!pm_runtime_suspended(hdata->dev))
1726 pm_runtime_put_sync(hdata->dev);
1727 break;
1728 default:
1729 DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
1730 break;
1734 static struct exynos_hdmi_ops hdmi_ops = {
1735 /* display */
1736 .is_connected = hdmi_is_connected,
1737 .get_edid = hdmi_get_edid,
1738 .check_mode = hdmi_check_mode,
1740 /* manager */
1741 .mode_set = hdmi_mode_set,
1742 .get_max_resol = hdmi_get_max_resol,
1743 .commit = hdmi_commit,
1744 .dpms = hdmi_dpms,
1747 static irqreturn_t hdmi_irq_thread(int irq, void *arg)
1749 struct exynos_drm_hdmi_context *ctx = arg;
1750 struct hdmi_context *hdata = ctx->ctx;
1752 mutex_lock(&hdata->hdmi_mutex);
1753 hdata->hpd = gpio_get_value(hdata->hpd_gpio);
1754 mutex_unlock(&hdata->hdmi_mutex);
1756 if (ctx->drm_dev)
1757 drm_helper_hpd_irq_event(ctx->drm_dev);
1759 return IRQ_HANDLED;
1762 static int hdmi_resources_init(struct hdmi_context *hdata)
1764 struct device *dev = hdata->dev;
1765 struct hdmi_resources *res = &hdata->res;
1766 static char *supply[] = {
1767 "hdmi-en",
1768 "vdd",
1769 "vdd_osc",
1770 "vdd_pll",
1772 int i, ret;
1774 DRM_DEBUG_KMS("HDMI resource init\n");
1776 memset(res, 0, sizeof(*res));
1778 /* get clocks, power */
1779 res->hdmi = devm_clk_get(dev, "hdmi");
1780 if (IS_ERR(res->hdmi)) {
1781 DRM_ERROR("failed to get clock 'hdmi'\n");
1782 goto fail;
1784 res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi");
1785 if (IS_ERR(res->sclk_hdmi)) {
1786 DRM_ERROR("failed to get clock 'sclk_hdmi'\n");
1787 goto fail;
1789 res->sclk_pixel = devm_clk_get(dev, "sclk_pixel");
1790 if (IS_ERR(res->sclk_pixel)) {
1791 DRM_ERROR("failed to get clock 'sclk_pixel'\n");
1792 goto fail;
1794 res->sclk_hdmiphy = devm_clk_get(dev, "sclk_hdmiphy");
1795 if (IS_ERR(res->sclk_hdmiphy)) {
1796 DRM_ERROR("failed to get clock 'sclk_hdmiphy'\n");
1797 goto fail;
1799 res->hdmiphy = devm_clk_get(dev, "hdmiphy");
1800 if (IS_ERR(res->hdmiphy)) {
1801 DRM_ERROR("failed to get clock 'hdmiphy'\n");
1802 goto fail;
1804 res->mout_hdmi = devm_clk_get(dev, "mout_hdmi");
1805 if (IS_ERR(res->mout_hdmi)) {
1806 DRM_ERROR("failed to get clock 'mout_hdmi'\n");
1807 goto fail;
1810 clk_set_parent(res->mout_hdmi, res->sclk_pixel);
1812 res->regul_bulk = devm_kzalloc(dev, ARRAY_SIZE(supply) *
1813 sizeof(res->regul_bulk[0]), GFP_KERNEL);
1814 if (!res->regul_bulk)
1815 goto fail;
1816 for (i = 0; i < ARRAY_SIZE(supply); ++i) {
1817 res->regul_bulk[i].supply = supply[i];
1818 res->regul_bulk[i].consumer = NULL;
1820 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), res->regul_bulk);
1821 if (ret) {
1822 DRM_ERROR("failed to get regulators\n");
1823 goto fail;
1825 res->regul_count = ARRAY_SIZE(supply);
1827 return 0;
1828 fail:
1829 DRM_ERROR("HDMI resource init - failed\n");
1830 return -ENODEV;
1833 static struct i2c_client *hdmi_ddc, *hdmi_hdmiphy;
1835 void hdmi_attach_ddc_client(struct i2c_client *ddc)
1837 if (ddc)
1838 hdmi_ddc = ddc;
1841 void hdmi_attach_hdmiphy_client(struct i2c_client *hdmiphy)
1843 if (hdmiphy)
1844 hdmi_hdmiphy = hdmiphy;
1847 static struct s5p_hdmi_platform_data *drm_hdmi_dt_parse_pdata
1848 (struct device *dev)
1850 struct device_node *np = dev->of_node;
1851 struct s5p_hdmi_platform_data *pd;
1852 u32 value;
1854 pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
1855 if (!pd)
1856 goto err_data;
1858 if (!of_find_property(np, "hpd-gpio", &value)) {
1859 DRM_ERROR("no hpd gpio property found\n");
1860 goto err_data;
1863 pd->hpd_gpio = of_get_named_gpio(np, "hpd-gpio", 0);
1865 return pd;
1867 err_data:
1868 return NULL;
1871 static struct of_device_id hdmi_match_types[] = {
1873 .compatible = "samsung,exynos5-hdmi",
1874 .data = (void *)HDMI_TYPE14,
1875 }, {
1876 .compatible = "samsung,exynos4212-hdmi",
1877 .data = (void *)HDMI_TYPE14,
1878 }, {
1879 /* end node */
1883 static int hdmi_probe(struct platform_device *pdev)
1885 struct device *dev = &pdev->dev;
1886 struct exynos_drm_hdmi_context *drm_hdmi_ctx;
1887 struct hdmi_context *hdata;
1888 struct s5p_hdmi_platform_data *pdata;
1889 struct resource *res;
1890 const struct of_device_id *match;
1891 int ret;
1893 if (!dev->of_node)
1894 return -ENODEV;
1896 pdata = drm_hdmi_dt_parse_pdata(dev);
1897 if (!pdata)
1898 return -EINVAL;
1900 drm_hdmi_ctx = devm_kzalloc(dev, sizeof(*drm_hdmi_ctx), GFP_KERNEL);
1901 if (!drm_hdmi_ctx)
1902 return -ENOMEM;
1904 hdata = devm_kzalloc(dev, sizeof(struct hdmi_context), GFP_KERNEL);
1905 if (!hdata)
1906 return -ENOMEM;
1908 mutex_init(&hdata->hdmi_mutex);
1910 drm_hdmi_ctx->ctx = (void *)hdata;
1911 hdata->parent_ctx = (void *)drm_hdmi_ctx;
1913 platform_set_drvdata(pdev, drm_hdmi_ctx);
1915 match = of_match_node(hdmi_match_types, dev->of_node);
1916 if (!match)
1917 return -ENODEV;
1918 hdata->type = (enum hdmi_type)match->data;
1920 hdata->hpd_gpio = pdata->hpd_gpio;
1921 hdata->dev = dev;
1923 ret = hdmi_resources_init(hdata);
1924 if (ret) {
1925 DRM_ERROR("hdmi_resources_init failed\n");
1926 return -EINVAL;
1929 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1930 hdata->regs = devm_ioremap_resource(dev, res);
1931 if (IS_ERR(hdata->regs))
1932 return PTR_ERR(hdata->regs);
1934 ret = devm_gpio_request(dev, hdata->hpd_gpio, "HPD");
1935 if (ret) {
1936 DRM_ERROR("failed to request HPD gpio\n");
1937 return ret;
1940 /* DDC i2c driver */
1941 if (i2c_add_driver(&ddc_driver)) {
1942 DRM_ERROR("failed to register ddc i2c driver\n");
1943 return -ENOENT;
1946 hdata->ddc_port = hdmi_ddc;
1948 /* hdmiphy i2c driver */
1949 if (i2c_add_driver(&hdmiphy_driver)) {
1950 DRM_ERROR("failed to register hdmiphy i2c driver\n");
1951 ret = -ENOENT;
1952 goto err_ddc;
1955 hdata->hdmiphy_port = hdmi_hdmiphy;
1957 hdata->irq = gpio_to_irq(hdata->hpd_gpio);
1958 if (hdata->irq < 0) {
1959 DRM_ERROR("failed to get GPIO irq\n");
1960 ret = hdata->irq;
1961 goto err_hdmiphy;
1964 hdata->hpd = gpio_get_value(hdata->hpd_gpio);
1966 ret = devm_request_threaded_irq(dev, hdata->irq, NULL,
1967 hdmi_irq_thread, IRQF_TRIGGER_RISING |
1968 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1969 "hdmi", drm_hdmi_ctx);
1970 if (ret) {
1971 DRM_ERROR("failed to register hdmi interrupt\n");
1972 goto err_hdmiphy;
1975 /* Attach HDMI Driver to common hdmi. */
1976 exynos_hdmi_drv_attach(drm_hdmi_ctx);
1978 /* register specific callbacks to common hdmi. */
1979 exynos_hdmi_ops_register(&hdmi_ops);
1981 pm_runtime_enable(dev);
1983 return 0;
1985 err_hdmiphy:
1986 i2c_del_driver(&hdmiphy_driver);
1987 err_ddc:
1988 i2c_del_driver(&ddc_driver);
1989 return ret;
1992 static int hdmi_remove(struct platform_device *pdev)
1994 struct device *dev = &pdev->dev;
1996 pm_runtime_disable(dev);
1998 /* hdmiphy i2c driver */
1999 i2c_del_driver(&hdmiphy_driver);
2000 /* DDC i2c driver */
2001 i2c_del_driver(&ddc_driver);
2003 return 0;
2006 #ifdef CONFIG_PM_SLEEP
2007 static int hdmi_suspend(struct device *dev)
2009 struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2010 struct hdmi_context *hdata = ctx->ctx;
2012 disable_irq(hdata->irq);
2014 hdata->hpd = false;
2015 if (ctx->drm_dev)
2016 drm_helper_hpd_irq_event(ctx->drm_dev);
2018 if (pm_runtime_suspended(dev)) {
2019 DRM_DEBUG_KMS("Already suspended\n");
2020 return 0;
2023 hdmi_poweroff(hdata);
2025 return 0;
2028 static int hdmi_resume(struct device *dev)
2030 struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2031 struct hdmi_context *hdata = ctx->ctx;
2033 hdata->hpd = gpio_get_value(hdata->hpd_gpio);
2035 enable_irq(hdata->irq);
2037 if (!pm_runtime_suspended(dev)) {
2038 DRM_DEBUG_KMS("Already resumed\n");
2039 return 0;
2042 hdmi_poweron(hdata);
2044 return 0;
2046 #endif
2048 #ifdef CONFIG_PM_RUNTIME
2049 static int hdmi_runtime_suspend(struct device *dev)
2051 struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2052 struct hdmi_context *hdata = ctx->ctx;
2054 hdmi_poweroff(hdata);
2056 return 0;
2059 static int hdmi_runtime_resume(struct device *dev)
2061 struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2062 struct hdmi_context *hdata = ctx->ctx;
2064 hdmi_poweron(hdata);
2066 return 0;
2068 #endif
2070 static const struct dev_pm_ops hdmi_pm_ops = {
2071 SET_SYSTEM_SLEEP_PM_OPS(hdmi_suspend, hdmi_resume)
2072 SET_RUNTIME_PM_OPS(hdmi_runtime_suspend, hdmi_runtime_resume, NULL)
2075 struct platform_driver hdmi_driver = {
2076 .probe = hdmi_probe,
2077 .remove = hdmi_remove,
2078 .driver = {
2079 .name = "exynos-hdmi",
2080 .owner = THIS_MODULE,
2081 .pm = &hdmi_pm_ops,
2082 .of_match_table = hdmi_match_types,