2 * drivers/video/tegra/dc/hdmi.c
4 * Copyright (C) 2010 Google, Inc.
5 * Author: Erik Gilling <konkers@android.com>
7 * Copyright (c) 2010-2015, 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 /* According to HDMI EDID specs for Short Audio
61 * Descriptor, format type LPCM is 1 (this is required
62 * by HAL before EDL is copied to hda codec driver
64 #define AUDIO_CODING_TYPE_LPCM 1
65 #define AUDIO_SAD_BYTE_SIZE 3
67 #define HDMI_ELD_VER_INDEX 0
68 #define HDMI_ELD_RESERVED1_INDEX 1
69 #define HDMI_ELD_BASELINE_LEN_INDEX 2
70 #define HDMI_ELD_RESERVED2_INDEX 3
71 #define HDMI_ELD_CEA_VER_MNL_INDEX 4
72 #define HDMI_ELD_SAD_CNT_CON_TYP_SAI_HDCP_INDEX 5
73 #define HDMI_ELD_AUD_SYNC_DELAY_INDEX 6
74 #define HDMI_ELD_SPK_ALLOC_INDEX 7
75 #define HDMI_ELD_PORT_ID_INDEX 8 /* 8 to 15 */
76 #define HDMI_ELD_MANF_NAME_INDEX 16 /* 16 to 17 */
77 #define HDMI_ELD_PRODUCT_CODE_INDEX 18 /* 18 to 19 */
78 #define HDMI_ELD_MONITOR_NAME_INDEX 20 /* 20 to 20 + MNL - 1 */
79 #define HDMI_ELD_BUF_SIZE 96
81 /* According to HDA ELD spec, the maxmimum baseline
82 * eld size for tye 2 ELD_Ver encoding (which is
83 * what this code supports) is 80 bytes.
85 #define MAX_BASELINE_ELD_SIZE 80
87 /* These two values need to be cross checked in case of
88 addition/removal from tegra_dc_hdmi_aspect_ratios[] */
89 #define TEGRA_DC_HDMI_MIN_ASPECT_RATIO_PERCENT 80
90 #define TEGRA_DC_HDMI_MAX_ASPECT_RATIO_PERCENT 320
92 struct tegra_dc_hdmi_data *dc_hdmi;
94 static ssize_t hdmi_audio_get_max_channel(struct kobject *kobj,
95 struct kobj_attribute *attr, char *buf);
97 static struct kobj_attribute hdmi_audio_channel_config =
98 __ATTR(config, 0640, hdmi_audio_get_max_channel, NULL);
100 static struct kobject *hdmi_audio;
102 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
103 const struct tmds_config tmds_config[] = {
106 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
107 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(0) |
108 SOR_PLL_TX_REG_LOAD(0),
109 .pll1 = SOR_PLL_TMDS_TERM_ENABLE,
110 .pe_current = 0x00000000,
111 .drive_current = 0x0a0a0a0a,
115 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
116 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(1) |
117 SOR_PLL_TX_REG_LOAD(0),
118 .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
119 .pe_current = 0x0a0a0a0a,
120 .drive_current = 0x0a0a0a0a,
124 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
125 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(3) |
126 SOR_PLL_TX_REG_LOAD(0),
127 .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
128 .pe_current = 0x0a0a0a0a,
129 .drive_current = 0x0a0a0a0a,
132 #elif defined(CONFIG_ARCH_TEGRA_2x_SOC)
133 const struct tmds_config tmds_config[] = {
136 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
137 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(0) |
138 SOR_PLL_TX_REG_LOAD(3),
139 .pll1 = SOR_PLL_TMDS_TERM_ENABLE,
140 .pe_current = 0x00000000,
141 .drive_current = 0x0f0f0f0f,
145 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
146 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(1) |
147 SOR_PLL_TX_REG_LOAD(3),
148 .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
149 .pe_current = 0x0c0c0c0c,
150 .drive_current = 0x0f0f0f0f,
154 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
155 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(1) |
156 SOR_PLL_TX_REG_LOAD(3),
157 .pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
158 .pe_current = 0x0c0c0c0c,
159 .drive_current = 0x0f0f0f0f,
162 #elif defined(CONFIG_ARCH_TEGRA_11x_SOC)
163 const struct tmds_config tmds_config[] = {
164 { /* 480p/576p / 25.2MHz/27MHz modes */
166 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
167 SOR_PLL_VCOCAP(0) | SOR_PLL_RESISTORSEL_EXT,
168 .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
169 .pe_current = 0x00000000,
170 .drive_current = 0x1a1a1a1a,
171 .peak_current = 0x00000000,
173 { /* 720p / 74.25MHz modes */
175 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
176 SOR_PLL_VCOCAP(1) | SOR_PLL_RESISTORSEL_EXT,
177 .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
178 .pe_current = 0x0f0f0f0f,
179 .drive_current = 0x1a1a1a1a,
180 .peak_current = 0x00000000,
182 { /* 1080p / 148.5MHz modes */
184 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
185 SOR_PLL_VCOCAP(3) | SOR_PLL_RESISTORSEL_EXT,
186 .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
187 .pe_current = 0x0a0a0a0a,
188 .drive_current = 0x1f1f1f1f,
189 .peak_current = 0x00000000,
191 { /* 225/297MHz modes */
193 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
194 SOR_PLL_VCOCAP(0xf) | SOR_PLL_RESISTORSEL_EXT,
195 .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(7)
196 | SOR_PLL_TMDS_TERM_ENABLE,
197 .pe_current = 0x00000000,
198 .drive_current = 0x303f3f3f, /* lane3 needs a slightly lower current */
199 .peak_current = 0x040f0f0f,
200 /* Alternative settings:
201 .drive_current = 0x2c333333,
202 .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(6)
203 | SOR_PLL_TMDS_TERM_ENABLE,
207 #elif defined(CONFIG_ARCH_TEGRA_12x_SOC)
208 const struct tmds_config tmds_config[] = {
209 { /* 480p/576p / 25.2MHz/27MHz modes */
210 .version = MKDEV(1, 0),
212 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
213 SOR_PLL_VCOCAP(0) | SOR_PLL_RESISTORSEL_EXT,
214 .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
215 .pe_current = 0x00000000,
216 .drive_current = 0x1a1a1a1a,
217 .peak_current = 0x00000000,
218 .pad_ctls0_mask = 0xfffff0ff,
219 .pad_ctls0_setting = 0x00000400, /* BG_VREF_LEVEL */
221 { /* 720p / 74.25MHz modes */
222 .version = MKDEV(1, 0),
224 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
225 SOR_PLL_VCOCAP(1) | SOR_PLL_RESISTORSEL_EXT,
226 .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
227 .pe_current = 0x0f0f0f0f,
228 .drive_current = 0x1a1a1a1a,
229 .peak_current = 0x00000000,
230 .pad_ctls0_mask = 0xfffff0ff,
231 .pad_ctls0_setting = 0x00000400, /* BG_VREF_LEVEL */
233 { /* 1080p / 148.5MHz modes */
234 .version = MKDEV(1, 0),
236 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
237 SOR_PLL_VCOCAP(3) | SOR_PLL_RESISTORSEL_EXT,
238 .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0),
239 .pe_current = 0x0a0a0a0a,
240 .drive_current = 0x1f1f1f1f,
241 .peak_current = 0x00000000,
242 .pad_ctls0_mask = 0xfffff0ff,
243 .pad_ctls0_setting = 0x00000400, /* BG_VREF_LEVEL */
245 { /* 225/297MHz modes */
246 .version = MKDEV(1, 0),
248 .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) |
249 SOR_PLL_VCOCAP(0xf) | SOR_PLL_RESISTORSEL_EXT,
250 .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(7)
251 | SOR_PLL_TMDS_TERM_ENABLE,
252 .pe_current = 0x00000000,
253 .drive_current = 0x303f3f3f, /* lane3 needs a slightly lower current */
254 .peak_current = 0x040f0f0f,
255 .pad_ctls0_mask = 0xfffff0ff,
256 .pad_ctls0_setting = 0x00000600, /* BG_VREF_LEVEL */
259 #elif defined(CONFIG_ARCH_TEGRA_14x_SOC)
260 const struct tmds_config tmds_config[] = {
263 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
264 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(0x0) |
265 SOR_PLL_TX_REG_LOAD(0),
266 .pll1 = SOR_PLL_TMDS_TERM_ENABLE |
267 SOR_PLL_TMDS_TERMADJ(0xD) | SOR_PLL_LOADADJ(3),
269 .drive_current = 0x1f1f1f1f,
274 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
275 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(0x1) |
276 SOR_PLL_TX_REG_LOAD(0),
277 .pll1 = SOR_PLL_TMDS_TERM_ENABLE |
278 SOR_PLL_TMDS_TERMADJ(0xD) | SOR_PLL_LOADADJ(3),
280 .drive_current = 0x20202020,
285 .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
286 SOR_PLL_RESISTORSEL_EXT | SOR_PLL_VCOCAP(0x3) |
287 SOR_PLL_TX_REG_LOAD(0),
288 .pll1 = SOR_PLL_TMDS_TERM_ENABLE |
289 SOR_PLL_TMDS_TERMADJ(0xD) | SOR_PLL_LOADADJ(3),
291 .drive_current = 0x22222222,
292 .peak_current = 0x04040404,
296 #warning tmds_config needs to be defined for your arch
299 struct tegra_hdmi_audio_config {
307 const struct tegra_hdmi_audio_config tegra_hdmi_audio_32k[] = {
308 {25200000, 4096, 25200, 24000},
309 {27000000, 4096, 27000, 24000},
310 {74250000, 4096, 74250, 24000},
311 {148500000, 4096, 148500, 24000},
312 {241500000, 4096, 241500, 24000},
313 {297000000, 3072, 222750, 24000},
317 const struct tegra_hdmi_audio_config tegra_hdmi_audio_44_1k[] = {
318 {25200000, 5880, 26250, 25000},
319 {27000000, 5880, 28125, 25000},
320 {74250000, 4704, 61875, 20000},
321 {148500000, 4704, 123750, 20000},
322 {241500000, 4704, 201250, 20000},
323 {297000000, 4704, 247500, 20000},
327 const struct tegra_hdmi_audio_config tegra_hdmi_audio_48k[] = {
328 {25200000, 6144, 25200, 24000},
329 {27000000, 6144, 27000, 24000},
330 {74250000, 6144, 74250, 24000},
331 {148500000, 6144, 148500, 24000},
332 {241500000, 5632, 221375, 22000},
333 {297000000, 5120, 247500, 24000},
337 const struct tegra_hdmi_audio_config tegra_hdmi_audio_88_2k[] = {
338 {25200000, 11760, 26250, 25000},
339 {27000000, 11760, 28125, 25000},
340 {74250000, 9408, 61875, 20000},
341 {148500000, 9408, 123750, 20000},
342 {241500000, 9408, 201250, 20000},
343 {297000000, 9408, 247500, 20000},
347 const struct tegra_hdmi_audio_config tegra_hdmi_audio_96k[] = {
348 {25200000, 12288, 25200, 24000},
349 {27000000, 12288, 27000, 24000},
350 {74250000, 12288, 74250, 24000},
351 {148500000, 12288, 148500, 24000},
352 {241500000, 11264, 221375, 22000},
353 {297000000, 10240, 247500, 24000},
357 const struct tegra_hdmi_audio_config tegra_hdmi_audio_176_4k[] = {
358 {25200000, 23520, 26250, 25000},
359 {27000000, 23520, 28125, 25000},
360 {74250000, 18816, 61875, 20000},
361 {148500000, 18816, 123750, 20000},
362 {241500000, 18816, 201250, 20000},
363 {297000000, 18816, 247500, 20000},
367 const struct tegra_hdmi_audio_config tegra_hdmi_audio_192k[] = {
368 {25200000, 24576, 25200, 24000},
369 {27000000, 24576, 27000, 24000},
370 {74250000, 24576, 74250, 24000},
371 {148500000, 24576, 148500, 24000},
372 {241500000, 22528, 221375, 22000},
373 {297000000, 20480, 247500, 24000},
377 static const struct tegra_hdmi_audio_config
378 *tegra_hdmi_get_audio_config(unsigned audio_freq, unsigned pix_clock)
380 const struct tegra_hdmi_audio_config *table;
382 switch (audio_freq) {
384 table = tegra_hdmi_audio_32k;
386 case AUDIO_FREQ_44_1K:
387 table = tegra_hdmi_audio_44_1k;
390 table = tegra_hdmi_audio_48k;
392 case AUDIO_FREQ_88_2K:
393 table = tegra_hdmi_audio_88_2k;
396 table = tegra_hdmi_audio_96k;
398 case AUDIO_FREQ_176_4K:
399 table = tegra_hdmi_audio_176_4k;
401 case AUDIO_FREQ_192K:
402 table = tegra_hdmi_audio_192k;
408 while (table->pix_clock) {
409 if (table->pix_clock > (pix_clock/100*99) &&
410 table->pix_clock < (pix_clock/100*101) &&
411 table->pix_clock >= 1000)
420 unsigned long tegra_hdmi_readl(struct tegra_dc_hdmi_data *hdmi,
425 if (WARN(!tegra_is_clk_enabled(hdmi->dc->clk), "DC is clock-gated.\n") ||
426 WARN(!tegra_powergate_is_powered(hdmi->dc->powergate_id),
427 "DC is power-gated.\n"))
430 ret = readl(hdmi->base + reg * 4);
431 trace_display_readl(hdmi->dc, ret, hdmi->base + reg * 4);
435 void tegra_hdmi_writel(struct tegra_dc_hdmi_data *hdmi,
436 unsigned long val, unsigned long reg)
438 if (WARN(!tegra_is_clk_enabled(hdmi->dc->clk), "DC is clock-gated.\n") ||
439 WARN(!tegra_powergate_is_powered(hdmi->dc->powergate_id),
440 "DC is power-gated.\n"))
443 trace_display_writel(hdmi->dc, val, hdmi->base + reg * 4);
444 writel(val, hdmi->base + reg * 4);
447 static inline int tegra_hdmi_writel_eld_buf(struct tegra_dc_hdmi_data *hdmi,
449 size_t buf_entries, size_t index,
450 void __iomem *eld_buf_addr)
452 size_t end_index = index + buf_entries;
454 unsigned long val = (index << 8) | *buf;
456 trace_display_writel(hdmi->dc, val, eld_buf_addr);
457 writel(val, eld_buf_addr);
460 } while (index < end_index);
461 /* outer for loop that uses this will increment index by 1 */
465 static inline void tegra_hdmi_clrsetbits(struct tegra_dc_hdmi_data *hdmi,
466 unsigned long reg, unsigned long clr,
469 unsigned long val = tegra_hdmi_readl(hdmi, reg);
472 tegra_hdmi_writel(hdmi, val, reg);
475 #ifdef CONFIG_DEBUG_FS
476 static int dbg_hdmi_show(struct seq_file *m, void *unused)
478 struct tegra_dc_hdmi_data *hdmi = m->private;
480 /* If gated quitely return */
481 if (!tegra_dc_is_powered(hdmi->dc))
484 #define DUMP_REG(a) do { \
485 seq_printf(m, "%-32s\t%03x\t%08lx\n", \
486 #a, a, tegra_hdmi_readl(hdmi, a)); \
489 tegra_dc_io_start(hdmi->dc);
490 clk_prepare_enable(hdmi->clk);
492 DUMP_REG(HDMI_CTXSW);
493 DUMP_REG(HDMI_NV_PDISP_SOR_STATE0);
494 DUMP_REG(HDMI_NV_PDISP_SOR_STATE1);
495 DUMP_REG(HDMI_NV_PDISP_SOR_STATE2);
496 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AN_MSB);
497 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AN_LSB);
498 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CN_MSB);
499 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CN_LSB);
500 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AKSV_MSB);
501 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_AKSV_LSB);
502 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_BKSV_MSB);
503 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_BKSV_LSB);
504 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CKSV_MSB);
505 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CKSV_LSB);
506 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_DKSV_MSB);
507 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_DKSV_LSB);
508 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CTRL);
509 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CMODE);
510 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_MPRIME_MSB);
511 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_MPRIME_LSB);
512 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_SPRIME_MSB);
513 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_SPRIME_LSB2);
514 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_SPRIME_LSB1);
515 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_RI);
516 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CS_MSB);
517 DUMP_REG(HDMI_NV_PDISP_RG_HDCP_CS_LSB);
518 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU0);
519 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU_RDATA0);
520 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU1);
521 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_EMU2);
522 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
523 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_STATUS);
524 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER);
525 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_LOW);
526 DUMP_REG(HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_HIGH);
527 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
528 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_STATUS);
529 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_HEADER);
530 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK0_LOW);
531 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK0_HIGH);
532 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK1_LOW);
533 DUMP_REG(HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK1_HIGH);
534 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
535 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_STATUS);
536 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_HEADER);
537 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK0_LOW);
538 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK0_HIGH);
539 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK1_LOW);
540 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK1_HIGH);
541 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK2_LOW);
542 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK2_HIGH);
543 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK3_LOW);
544 DUMP_REG(HDMI_NV_PDISP_HDMI_GENERIC_SUBPACK3_HIGH);
545 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_CTRL);
546 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0320_SUBPACK_LOW);
547 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0320_SUBPACK_HIGH);
548 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW);
549 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_HIGH);
550 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0882_SUBPACK_LOW);
551 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0882_SUBPACK_HIGH);
552 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1764_SUBPACK_LOW);
553 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1764_SUBPACK_HIGH);
554 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0480_SUBPACK_LOW);
555 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0480_SUBPACK_HIGH);
556 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0960_SUBPACK_LOW);
557 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_0960_SUBPACK_HIGH);
558 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1920_SUBPACK_LOW);
559 DUMP_REG(HDMI_NV_PDISP_HDMI_ACR_1920_SUBPACK_HIGH);
560 DUMP_REG(HDMI_NV_PDISP_HDMI_CTRL);
561 DUMP_REG(HDMI_NV_PDISP_HDMI_VSYNC_KEEPOUT);
562 DUMP_REG(HDMI_NV_PDISP_HDMI_VSYNC_WINDOW);
563 DUMP_REG(HDMI_NV_PDISP_HDMI_GCP_CTRL);
564 DUMP_REG(HDMI_NV_PDISP_HDMI_GCP_STATUS);
565 DUMP_REG(HDMI_NV_PDISP_HDMI_GCP_SUBPACK);
566 DUMP_REG(HDMI_NV_PDISP_HDMI_CHANNEL_STATUS1);
567 DUMP_REG(HDMI_NV_PDISP_HDMI_CHANNEL_STATUS2);
568 DUMP_REG(HDMI_NV_PDISP_HDMI_EMU0);
569 DUMP_REG(HDMI_NV_PDISP_HDMI_EMU1);
570 DUMP_REG(HDMI_NV_PDISP_HDMI_EMU1_RDATA);
571 DUMP_REG(HDMI_NV_PDISP_HDMI_SPARE);
572 DUMP_REG(HDMI_NV_PDISP_HDMI_SPDIF_CHN_STATUS1);
573 DUMP_REG(HDMI_NV_PDISP_HDMI_SPDIF_CHN_STATUS2);
574 DUMP_REG(HDMI_NV_PDISP_HDCPRIF_ROM_CTRL);
575 DUMP_REG(HDMI_NV_PDISP_SOR_CAP);
576 DUMP_REG(HDMI_NV_PDISP_SOR_PWR);
577 DUMP_REG(HDMI_NV_PDISP_SOR_TEST);
578 DUMP_REG(HDMI_NV_PDISP_SOR_PLL0);
579 DUMP_REG(HDMI_NV_PDISP_SOR_PLL1);
580 DUMP_REG(HDMI_NV_PDISP_SOR_PLL2);
581 DUMP_REG(HDMI_NV_PDISP_SOR_CSTM);
582 DUMP_REG(HDMI_NV_PDISP_SOR_LVDS);
583 DUMP_REG(HDMI_NV_PDISP_SOR_CRCA);
584 DUMP_REG(HDMI_NV_PDISP_SOR_CRCB);
585 DUMP_REG(HDMI_NV_PDISP_SOR_BLANK);
586 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_CTL);
587 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST0);
588 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST1);
589 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST2);
590 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST3);
591 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST4);
592 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST5);
593 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST6);
594 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST7);
595 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST8);
596 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INST9);
597 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTA);
598 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTB);
599 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTC);
600 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTD);
601 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTE);
602 DUMP_REG(HDMI_NV_PDISP_SOR_SEQ_INSTF);
603 DUMP_REG(HDMI_NV_PDISP_SOR_VCRCA0);
604 DUMP_REG(HDMI_NV_PDISP_SOR_VCRCA1);
605 DUMP_REG(HDMI_NV_PDISP_SOR_CCRCA0);
606 DUMP_REG(HDMI_NV_PDISP_SOR_CCRCA1);
607 DUMP_REG(HDMI_NV_PDISP_SOR_EDATAA0);
608 DUMP_REG(HDMI_NV_PDISP_SOR_EDATAA1);
609 DUMP_REG(HDMI_NV_PDISP_SOR_COUNTA0);
610 DUMP_REG(HDMI_NV_PDISP_SOR_COUNTA1);
611 DUMP_REG(HDMI_NV_PDISP_SOR_DEBUGA0);
612 DUMP_REG(HDMI_NV_PDISP_SOR_DEBUGA1);
613 DUMP_REG(HDMI_NV_PDISP_SOR_TRIG);
614 DUMP_REG(HDMI_NV_PDISP_SOR_MSCHECK);
615 DUMP_REG(HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT);
616 DUMP_REG(HDMI_NV_PDISP_AUDIO_DEBUG0);
617 DUMP_REG(HDMI_NV_PDISP_AUDIO_DEBUG1);
618 DUMP_REG(HDMI_NV_PDISP_AUDIO_DEBUG2);
619 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(0));
620 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(1));
621 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(2));
622 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(3));
623 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(4));
624 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(5));
625 DUMP_REG(HDMI_NV_PDISP_AUDIO_FS(6));
626 DUMP_REG(HDMI_NV_PDISP_AUDIO_PULSE_WIDTH);
627 DUMP_REG(HDMI_NV_PDISP_AUDIO_THRESHOLD);
628 DUMP_REG(HDMI_NV_PDISP_AUDIO_CNTRL0);
629 DUMP_REG(HDMI_NV_PDISP_AUDIO_N);
630 DUMP_REG(HDMI_NV_PDISP_HDCPRIF_ROM_TIMING);
631 DUMP_REG(HDMI_NV_PDISP_SOR_REFCLK);
632 DUMP_REG(HDMI_NV_PDISP_CRC_CONTROL);
633 DUMP_REG(HDMI_NV_PDISP_INPUT_CONTROL);
634 DUMP_REG(HDMI_NV_PDISP_SCRATCH);
635 DUMP_REG(HDMI_NV_PDISP_PE_CURRENT);
636 DUMP_REG(HDMI_NV_PDISP_KEY_CTRL);
637 DUMP_REG(HDMI_NV_PDISP_KEY_DEBUG0);
638 DUMP_REG(HDMI_NV_PDISP_KEY_DEBUG1);
639 DUMP_REG(HDMI_NV_PDISP_KEY_DEBUG2);
640 DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_0);
641 DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_1);
642 DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_2);
643 DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_3);
644 DUMP_REG(HDMI_NV_PDISP_KEY_HDCP_KEY_TRIG);
645 DUMP_REG(HDMI_NV_PDISP_KEY_SKEY_INDEX);
646 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
647 DUMP_REG(HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT);
649 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC) && !defined(CONFIG_ARCH_TEGRA_11x_SOC)
650 DUMP_REG(HDMI_NV_PDISP_SOR_PAD_CTLS0);
651 DUMP_REG(HDMI_NV_PDISP_SOR_PAD_CTLS1);
652 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_CTRL);
653 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_STATUS);
654 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_HEADER);
655 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK0_LOW);
656 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK0_HIGH);
657 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK1_LOW);
658 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK1_HIGH);
659 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK2_LOW);
660 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK2_HIGH);
661 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK3_LOW);
662 DUMP_REG(HDMI_NV_PDISP_HDMI_VSI_INFOFRAME_SUBPACK3_HIGH);
667 clk_disable_unprepare(hdmi->clk);
668 tegra_dc_io_end(hdmi->dc);
673 static int dbg_hdmi_show_open(struct inode *inode, struct file *file)
675 return single_open(file, dbg_hdmi_show, inode->i_private);
678 static const struct file_operations dbg_hdmi_show_fops = {
679 .open = dbg_hdmi_show_open,
682 .release = single_release,
685 static int dbg_hotplug_show(struct seq_file *m, void *unused)
687 struct tegra_dc_hdmi_data *hdmi = m->private;
688 struct tegra_dc *dc = hdmi->dc;
690 if (WARN_ON(!hdmi || !dc || !dc->out))
693 seq_put_decimal_ll(m, '\0', dc->out->hotplug_state);
698 static int dbg_hotplug_open(struct inode *inode, struct file *file)
700 return single_open(file, dbg_hotplug_show, inode->i_private);
703 static ssize_t dbg_hotplug_write(struct file *file, const char __user *addr,
704 size_t len, loff_t *pos)
706 struct seq_file *m = file->private_data; /* single_open() initialized */
707 struct tegra_dc_hdmi_data *hdmi = m->private;
708 struct tegra_dc *dc = hdmi->dc;
712 if (WARN_ON(!hdmi || !dc || !dc->out))
715 ret = kstrtol_from_user(addr, len, 10, &new_state);
719 if (dc->out->hotplug_state == 0 && new_state != 0
720 && tegra_dc_hotplug_supported(dc)) {
721 /* was 0, now -1 or 1.
722 * we are overriding the hpd GPIO, so ignore the interrupt. */
723 int gpio_irq = gpio_to_irq(dc->out->hotplug_gpio);
725 disable_irq(gpio_irq);
726 } else if (dc->out->hotplug_state != 0 && new_state == 0
727 && tegra_dc_hotplug_supported(dc)) {
728 /* was -1 or 1, and now 0
729 * restore the interrupt for hpd GPIO. */
730 int gpio_irq = gpio_to_irq(dc->out->hotplug_gpio);
732 enable_irq(gpio_irq);
735 dc->out->hotplug_state = new_state;
737 hdmi_state_machine_set_pending_hpd();
742 static const struct file_operations dbg_hotplug_fops = {
743 .open = dbg_hotplug_open,
745 .write = dbg_hotplug_write,
747 .release = single_release,
750 static struct dentry *hdmidir;
752 static void tegra_dc_hdmi_debug_create(struct tegra_dc_hdmi_data *hdmi)
754 struct dentry *retval;
756 hdmidir = debugfs_create_dir("tegra_hdmi", NULL);
759 retval = debugfs_create_file("regs", S_IRUGO, hdmidir, hdmi,
760 &dbg_hdmi_show_fops);
763 retval = debugfs_create_file("hotplug", S_IRUGO, hdmidir, hdmi,
769 debugfs_remove_recursive(hdmidir);
774 static inline void tegra_dc_hdmi_debug_create(struct tegra_dc_hdmi_data *hdmi)
778 #define PIXCLOCK_TOLERANCE 200
780 static int tegra_dc_calc_clock_per_frame(const struct fb_videomode *mode)
782 return (mode->left_margin + mode->xres +
783 mode->right_margin + mode->hsync_len) *
784 (mode->upper_margin + mode->yres +
785 mode->lower_margin + mode->vsync_len);
788 static bool tegra_dc_hdmi_valid_pixclock(const struct tegra_dc *dc,
789 const struct fb_videomode *mode)
791 unsigned max_pixclock = tegra_dc_get_out_max_pixclock(dc);
793 /* this might look counter-intuitive,
794 * but pixclock's unit is picos(not Khz)
796 return mode->pixclock >= max_pixclock;
802 static bool tegra_dc_check_constraint(const struct fb_videomode *mode)
804 return mode->hsync_len >= 1 && mode->vsync_len >= 1 &&
805 mode->lower_margin + mode->vsync_len + mode->upper_margin > 1 &&
806 mode->xres >= 16 && mode->yres >= 16;
809 /* adjusts pixclock to fit audio table */
810 static bool tegra_dc_hdmi_adjust_pixclock(const struct tegra_dc *dc,
811 struct fb_videomode *mode)
813 const struct tegra_hdmi_audio_config *cfg = tegra_hdmi_audio_44_1k;
819 pclk = PICOS2KHZ(mode->pixclock) * 1000;
821 /* look on 44.1k audio table, if mode's pixel clock is within 1%, then
822 * use the pixel clock from the audio table.*/
823 while (cfg->pix_clock) {
824 if (cfg->pix_clock > (pclk / 100 * 99) &&
825 cfg->pix_clock < (pclk / 100 * 101) &&
826 cfg->pix_clock >= 1000) {
827 mode->pixclock = KHZ2PICOS(cfg->pix_clock / 1000);
835 bool tegra_dc_hdmi_mode_filter(const struct tegra_dc *dc,
836 struct fb_videomode *mode)
840 #ifndef CONFIG_ARCH_TEGRA_12x_SOC
841 if (mode->vmode & FB_VMODE_INTERLACED)
845 /* Ignore modes with a 0 pixel clock */
849 #ifdef CONFIG_TEGRA_HDMI_74MHZ_LIMIT
850 if (PICOS2KHZ(mode->pixclock) > 74250)
854 #if defined(CONFIG_ARCH_TEGRA_11x_SOC)
855 /* Display B max is 4096 */
856 if (mode->xres > 4096)
858 #elif defined(CONFIG_ARCH_TEGRA_2x_SOC) || defined(CONFIG_ARCH_TEGRA_3x_SOC)
859 if (mode->xres > 2560)
862 /* don't filter any modes due to width - probably not what you want */
865 tegra_dc_hdmi_adjust_pixclock(dc, mode);
867 /* Check if the mode's pixel clock is more than the max rate*/
868 if (!tegra_dc_hdmi_valid_pixclock(dc, mode))
871 /* Work around for modes that fail the constrait:
872 * V_FRONT_PORCH >= V_REF_TO_SYNC + 1 */
873 if (mode->lower_margin == 1) {
874 mode->lower_margin++;
875 mode->upper_margin--;
878 /* even after fix-ups the mode still isn't supported */
879 if (!tegra_dc_check_constraint(mode))
882 mode->flag |= FB_MODE_IS_DETAILED;
883 total_clocks = tegra_dc_calc_clock_per_frame(mode);
884 mode->refresh = total_clocks ?
885 (PICOS2KHZ(mode->pixclock) * 1000) / total_clocks : 0;
890 /* used by tegra_dc_probe() to detect hpd/hdmi status at boot */
891 static bool tegra_dc_hdmi_detect(struct tegra_dc *dc)
893 /* trigger an edid read by the hdmi state machine */
894 hdmi_state_machine_set_pending_hpd();
896 return tegra_dc_hpd(dc);
899 static irqreturn_t tegra_dc_hdmi_irq(int irq, void *ptr)
901 struct tegra_dc *dc = ptr;
902 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
904 pr_info("%s: start\n", __func__);
905 rt_mutex_lock(&hdmi->suspend_lock);
906 if (!hdmi->suspended)
907 hdmi_state_machine_set_pending_hpd();
908 rt_mutex_unlock(&hdmi->suspend_lock);
909 pr_info("%s: end\n", __func__);
913 static void tegra_dc_hdmi_suspend(struct tegra_dc *dc)
915 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
917 tegra_nvhdcp_suspend(hdmi->nvhdcp);
919 if (hdmi->info.hdmi2fpd_bridge_enable)
920 hdmi2fpd_suspend(hdmi);
922 if (dc->out->flags & TEGRA_DC_OUT_HOTPLUG_WAKE_LP0) {
923 int wake_irq = gpio_to_irq(dc->out->hotplug_gpio);
926 ret = enable_irq_wake(wake_irq);
928 dev_err(&dc->ndev->dev,
929 "%s: Couldn't enable HDMI wakeup, irq=%d, error=%d\n",
930 __func__, wake_irq, ret);
934 rt_mutex_lock(&hdmi->suspend_lock);
935 hdmi->suspended = true;
936 rt_mutex_unlock(&hdmi->suspend_lock);
940 static void tegra_dc_hdmi_resume(struct tegra_dc *dc)
942 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
944 rt_mutex_lock(&hdmi->suspend_lock);
945 hdmi->suspended = false;
946 hdmi_state_machine_set_pending_hpd();
947 rt_mutex_unlock(&hdmi->suspend_lock);
949 if (dc->out->flags & TEGRA_DC_OUT_HOTPLUG_WAKE_LP0)
950 disable_irq_wake(gpio_to_irq(dc->out->hotplug_gpio));
952 if (hdmi->info.hdmi2fpd_bridge_enable)
953 hdmi2fpd_resume(hdmi);
955 tegra_nvhdcp_resume(hdmi->nvhdcp);
959 static ssize_t underscan_show(struct device *dev,
960 struct device_attribute *attr, char *buf)
962 struct tegra_dc_hdmi_data *hdmi =
963 container_of(dev_get_drvdata(dev), struct tegra_dc_hdmi_data, hpd_switch);
966 return sprintf(buf, "%d\n", tegra_edid_underscan_supported(hdmi->edid));
971 static DEVICE_ATTR(underscan, S_IRUGO, underscan_show, NULL);
973 static ssize_t hdmi_audio_show(struct device *dev,
974 struct device_attribute *attr, char *buf)
976 struct tegra_dc_hdmi_data *hdmi =
977 container_of(dev_get_drvdata(dev),
978 struct tegra_dc_hdmi_data, audio_switch);
981 return sprintf(buf, "%d\n",
982 tegra_edid_audio_supported(hdmi->edid));
987 static DEVICE_ATTR(hdmi_audio, S_IRUGO, hdmi_audio_show, NULL);
991 static int tegra_dc_hdmi_i2c_xfer(struct tegra_dc *dc, struct i2c_msg *msgs,
994 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
996 return i2c_transfer(hdmi->i2c_info.client->adapter, msgs, num);
999 /* This is needed to obtain audio channel info before HAL
1000 * opens pcm stream and copies edid audio data */
1001 static int tegra_hdmi_get_max_channels(void)
1003 struct tegra_dc_hdmi_data *hdmi = dc_hdmi;
1006 u8 max_channels = 0;
1012 if (!hdmi->eld_retrieved)
1015 if (!hdmi->dc->enabled)
1018 for (i = 0; i < hdmi->eld.sad_count; i++) {
1019 sad_channels = max(((hdmi->eld.sad[AUDIO_SAD_BYTE_SIZE*i]
1021 sad_format = ((hdmi->eld.sad[AUDIO_SAD_BYTE_SIZE*i]
1023 if (sad_format == AUDIO_CODING_TYPE_LPCM)
1024 max_channels = max_channels > sad_channels ?
1025 max_channels : sad_channels;
1027 return max_channels;
1030 static int tegra_dc_hdmi_init(struct tegra_dc *dc)
1032 struct tegra_dc_hdmi_data *hdmi;
1033 struct resource *res;
1034 struct resource hdmi_res;
1035 struct resource *base_res;
1038 struct clk *clk = NULL;
1039 struct clk *disp1_clk = NULL;
1040 struct clk *disp2_clk = NULL;
1041 struct tegra_hdmi_out *hdmi_out = NULL;
1042 struct i2c_adapter *adapter = NULL;
1044 struct device_node *np = dc->ndev->dev.of_node;
1046 struct device_node *np_hdmi =
1047 of_find_node_by_path(HDMI_NODE);
1049 struct device_node *np_hdmi = NULL;
1051 struct device_node *np_panel = NULL;
1053 bool virtual_edid = false;
1054 hdmi = kzalloc(sizeof(*hdmi), GFP_KERNEL);
1056 of_node_put(np_hdmi);
1060 if (np_hdmi && of_device_is_available(np_hdmi)) {
1061 of_address_to_resource(np_hdmi, 0, &hdmi_res);
1063 np_panel = tegra_get_panel_node_out_type_check(dc,
1065 if (np_panel && of_device_is_available(np_panel)) {
1066 virtual_edid = of_property_read_bool(np_panel,
1068 of_node_put(np_panel);
1072 of_node_put(np_panel);
1076 res = platform_get_resource_byname(dc->ndev,
1077 IORESOURCE_MEM, "hdmi_regs");
1080 dev_err(&dc->ndev->dev, "hdmi: no mem resource\n");
1085 base_res = request_mem_region(res->start,
1086 resource_size(res), dc->ndev->name);
1088 dev_err(&dc->ndev->dev, "hdmi: request_mem_region failed\n");
1093 base = ioremap(res->start, resource_size(res));
1095 dev_err(&dc->ndev->dev, "hdmi: registers can't be mapped\n");
1097 goto err_release_resource_reg;
1100 clk = clk_get(&dc->ndev->dev, "hdmi");
1101 if (IS_ERR_OR_NULL(clk)) {
1102 dev_err(&dc->ndev->dev, "hdmi: can't get clock\n");
1104 goto err_iounmap_reg;
1107 disp1_clk = clk_get_sys("tegradc.0", NULL);
1108 if (IS_ERR_OR_NULL(disp1_clk)) {
1109 dev_err(&dc->ndev->dev, "hdmi: can't disp1 clock\n");
1114 disp2_clk = clk_get_sys("tegradc.1", NULL);
1115 if (IS_ERR_OR_NULL(disp2_clk)) {
1116 dev_err(&dc->ndev->dev, "hdmi: can't disp2 clock\n");
1121 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1122 hdmi->hda_clk = clk_get_sys("tegra30-hda", "hda");
1123 if (IS_ERR_OR_NULL(hdmi->hda_clk)) {
1124 dev_err(&dc->ndev->dev, "hdmi: can't get hda clock\n");
1129 hdmi->hda2codec_clk = clk_get_sys("tegra30-hda", "hda2codec");
1130 if (IS_ERR_OR_NULL(hdmi->hda2codec_clk)) {
1131 dev_err(&dc->ndev->dev, "hdmi: can't get hda2codec clock\n");
1136 hdmi->hda2hdmi_clk = clk_get_sys("tegra30-hda", "hda2hdmi");
1137 if (IS_ERR_OR_NULL(hdmi->hda2hdmi_clk)) {
1138 dev_err(&dc->ndev->dev, "hdmi: can't get hda2hdmi clock\n");
1144 /* Get the pointer of board file settings */
1145 hdmi_out = dc->pdata->default_out->hdmi_out;
1147 memcpy(&hdmi->info, hdmi_out, sizeof(hdmi->info));
1150 hdmi->edid = tegra_edid_create(dc, tegra_dc_edid_blob);
1152 hdmi->edid = tegra_edid_create(dc, tegra_dc_hdmi_i2c_xfer);
1154 if (IS_ERR_OR_NULL(hdmi->edid)) {
1155 dev_err(&dc->ndev->dev, "hdmi: can't create edid\n");
1156 err = PTR_ERR(hdmi->edid);
1159 tegra_dc_set_edid(dc, hdmi->edid);
1161 adapter = i2c_get_adapter(dc->out->dcc_bus);
1163 pr_err("can't get adpater for bus %d\n", dc->out->dcc_bus);
1168 hdmi->i2c_info.board.addr = 0x50;
1169 hdmi->i2c_info.board.platform_data = hdmi;
1170 strlcpy(hdmi->i2c_info.board.type, "tegra_hdmi",
1171 sizeof(hdmi->i2c_info.board.type));
1173 hdmi->i2c_info.client = i2c_new_device(adapter, &hdmi->i2c_info.board);
1174 i2c_put_adapter(adapter);
1176 if (!hdmi->i2c_info.client) {
1177 pr_err("can't create new device\n");
1182 #ifdef CONFIG_TEGRA_NVHDCP
1183 hdmi->nvhdcp = tegra_nvhdcp_create(hdmi, tegra_dc_which_sor(dc),
1185 if (IS_ERR_OR_NULL(hdmi->nvhdcp)) {
1186 dev_err(&dc->ndev->dev, "hdmi: can't create nvhdcp\n");
1187 err = PTR_ERR(hdmi->nvhdcp);
1188 goto err_edid_destroy;
1191 hdmi->nvhdcp = NULL;
1193 hdmi_state_machine_init(hdmi);
1197 hdmi->base_res = base_res;
1199 hdmi->disp1_clk = disp1_clk;
1200 hdmi->disp2_clk = disp2_clk;
1201 hdmi->suspended = false;
1202 hdmi->eld_retrieved = false;
1203 hdmi->clk_enabled = false;
1204 hdmi->audio_freq = 44100;
1205 hdmi->audio_source = AUTO;
1206 rt_mutex_init(&hdmi->suspend_lock);
1208 #ifdef CONFIG_SWITCH
1209 hdmi->hpd_switch.name = "hdmi";
1210 ret = switch_dev_register(&hdmi->hpd_switch);
1213 ret = device_create_file(hdmi->hpd_switch.dev,
1214 &dev_attr_underscan);
1217 hdmi->audio_switch.name = "hdmi_audio";
1218 ret = switch_dev_register(&hdmi->audio_switch);
1221 ret = device_create_file(hdmi->audio_switch.dev,
1222 &dev_attr_hdmi_audio);
1226 dc->out->depth = 24;
1228 tegra_dc_set_outdata(dc, hdmi);
1231 /* boards can select default content protection policy */
1232 if (dc->out->flags & TEGRA_DC_OUT_NVHDCP_POLICY_ON_DEMAND)
1233 tegra_nvhdcp_set_policy(hdmi->nvhdcp,
1234 TEGRA_NVHDCP_POLICY_ON_DEMAND);
1236 tegra_nvhdcp_set_policy(hdmi->nvhdcp,
1237 TEGRA_NVHDCP_POLICY_ALWAYS_ON);
1239 tegra_dc_hdmi_debug_create(hdmi);
1241 if (tegra_dc_hotplug_supported(dc)) {
1242 err = gpio_request(dc->out->hotplug_gpio, "hdmi_hpd");
1244 dev_err(&dc->ndev->dev, "hdmi: hpd gpio_request failed\n");
1245 goto err_nvhdcp_destroy;
1248 gpio_direction_input(dc->out->hotplug_gpio);
1250 /* TODO: support non-hotplug */
1251 ret = request_threaded_irq(gpio_to_irq(dc->out->hotplug_gpio),
1252 NULL, tegra_dc_hdmi_irq,
1253 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
1255 dev_name(&dc->ndev->dev), dc);
1258 dev_err(&dc->ndev->dev,
1259 "hdmi: request_irq %d failed - %d\n",
1260 gpio_to_irq(dc->out->hotplug_gpio),
1266 if (hdmi->info.hdmi2fpd_bridge_enable)
1267 hdmi2fpd_init(hdmi);
1269 /* NOTE: Below code is applicable to L4T or embedded systems and is
1270 * protected accordingly. This section early enables DC with first mode
1271 * from the monitor specs.
1272 * In case there is no hotplug we are falling back
1273 * to default VGA mode.
1275 if ((config_enabled(CONFIG_FRAMEBUFFER_CONSOLE) ||
1276 ((dc->pdata->flags & TEGRA_DC_FLAG_ENABLED) &&
1277 (dc->pdata->flags & TEGRA_DC_FLAG_SET_EARLY_MODE))) &&
1278 dc->out && (dc->out->type == TEGRA_DC_OUT_HDMI)) {
1279 struct fb_monspecs specs;
1280 if (tegra_dc_hpd(dc) && (!dc->initialized)) {
1281 if (!tegra_edid_get_monspecs(hdmi->edid, &specs))
1282 tegra_dc_set_fb_mode(dc, specs.modedb, false);
1283 kfree(specs.modedb);
1285 tegra_dc_set_fb_mode(dc, &tegra_dc_vga_mode, false);
1288 /*Add sysfs node to query hdmi audio channels on startup*/
1289 hdmi_audio = kobject_create_and_add("hdmi_audio_channels", kernel_kobj);
1291 pr_warn("kobject create_and_add hdmi_audio_channels failed\n");
1292 of_node_put(np_hdmi);
1295 ret = sysfs_create_file(hdmi_audio, &hdmi_audio_channel_config.attr);
1297 pr_warn("sysfs create file hdmi_audio_channels failed\n");
1298 of_node_put(np_hdmi);
1301 of_node_put(np_hdmi);
1305 if (tegra_dc_hotplug_supported(dc))
1306 gpio_free(dc->out->hotplug_gpio);
1309 tegra_nvhdcp_destroy(hdmi->nvhdcp);
1310 #ifdef CONFIG_TEGRA_NVHDCP
1313 tegra_edid_destroy(hdmi->edid);
1315 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1316 if (!IS_ERR_OR_NULL(hdmi->hda2hdmi_clk))
1317 clk_put(hdmi->hda2hdmi_clk);
1318 if (!IS_ERR_OR_NULL(hdmi->hda2codec_clk))
1319 clk_put(hdmi->hda2codec_clk);
1320 if (!IS_ERR_OR_NULL(hdmi->hda_clk))
1321 clk_put(hdmi->hda_clk);
1323 if (!IS_ERR_OR_NULL(disp2_clk))
1325 if (!IS_ERR_OR_NULL(disp1_clk))
1327 if (!IS_ERR_OR_NULL(clk))
1331 err_release_resource_reg:
1332 release_resource(base_res);
1335 of_node_put(np_hdmi);
1339 static void tegra_dc_hdmi_destroy(struct tegra_dc *dc)
1341 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1343 if (tegra_dc_hotplug_supported(dc))
1344 free_irq(gpio_to_irq(dc->out->hotplug_gpio), dc);
1345 hdmi_state_machine_shutdown();
1347 if (hdmi->info.hdmi2fpd_bridge_enable)
1348 hdmi2fpd_destroy(hdmi);
1350 i2c_release_client(hdmi->i2c_info.client);
1351 #ifdef CONFIG_SWITCH
1352 switch_dev_unregister(&hdmi->hpd_switch);
1353 switch_dev_unregister(&hdmi->audio_switch);
1355 iounmap(hdmi->base);
1356 release_resource(hdmi->base_res);
1357 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1358 clk_put(hdmi->hda2hdmi_clk);
1359 clk_put(hdmi->hda2codec_clk);
1360 clk_put(hdmi->hda_clk);
1363 clk_put(hdmi->disp1_clk);
1364 clk_put(hdmi->disp2_clk);
1365 tegra_edid_destroy(hdmi->edid);
1366 tegra_nvhdcp_destroy(hdmi->nvhdcp);
1372 static void tegra_dc_hdmi_setup_audio_fs_tables(struct tegra_dc *dc)
1374 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1376 unsigned freqs[] = {
1386 for (i = 0; i < ARRAY_SIZE(freqs); i++) {
1387 unsigned f = freqs[i];
1388 unsigned eight_half;
1401 eight_half = (8 * HDMI_AUDIOCLK_FREQ) / (f * 128);
1402 tegra_hdmi_writel(hdmi, AUDIO_FS_LOW(eight_half - delta) |
1403 AUDIO_FS_HIGH(eight_half + delta),
1404 HDMI_NV_PDISP_AUDIO_FS(i));
1408 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1409 static void tegra_dc_hdmi_setup_eld_buff(struct tegra_dc *dc)
1413 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1414 void __iomem *eld_buf_addr;
1415 int baseline_eld_len = (HDMI_ELD_MONITOR_NAME_INDEX -
1416 HDMI_ELD_CEA_VER_MNL_INDEX +
1418 (3 * hdmi->eld.sad_count));
1419 u8 baseline_eld_len_val;
1421 eld_buf_addr = hdmi->base + HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0 * 4;
1423 /* the baseline_eld_len needs to be written as a
1424 * multiple of DWORDS (4 bytes).
1426 BUG_ON(baseline_eld_len > MAX_BASELINE_ELD_SIZE);
1427 baseline_eld_len_val = DIV_ROUND_UP(baseline_eld_len, 4);
1429 /* program ELD stuff. we must write all bytes of the
1430 * ELD buffer. when hda_eld.c tries to read it back,
1431 * it's query of the size returns not how many valid
1432 * were written, but the entire size, and will try to
1433 * read all the bytes in the buffer. it will fail
1434 * if any invalid bytes are read back, so we have to
1435 * fill the entire buffer with something, even if it's
1438 for (i = 0; i < HDMI_ELD_BUF_SIZE; i++) {
1440 case HDMI_ELD_VER_INDEX:
1441 tmp = (hdmi->eld.eld_ver << 3);
1442 tegra_hdmi_writel(hdmi, (i << 8) | tmp,
1443 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1445 case HDMI_ELD_RESERVED1_INDEX:
1446 case HDMI_ELD_RESERVED2_INDEX:
1447 /* must write a dummy byte or else hda_eld.c
1448 * will get an error when it tries to read a
1449 * complete eld buffer
1451 tegra_hdmi_writel(hdmi, (i << 8),
1452 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1454 case HDMI_ELD_BASELINE_LEN_INDEX:
1455 tegra_hdmi_writel(hdmi, (i << 8) | baseline_eld_len_val,
1456 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1458 case HDMI_ELD_CEA_VER_MNL_INDEX:
1459 tmp = (hdmi->eld.cea_edid_ver << 5);
1460 tmp |= (hdmi->eld.mnl & 0x1f);
1461 tegra_hdmi_writel(hdmi, (i << 8) | tmp,
1462 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1464 case HDMI_ELD_SAD_CNT_CON_TYP_SAI_HDCP_INDEX:
1465 tmp = (hdmi->eld.sad_count << 4);
1466 tmp |= (hdmi->eld.conn_type & 0xC);
1467 tmp |= (hdmi->eld.support_ai & 0x2);
1468 tmp |= (hdmi->eld.support_hdcp & 0x1);
1469 tegra_hdmi_writel(hdmi, (i << 8) | tmp,
1470 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1472 case HDMI_ELD_AUD_SYNC_DELAY_INDEX:
1473 tegra_hdmi_writel(hdmi, (i << 8) | (hdmi->eld.aud_synch_delay),
1474 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1476 case HDMI_ELD_SPK_ALLOC_INDEX:
1477 tegra_hdmi_writel(hdmi, (i << 8) | (hdmi->eld.spk_alloc),
1478 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1480 case HDMI_ELD_PORT_ID_INDEX:
1481 i = tegra_hdmi_writel_eld_buf(hdmi, hdmi->eld.port_id,
1482 8, i, eld_buf_addr);
1484 case HDMI_ELD_MANF_NAME_INDEX:
1485 i = tegra_hdmi_writel_eld_buf(hdmi,
1486 hdmi->eld.manufacture_id,
1487 2, i, eld_buf_addr);
1489 case HDMI_ELD_PRODUCT_CODE_INDEX:
1490 i = tegra_hdmi_writel_eld_buf(hdmi,
1491 hdmi->eld.product_id,
1492 2, i, eld_buf_addr);
1494 case HDMI_ELD_MONITOR_NAME_INDEX:
1495 /* write the eld.mnl bytes of the monitor name,
1496 * followed immediately the short audio descriptor bytes
1498 i = tegra_hdmi_writel_eld_buf(hdmi,
1499 hdmi->eld.monitor_name,
1502 i = tegra_hdmi_writel_eld_buf(hdmi, hdmi->eld.sad,
1503 hdmi->eld.sad_count * 3,
1507 tegra_hdmi_writel(hdmi, (i << 8),
1508 HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR_0);
1512 /* set presence and valid bit */
1513 tegra_hdmi_writel(hdmi, 3, HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE_0);
1517 static int tegra_dc_hdmi_setup_audio(struct tegra_dc *dc, unsigned audio_freq,
1518 unsigned audio_source)
1520 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1521 const struct tegra_hdmi_audio_config *config;
1522 unsigned long audio_n;
1523 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1524 unsigned long reg_addr = 0;
1526 unsigned a_source = AUDIO_CNTRL0_SOURCE_SELECT_AUTO;
1528 if (HDA == audio_source)
1529 a_source = AUDIO_CNTRL0_SOURCE_SELECT_HDAL;
1530 else if (SPDIF == audio_source)
1531 a_source = AUDIO_CNTRL0_SOURCE_SELECT_SPDIF;
1533 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1534 if (hdmi->audio_inject_null)
1535 a_source |= AUDIO_CNTRL0_INJECT_NULLSMPL;
1537 tegra_hdmi_writel(hdmi,a_source,
1538 HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_0);
1539 tegra_hdmi_writel(hdmi,
1540 AUDIO_CNTRL0_ERROR_TOLERANCE(6) |
1541 AUDIO_CNTRL0_FRAMES_PER_BLOCK(0xc0),
1542 HDMI_NV_PDISP_AUDIO_CNTRL0);
1543 #if !defined(CONFIG_ARCH_TEGRA_3x_SOC)
1544 tegra_hdmi_writel(hdmi, (1 << HDMI_AUDIO_HBR_ENABLE_SHIFT) |
1545 tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_AUDIO_SPARE0_0),
1546 HDMI_NV_PDISP_SOR_AUDIO_SPARE0_0);
1549 tegra_hdmi_writel(hdmi,
1550 AUDIO_CNTRL0_ERROR_TOLERANCE(6) |
1551 AUDIO_CNTRL0_FRAMES_PER_BLOCK(0xc0) |
1553 HDMI_NV_PDISP_AUDIO_CNTRL0);
1555 config = tegra_hdmi_get_audio_config(audio_freq, dc->mode.pclk);
1557 dev_err(&dc->ndev->dev,
1558 "hdmi: can't set audio to %d at %d pix_clock",
1559 audio_freq, dc->mode.pclk);
1563 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_HDMI_ACR_CTRL);
1565 audio_n = AUDIO_N_RESETF | AUDIO_N_GENERATE_ALTERNALTE |
1566 AUDIO_N_VALUE(config->n - 1);
1567 tegra_hdmi_writel(hdmi, audio_n, HDMI_NV_PDISP_AUDIO_N);
1569 tegra_hdmi_writel(hdmi, ACR_SUBPACK_N(config->n) | ACR_ENABLE,
1570 HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_HIGH);
1572 tegra_hdmi_writel(hdmi, ACR_SUBPACK_CTS(config->cts),
1573 HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW);
1575 tegra_hdmi_writel(hdmi, SPARE_HW_CTS | SPARE_FORCE_SW_CTS |
1576 SPARE_CTS_RESET_VAL(1),
1577 HDMI_NV_PDISP_HDMI_SPARE);
1579 audio_n &= ~AUDIO_N_RESETF;
1580 tegra_hdmi_writel(hdmi, audio_n, HDMI_NV_PDISP_AUDIO_N);
1582 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1583 switch (audio_freq) {
1584 case AUDIO_FREQ_32K:
1585 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0320_0;
1587 case AUDIO_FREQ_44_1K:
1588 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0441_0;
1590 case AUDIO_FREQ_48K:
1591 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0480_0;
1593 case AUDIO_FREQ_88_2K:
1594 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0882_0;
1596 case AUDIO_FREQ_96K:
1597 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0960_0;
1599 case AUDIO_FREQ_176_4K:
1600 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_1764_0;
1602 case AUDIO_FREQ_192K:
1603 reg_addr = HDMI_NV_PDISP_SOR_AUDIO_AVAL_1920_0;
1607 tegra_hdmi_writel(hdmi, config->aval, reg_addr);
1609 tegra_dc_hdmi_setup_audio_fs_tables(dc);
1614 int tegra_hdmi_setup_audio_freq_source(unsigned audio_freq, unsigned audio_source)
1616 struct tegra_dc_hdmi_data *hdmi = dc_hdmi;
1621 /* check for know freq */
1622 if (AUDIO_FREQ_32K == audio_freq ||
1623 AUDIO_FREQ_44_1K== audio_freq ||
1624 AUDIO_FREQ_48K== audio_freq ||
1625 AUDIO_FREQ_88_2K== audio_freq ||
1626 AUDIO_FREQ_96K== audio_freq ||
1627 AUDIO_FREQ_176_4K== audio_freq ||
1628 AUDIO_FREQ_192K== audio_freq) {
1629 /* If we can program HDMI, then proceed */
1630 if (hdmi->clk_enabled) {
1631 tegra_dc_io_start(hdmi->dc);
1632 tegra_dc_hdmi_setup_audio(hdmi->dc, audio_freq,audio_source);
1633 tegra_dc_io_end(hdmi->dc);
1636 /* Store it for using it in enable */
1637 hdmi->audio_freq = audio_freq;
1638 hdmi->audio_source = audio_source;
1645 EXPORT_SYMBOL(tegra_hdmi_setup_audio_freq_source);
1647 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1648 int tegra_hdmi_audio_null_sample_inject(bool on)
1650 struct tegra_dc_hdmi_data *hdmi = dc_hdmi;
1651 unsigned int val = 0;
1656 if (hdmi->audio_inject_null != on) {
1657 hdmi->audio_inject_null = on;
1658 if (hdmi->clk_enabled) {
1659 val = tegra_hdmi_readl(hdmi,
1660 HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_0);
1661 val &= ~AUDIO_CNTRL0_INJECT_NULLSMPL;
1663 val |= AUDIO_CNTRL0_INJECT_NULLSMPL;
1664 tegra_hdmi_writel(hdmi,val,
1665 HDMI_NV_PDISP_SOR_AUDIO_CNTRL0_0);
1671 EXPORT_SYMBOL(tegra_hdmi_audio_null_sample_inject);
1673 int tegra_hdmi_setup_hda_presence()
1675 struct tegra_dc_hdmi_data *hdmi = dc_hdmi;
1680 if (hdmi->clk_enabled && hdmi->eld_retrieved) {
1681 /* If HDA_PRESENCE is already set reset it */
1682 tegra_dc_unpowergate_locked(hdmi->dc);
1683 if (tegra_hdmi_readl(hdmi,
1684 HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE_0))
1685 tegra_hdmi_writel(hdmi, 0,
1686 HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE_0);
1688 tegra_dc_hdmi_setup_eld_buff(hdmi->dc);
1689 tegra_dc_powergate_locked(hdmi->dc);
1695 EXPORT_SYMBOL(tegra_hdmi_setup_hda_presence);
1698 static void tegra_dc_hdmi_write_infopack(struct tegra_dc *dc, int header_reg,
1699 u8 type, u8 version, void *data, int len)
1701 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1702 u32 subpack[2]; /* extra byte for zero padding of subpack */
1706 /* first byte of data is the checksum */
1707 csum = type + version + len - 1;
1708 for (i = 1; i < len; i++)
1709 csum +=((u8 *)data)[i];
1710 ((u8 *)data)[0] = 0x100 - csum;
1712 tegra_hdmi_writel(hdmi, INFOFRAME_HEADER_TYPE(type) |
1713 INFOFRAME_HEADER_VERSION(version) |
1714 INFOFRAME_HEADER_LEN(len - 1),
1717 /* The audio inforame only has one set of subpack registers. The hdmi
1718 * block pads the rest of the data as per the spec so we have to fixup
1719 * the length before filling in the subpacks.
1721 if (header_reg == HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER)
1724 /* each subpack 7 bytes devided into:
1725 * subpack_low - bytes 0 - 3
1726 * subpack_high - bytes 4 - 6 (with byte 7 padded to 0x00)
1728 for (i = 0; i < len; i++) {
1729 int subpack_idx = i % 7;
1731 if (subpack_idx == 0)
1732 memset(subpack, 0x0, sizeof(subpack));
1734 ((u8 *)subpack)[subpack_idx] = ((u8 *)data)[i];
1736 if (subpack_idx == 6 || (i + 1 == len)) {
1737 int reg = header_reg + 1 + (i / 7) * 2;
1739 tegra_hdmi_writel(hdmi, subpack[0], reg);
1740 tegra_hdmi_writel(hdmi, subpack[1], reg + 1);
1745 static int tegra_dc_find_cea_vic(const struct tegra_dc_mode *mode)
1747 struct fb_videomode m;
1751 tegra_dc_to_fb_videomode(&m, mode);
1753 m.vmode &= ~FB_VMODE_STEREO_MASK; /* stereo modes have the same VICs */
1755 for (i = 1; i < CEA_861_D_MODEDB_SIZE; i++) {
1756 const struct fb_videomode *curr = &cea_modes[i];
1758 if (!fb_mode_is_equal(&m, curr))
1763 /* if either flag is set, then match is required */
1764 if (curr->flag & (FB_FLAG_RATIO_4_3 | FB_FLAG_RATIO_16_9)) {
1765 if (m.flag & curr->flag & FB_FLAG_RATIO_4_3)
1767 else if (m.flag & curr->flag & FB_FLAG_RATIO_16_9)
1776 static int tegra_dc_find_hdmi_vic(const struct tegra_dc_mode *mode)
1778 struct fb_videomode m;
1781 tegra_dc_to_fb_videomode(&m, mode);
1783 for (i = 1; i < HDMI_EXT_MODEDB_SIZE; i++) {
1784 const struct fb_videomode *curr = &hdmi_ext_modes[i];
1786 if (fb_mode_is_equal(&m, curr))
1792 static void tegra_dc_hdmi_disable_generic_infoframe(struct tegra_dc *dc)
1794 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1797 val = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1798 val &= ~GENERIC_CTRL_ENABLE;
1799 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1802 /* return 1 if generic infoframe is used, 0 if not used */
1803 static int tegra_dc_hdmi_setup_hdmi_vic_infoframe(struct tegra_dc *dc, bool dvi)
1805 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1806 struct hdmi_extres_infoframe extres;
1812 hdmi_vic = tegra_dc_find_hdmi_vic(&dc->mode);
1816 memset(&extres, 0x0, sizeof(extres));
1819 extres.regid0 = 0x03;
1820 extres.regid1 = 0x0c;
1821 extres.regid2 = 0x00;
1822 extres.hdmi_video_format = 1; /* Extended Resolution Format */
1823 extres.hdmi_vic = hdmi_vic;
1825 tegra_dc_hdmi_write_infopack(dc,
1826 HDMI_NV_PDISP_HDMI_GENERIC_HEADER,
1827 HDMI_INFOFRAME_TYPE_VENDOR, HDMI_VENDOR_VERSION,
1829 val = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1830 val |= GENERIC_CTRL_ENABLE;
1831 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1835 static void tegra_dc_hdmi_setup_avi_infoframe(struct tegra_dc *dc, bool dvi)
1837 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1838 struct hdmi_avi_infoframe avi;
1839 unsigned int blender_reg;
1842 tegra_hdmi_writel(hdmi, 0x0,
1843 HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
1847 memset(&avi, 0x0, sizeof(avi));
1849 /* Indicate active format info is valid. */
1851 avi.r = HDMI_AVI_R_SAME;
1853 #if !defined(CONFIG_TEGRA_DC_BLENDER_GEN2)
1854 blender_reg = DC_DISP_BORDER_COLOR;
1856 blender_reg = DC_DISP_BLEND_BACKGROUND_COLOR;
1859 if ((dc->mode.h_active == 720) && ((dc->mode.v_active == 480) || (dc->mode.v_active == 576)))
1860 tegra_dc_writel(dc, 0x00101010, blender_reg);
1862 tegra_dc_writel(dc, 0x00000000, blender_reg);
1864 avi.vic = tegra_dc_find_cea_vic(&dc->mode);
1865 avi.m = dc->mode.avi_m;
1866 /*Enable YUV format for 4k support*/
1867 if (dc->mode.vmode & (FB_VMODE_Y420 | FB_VMODE_Y420_ONLY))
1869 else if (dc->mode.vmode & FB_VMODE_Y422)
1874 if (tegra_edid_underscan_supported(hdmi->edid))
1875 avi.s = HDMI_AVI_S_UNDERSCAN;
1876 dev_dbg(&dc->ndev->dev, "HDMI AVI vic=%d m=%d\n", avi.vic, avi.m);
1877 avi.s = HDMI_AVI_S_UNDERSCAN;
1879 tegra_dc_hdmi_write_infopack(dc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_HEADER,
1880 HDMI_INFOFRAME_TYPE_AVI,
1884 tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE,
1885 HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
1888 static void tegra_dc_hdmi_setup_stereo_infoframe(struct tegra_dc *dc)
1890 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1891 struct hdmi_stereo_infoframe stereo;
1894 WARN(!dc->mode.stereo_mode,
1895 "function assumes 3D/stereo mode is disabled\n");
1897 memset(&stereo, 0x0, sizeof(stereo));
1899 stereo.regid0 = 0x03;
1900 stereo.regid1 = 0x0c;
1901 stereo.regid2 = 0x00;
1902 stereo.hdmi_video_format = 2; /* 3D_Structure present */
1903 #ifndef CONFIG_TEGRA_HDMI_74MHZ_LIMIT
1904 stereo._3d_structure = 0; /* frame packing */
1906 stereo._3d_structure = 8; /* side-by-side (half) */
1907 stereo._3d_ext_data = 0; /* something which fits into 00XX bit req */
1910 tegra_dc_hdmi_write_infopack(dc, HDMI_NV_PDISP_HDMI_GENERIC_HEADER,
1911 HDMI_INFOFRAME_TYPE_VENDOR,
1912 HDMI_VENDOR_VERSION,
1915 val = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1916 val |= GENERIC_CTRL_ENABLE;
1918 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
1921 static void tegra_dc_hdmi_setup_audio_infoframe(struct tegra_dc *dc, bool dvi)
1923 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1924 struct hdmi_audio_infoframe audio;
1927 tegra_hdmi_writel(hdmi, 0x0,
1928 HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
1932 memset(&audio, 0x0, sizeof(audio));
1934 audio.cc = HDMI_AUDIO_CC_2;
1935 tegra_dc_hdmi_write_infopack(dc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER,
1936 HDMI_INFOFRAME_TYPE_AUDIO,
1938 &audio, sizeof(audio));
1940 tegra_hdmi_writel(hdmi, INFOFRAME_CTRL_ENABLE,
1941 HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
1944 static void tegra_dc_hdmi_setup_tmds(struct tegra_dc_hdmi_data *hdmi,
1945 const struct tmds_config *tc)
1947 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
1951 tegra_hdmi_writel(hdmi, tc->pll0, HDMI_NV_PDISP_SOR_PLL0);
1952 tegra_hdmi_writel(hdmi, tc->pll1, HDMI_NV_PDISP_SOR_PLL1);
1954 tegra_hdmi_writel(hdmi, tc->pe_current, HDMI_NV_PDISP_PE_CURRENT);
1956 #if defined(CONFIG_ARCH_TEGRA_11x_SOC) || defined(CONFIG_ARCH_TEGRA_12x_SOC)
1957 tegra_hdmi_writel(hdmi, tc->drive_current,
1958 HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT);
1959 val = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PAD_CTLS0);
1960 val |= DRIVE_CURRENT_FUSE_OVERRIDE_T11x;
1961 if (MAJOR(tc->version) >= 1) {
1962 val &= tc->pad_ctls0_mask;
1963 val |= tc->pad_ctls0_setting;
1965 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_PAD_CTLS0);
1967 tegra_hdmi_writel(hdmi, tc->peak_current,
1968 HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT);
1969 #elif defined(CONFIG_ARCH_TEGRA_14x_SOC)
1970 tegra_hdmi_writel(hdmi, tc->drive_current,
1971 HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT);
1972 tegra_hdmi_writel(hdmi, 0x800034bb, HDMI_NV_PDISP_SOR_PAD_CTLS0);
1974 tegra_hdmi_writel(hdmi, tc->peak_current,
1975 HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT);
1977 tegra_hdmi_writel(hdmi, tc->drive_current | DRIVE_CURRENT_FUSE_OVERRIDE,
1978 HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT);
1982 void tegra_dc_hdmi_setup_audio_and_infoframes(struct tegra_dc *dc)
1987 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
1990 err = tegra_dc_hdmi_setup_audio(dc, hdmi->audio_freq,
1991 hdmi->audio_source);
1997 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
1998 tegra_dc_hdmi_setup_eld_buff(dc);
2001 rekey = HDMI_REKEY_DEFAULT;
2002 val = HDMI_CTRL_REKEY(rekey);
2003 val |= HDMI_CTRL_MAX_AC_PACKET((dc->mode.h_sync_width +
2004 dc->mode.h_back_porch +
2005 dc->mode.h_front_porch -
2008 val |= HDMI_CTRL_ENABLE;
2009 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_HDMI_CTRL);
2012 tegra_hdmi_writel(hdmi, 0x0,
2013 HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
2015 tegra_hdmi_writel(hdmi, GENERIC_CTRL_AUDIO,
2016 HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
2018 tegra_dc_hdmi_setup_avi_infoframe(dc, hdmi->dvi);
2020 if (dc->mode.stereo_mode)
2021 tegra_dc_hdmi_setup_stereo_infoframe(dc);
2022 else if (!tegra_dc_hdmi_setup_hdmi_vic_infoframe(dc, hdmi->dvi))
2023 tegra_dc_hdmi_disable_generic_infoframe(dc);
2025 tegra_dc_hdmi_setup_audio_infoframe(dc, hdmi->dvi);
2028 static void tegra_dc_hdmi_enable(struct tegra_dc *dc)
2030 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
2032 int dispclk_div_8_2;
2036 const struct tmds_config *tmds_ptr;
2040 /* enable power, clocks, resets, etc. */
2042 /* The upstream DC needs to be clocked for accesses to HDMI to not
2043 * hard lock the system. Because we don't know if HDMI is connected
2044 * to disp1 or disp2 we need to enable both until we set the DC mux.
2046 clk_prepare_enable(hdmi->disp1_clk);
2047 clk_prepare_enable(hdmi->disp2_clk);
2049 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
2050 /* Enabling HDA clocks before asserting HDA PD and ELDV bits */
2051 clk_prepare_enable(hdmi->hda_clk);
2052 clk_prepare_enable(hdmi->hda2codec_clk);
2053 clk_prepare_enable(hdmi->hda2hdmi_clk);
2056 /* Reseting HDMI clock would cause visible display reset during boot
2057 * if bootloader set an image already. Skip such operation if HDMI
2058 * is already running on desired clock rate.
2060 if (clk_get_rate(hdmi->clk) == dc->mode.pclk) {
2061 pr_info("%s: HDMI clock already configured to "
2062 "target frequency, skipping clk setup.\n", __func__);
2063 clk_prepare_enable(hdmi->clk);
2065 tegra_dc_setup_clk(dc, hdmi->clk);
2066 clk_set_rate(hdmi->clk, dc->mode.pclk);
2068 clk_prepare_enable(hdmi->clk);
2069 tegra_periph_reset_assert(hdmi->clk);
2071 tegra_periph_reset_deassert(hdmi->clk);
2074 /* TODO: copy HDCP keys from KFUSE to HDMI */
2076 /* Program display timing registers: handled by dc */
2078 /* program HDMI registers and SOR sequencer */
2080 tegra_dc_io_start(dc);
2081 tegra_dc_writel(dc, VSYNC_H_POSITION(1), DC_DISP_DISP_TIMING_OPTIONS);
2083 dc->out->depth = 24;
2084 dc->out->dither = TEGRA_DC_DISABLE_DITHER;
2085 tegra_dc_set_color_control(dc);
2087 /* video_preamble uses h_pulse2 */
2088 pulse_start = dc->mode.h_ref_to_sync + dc->mode.h_sync_width +
2089 dc->mode.h_back_porch - 10;
2090 tegra_dc_writel(dc, H_PULSE_2_ENABLE, DC_DISP_DISP_SIGNAL_OPTIONS0);
2093 PULSE_POLARITY_HIGH |
2094 PULSE_QUAL_VACTIVE |
2096 DC_DISP_H_PULSE2_CONTROL);
2097 tegra_dc_writel(dc, PULSE_START(pulse_start) | PULSE_END(pulse_start + 8),
2098 DC_DISP_H_PULSE2_POSITION_A);
2100 tegra_hdmi_writel(hdmi,
2101 VSYNC_WINDOW_END(0x210) |
2102 VSYNC_WINDOW_START(0x200) |
2103 VSYNC_WINDOW_ENABLE,
2104 HDMI_NV_PDISP_HDMI_VSYNC_WINDOW);
2106 if ((dc->mode.h_active == 720) && ((dc->mode.v_active == 480) || (dc->mode.v_active == 576)))
2107 tegra_hdmi_writel(hdmi,
2108 (dc->ctrl_num ? HDMI_SRC_DISPLAYB :
2109 HDMI_SRC_DISPLAYA) |
2110 ARM_VIDEO_RANGE_FULL,
2111 HDMI_NV_PDISP_INPUT_CONTROL);
2113 tegra_hdmi_writel(hdmi,
2114 (dc->ctrl_num ? HDMI_SRC_DISPLAYB :
2115 HDMI_SRC_DISPLAYA) |
2116 ARM_VIDEO_RANGE_LIMITED,
2117 HDMI_NV_PDISP_INPUT_CONTROL);
2119 clk_disable_unprepare(hdmi->disp1_clk);
2120 clk_disable_unprepare(hdmi->disp2_clk);
2122 dispclk_div_8_2 = clk_get_rate(hdmi->clk) / 1000000 * 4;
2123 tegra_hdmi_writel(hdmi,
2124 SOR_REFCLK_DIV_INT(dispclk_div_8_2 >> 2) |
2125 SOR_REFCLK_DIV_FRAC(dispclk_div_8_2),
2126 HDMI_NV_PDISP_SOR_REFCLK);
2128 hdmi->clk_enabled = true;
2130 edid_read = hdmi->eld_retrieved;
2131 /* on first boot, we haven't read EDID yet so
2132 * we don't know what to setup yet. we'll
2133 * call audio and infoframes setup in hdmi worker
2134 * after EDID has been read.
2137 /* after boot, this is called by hwc via ioctl
2138 * blank/unblank, which is done after EDID has
2141 tegra_dc_hdmi_setup_audio_and_infoframes(dc);
2144 /* Set tmds config. Set it to custom values provided in board file;
2145 * otherwise, set it to default values. */
2146 if (hdmi->info.tmds_config && hdmi->info.n_tmds_config) {
2147 tmds_ptr = hdmi->info.tmds_config;
2148 tmds_len = hdmi->info.n_tmds_config;
2150 tmds_ptr = tmds_config;
2151 tmds_len = ARRAY_SIZE(tmds_config);
2154 for (i = 0; i < tmds_len && tmds_ptr[i].pclk < dc->mode.pclk; i++)
2157 tegra_dc_hdmi_setup_tmds(hdmi, &tmds_ptr[i]);
2159 dev_warn(&dc->ndev->dev,
2160 "pixel clock %u not present on TMDS table.\n",
2162 tegra_dc_hdmi_setup_tmds(hdmi, &tmds_ptr[tmds_len - 1]);
2166 tegra_hdmi_writel(hdmi,
2167 SOR_SEQ_CTL_PU_PC(0) |
2168 SOR_SEQ_PU_PC_ALT(0) |
2170 SOR_SEQ_PD_PC_ALT(8),
2171 HDMI_NV_PDISP_SOR_SEQ_CTL);
2173 val = SOR_SEQ_INST_WAIT_TIME(1) |
2174 SOR_SEQ_INST_WAIT_UNITS_VSYNC |
2176 SOR_SEQ_INST_PIN_A_LOW |
2177 SOR_SEQ_INST_PIN_B_LOW |
2178 SOR_SEQ_INST_DRIVE_PWM_OUT_LO;
2180 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_SEQ_INST0);
2181 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_SEQ_INST8);
2184 val &= ~SOR_CSTM_ROTCLK(~0);
2185 val |= SOR_CSTM_ROTCLK(2);
2186 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_CSTM);
2188 /* Putting display into STOP MODE will reset display which is undesired
2189 * if bootloader has already initialized display with image.
2191 if (!hdmi->dc->initialized) {
2192 tegra_dc_writel(dc, DISP_CTRL_MODE_STOP,
2193 DC_CMD_DISPLAY_COMMAND);
2194 tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
2195 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
2197 pr_info("%s: DC already initialized, skip putting HDMI "
2198 "to STOP mode.\n", __func__);
2202 tegra_hdmi_writel(hdmi,
2203 SOR_PWR_NORMAL_STATE_PU |
2204 SOR_PWR_NORMAL_START_NORMAL |
2205 SOR_PWR_SAFE_STATE_PD |
2206 SOR_PWR_SETTING_NEW_TRIGGER,
2207 HDMI_NV_PDISP_SOR_PWR);
2208 tegra_hdmi_writel(hdmi,
2209 SOR_PWR_NORMAL_STATE_PU |
2210 SOR_PWR_NORMAL_START_NORMAL |
2211 SOR_PWR_SAFE_STATE_PD |
2212 SOR_PWR_SETTING_NEW_DONE,
2213 HDMI_NV_PDISP_SOR_PWR);
2217 BUG_ON(--retries < 0);
2218 val = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PWR);
2219 } while (val & SOR_PWR_SETTING_NEW_PENDING);
2221 val = SOR_STATE_ASY_CRCMODE_COMPLETE |
2222 SOR_STATE_ASY_OWNER_HEAD0 |
2223 SOR_STATE_ASY_SUBOWNER_BOTH |
2224 SOR_STATE_ASY_PROTOCOL_SINGLE_TMDS_A |
2225 SOR_STATE_ASY_DEPOL_POS;
2227 if (dc->mode.flags & TEGRA_DC_MODE_FLAG_NEG_H_SYNC)
2228 val |= SOR_STATE_ASY_HSYNCPOL_NEG;
2230 val |= SOR_STATE_ASY_HSYNCPOL_POS;
2232 if (dc->mode.flags & TEGRA_DC_MODE_FLAG_NEG_V_SYNC)
2233 val |= SOR_STATE_ASY_VSYNCPOL_NEG;
2235 val |= SOR_STATE_ASY_VSYNCPOL_POS;
2237 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_STATE2);
2239 val = SOR_STATE_ASY_HEAD_OPMODE_AWAKE | SOR_STATE_ASY_ORMODE_NORMAL;
2240 tegra_hdmi_writel(hdmi, val, HDMI_NV_PDISP_SOR_STATE1);
2242 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0);
2243 tegra_hdmi_writel(hdmi, SOR_STATE_UPDATE, HDMI_NV_PDISP_SOR_STATE0);
2244 tegra_hdmi_writel(hdmi, val | SOR_STATE_ATTACHED,
2245 HDMI_NV_PDISP_SOR_STATE1);
2246 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_STATE0);
2248 tegra_dc_writel(dc, HDMI_ENABLE, DC_DISP_DISP_WIN_OPTIONS);
2250 tegra_dc_writel(dc, PW0_ENABLE | PW1_ENABLE | PW2_ENABLE | PW3_ENABLE |
2251 PW4_ENABLE | PM0_ENABLE | PM1_ENABLE,
2252 DC_CMD_DISPLAY_POWER_CONTROL);
2254 tegra_dc_writel(dc, DISP_CTRL_MODE_C_DISPLAY, DC_CMD_DISPLAY_COMMAND);
2255 tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
2256 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
2258 /* we are called at boot when the actual connection state
2259 * isn't known, and other times (like fb_blank, which
2260 * does a disable followed by an enable) when it is.
2261 * don't just assume a connection but check hpd.
2263 if (hdmi->info.hdmi2fpd_bridge_enable)
2264 hdmi2fpd_enable(hdmi);
2266 tegra_nvhdcp_set_plug(hdmi->nvhdcp, tegra_dc_hpd(dc));
2267 tegra_dc_io_end(dc);
2270 static void tegra_dc_hdmi_disable(struct tegra_dc *dc)
2272 struct tegra_dc_hdmi_data *hdmi = tegra_dc_get_outdata(dc);
2274 if (hdmi->info.hdmi2fpd_bridge_enable)
2275 hdmi2fpd_disable(hdmi);
2278 * set DC to STOP mode
2280 tegra_dc_writel(dc, DISP_CTRL_MODE_STOP, DC_CMD_DISPLAY_COMMAND);
2281 tegra_dc_writel(dc, GENERAL_UPDATE, DC_CMD_STATE_CONTROL);
2282 tegra_dc_writel(dc, GENERAL_ACT_REQ, DC_CMD_STATE_CONTROL);
2284 tegra_nvhdcp_set_plug(hdmi->nvhdcp, 0);
2286 #if !defined(CONFIG_ARCH_TEGRA_2x_SOC)
2287 tegra_hdmi_writel(hdmi, 0, HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE_0);
2288 /* sleep 1ms before disabling clocks to ensure HDA gets the interrupt */
2290 clk_disable_unprepare(hdmi->hda2hdmi_clk);
2291 clk_disable_unprepare(hdmi->hda2codec_clk);
2292 clk_disable_unprepare(hdmi->hda_clk);
2294 tegra_periph_reset_assert(hdmi->clk);
2295 hdmi->clk_enabled = false;
2296 clk_disable_unprepare(hdmi->clk);
2297 tegra_dvfs_set_rate(hdmi->clk, 0);
2301 /* To determine the best parent clock rate for a nominal HDMI pixel clock
2302 * rate for T124 host1x display controller
2304 * - dc: pointer to the display controller
2305 * - parent_clk: pointer to the parent clock
2306 * - pclk: rate of nominal HDMI pixel clock in Hz
2308 * - return: best parent clock rate in Hz
2310 static unsigned long tegra12x_hdmi_determine_parent(
2311 struct tegra_dc *dc, struct clk *parent_clk, int pclk)
2314 * parentClk = pclk * m (m=1,1.5,2,2.5,...,128.5)
2315 * refclk * n = pclk * m (n=1,1.5,2,2.5,...,128.5)
2316 * (prevent m==1.5 due to too much uneven out clock duty cycle)
2317 * refclk * (N / 2) = pclk * (M / 2) (M&N=2,3,4,...,257)
2318 * M = (refclk * N) / pclk (prevent the use of M==3)
2319 * (look for N to make M whole number)
2321 int n, m; /* N & M */
2324 /* following parameters should come from parent clock */
2325 const int ref = 12000000; /* reference clock to parent */
2326 const int pmax = 600000000; /* max freq of parent clock */
2327 const int pmin = 200000000; /* min freq of parent clock */
2331 for (n = 4; (ref / 2 * n) <= pmax; n++) {
2332 if ((ref / 2 * n) < pmin) /* too low */
2334 m = (ref * n) / (pclk / 1000);
2335 if (3 == (((m - 1) / 1000) + 1)) /* omit M==3 aft rnd-up */
2337 f = m % 1000; /* fractional parts */
2338 f = (0 == f) ? f : (1000 - f); /* round-up */
2339 if (0 == f) { /* exact match */
2343 } else if (f < fr) {
2349 /* parent clk: ref * b / 2
2350 * divider value: (m + 2000 - 1) / 2000 (if m saved; round-up)
2351 * expected pclk: ref * b / 2 / divider
2353 return (unsigned long)(ref / 2 * b);
2357 static long tegra_dc_hdmi_setup_clk(struct tegra_dc *dc, struct clk *clk)
2360 struct clk *parent_clk = clk_get_sys(NULL,
2361 dc->out->parent_clk ? : "pll_d_out0");
2362 #if !defined(CONFIG_ARCH_TEGRA_12x_SOC)
2363 struct clk *base_clk = clk_get_parent(parent_clk);
2365 if (clk != dc->clk) {
2366 #if !defined(CONFIG_ARCH_TEGRA_12x_SOC)
2367 clk_set_rate(base_clk, dc->mode.pclk);
2369 if (clk_get_parent(clk) != parent_clk)
2370 clk_set_parent(clk, parent_clk);
2372 clk_set_rate(clk, dc->mode.pclk / 4);
2375 clk_set_rate(parent_clk, rate);
2376 if (clk_get_parent(clk) != parent_clk)
2377 clk_set_parent(clk, parent_clk);
2378 clk_set_rate(clk, rate / 4);
2383 * Providing dynamic frequency rate setting for T20/T30 HDMI.
2384 * The required rate needs to be setup at 4x multiplier,
2385 * as out0 is 1/2 of the actual PLL output.
2387 #if defined(CONFIG_ARCH_TEGRA_12x_SOC)
2388 rate = tegra12x_hdmi_determine_parent(dc, parent_clk, dc->mode.pclk);
2390 rate = dc->mode.pclk * 2;
2391 while (rate < 500000000)
2394 #if !defined(CONFIG_ARCH_TEGRA_12x_SOC)
2395 if (rate != clk_get_rate(base_clk))
2396 clk_set_rate(base_clk, rate);
2398 if (rate != clk_get_rate(parent_clk))
2399 clk_set_rate(parent_clk, rate);
2401 if (clk_get_parent(clk) != parent_clk)
2402 clk_set_parent(clk, parent_clk);
2404 return tegra_dc_pclk_round_rate(dc, dc->mode.pclk);
2407 static bool tegra_dc_hdmi_hpd_state(struct tegra_dc *dc)
2413 if (WARN_ON(!dc || !dc->out))
2416 level = gpio_get_value_cansleep(dc->out->hotplug_gpio);
2418 sense = dc->out->flags & TEGRA_DC_OUT_HOTPLUG_MASK;
2420 hpd = (sense == TEGRA_DC_OUT_HOTPLUG_HIGH && level) ||
2421 (sense == TEGRA_DC_OUT_HOTPLUG_LOW && !level);
2426 struct tegra_dc_out_ops tegra_dc_hdmi_ops = {
2427 .init = tegra_dc_hdmi_init,
2428 .destroy = tegra_dc_hdmi_destroy,
2429 .enable = tegra_dc_hdmi_enable,
2430 .disable = tegra_dc_hdmi_disable,
2431 .detect = tegra_dc_hdmi_detect,
2432 .suspend = tegra_dc_hdmi_suspend,
2433 .resume = tegra_dc_hdmi_resume,
2434 .mode_filter = tegra_dc_hdmi_mode_filter,
2435 .setup_clk = tegra_dc_hdmi_setup_clk,
2436 .hpd_state = tegra_dc_hdmi_hpd_state,
2439 struct tegra_dc *tegra_dc_hdmi_get_dc(struct tegra_dc_hdmi_data *hdmi)
2441 return hdmi ? hdmi->dc : NULL;
2444 static ssize_t hdmi_audio_get_max_channel(struct kobject *kobj,
2445 struct kobj_attribute *attr, char *buf)
2447 return sprintf(buf, "%d\n", tegra_hdmi_get_max_channels());