2 * drivers/video/tegra/dc/hdmi.c
4 * Copyright (C) 2010 Google, Inc.
5 * Author: Erik Gilling <konkers@android.com>
7 * Copyright (c) 2010-2014, NVIDIA CORPORATION, All rights reserved.
9 * This software is licensed under the terms of the GNU General Public
10 * License version 2, as published by the Free Software Foundation, and
11 * may be copied, distributed, and modified under those terms.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
20 #include <linux/clk.h>
21 #include <linux/delay.h>
22 #include <linux/err.h>
24 #include <linux/gpio.h>
25 #include <linux/interrupt.h>
26 #include <linux/kernel.h>
27 #include <linux/slab.h>
28 #include <linux/mutex.h>
30 #include <linux/switch.h>
32 #include <linux/debugfs.h>
33 #include <linux/seq_file.h>
34 #include <linux/device.h>
35 #include <linux/export.h>
36 #include <linux/clk/tegra.h>
40 #include <linux/nvhost.h>
41 #include <mach/hdmi-audio.h>
43 #include <video/tegrafb.h>
49 #include "hdmi_state_machine.h"
53 #include <linux/of_address.h>
55 /* datasheet claims this will always be 216MHz */
56 #define HDMI_AUDIOCLK_FREQ 216000000
58 #define HDMI_REKEY_DEFAULT 56
60 #define HDMI_ELD_VER_INDEX 0
61 #define HDMI_ELD_RESERVED1_INDEX 1
62 #define HDMI_ELD_BASELINE_LEN_INDEX 2
63 #define HDMI_ELD_RESERVED2_INDEX 3
64 #define HDMI_ELD_CEA_VER_MNL_INDEX 4
65 #define HDMI_ELD_SAD_CNT_CON_TYP_SAI_HDCP_INDEX 5
66 #define HDMI_ELD_AUD_SYNC_DELAY_INDEX 6
67 #define HDMI_ELD_SPK_ALLOC_INDEX 7
68 #define HDMI_ELD_PORT_ID_INDEX 8 /* 8 to 15 */
69 #define HDMI_ELD_MANF_NAME_INDEX 16 /* 16 to 17 */
70 #define HDMI_ELD_PRODUCT_CODE_INDEX 18 /* 18 to 19 */
71 #define HDMI_ELD_MONITOR_NAME_INDEX 20 /* 20 to 20 + MNL - 1 */
72 #define HDMI_ELD_BUF_SIZE 96
74 /* According to HDA ELD spec, the maxmimum baseline
75 * eld size for tye 2 ELD_Ver encoding (which is
76 * what this code supports) is 80 bytes.
78 #define MAX_BASELINE_ELD_SIZE 80
80 /* These two values need to be cross checked in case of
81 addition/removal from tegra_dc_hdmi_aspect_ratios[] */
82 #define TEGRA_DC_HDMI_MIN_ASPECT_RATIO_PERCENT 80
83 #define TEGRA_DC_HDMI_MAX_ASPECT_RATIO_PERCENT 320
85 struct tegra_dc_hdmi_data *dc_hdmi;
87 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
88 const struct tmds_config tmds_config[] = {
91 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
92 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(0) |
93 SOR_PLL_TX_REG_LOAD(0),
94 .pll1 = SOR_PLL_TMDS_TERM_ENABLE,
95 .pe_current = 0x00000000,
96 .drive_current = 0x0a0a0a0a,
100 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
101 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(1) |
102 SOR_PLL_TX_REG_LOAD(0),
103 .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
104 .pe_current = 0x0a0a0a0a,
105 .drive_current = 0x0a0a0a0a,
109 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
110 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(3) |
111 SOR_PLL_TX_REG_LOAD(0),
112 .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
113 .pe_current = 0x0a0a0a0a,
114 .drive_current = 0x0a0a0a0a,
117 #elif defined(CONFIG_ARCH_TEGRA_2x_SOC)
118 const struct tmds_config tmds_config[] = {
121 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
122 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(0) |
123 SOR_PLL_TX_REG_LOAD(3),
124 .pll1 = SOR_PLL_TMDS_TERM_ENABLE,
125 .pe_current = 0x00000000,
126 .drive_current = 0x0f0f0f0f,
130 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
131 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(1) |
132 SOR_PLL_TX_REG_LOAD(3),
133 .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
134 .pe_current = 0x0c0c0c0c,
135 .drive_current = 0x0f0f0f0f,
139 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
140 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(1) |
141 SOR_PLL_TX_REG_LOAD(3),
142 .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
143 .pe_current = 0x0c0c0c0c,
144 .drive_current = 0x0f0f0f0f,
147 #elif defined(CONFIG_ARCH_TEGRA_11x_SOC)
148 const struct tmds_config tmds_config[] = {
149 { /* 480p/576p / 25.2MHz/27MHz modes */
151 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
152 SOR_PLL_VCOCAP(0) | SOR_PLL_RESISTORSEL_EXT,
153 .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
154 .pe_current = 0x00000000,
155 .drive_current = 0x1a1a1a1a,
156 .peak_current = 0x00000000,
158 { /* 720p / 74.25MHz modes */
160 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
161 SOR_PLL_VCOCAP(1) | SOR_PLL_RESISTORSEL_EXT,
162 .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
163 .pe_current = 0x0f0f0f0f,
164 .drive_current = 0x1a1a1a1a,
165 .peak_current = 0x00000000,
167 { /* 1080p / 148.5MHz modes */
169 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
170 SOR_PLL_VCOCAP(3) | SOR_PLL_RESISTORSEL_EXT,
171 .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
172 .pe_current = 0x0a0a0a0a,
173 .drive_current = 0x1f1f1f1f,
174 .peak_current = 0x00000000,
176 { /* 225/297MHz modes */
178 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
179 SOR_PLL_VCOCAP(0xf) | SOR_PLL_RESISTORSEL_EXT,
180 .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(7)
181 | SOR_PLL_TMDS_TERM_ENABLE,
182 .pe_current = 0x00000000,
183 .drive_current = 0x303f3f3f, /* lane3 needs a slightly lower current */
184 .peak_current = 0x040f0f0f,
185 /* Alternative settings:
186 .drive_current = 0x2c333333,
187 .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(6)
188 | SOR_PLL_TMDS_TERM_ENABLE,
192 #elif defined(CONFIG_ARCH_TEGRA_12x_SOC)
193 const struct tmds_config tmds_config[] = {
194 { /* 480p/576p / 25.2MHz/27MHz modes */
195 .version = MKDEV(1, 0),
197 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
198 SOR_PLL_VCOCAP(0) | SOR_PLL_RESISTORSEL_EXT,
199 .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
200 .pe_current = 0x00000000,
201 .drive_current = 0x1a1a1a1a,
202 .peak_current = 0x00000000,
203 .pad_ctls0_mask = 0xfffff0ff,
204 .pad_ctls0_setting = 0x00000400, /* BG_VREF_LEVEL */
206 { /* 720p / 74.25MHz modes */
207 .version = MKDEV(1, 0),
209 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
210 SOR_PLL_VCOCAP(1) | SOR_PLL_RESISTORSEL_EXT,
211 .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
212 .pe_current = 0x0f0f0f0f,
213 .drive_current = 0x1a1a1a1a,
214 .peak_current = 0x00000000,
215 .pad_ctls0_mask = 0xfffff0ff,
216 .pad_ctls0_setting = 0x00000400, /* BG_VREF_LEVEL */
218 { /* 1080p / 148.5MHz modes */
219 .version = MKDEV(1, 0),
221 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
222 SOR_PLL_VCOCAP(3) | SOR_PLL_RESISTORSEL_EXT,
223 .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
224 .pe_current = 0x0a0a0a0a,
225 .drive_current = 0x1f1f1f1f,
226 .peak_current = 0x00000000,
227 .pad_ctls0_mask = 0xfffff0ff,
228 .pad_ctls0_setting = 0x00000400, /* BG_VREF_LEVEL */
230 { /* 225/297MHz modes */
231 .version = MKDEV(1, 0),
233 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
234 SOR_PLL_VCOCAP(0xf) | SOR_PLL_RESISTORSEL_EXT,
235 .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(7)
236 | SOR_PLL_TMDS_TERM_ENABLE,
237 .pe_current = 0x00000000,
238 .drive_current = 0x303f3f3f, /* lane3 needs a slightly lower current */
239 .peak_current = 0x040f0f0f,
240 .pad_ctls0_mask = 0xfffff0ff,
241 .pad_ctls0_setting = 0x00000600, /* BG_VREF_LEVEL */
244 #elif defined(CONFIG_ARCH_TEGRA_14x_SOC)
245 const struct tmds_config tmds_config[] = {
248 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
249 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(0x0) |
250 SOR_PLL_TX_REG_LOAD(0),
251 .pll1 = SOR_PLL_TMDS_TERM_ENABLE |
252 SOR_PLL_TMDS_TERMADJ(0xD) | SOR_PLL_LOADADJ(3),
254 .drive_current = 0x1f1f1f1f,
259 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
260 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(0x1) |
261 SOR_PLL_TX_REG_LOAD(0),
262 .pll1 = SOR_PLL_TMDS_TERM_ENABLE |
263 SOR_PLL_TMDS_TERMADJ(0xD) | SOR_PLL_LOADADJ(3),
265 .drive_current = 0x20202020,
270 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
271 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(0x3) |
272 SOR_PLL_TX_REG_LOAD(0),
273 .pll1 = SOR_PLL_TMDS_TERM_ENABLE |
274 SOR_PLL_TMDS_TERMADJ(0xD) | SOR_PLL_LOADADJ(3),
276 .drive_current = 0x22222222,
277 .peak_current = 0x04040404,
281 #warning tmds_config needs to be defined for your arch
284 struct tegra_hdmi_audio_config {
292 const struct tegra_hdmi_audio_config tegra_hdmi_audio_32k[] = {
293 {25200000, 4096, 25200, 24000},
294 {27000000, 4096, 27000, 24000},
295 {74250000, 4096, 74250, 24000},
296 {148500000, 4096, 148500, 24000},
297 {241500000, 4096, 241500, 24000},
298 {297000000, 3072, 222750, 24000},
302 const struct tegra_hdmi_audio_config tegra_hdmi_audio_44_1k[] = {
303 {25200000, 5880, 26250, 25000},
304 {27000000, 5880, 28125, 25000},
305 {74250000, 4704, 61875, 20000},
306 {148500000, 4704, 123750, 20000},
307 {241500000, 4704, 201250, 20000},
308 {297000000, 4704, 247500, 20000},
312 const struct tegra_hdmi_audio_config tegra_hdmi_audio_48k[] = {
313 {25200000, 6144, 25200, 24000},
314 {27000000, 6144, 27000, 24000},
315 {74250000, 6144, 74250, 24000},
316 {148500000, 6144, 148500, 24000},
317 {241500000, 5632, 221375, 22000},
318 {297000000, 5120, 247500, 24000},
322 const struct tegra_hdmi_audio_config tegra_hdmi_audio_88_2k[] = {
323 {25200000, 11760, 26250, 25000},
324 {27000000, 11760, 28125, 25000},
325 {74250000, 9408, 61875, 20000},
326 {148500000, 9408, 123750, 20000},
327 {241500000, 9408, 201250, 20000},
328 {297000000, 9408, 247500, 20000},
332 const struct tegra_hdmi_audio_config tegra_hdmi_audio_96k[] = {
333 {25200000, 12288, 25200, 24000},
334 {27000000, 12288, 27000, 24000},
335 {74250000, 12288, 74250, 24000},
336 {148500000, 12288, 148500, 24000},
337 {241500000, 11264, 221375, 22000},
338 {297000000, 10240, 247500, 24000},
342 const struct tegra_hdmi_audio_config tegra_hdmi_audio_176_4k[] = {
343 {25200000, 23520, 26250, 25000},
344 {27000000, 23520, 28125, 25000},
345 {74250000, 18816, 61875, 20000},
346 {148500000, 18816, 123750, 20000},
347 {241500000, 18816, 201250, 20000},
348 {297000000, 18816, 247500, 20000},
352 const struct tegra_hdmi_audio_config tegra_hdmi_audio_192k[] = {
353 {25200000, 24576, 25200, 24000},
354 {27000000, 24576, 27000, 24000},
355 {74250000, 24576, 74250, 24000},
356 {148500000, 24576, 148500, 24000},
357 {241500000, 22528, 221375, 22000},
358 {297000000, 20480, 247500, 24000},
362 static const struct tegra_hdmi_audio_config
363 *tegra_hdmi_get_audio_config(unsigned audio_freq, unsigned pix_clock)
365 const struct tegra_hdmi_audio_config *table;
367 switch (audio_freq) {
369 table = tegra_hdmi_audio_32k;
371 case AUDIO_FREQ_44_1K:
372 table = tegra_hdmi_audio_44_1k;
375 table = tegra_hdmi_audio_48k;
377 case AUDIO_FREQ_88_2K:
378 table = tegra_hdmi_audio_88_2k;
381 table = tegra_hdmi_audio_96k;
383 case AUDIO_FREQ_176_4K:
384 table = tegra_hdmi_audio_176_4k;
386 case AUDIO_FREQ_192K:
387 table = tegra_hdmi_audio_192k;
393 while (table->pix_clock) {
394 if (table->pix_clock > (pix_clock/100*99) &&
395 table->pix_clock < (pix_clock/100*101) &&
396 table->pix_clock >= 1000)
405 unsigned long tegra_hdmi_readl(struct tegra_dc_hdmi_data *hdmi,
409 ret = readl(hdmi->base + reg * 4);
410 trace_display_readl(hdmi->dc, ret, hdmi->base + reg * 4);
414 void tegra_hdmi_writel(struct tegra_dc_hdmi_data *hdmi,
415 unsigned long val, unsigned long reg)
417 trace_display_writel(hdmi->dc, val, hdmi->base + reg * 4);
418 writel(val, hdmi->base + reg * 4);
421 static inline int tegra_hdmi_writel_eld_buf(struct tegra_dc_hdmi_data *hdmi,
423 size_t buf_entries, size_t index,
424 void __iomem *eld_buf_addr)
426 size_t end_index = index + buf_entries;
428 unsigned long val = (index << 8) | *buf;
430 trace_display_writel(hdmi->dc, val, eld_buf_addr);
431 writel(val, eld_buf_addr);
434 } while (index < end_index);
435 /* outer for loop that uses this will increment index by 1 */
439 static inline void tegra_hdmi_clrsetbits(struct tegra_dc_hdmi_data *hdmi,
440 unsigned long reg, unsigned long clr,
443 unsigned long val = tegra_hdmi_readl(hdmi, reg);
446 tegra_hdmi_writel(hdmi, val, reg);
449 #ifdef CONFIG_DEBUG_FS
450 static int dbg_hdmi_show(struct seq_file *m, void *unused)
452 struct tegra_dc_hdmi_data *hdmi = m->private;
454 /* If gated quitely return */
455 if (!tegra_dc_is_powered(hdmi->dc))
458 #define DUMP_REG(a) do { \
459 seq_printf(m, "%-32s\t%03x\t%08lx\n", \
460 #a, a, tegra_hdmi_readl(hdmi, a)); \
463 tegra_dc_io_start(hdmi->dc);
464 clk_prepare_enable(hdmi->clk);
466 DUMP_REG(HDMI_CTXSW);
467 DUMP_REG(HDMI_NV_PDISP_SOR_STATE0);
468 DUMP_REG(HDMI_NV_PDISP_SOR_STATE1);
469 DUMP_REG(HDMI_NV_PDISP_SOR_STATE2);
470 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AN_MSB);
471 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AN_LSB);
472 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CN_MSB);
473 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CN_LSB);
474 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AKSV_MSB);
475 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AKSV_LSB);
476 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_BKSV_MSB);
477 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_BKSV_LSB);
478 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CKSV_MSB);
479 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CKSV_LSB);
480 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_DKSV_MSB);
481 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_DKSV_LSB);
482 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CTRL);
483 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CMODE);
484 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_MPRIME_MSB);
485 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_MPRIME_LSB);
486 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_SPRIME_MSB);
487 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_SPRIME_LSB2);
488 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_SPRIME_LSB1);
489 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_RI);
490 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CS_MSB);
491 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CS_LSB);
492 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU0);
493 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU_RDATA0);
494 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU1);
495 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU2);
496 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
497 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_STATUS);
498 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER);
499 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_LOW);
500 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_HIGH);
501 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
502 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_STATUS);
503 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_HEADER);
504 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK0_LOW);
505 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK0_HIGH);
506 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK1_LOW);
507 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK1_HIGH);
508 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
509 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_STATUS);
510 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_HEADER);
511 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK0_LOW);
512 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK0_HIGH);
513 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK1_LOW);
514 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK1_HIGH);
515 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK2_LOW);
516 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK2_HIGH);
517 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK3_LOW);
518 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK3_HIGH);
519 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_CTRL);
520 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0320_SUBPACK_LOW);
521 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0320_SUBPACK_HIGH);
522 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW);
523 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_HIGH);
524 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0882_SUBPACK_LOW);
525 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0882_SUBPACK_HIGH);
526 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1764_SUBPACK_LOW);
527 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1764_SUBPACK_HIGH);
528 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0480_SUBPACK_LOW);
529 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0480_SUBPACK_HIGH);
530 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0960_SUBPACK_LOW);
531 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0960_SUBPACK_HIGH);
532 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1920_SUBPACK_LOW);
533 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1920_SUBPACK_HIGH);
534 DUMP_REG(HDMI_NV_PDISP_HDMI_CTRL);
535 DUMP_REG(HDMI_NV_PDISP_HDMI_VSYNC_KEEPOUT);
536 DUMP_REG(HDMI_NV_PDISP_HDMI_VSYNC_WINDOW);
537 DUMP_REG(HDMI_NV_PDISP_HDMI_GCP_CTRL);
538 DUMP_REG(HDMI_NV_PDISP_HDMI_GCP_STATUS);
539 DUMP_REG(HDMI_NV_PDISP_HDMI_GCP_SUBPACK);
540 DUMP_REG(HDMI_NV_PDISP_HDMI_CHANNEL_STATUS1);
541 DUMP_REG(HDMI_NV_PDISP_HDMI_CHANNEL_STATUS2);
542 DUMP_REG(HDMI_NV_PDISP_HDMI_EMU0);
543 DUMP_REG(HDMI_NV_PDISP_HDMI_EMU1);
544 DUMP_REG(HDMI_NV_PDISP_HDMI_EMU1_RDATA);
545 DUMP_REG(HDMI_NV_PDISP_HDMI_SPARE);
546 DUMP_REG(HDMI_NV_PDISP_HDMI_SPDIF_CHN_STATUS1);
547 DUMP_REG(HDMI_NV_PDISP_HDMI_SPDIF_CHN_STATUS2);
548 DUMP_REG(HDMI_NV_PDISP_HDCPRIF_ROM_CTRL);
549 DUMP_REG(HDMI_NV_PDISP_SOR_CAP);
550 DUMP_REG(HDMI_NV_PDISP_SOR_PWR);
551 DUMP_REG(HDMI_NV_PDISP_SOR_TEST);
552 DUMP_REG(HDMI_NV_PDISP_SOR_PLL0);
553 DUMP_REG(HDMI_NV_PDISP_SOR_PLL1);
554 DUMP_REG(HDMI_NV_PDISP_SOR_PLL2);
555 DUMP_REG(HDMI_NV_PDISP_SOR_CSTM);
556 DUMP_REG(HDMI_NV_PDISP_SOR_LVDS);
557 DUMP_REG(HDMI_NV_PDISP_SOR_CRCA);
558 DUMP_REG(HDMI_NV_PDISP_SOR_CRCB);
559 DUMP_REG(HDMI_NV_PDISP_SOR_BLANK);
560 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_CTL);
561 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST0);
562 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST1);
563 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST2);
564 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST3);
565 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST4);
566 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST5);
567 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST6);
568 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST7);
569 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST8);
570 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST9);
571 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTA);
572 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTB);
573 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTC);
574 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTD);
575 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTE);
576 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTF);
577 DUMP_REG(HDMI_NV_PDISP_SOR_VCRCA0);
578 DUMP_REG(HDMI_NV_PDISP_SOR_VCRCA1);
579 DUMP_REG(HDMI_NV_PDISP_SOR_CCRCA0);
580 DUMP_REG(HDMI_NV_PDISP_SOR_CCRCA1);
581 DUMP_REG(HDMI_NV_PDISP_SOR_EDATAA0);
582 DUMP_REG(HDMI_NV_PDISP_SOR_EDATAA1);
583 DUMP_REG(HDMI_NV_PDISP_SOR_COUNTA0);
584 DUMP_REG(HDMI_NV_PDISP_SOR_COUNTA1);
585 DUMP_REG(HDMI_NV_PDISP_SOR_DEBUGA0);
586 DUMP_REG(HDMI_NV_PDISP_SOR_DEBUGA1);
587 DUMP_REG(HDMI_NV_PDISP_SOR_TRIG);
588 DUMP_REG(HDMI_NV_PDISP_SOR_MSCHECK);
589 DUMP_REG(HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT);
590 DUMP_REG(HDMI_NV_PDISP_AUDIO_DEBUG0);
591 DUMP_REG(HDMI_NV_PDISP_AUDIO_DEBUG1);
592 DUMP_REG(HDMI_NV_PDISP_AUDIO_DEBUG2);
593 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(0));
594 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(1));
595 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(2));
596 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(3));
597 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(4));
598 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(5));
599 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(6));
600 DUMP_REG(HDMI_NV_PDISP_AUDIO_PULSE_WIDTH);
601 DUMP_REG(HDMI_NV_PDISP_AUDIO_THRESHOLD);
602 DUMP_REG(HDMI_NV_PDISP_AUDIO_CNTRL0);
603 DUMP_REG(HDMI_NV_PDISP_AUDIO_N);
604 DUMP_REG(HDMI_NV_PDISP_HDCPRIF_ROM_TIMING);
605 DUMP_REG(HDMI_NV_PDISP_SOR_REFCLK);
606 DUMP_REG(HDMI_NV_PDISP_CRC_CONTROL);
607 DUMP_REG(HDMI_NV_PDISP_INPUT_CONTROL);
608 DUMP_REG(HDMI_NV_PDISP_SCRATCH);
609 DUMP_REG(HDMI_NV_PDISP_PE_CURRENT);
610 DUMP_REG(HDMI_NV_PDISP_KEY_CTRL);
611 DUMP_REG(HDMI_NV_PDISP_KEY_DEBUG0);
612 DUMP_REG(HDMI_NV_PDISP_KEY_DEBUG1);
613 DUMP_REG(HDMI_NV_PDISP_KEY_DEBUG2);
614 DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_0);
615 DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_1);
616 DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_2);
617 DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_3);
618 DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_TRIG);
619 DUMP_REG(HDMI_NV_PDISP_KEY_SKEY_INDEX);
620 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
621 DUMP_REG(HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT);
623 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC) && !defined(CONFIG_ARCH_TEGRA_11x_SOC)
624 DUMP_REG(HDMI_NV_PDISP_SOR_PAD_CTLS0);
625 DUMP_REG(HDMI_NV_PDISP_SOR_PAD_CTLS1);
626 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_CTRL);
627 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_STATUS);
628 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_HEADER);
629 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK0_LOW);
630 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK0_HIGH);
631 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK1_LOW);
632 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK1_HIGH);
633 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK2_LOW);
634 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK2_HIGH);
635 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK3_LOW);
636 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK3_HIGH);
641 clk_disable_unprepare(hdmi->clk);
642 tegra_dc_io_end(hdmi->dc);
647 static int dbg_hdmi_show_open(struct inode *inode, struct file *file)
649 return single_open(file, dbg_hdmi_show, inode->i_private);
652 static const struct file_operations dbg_hdmi_show_fops = {
653 .open = dbg_hdmi_show_open,
656 .release = single_release,
659 static int dbg_hotplug_show(struct seq_file *m, void *unused)
661 struct tegra_dc_hdmi_data *hdmi = m->private;
662 struct tegra_dc *dc = hdmi->dc;
664 if (WARN_ON(!hdmi || !dc || !dc->out))
667 seq_put_decimal_ll(m, '\0', dc->out->hotplug_state);
672 static int dbg_hotplug_open(struct inode *inode, struct file *file)
674 return single_open(file, dbg_hotplug_show, inode->i_private);
677 static ssize_t dbg_hotplug_write(struct file *file, const char __user *addr,
678 size_t len, loff_t *pos)
680 struct seq_file *m = file->private_data; /* single_open() initialized */
681 struct tegra_dc_hdmi_data *hdmi = m->private;
682 struct tegra_dc *dc = hdmi->dc;
686 if (WARN_ON(!hdmi || !dc || !dc->out))
689 ret = kstrtol_from_user(addr, len, 10, &new_state);
693 if (dc->out->hotplug_state == 0 && new_state != 0) {
694 /* was 0, now -1 or 1.
695 * we are overriding the hpd GPIO, so ignore the interrupt. */
696 int gpio_irq = gpio_to_irq(dc->out->hotplug_gpio);
698 disable_irq(gpio_irq);
699 } else if (dc->out->hotplug_state != 0 && new_state == 0) {
700 /* was -1 or 1, and now 0
701 * restore the interrupt for hpd GPIO. */
702 int gpio_irq = gpio_to_irq(dc->out->hotplug_gpio);
704 enable_irq(gpio_irq);
707 dc->out->hotplug_state = new_state;
709 hdmi_state_machine_set_pending_hpd();
714 static const struct file_operations dbg_hotplug_fops = {
715 .open = dbg_hotplug_open,
717 .write = dbg_hotplug_write,
719 .release = single_release,
722 static struct dentry *hdmidir;
724 static void tegra_dc_hdmi_debug_create(struct tegra_dc_hdmi_data *hdmi)
726 struct dentry *retval;
728 hdmidir = debugfs_create_dir("tegra_hdmi", NULL);
731 retval = debugfs_create_file("regs", S_IRUGO, hdmidir, hdmi,
732 &dbg_hdmi_show_fops);
735 retval = debugfs_create_file("hotplug", S_IRUGO, hdmidir, hdmi,
741 debugfs_remove_recursive(hdmidir);
746 static inline void tegra_dc_hdmi_debug_create(struct tegra_dc_hdmi_data *hdmi)
750 #define PIXCLOCK_TOLERANCE 200
752 static int tegra_dc_calc_clock_per_frame(const struct fb_videomode *mode)
754 return (mode->left_margin + mode->xres +
755 mode->right_margin + mode->hsync_len) *
756 (mode->upper_margin + mode->yres +
757 mode->lower_margin + mode->vsync_len);
760 static bool tegra_dc_hdmi_valid_pixclock(const struct tegra_dc *dc,
761 const struct fb_videomode *mode)
763 unsigned max_pixclock = tegra_dc_get_out_max_pixclock(dc);
765 /* this might look counter-intuitive,
766 * but pixclock's unit is picos(not Khz)
768 return mode->pixclock >= max_pixclock;
774 static bool tegra_dc_check_constraint(const struct fb_videomode *mode)
776 return mode->hsync_len > 1 && mode->vsync_len > 1 &&
777 mode->lower_margin + mode->vsync_len + mode->upper_margin > 1 &&
778 mode->xres >= 16 && mode->yres >= 16;
781 /* adjusts pixclock to fit audio table */
782 static bool tegra_dc_hdmi_adjust_pixclock(const struct tegra_dc *dc,
783 struct fb_videomode *mode)
785 const struct tegra_hdmi_audio_config *cfg = tegra_hdmi_audio_44_1k;
791 pclk = PICOS2KHZ(mode->pixclock) * 1000;
793 /* look on 44.1k audio table, if mode's pixel clock is within 1%, then
794 * use the pixel clock from the audio table.*/
795 while (cfg->pix_clock) {
796 if (cfg->pix_clock > (pclk / 100 * 99) &&
797 cfg->pix_clock < (pclk / 100 * 101) &&
798 cfg->pix_clock >= 1000) {
799 mode->pixclock = KHZ2PICOS(cfg->pix_clock / 1000);
807 bool tegra_dc_hdmi_mode_filter(const struct tegra_dc *dc,
808 struct fb_videomode *mode)
812 #ifndef CONFIG_ARCH_TEGRA_12x_SOC
813 if (mode->vmode & FB_VMODE_INTERLACED)
817 /* Ignore modes with a 0 pixel clock */
821 #ifdef CONFIG_TEGRA_HDMI_74MHZ_LIMIT
822 if (PICOS2KHZ(mode->pixclock) > 74250)
826 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
827 /* Display B max is 4096 */
828 if (mode->xres > 4096)
830 #elif defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
831 if (mode->xres > 2560)
834 /* don't filter any modes due to width - probably not what you want */
837 tegra_dc_hdmi_adjust_pixclock(dc, mode);
839 /* Check if the mode's pixel clock is more than the max rate*/
840 if (!tegra_dc_hdmi_valid_pixclock(dc, mode))
843 /* Work around for modes that fail the constrait:
844 * V_FRONT_PORCH >= V_REF_TO_SYNC + 1 */
845 if (mode->lower_margin == 1) {
846 mode->lower_margin++;
847 mode->upper_margin--;
850 /* even after fix-ups the mode still isn't supported */
851 if (!tegra_dc_check_constraint(mode))
854 mode->flag |= FB_MODE_IS_DETAILED;
855 total_clocks = tegra_dc_calc_clock_per_frame(mode);
856 mode->refresh = total_clocks ?
857 (PICOS2KHZ(mode->pixclock) * 1000) / total_clocks : 0;
862 /* used by tegra_dc_probe() to detect hpd/hdmi status at boot */
863 static bool tegra_dc_hdmi_detect(struct tegra_dc *dc)
865 /* trigger an edid read by the hdmi state machine */
866 hdmi_state_machine_set_pending_hpd();
868 return tegra_dc_hpd(dc);
871 static irqreturn_t tegra_dc_hdmi_irq(int irq, void *ptr)
873 struct tegra_dc *dc = ptr;
874 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
876 pr_info("%s: start\n", __func__);
877 rt_mutex_lock(&hdmi->suspend_lock);
878 if (!hdmi->suspended)
879 hdmi_state_machine_set_pending_hpd();
880 rt_mutex_unlock(&hdmi->suspend_lock);
881 pr_info("%s: end\n", __func__);
885 static void tegra_dc_hdmi_suspend(struct tegra_dc *dc)
887 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
889 tegra_nvhdcp_suspend(hdmi->nvhdcp);
891 if (dc->out->flags & TEGRA_DC_OUT_HOTPLUG_WAKE_LP0) {
892 int wake_irq = gpio_to_irq(dc->out->hotplug_gpio);
895 ret = enable_irq_wake(wake_irq);
897 dev_err(&dc->ndev->dev,
898 "%s: Couldn't enable HDMI wakeup, irq=%d, error=%d\n",
899 __func__, wake_irq, ret);
903 rt_mutex_lock(&hdmi->suspend_lock);
904 hdmi->suspended = true;
905 rt_mutex_unlock(&hdmi->suspend_lock);
909 static void tegra_dc_hdmi_resume(struct tegra_dc *dc)
911 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
913 rt_mutex_lock(&hdmi->suspend_lock);
914 hdmi->suspended = false;
915 hdmi_state_machine_set_pending_hpd();
916 rt_mutex_unlock(&hdmi->suspend_lock);
918 if (dc->out->flags & TEGRA_DC_OUT_HOTPLUG_WAKE_LP0)
919 disable_irq_wake(gpio_to_irq(dc->out->hotplug_gpio));
921 tegra_nvhdcp_resume(hdmi->nvhdcp);
925 static ssize_t underscan_show(struct device *dev,
926 struct device_attribute *attr, char *buf)
928 struct tegra_dc_hdmi_data *hdmi =
929 container_of(dev_get_drvdata(dev), struct tegra_dc_hdmi_data, hpd_switch);
932 return sprintf(buf, "%d\n", tegra_edid_underscan_supported(hdmi->edid));
937 static DEVICE_ATTR(underscan, S_IRUGO, underscan_show, NULL);
939 static ssize_t hdmi_audio_show(struct device *dev,
940 struct device_attribute *attr, char *buf)
942 struct tegra_dc_hdmi_data *hdmi =
943 container_of(dev_get_drvdata(dev),
944 struct tegra_dc_hdmi_data, audio_switch);
947 return sprintf(buf, "%d\n",
948 tegra_edid_audio_supported(hdmi->edid));
953 static DEVICE_ATTR(hdmi_audio, S_IRUGO, hdmi_audio_show, NULL);
957 static int tegra_dc_hdmi_i2c_xfer(struct tegra_dc *dc, struct i2c_msg *msgs,
960 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
962 return i2c_transfer(hdmi->i2c_info.client->adapter, msgs, num);
965 static int tegra_dc_hdmi_init(struct tegra_dc *dc)
967 struct tegra_dc_hdmi_data *hdmi;
968 struct resource *res;
969 struct resource hdmi_res;
970 struct resource *base_res;
973 struct clk *clk = NULL;
974 struct clk *disp1_clk = NULL;
975 struct clk *disp2_clk = NULL;
976 struct tegra_hdmi_out *hdmi_out = NULL;
977 struct i2c_adapter *adapter = NULL;
979 struct device_node *np = dc->ndev->dev.of_node;
981 struct device_node *np_hdmi =
982 of_find_node_by_path("/host1x/hdmi");
984 struct device_node *np_hdmi = NULL;
986 hdmi = kzalloc(sizeof(*hdmi), GFP_KERNEL);
990 if (np_hdmi && of_device_is_available(np_hdmi)) {
991 of_address_to_resource(np_hdmi, 0, &hdmi_res);
998 res = platform_get_resource_byname(dc->ndev,
999 IORESOURCE_MEM, "hdmi_regs");
1002 dev_err(&dc->ndev->dev, "hdmi: no mem resource\n");
1007 base_res = request_mem_region(res->start,
1008 resource_size(res), dc->ndev->name);
1010 dev_err(&dc->ndev->dev, "hdmi: request_mem_region failed\n");
1015 base = ioremap(res->start, resource_size(res));
1017 dev_err(&dc->ndev->dev, "hdmi: registers can't be mapped\n");
1019 goto err_release_resource_reg;
1022 clk = clk_get(&dc->ndev->dev, "hdmi");
1023 if (IS_ERR_OR_NULL(clk)) {
1024 dev_err(&dc->ndev->dev, "hdmi: can't get clock\n");
1026 goto err_iounmap_reg;
1029 disp1_clk = clk_get_sys("tegradc.0", NULL);
1030 if (IS_ERR_OR_NULL(disp1_clk)) {
1031 dev_err(&dc->ndev->dev, "hdmi: can't disp1 clock\n");
1036 disp2_clk = clk_get_sys("tegradc.1", NULL);
1037 if (IS_ERR_OR_NULL(disp2_clk)) {
1038 dev_err(&dc->ndev->dev, "hdmi: can't disp2 clock\n");
1043 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1044 hdmi->hda_clk = clk_get_sys("tegra30-hda", "hda");
1045 if (IS_ERR_OR_NULL(hdmi->hda_clk)) {
1046 dev_err(&dc->ndev->dev, "hdmi: can't get hda clock\n");
1051 hdmi->hda2codec_clk = clk_get_sys("tegra30-hda", "hda2codec");
1052 if (IS_ERR_OR_NULL(hdmi->hda2codec_clk)) {
1053 dev_err(&dc->ndev->dev, "hdmi: can't get hda2codec clock\n");
1058 hdmi->hda2hdmi_clk = clk_get_sys("tegra30-hda", "hda2hdmi");
1059 if (IS_ERR_OR_NULL(hdmi->hda2hdmi_clk)) {
1060 dev_err(&dc->ndev->dev, "hdmi: can't get hda2hdmi clock\n");
1066 /* Get the pointer of board file settings */
1067 hdmi_out = dc->pdata->default_out->hdmi_out;
1069 memcpy(&hdmi->info, hdmi_out, sizeof(hdmi->info));
1071 hdmi->edid = tegra_edid_create(dc, tegra_dc_hdmi_i2c_xfer);
1072 if (IS_ERR_OR_NULL(hdmi->edid)) {
1073 dev_err(&dc->ndev->dev, "hdmi: can't create edid\n");
1074 err = PTR_ERR(hdmi->edid);
1077 tegra_dc_set_edid(dc, hdmi->edid);
1079 adapter = i2c_get_adapter(dc->out->dcc_bus);
1081 pr_err("can't get adpater for bus %d\n", dc->out->dcc_bus);
1086 hdmi->i2c_info.board.addr = 0x50;
1087 hdmi->i2c_info.board.platform_data = hdmi;
1088 strlcpy(hdmi->i2c_info.board.type, "tegra_hdmi",
1089 sizeof(hdmi->i2c_info.board.type));
1091 hdmi->i2c_info.client = i2c_new_device(adapter, &hdmi->i2c_info.board);
1092 i2c_put_adapter(adapter);
1094 if (!hdmi->i2c_info.client) {
1095 pr_err("can't create new device\n");
1100 #ifdef CONFIG_TEGRA_NVHDCP
1101 hdmi->nvhdcp = tegra_nvhdcp_create(hdmi, dc->ndev->id,
1103 if (IS_ERR_OR_NULL(hdmi->nvhdcp)) {
1104 dev_err(&dc->ndev->dev, "hdmi: can't create nvhdcp\n");
1105 err = PTR_ERR(hdmi->nvhdcp);
1106 goto err_edid_destroy;
1109 hdmi->nvhdcp = NULL;
1111 hdmi_state_machine_init(hdmi);
1115 hdmi->base_res = base_res;
1117 hdmi->disp1_clk = disp1_clk;
1118 hdmi->disp2_clk = disp2_clk;
1119 hdmi->suspended = false;
1120 hdmi->eld_retrieved = false;
1121 hdmi->clk_enabled = false;
1122 hdmi->audio_freq = 44100;
1123 hdmi->audio_source = AUTO;
1124 rt_mutex_init(&hdmi->suspend_lock);
1126 #ifdef CONFIG_SWITCH
1127 hdmi->hpd_switch.name = "hdmi";
1128 ret = switch_dev_register(&hdmi->hpd_switch);
1131 ret = device_create_file(hdmi->hpd_switch.dev,
1132 &dev_attr_underscan);
1135 hdmi->audio_switch.name = "hdmi_audio";
1136 ret = switch_dev_register(&hdmi->audio_switch);
1139 ret = device_create_file(hdmi->audio_switch.dev,
1140 &dev_attr_hdmi_audio);
1144 dc->out->depth = 24;
1146 tegra_dc_set_outdata(dc, hdmi);
1149 /* boards can select default content protection policy */
1150 if (dc->out->flags & TEGRA_DC_OUT_NVHDCP_POLICY_ON_DEMAND)
1151 tegra_nvhdcp_set_policy(hdmi->nvhdcp,
1152 TEGRA_NVHDCP_POLICY_ON_DEMAND);
1154 tegra_nvhdcp_set_policy(hdmi->nvhdcp,
1155 TEGRA_NVHDCP_POLICY_ALWAYS_ON);
1157 tegra_dc_hdmi_debug_create(hdmi);
1159 err = gpio_request(dc->out->hotplug_gpio, "hdmi_hpd");
1161 dev_err(&dc->ndev->dev, "hdmi: hpd gpio_request failed\n");
1162 goto err_nvhdcp_destroy;
1165 gpio_direction_input(dc->out->hotplug_gpio);
1167 /* TODO: support non-hotplug */
1168 ret = request_threaded_irq(gpio_to_irq(dc->out->hotplug_gpio),
1169 NULL, tegra_dc_hdmi_irq,
1170 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1171 dev_name(&dc->ndev->dev), dc);
1174 dev_err(&dc->ndev->dev, "hdmi: request_irq %d failed - %d\n",
1175 gpio_to_irq(dc->out->hotplug_gpio), ret);
1183 gpio_free(dc->out->hotplug_gpio);
1186 tegra_nvhdcp_destroy(hdmi->nvhdcp);
1187 #ifdef CONFIG_TEGRA_NVHDCP
1190 tegra_edid_destroy(hdmi->edid);
1192 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1193 if (!IS_ERR_OR_NULL(hdmi->hda2hdmi_clk))
1194 clk_put(hdmi->hda2hdmi_clk);
1195 if (!IS_ERR_OR_NULL(hdmi->hda2codec_clk))
1196 clk_put(hdmi->hda2codec_clk);
1197 if (!IS_ERR_OR_NULL(hdmi->hda_clk))
1198 clk_put(hdmi->hda_clk);
1200 if (!IS_ERR_OR_NULL(disp2_clk))
1202 if (!IS_ERR_OR_NULL(disp1_clk))
1204 if (!IS_ERR_OR_NULL(clk))
1208 err_release_resource_reg:
1209 release_resource(base_res);
1215 static void tegra_dc_hdmi_destroy(struct tegra_dc *dc)
1217 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1219 free_irq(gpio_to_irq(dc->out->hotplug_gpio), dc);
1220 hdmi_state_machine_shutdown();
1222 i2c_release_client(hdmi->i2c_info.client);
1223 #ifdef CONFIG_SWITCH
1224 switch_dev_unregister(&hdmi->hpd_switch);
1225 switch_dev_unregister(&hdmi->audio_switch);
1227 iounmap(hdmi->base);
1228 release_resource(hdmi->base_res);
1229 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1230 clk_put(hdmi->hda2hdmi_clk);
1231 clk_put(hdmi->hda2codec_clk);
1232 clk_put(hdmi->hda_clk);
1235 clk_put(hdmi->disp1_clk);
1236 clk_put(hdmi->disp2_clk);
1237 tegra_edid_destroy(hdmi->edid);
1238 tegra_nvhdcp_destroy(hdmi->nvhdcp);
1244 static void tegra_dc_hdmi_setup_audio_fs_tables(struct tegra_dc *dc)
1246 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1248 unsigned freqs[] = {
1258 for (i = 0; i < ARRAY_SIZE(freqs); i++) {
1259 unsigned f = freqs[i];
1260 unsigned eight_half;
1273 eight_half = (8 * HDMI_AUDIOCLK_FREQ) / (f * 128);
1274 tegra_hdmi_writel(hdmi, AUDIO_FS_LOW(eight_half - delta) |
1275 AUDIO_FS_HIGH(eight_half + delta),
1276 HDMI_NV_PDISP_AUDIO_FS(i));
1280 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1281 static void tegra_dc_hdmi_setup_eld_buff(struct tegra_dc *dc)
1285 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1286 void __iomem *eld_buf_addr;
1287 int baseline_eld_len = (HDMI_ELD_MONITOR_NAME_INDEX -
1288 HDMI_ELD_CEA_VER_MNL_INDEX +
1290 (3 * hdmi->eld.sad_count));
1291 u8 baseline_eld_len_val;
1293 eld_buf_addr = hdmi->base + HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0 * 4;
1295 /* the baseline_eld_len needs to be written as a
1296 * multiple of DWORDS (4 bytes).
1298 BUG_ON(baseline_eld_len > MAX_BASELINE_ELD_SIZE);
1299 baseline_eld_len_val = DIV_ROUND_UP(baseline_eld_len, 4);
1301 /* program ELD stuff. we must write all bytes of the
1302 * ELD buffer. when hda_eld.c tries to read it back,
1303 * it's query of the size returns not how many valid
1304 * were written, but the entire size, and will try to
1305 * read all the bytes in the buffer. it will fail
1306 * if any invalid bytes are read back, so we have to
1307 * fill the entire buffer with something, even if it's
1310 for (i = 0; i < HDMI_ELD_BUF_SIZE; i++) {
1312 case HDMI_ELD_VER_INDEX:
1313 tmp = (hdmi->eld.eld_ver << 3);
1314 tegra_hdmi_writel(hdmi, (i << 8) | tmp,
1315 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1317 case HDMI_ELD_RESERVED1_INDEX:
1318 case HDMI_ELD_RESERVED2_INDEX:
1319 /* must write a dummy byte or else hda_eld.c
1320 * will get an error when it tries to read a
1321 * complete eld buffer
1323 tegra_hdmi_writel(hdmi, (i << 8),
1324 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1326 case HDMI_ELD_BASELINE_LEN_INDEX:
1327 tegra_hdmi_writel(hdmi, (i << 8) | baseline_eld_len_val,
1328 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1330 case HDMI_ELD_CEA_VER_MNL_INDEX:
1331 tmp = (hdmi->eld.cea_edid_ver << 5);
1332 tmp |= (hdmi->eld.mnl & 0x1f);
1333 tegra_hdmi_writel(hdmi, (i << 8) | tmp,
1334 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1336 case HDMI_ELD_SAD_CNT_CON_TYP_SAI_HDCP_INDEX:
1337 tmp = (hdmi->eld.sad_count << 4);
1338 tmp |= (hdmi->eld.conn_type & 0xC);
1339 tmp |= (hdmi->eld.support_ai & 0x2);
1340 tmp |= (hdmi->eld.support_hdcp & 0x1);
1341 tegra_hdmi_writel(hdmi, (i << 8) | tmp,
1342 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1344 case HDMI_ELD_AUD_SYNC_DELAY_INDEX:
1345 tegra_hdmi_writel(hdmi, (i << 8) | (hdmi->eld.aud_synch_delay),
1346 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1348 case HDMI_ELD_SPK_ALLOC_INDEX:
1349 tegra_hdmi_writel(hdmi, (i << 8) | (hdmi->eld.spk_alloc),
1350 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1352 case HDMI_ELD_PORT_ID_INDEX:
1353 i = tegra_hdmi_writel_eld_buf(hdmi, hdmi->eld.port_id,
1354 8, i, eld_buf_addr);
1356 case HDMI_ELD_MANF_NAME_INDEX:
1357 i = tegra_hdmi_writel_eld_buf(hdmi,
1358 hdmi->eld.manufacture_id,
1359 2, i, eld_buf_addr);
1361 case HDMI_ELD_PRODUCT_CODE_INDEX:
1362 i = tegra_hdmi_writel_eld_buf(hdmi,
1363 hdmi->eld.product_id,
1364 2, i, eld_buf_addr);
1366 case HDMI_ELD_MONITOR_NAME_INDEX:
1367 /* write the eld.mnl bytes of the monitor name,
1368 * followed immediately the short audio descriptor bytes
1370 i = tegra_hdmi_writel_eld_buf(hdmi,
1371 hdmi->eld.monitor_name,
1374 i = tegra_hdmi_writel_eld_buf(hdmi, hdmi->eld.sad,
1375 hdmi->eld.sad_count * 3,
1379 tegra_hdmi_writel(hdmi, (i << 8),
1380 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1384 /* set presence and valid bit */
1385 tegra_hdmi_writel(hdmi, 3, HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE_0);
1389 static int tegra_dc_hdmi_setup_audio(struct tegra_dc *dc, unsigned audio_freq,
1390 unsigned audio_source)
1392 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1393 const struct tegra_hdmi_audio_config *config;
1394 unsigned long audio_n;
1395 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1396 unsigned long reg_addr = 0;
1398 unsigned a_source = AUDIO_CNTRL0_SOURCE_SELECT_AUTO;
1400 if (HDA == audio_source)
1401 a_source = AUDIO_CNTRL0_SOURCE_SELECT_HDAL;
1402 else if (SPDIF == audio_source)
1403 a_source = AUDIO_CNTRL0_SOURCE_SELECT_SPDIF;
1405 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1406 if (hdmi->audio_inject_null)
1407 a_source |= AUDIO_CNTRL0_INJECT_NULLSMPL;
1409 tegra_hdmi_writel(hdmi,a_source,
1410 HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_0);
1411 tegra_hdmi_writel(hdmi,
1412 AUDIO_CNTRL0_ERROR_TOLERANCE(6) |
1413 AUDIO_CNTRL0_FRAMES_PER_BLOCK(0xc0),
1414 HDMI_NV_PDISP_AUDIO_CNTRL0);
1415 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
1416 tegra_hdmi_writel(hdmi, (1 << HDMI_AUDIO_HBR_ENABLE_SHIFT) |
1417 tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_AUDIO_SPARE0_0),
1418 HDMI_NV_PDISP_SOR_AUDIO_SPARE0_0);
1421 tegra_hdmi_writel(hdmi,
1422 AUDIO_CNTRL0_ERROR_TOLERANCE(6) |
1423 AUDIO_CNTRL0_FRAMES_PER_BLOCK(0xc0) |
1425 HDMI_NV_PDISP_AUDIO_CNTRL0);
1427 config = tegra_hdmi_get_audio_config(audio_freq, dc->mode.pclk);
1429 dev_err(&dc->ndev->dev,
1430 "hdmi: can't set audio to %d at %d pix_clock",
1431 audio_freq, dc->mode.pclk);
1435 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_HDMI_ACR_CTRL);
1437 audio_n = AUDIO_N_RESETF | AUDIO_N_GENERATE_ALTERNALTE |
1438 AUDIO_N_VALUE(config->n - 1);
1439 tegra_hdmi_writel(hdmi, audio_n, HDMI_NV_PDISP_AUDIO_N);
1441 tegra_hdmi_writel(hdmi, ACR_SUBPACK_N(config->n) | ACR_ENABLE,
1442 HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_HIGH);
1444 tegra_hdmi_writel(hdmi, ACR_SUBPACK_CTS(config->cts),
1445 HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW);
1447 tegra_hdmi_writel(hdmi, SPARE_HW_CTS | SPARE_FORCE_SW_CTS |
1448 SPARE_CTS_RESET_VAL(1),
1449 HDMI_NV_PDISP_HDMI_SPARE);
1451 audio_n &= ~AUDIO_N_RESETF;
1452 tegra_hdmi_writel(hdmi, audio_n, HDMI_NV_PDISP_AUDIO_N);
1454 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1455 switch (audio_freq) {
1456 case AUDIO_FREQ_32K:
1457 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0320_0;
1459 case AUDIO_FREQ_44_1K:
1460 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0441_0;
1462 case AUDIO_FREQ_48K:
1463 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0480_0;
1465 case AUDIO_FREQ_88_2K:
1466 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0882_0;
1468 case AUDIO_FREQ_96K:
1469 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0960_0;
1471 case AUDIO_FREQ_176_4K:
1472 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_1764_0;
1474 case AUDIO_FREQ_192K:
1475 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_1920_0;
1479 tegra_hdmi_writel(hdmi, config->aval, reg_addr);
1481 tegra_dc_hdmi_setup_audio_fs_tables(dc);
1486 int tegra_hdmi_setup_audio_freq_source(unsigned audio_freq, unsigned audio_source)
1488 struct tegra_dc_hdmi_data *hdmi = dc_hdmi;
1493 /* check for know freq */
1494 if (AUDIO_FREQ_32K == audio_freq ||
1495 AUDIO_FREQ_44_1K== audio_freq ||
1496 AUDIO_FREQ_48K== audio_freq ||
1497 AUDIO_FREQ_88_2K== audio_freq ||
1498 AUDIO_FREQ_96K== audio_freq ||
1499 AUDIO_FREQ_176_4K== audio_freq ||
1500 AUDIO_FREQ_192K== audio_freq) {
1501 /* If we can program HDMI, then proceed */
1502 if (hdmi->clk_enabled) {
1503 tegra_dc_io_start(hdmi->dc);
1504 tegra_dc_hdmi_setup_audio(hdmi->dc, audio_freq,audio_source);
1505 tegra_dc_io_end(hdmi->dc);
1508 /* Store it for using it in enable */
1509 hdmi->audio_freq = audio_freq;
1510 hdmi->audio_source = audio_source;
1517 EXPORT_SYMBOL(tegra_hdmi_setup_audio_freq_source);
1519 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1520 int tegra_hdmi_audio_null_sample_inject(bool on)
1522 struct tegra_dc_hdmi_data *hdmi = dc_hdmi;
1523 unsigned int val = 0;
1528 if (hdmi->audio_inject_null != on) {
1529 hdmi->audio_inject_null = on;
1530 if (hdmi->clk_enabled) {
1531 val = tegra_hdmi_readl(hdmi,
1532 HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_0);
1533 val &= ~AUDIO_CNTRL0_INJECT_NULLSMPL;
1535 val |= AUDIO_CNTRL0_INJECT_NULLSMPL;
1536 tegra_hdmi_writel(hdmi,val,
1537 HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_0);
1543 EXPORT_SYMBOL(tegra_hdmi_audio_null_sample_inject);
1545 int tegra_hdmi_setup_hda_presence()
1547 struct tegra_dc_hdmi_data *hdmi = dc_hdmi;
1552 if (hdmi->clk_enabled && hdmi->eld_retrieved) {
1553 /* If HDA_PRESENCE is already set reset it */
1554 tegra_dc_unpowergate_locked(hdmi->dc);
1555 if (tegra_hdmi_readl(hdmi,
1556 HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE_0))
1557 tegra_hdmi_writel(hdmi, 0,
1558 HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE_0);
1560 tegra_dc_hdmi_setup_eld_buff(hdmi->dc);
1561 tegra_dc_powergate_locked(hdmi->dc);
1567 EXPORT_SYMBOL(tegra_hdmi_setup_hda_presence);
1570 static void tegra_dc_hdmi_write_infopack(struct tegra_dc *dc, int header_reg,
1571 u8 type, u8 version, void *data, int len)
1573 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1574 u32 subpack[2]; /* extra byte for zero padding of subpack */
1578 /* first byte of data is the checksum */
1579 csum = type + version + len - 1;
1580 for (i = 1; i < len; i++)
1581 csum +=((u8 *)data)[i];
1582 ((u8 *)data)[0] = 0x100 - csum;
1584 tegra_hdmi_writel(hdmi, INFOFRAME_HEADER_TYPE(type) |
1585 INFOFRAME_HEADER_VERSION(version) |
1586 INFOFRAME_HEADER_LEN(len - 1),
1589 /* The audio inforame only has one set of subpack registers. The hdmi
1590 * block pads the rest of the data as per the spec so we have to fixup
1591 * the length before filling in the subpacks.
1593 if (header_reg == HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER)
1596 /* each subpack 7 bytes devided into:
1597 * subpack_low - bytes 0 - 3
1598 * subpack_high - bytes 4 - 6 (with byte 7 padded to 0x00)
1600 for (i = 0; i < len; i++) {
1601 int subpack_idx = i % 7;
1603 if (subpack_idx == 0)
1604 memset(subpack, 0x0, sizeof(subpack));
1606 ((u8 *)subpack)[subpack_idx] = ((u8 *)data)[i];
1608 if (subpack_idx == 6 || (i + 1 == len)) {
1609 int reg = header_reg + 1 + (i / 7) * 2;
1611 tegra_hdmi_writel(hdmi, subpack[0], reg);
1612 tegra_hdmi_writel(hdmi, subpack[1], reg + 1);
1617 static int tegra_dc_find_cea_vic(const struct tegra_dc_mode *mode)
1619 struct fb_videomode m;
1623 tegra_dc_to_fb_videomode(&m, mode);
1625 m.vmode &= ~FB_VMODE_STEREO_MASK; /* stereo modes have the same VICs */
1627 for (i = 1; i < CEA_MODEDB_SIZE; i++) {
1628 const struct fb_videomode *curr = &cea_modes[i];
1630 if (!fb_mode_is_equal(&m, curr))
1635 /* if either flag is set, then match is required */
1636 if (curr->flag & (FB_FLAG_RATIO_4_3 | FB_FLAG_RATIO_16_9)) {
1637 if (m.flag & curr->flag & FB_FLAG_RATIO_4_3)
1639 else if (m.flag & curr->flag & FB_FLAG_RATIO_16_9)
1648 static int tegra_dc_find_hdmi_vic(const struct tegra_dc_mode *mode)
1650 struct fb_videomode m;
1653 tegra_dc_to_fb_videomode(&m, mode);
1655 for (i = 1; i < HDMI_EXT_MODEDB_SIZE; i++) {
1656 const struct fb_videomode *curr = &hdmi_ext_modes[i];
1658 if (fb_mode_is_equal(&m, curr))
1664 static void tegra_dc_hdmi_disable_generic_infoframe(struct tegra_dc *dc)
1666 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1669 val = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1670 val &= ~GENERIC_CTRL_ENABLE;
1671 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1674 /* return 1 if generic infoframe is used, 0 if not used */
1675 static int tegra_dc_hdmi_setup_hdmi_vic_infoframe(struct tegra_dc *dc, bool dvi)
1677 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1678 struct hdmi_extres_infoframe extres;
1684 hdmi_vic = tegra_dc_find_hdmi_vic(&dc->mode);
1688 memset(&extres, 0x0, sizeof(extres));
1691 extres.regid0 = 0x03;
1692 extres.regid1 = 0x0c;
1693 extres.regid2 = 0x00;
1694 extres.hdmi_video_format = 1; /* Extended Resolution Format */
1695 extres.hdmi_vic = hdmi_vic;
1697 tegra_dc_hdmi_write_infopack(dc,
1698 HDMI_NV_PDISP_HDMI_GENERIC_HEADER,
1699 HDMI_INFOFRAME_TYPE_VENDOR, HDMI_VENDOR_VERSION,
1701 val = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1702 val |= GENERIC_CTRL_ENABLE;
1703 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1707 static void tegra_dc_hdmi_setup_avi_infoframe(struct tegra_dc *dc, bool dvi)
1709 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1710 struct hdmi_avi_infoframe avi;
1711 unsigned int blender_reg;
1714 tegra_hdmi_writel(hdmi, 0x0,
1715 HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
1719 memset(&avi, 0x0, sizeof(avi));
1721 /* Indicate active format info is valid. */
1723 avi.r = HDMI_AVI_R_SAME;
1725 #if !defined(CONFIG_TEGRA_DC_BLENDER_GEN2)
1726 blender_reg = DC_DISP_BORDER_COLOR;
1728 blender_reg = DC_DISP_BLEND_BACKGROUND_COLOR;
1731 if ((dc->mode.h_active == 720) && ((dc->mode.v_active == 480) || (dc->mode.v_active == 576)))
1732 tegra_dc_writel(dc, 0x00101010, blender_reg);
1734 tegra_dc_writel(dc, 0x00000000, blender_reg);
1736 avi.vic = tegra_dc_find_cea_vic(&dc->mode);
1737 avi.m = dc->mode.avi_m;
1738 if (tegra_edid_underscan_supported(hdmi->edid))
1739 avi.s = HDMI_AVI_S_UNDERSCAN;
1740 dev_dbg(&dc->ndev->dev, "HDMI AVI vic=%d m=%d\n", avi.vic, avi.m);
1741 avi.s = HDMI_AVI_S_UNDERSCAN;
1743 tegra_dc_hdmi_write_infopack(dc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_HEADER,
1744 HDMI_INFOFRAME_TYPE_AVI,
1748 tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE,
1749 HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
1752 static void tegra_dc_hdmi_setup_stereo_infoframe(struct tegra_dc *dc)
1754 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1755 struct hdmi_stereo_infoframe stereo;
1758 WARN(!dc->mode.stereo_mode,
1759 "function assumes 3D/stereo mode is disabled\n");
1761 memset(&stereo, 0x0, sizeof(stereo));
1763 stereo.regid0 = 0x03;
1764 stereo.regid1 = 0x0c;
1765 stereo.regid2 = 0x00;
1766 stereo.hdmi_video_format = 2; /* 3D_Structure present */
1767 #ifndef CONFIG_TEGRA_HDMI_74MHZ_LIMIT
1768 stereo._3d_structure = 0; /* frame packing */
1770 stereo._3d_structure = 8; /* side-by-side (half) */
1771 stereo._3d_ext_data = 0; /* something which fits into 00XX bit req */
1774 tegra_dc_hdmi_write_infopack(dc, HDMI_NV_PDISP_HDMI_GENERIC_HEADER,
1775 HDMI_INFOFRAME_TYPE_VENDOR,
1776 HDMI_VENDOR_VERSION,
1779 val = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1780 val |= GENERIC_CTRL_ENABLE;
1782 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1785 static void tegra_dc_hdmi_setup_audio_infoframe(struct tegra_dc *dc, bool dvi)
1787 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1788 struct hdmi_audio_infoframe audio;
1791 tegra_hdmi_writel(hdmi, 0x0,
1792 HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
1796 memset(&audio, 0x0, sizeof(audio));
1798 audio.cc = HDMI_AUDIO_CC_2;
1799 tegra_dc_hdmi_write_infopack(dc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER,
1800 HDMI_INFOFRAME_TYPE_AUDIO,
1802 &audio, sizeof(audio));
1804 tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE,
1805 HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
1808 static void tegra_dc_hdmi_setup_tmds(struct tegra_dc_hdmi_data *hdmi,
1809 const struct tmds_config *tc)
1811 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
1815 tegra_hdmi_writel(hdmi, tc->pll0, HDMI_NV_PDISP_SOR_PLL0);
1816 tegra_hdmi_writel(hdmi, tc->pll1, HDMI_NV_PDISP_SOR_PLL1);
1818 tegra_hdmi_writel(hdmi, tc->pe_current, HDMI_NV_PDISP_PE_CURRENT);
1820 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
1821 tegra_hdmi_writel(hdmi, tc->drive_current,
1822 HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT);
1823 val = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PAD_CTLS0);
1824 val |= DRIVE_CURRENT_FUSE_OVERRIDE_T11x;
1825 if (MAJOR(tc->version) >= 1) {
1826 val &= tc->pad_ctls0_mask;
1827 val |= tc->pad_ctls0_setting;
1829 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_PAD_CTLS0);
1831 tegra_hdmi_writel(hdmi, tc->peak_current,
1832 HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT);
1833 #elif defined(CONFIG_ARCH_TEGRA_14x_SOC)
1834 tegra_hdmi_writel(hdmi, tc->drive_current,
1835 HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT);
1836 tegra_hdmi_writel(hdmi, 0x800034bb, HDMI_NV_PDISP_SOR_PAD_CTLS0);
1838 tegra_hdmi_writel(hdmi, tc->peak_current,
1839 HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT);
1841 tegra_hdmi_writel(hdmi, tc->drive_current | DRIVE_CURRENT_FUSE_OVERRIDE,
1842 HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT);
1846 void tegra_dc_hdmi_setup_audio_and_infoframes(struct tegra_dc *dc)
1851 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1854 err = tegra_dc_hdmi_setup_audio(dc, hdmi->audio_freq,
1855 hdmi->audio_source);
1861 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1862 tegra_dc_hdmi_setup_eld_buff(dc);
1865 rekey = HDMI_REKEY_DEFAULT;
1866 val = HDMI_CTRL_REKEY(rekey);
1867 val |= HDMI_CTRL_MAX_AC_PACKET((dc->mode.h_sync_width +
1868 dc->mode.h_back_porch +
1869 dc->mode.h_front_porch -
1872 val |= HDMI_CTRL_ENABLE;
1873 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_HDMI_CTRL);
1876 tegra_hdmi_writel(hdmi, 0x0,
1877 HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1879 tegra_hdmi_writel(hdmi, GENERIC_CTRL_AUDIO,
1880 HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1882 tegra_dc_hdmi_setup_avi_infoframe(dc, hdmi->dvi);
1884 if (dc->mode.stereo_mode)
1885 tegra_dc_hdmi_setup_stereo_infoframe(dc);
1886 else if (!tegra_dc_hdmi_setup_hdmi_vic_infoframe(dc, hdmi->dvi))
1887 tegra_dc_hdmi_disable_generic_infoframe(dc);
1889 tegra_dc_hdmi_setup_audio_infoframe(dc, hdmi->dvi);
1892 static void tegra_dc_hdmi_enable(struct tegra_dc *dc)
1894 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1896 int dispclk_div_8_2;
1900 const struct tmds_config *tmds_ptr;
1904 /* enable power, clocks, resets, etc. */
1906 /* The upstream DC needs to be clocked for accesses to HDMI to not
1907 * hard lock the system. Because we don't know if HDMI is connected
1908 * to disp1 or disp2 we need to enable both until we set the DC mux.
1910 clk_prepare_enable(hdmi->disp1_clk);
1911 clk_prepare_enable(hdmi->disp2_clk);
1913 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1914 /* Enabling HDA clocks before asserting HDA PD and ELDV bits */
1915 clk_prepare_enable(hdmi->hda_clk);
1916 clk_prepare_enable(hdmi->hda2codec_clk);
1917 clk_prepare_enable(hdmi->hda2hdmi_clk);
1920 /* Reseting HDMI clock would cause visible display reset during boot
1921 * if bootloader set an image already. Skip such operation if HDMI
1922 * is already running on desired clock rate.
1924 if (clk_get_rate(hdmi->clk) == dc->mode.pclk) {
1925 pr_info("%s: HDMI clock already configured to "
1926 "target frequency, skipping clk setup.\n", __func__);
1927 clk_prepare_enable(hdmi->clk);
1929 tegra_dc_setup_clk(dc, hdmi->clk);
1930 clk_set_rate(hdmi->clk, dc->mode.pclk);
1932 clk_prepare_enable(hdmi->clk);
1933 tegra_periph_reset_assert(hdmi->clk);
1935 tegra_periph_reset_deassert(hdmi->clk);
1938 /* TODO: copy HDCP keys from KFUSE to HDMI */
1940 /* Program display timing registers: handled by dc */
1942 /* program HDMI registers and SOR sequencer */
1944 tegra_dc_io_start(dc);
1945 tegra_dc_writel(dc, VSYNC_H_POSITION(1), DC_DISP_DISP_TIMING_OPTIONS);
1947 dc->out->depth = 24;
1948 dc->out->dither = TEGRA_DC_DISABLE_DITHER;
1949 tegra_dc_set_color_control(dc);
1951 /* video_preamble uses h_pulse2 */
1952 pulse_start = dc->mode.h_ref_to_sync + dc->mode.h_sync_width +
1953 dc->mode.h_back_porch - 10;
1954 tegra_dc_writel(dc, H_PULSE_2_ENABLE, DC_DISP_DISP_SIGNAL_OPTIONS0);
1957 PULSE_POLARITY_HIGH |
1958 PULSE_QUAL_VACTIVE |
1960 DC_DISP_H_PULSE2_CONTROL);
1961 tegra_dc_writel(dc, PULSE_START(pulse_start) | PULSE_END(pulse_start + 8),
1962 DC_DISP_H_PULSE2_POSITION_A);
1964 tegra_hdmi_writel(hdmi,
1965 VSYNC_WINDOW_END(0x210) |
1966 VSYNC_WINDOW_START(0x200) |
1967 VSYNC_WINDOW_ENABLE,
1968 HDMI_NV_PDISP_HDMI_VSYNC_WINDOW);
1970 if ((dc->mode.h_active == 720) && ((dc->mode.v_active == 480) || (dc->mode.v_active == 576)))
1971 tegra_hdmi_writel(hdmi,
1972 (dc->ndev->id ? HDMI_SRC_DISPLAYB : HDMI_SRC_DISPLAYA) |
1973 ARM_VIDEO_RANGE_FULL,
1974 HDMI_NV_PDISP_INPUT_CONTROL);
1976 tegra_hdmi_writel(hdmi,
1977 (dc->ndev->id ? HDMI_SRC_DISPLAYB : HDMI_SRC_DISPLAYA) |
1978 ARM_VIDEO_RANGE_LIMITED,
1979 HDMI_NV_PDISP_INPUT_CONTROL);
1981 clk_disable_unprepare(hdmi->disp1_clk);
1982 clk_disable_unprepare(hdmi->disp2_clk);
1984 dispclk_div_8_2 = clk_get_rate(hdmi->clk) / 1000000 * 4;
1985 tegra_hdmi_writel(hdmi,
1986 SOR_REFCLK_DIV_INT(dispclk_div_8_2 >> 2) |
1987 SOR_REFCLK_DIV_FRAC(dispclk_div_8_2),
1988 HDMI_NV_PDISP_SOR_REFCLK);
1990 hdmi->clk_enabled = true;
1992 edid_read = hdmi->eld_retrieved;
1993 /* on first boot, we haven't read EDID yet so
1994 * we don't know what to setup yet. we'll
1995 * call audio and infoframes setup in hdmi worker
1996 * after EDID has been read.
1999 /* after boot, this is called by hwc via ioctl
2000 * blank/unblank, which is done after EDID has
2003 tegra_dc_hdmi_setup_audio_and_infoframes(dc);
2006 /* Set tmds config. Set it to custom values provided in board file;
2007 * otherwise, set it to default values. */
2008 if (hdmi->info.tmds_config && hdmi->info.n_tmds_config) {
2009 tmds_ptr = hdmi->info.tmds_config;
2010 tmds_len = hdmi->info.n_tmds_config;
2012 tmds_ptr = tmds_config;
2013 tmds_len = ARRAY_SIZE(tmds_config);
2016 for (i = 0; i < tmds_len && tmds_ptr[i].pclk < dc->mode.pclk; i++)
2019 tegra_dc_hdmi_setup_tmds(hdmi, &tmds_ptr[i]);
2021 dev_warn(&dc->ndev->dev,
2022 "pixel clock %u not present on TMDS table.\n",
2024 tegra_dc_hdmi_setup_tmds(hdmi, &tmds_ptr[tmds_len - 1]);
2028 tegra_hdmi_writel(hdmi,
2029 SOR_SEQ_CTL_PU_PC(0) |
2030 SOR_SEQ_PU_PC_ALT(0) |
2032 SOR_SEQ_PD_PC_ALT(8),
2033 HDMI_NV_PDISP_SOR_SEQ_CTL);
2035 val = SOR_SEQ_INST_WAIT_TIME(1) |
2036 SOR_SEQ_INST_WAIT_UNITS_VSYNC |
2038 SOR_SEQ_INST_PIN_A_LOW |
2039 SOR_SEQ_INST_PIN_B_LOW |
2040 SOR_SEQ_INST_DRIVE_PWM_OUT_LO;
2042 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_SEQ_INST0);
2043 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_SEQ_INST8);
2046 val &= ~SOR_CSTM_ROTCLK(~0);
2047 val |= SOR_CSTM_ROTCLK(2);
2048 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_CSTM);
2050 /* Putting display into STOP MODE will reset display which is undesired
2051 * if bootloader has already initialized display with image.
2053 if (!hdmi->dc->initialized) {
2054 tegra_dc_writel(dc, DISP_CTRL_MODE_STOP,
2055 DC_CMD_DISPLAY_COMMAND);
2056 tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
2057 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
2059 pr_info("%s: DC already initialized, skip putting HDMI "
2060 "to STOP mode.\n", __func__);
2064 tegra_hdmi_writel(hdmi,
2065 SOR_PWR_NORMAL_STATE_PU |
2066 SOR_PWR_NORMAL_START_NORMAL |
2067 SOR_PWR_SAFE_STATE_PD |
2068 SOR_PWR_SETTING_NEW_TRIGGER,
2069 HDMI_NV_PDISP_SOR_PWR);
2070 tegra_hdmi_writel(hdmi,
2071 SOR_PWR_NORMAL_STATE_PU |
2072 SOR_PWR_NORMAL_START_NORMAL |
2073 SOR_PWR_SAFE_STATE_PD |
2074 SOR_PWR_SETTING_NEW_DONE,
2075 HDMI_NV_PDISP_SOR_PWR);
2079 BUG_ON(--retries < 0);
2080 val = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PWR);
2081 } while (val & SOR_PWR_SETTING_NEW_PENDING);
2083 val = SOR_STATE_ASY_CRCMODE_COMPLETE |
2084 SOR_STATE_ASY_OWNER_HEAD0 |
2085 SOR_STATE_ASY_SUBOWNER_BOTH |
2086 SOR_STATE_ASY_PROTOCOL_SINGLE_TMDS_A |
2087 SOR_STATE_ASY_DEPOL_POS;
2089 if (dc->mode.flags & TEGRA_DC_MODE_FLAG_NEG_H_SYNC)
2090 val |= SOR_STATE_ASY_HSYNCPOL_NEG;
2092 val |= SOR_STATE_ASY_HSYNCPOL_POS;
2094 if (dc->mode.flags & TEGRA_DC_MODE_FLAG_NEG_V_SYNC)
2095 val |= SOR_STATE_ASY_VSYNCPOL_NEG;
2097 val |= SOR_STATE_ASY_VSYNCPOL_POS;
2099 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_STATE2);
2101 val = SOR_STATE_ASY_HEAD_OPMODE_AWAKE | SOR_STATE_ASY_ORMODE_NORMAL;
2102 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_STATE1);
2104 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0);
2105 tegra_hdmi_writel(hdmi, SOR_STATE_UPDATE, HDMI_NV_PDISP_SOR_STATE0);
2106 tegra_hdmi_writel(hdmi, val | SOR_STATE_ATTACHED,
2107 HDMI_NV_PDISP_SOR_STATE1);
2108 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0);
2110 tegra_dc_writel(dc, HDMI_ENABLE, DC_DISP_DISP_WIN_OPTIONS);
2112 tegra_dc_writel(dc, PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE |
2113 PW4_ENABLE | PM0_ENABLE | PM1_ENABLE,
2114 DC_CMD_DISPLAY_POWER_CONTROL);
2116 tegra_dc_writel(dc, DISP_CTRL_MODE_C_DISPLAY, DC_CMD_DISPLAY_COMMAND);
2117 tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
2118 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
2120 /* we are called at boot when the actual connection state
2121 * isn't known, and other times (like fb_blank, which
2122 * does a disable followed by an enable) when it is.
2123 * don't just assume a connection but check hpd.
2125 tegra_nvhdcp_set_plug(hdmi->nvhdcp, tegra_dc_hpd(dc));
2126 tegra_dc_io_end(dc);
2129 static void tegra_dc_hdmi_disable(struct tegra_dc *dc)
2131 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
2134 * set DC to STOP mode
2136 tegra_dc_writel(dc, DISP_CTRL_MODE_STOP, DC_CMD_DISPLAY_COMMAND);
2137 tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
2138 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
2140 tegra_nvhdcp_set_plug(hdmi->nvhdcp, 0);
2142 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
2143 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE_0);
2144 /* sleep 1ms before disabling clocks to ensure HDA gets the interrupt */
2146 clk_disable_unprepare(hdmi->hda2hdmi_clk);
2147 clk_disable_unprepare(hdmi->hda2codec_clk);
2148 clk_disable_unprepare(hdmi->hda_clk);
2150 tegra_periph_reset_assert(hdmi->clk);
2151 hdmi->clk_enabled = false;
2152 clk_disable_unprepare(hdmi->clk);
2153 tegra_dvfs_set_rate(hdmi->clk, 0);
2157 /* To determine the best parent clock rate for a nominal HDMI pixel clock
2158 * rate for T124 host1x display controller
2160 * - dc: pointer to the display controller
2161 * - parent_clk: pointer to the parent clock
2162 * - pclk: rate of nominal HDMI pixel clock in Hz
2164 * - return: best parent clock rate in Hz
2166 static unsigned long tegra12x_hdmi_determine_parent(
2167 struct tegra_dc *dc, struct clk *parent_clk, int pclk)
2170 * parentClk = pclk * m (m=1,1.5,2,2.5,...,128.5)
2171 * (refclk * n) = pclk * m (n=1,1.5,2,2.5,...,128.5)
2172 * (no half resolutions for m due to uneven out duty cycle)
2173 * (refclk * N / 2) = pclk * m (N=2,3,4,...,257)
2174 * m = (refclk / 2 * N) / pclk (m=1,2,3,...,128)
2175 * looking for N to make m whole number
2180 /* following parameters should come from parent clock */
2181 const int ref = 12000000; /* reference clock to parent */
2182 const int pmax = 600000000; /* max freq of parent clock */
2183 const int pmin = 200000000; /* min freq of parent clock */
2187 for (n = 4; (ref / 2 * n) <= pmax; n++) {
2188 if ((ref / 2 * n) < pmin) /* too low */
2190 m = DIV_ROUND_UP((ref / 2 * n), (pclk / 1000));
2191 if (m <= 1700) /* for 2 <= m */
2193 f = m % 1000; /* fractional parts */
2194 f = (0 == f) ? f : (1000 - f); /* round-up */
2195 if (0 == f) { /* exact match */
2199 } else if (f < fr) {
2205 return (unsigned long)(ref / 2 * b);
2209 static long tegra_dc_hdmi_setup_clk(struct tegra_dc *dc, struct clk *clk)
2212 struct clk *parent_clk = clk_get_sys(NULL,
2213 dc->out->parent_clk ? : "pll_d_out0");
2214 #if !defined(CONFIG_ARCH_TEGRA_12x_SOC)
2215 struct clk *base_clk = clk_get_parent(parent_clk);
2217 if (clk != dc->clk) {
2218 #if !defined(CONFIG_ARCH_TEGRA_12x_SOC)
2219 clk_set_rate(base_clk, dc->mode.pclk);
2221 if (clk_get_parent(clk) != parent_clk)
2222 clk_set_parent(clk, parent_clk);
2224 clk_set_rate(clk, dc->mode.pclk / 4);
2227 clk_set_rate(parent_clk, rate);
2228 if (clk_get_parent(clk) != parent_clk)
2229 clk_set_parent(clk, parent_clk);
2230 clk_set_rate(clk, rate / 4);
2235 * Providing dynamic frequency rate setting for T20/T30 HDMI.
2236 * The required rate needs to be setup at 4x multiplier,
2237 * as out0 is 1/2 of the actual PLL output.
2239 #if defined(CONFIG_ARCH_TEGRA_12x_SOC)
2240 rate = tegra12x_hdmi_determine_parent(dc, parent_clk, dc->mode.pclk);
2242 rate = dc->mode.pclk * 2;
2243 while (rate < 500000000)
2246 #if !defined(CONFIG_ARCH_TEGRA_12x_SOC)
2247 if (rate != clk_get_rate(base_clk))
2248 clk_set_rate(base_clk, rate);
2250 if (rate != clk_get_rate(parent_clk))
2251 clk_set_rate(parent_clk, rate);
2253 if (clk_get_parent(clk) != parent_clk)
2254 clk_set_parent(clk, parent_clk);
2256 return tegra_dc_pclk_round_rate(dc, dc->mode.pclk);
2259 struct tegra_dc_out_ops tegra_dc_hdmi_ops = {
2260 .init = tegra_dc_hdmi_init,
2261 .destroy = tegra_dc_hdmi_destroy,
2262 .enable = tegra_dc_hdmi_enable,
2263 .disable = tegra_dc_hdmi_disable,
2264 .detect = tegra_dc_hdmi_detect,
2265 .suspend = tegra_dc_hdmi_suspend,
2266 .resume = tegra_dc_hdmi_resume,
2267 .mode_filter = tegra_dc_hdmi_mode_filter,
2268 .setup_clk = tegra_dc_hdmi_setup_clk,
2271 struct tegra_dc *tegra_dc_hdmi_get_dc(struct tegra_dc_hdmi_data *hdmi)
2273 return hdmi ? hdmi->dc : NULL;