Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/tegra: hdmi - Add Tegra124 support

Tegra124 is mostly backwards-compatible with Tegra114. However, Tegra124
supports a few more features (e.g. interlacing, ...). Introduce a new
compatible string and TMDS tables to cope with these differences.

Signed-off-by: Thierry Reding <treding@nvidia.com>

+89
+1
drivers/gpu/drm/tegra/drm.c
··· 666 666 { .compatible = "nvidia,tegra114-gr3d", }, 667 667 { .compatible = "nvidia,tegra124-dc", }, 668 668 { .compatible = "nvidia,tegra124-sor", }, 669 + { .compatible = "nvidia,tegra124-hdmi", }, 669 670 { /* sentinel */ } 670 671 }; 671 672
+88
drivers/gpu/drm/tegra/hdmi.c
··· 318 318 }, 319 319 }; 320 320 321 + static const struct tmds_config tegra124_tmds_config[] = { 322 + { /* 480p/576p / 25.2MHz/27MHz modes */ 323 + .pclk = 27000000, 324 + .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) | 325 + SOR_PLL_VCOCAP(0) | SOR_PLL_RESISTORSEL, 326 + .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(0), 327 + .pe_current = PE_CURRENT0(PE_CURRENT_0_mA_T114) | 328 + PE_CURRENT1(PE_CURRENT_0_mA_T114) | 329 + PE_CURRENT2(PE_CURRENT_0_mA_T114) | 330 + PE_CURRENT3(PE_CURRENT_0_mA_T114), 331 + .drive_current = 332 + DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_10_400_mA_T114) | 333 + DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_10_400_mA_T114) | 334 + DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_10_400_mA_T114) | 335 + DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_10_400_mA_T114), 336 + .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_0_000_mA) | 337 + PEAK_CURRENT_LANE1(PEAK_CURRENT_0_000_mA) | 338 + PEAK_CURRENT_LANE2(PEAK_CURRENT_0_000_mA) | 339 + PEAK_CURRENT_LANE3(PEAK_CURRENT_0_000_mA), 340 + }, { /* 720p / 74.25MHz modes */ 341 + .pclk = 74250000, 342 + .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) | 343 + SOR_PLL_VCOCAP(1) | SOR_PLL_RESISTORSEL, 344 + .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) | 345 + SOR_PLL_TMDS_TERMADJ(0), 346 + .pe_current = PE_CURRENT0(PE_CURRENT_15_mA_T114) | 347 + PE_CURRENT1(PE_CURRENT_15_mA_T114) | 348 + PE_CURRENT2(PE_CURRENT_15_mA_T114) | 349 + PE_CURRENT3(PE_CURRENT_15_mA_T114), 350 + .drive_current = 351 + DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_10_400_mA_T114) | 352 + DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_10_400_mA_T114) | 353 + DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_10_400_mA_T114) | 354 + DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_10_400_mA_T114), 355 + .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_0_000_mA) | 356 + PEAK_CURRENT_LANE1(PEAK_CURRENT_0_000_mA) | 357 + PEAK_CURRENT_LANE2(PEAK_CURRENT_0_000_mA) | 358 + PEAK_CURRENT_LANE3(PEAK_CURRENT_0_000_mA), 359 + }, { /* 1080p / 148.5MHz modes */ 360 + .pclk = 148500000, 361 + .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) | 362 + SOR_PLL_VCOCAP(3) | SOR_PLL_RESISTORSEL, 363 + .pll1 = SOR_PLL_PE_EN | SOR_PLL_LOADADJ(3) | 364 + SOR_PLL_TMDS_TERMADJ(0), 365 + .pe_current = PE_CURRENT0(PE_CURRENT_10_mA_T114) | 366 + PE_CURRENT1(PE_CURRENT_10_mA_T114) | 367 + PE_CURRENT2(PE_CURRENT_10_mA_T114) | 368 + PE_CURRENT3(PE_CURRENT_10_mA_T114), 369 + .drive_current = 370 + DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_12_400_mA_T114) | 371 + DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_12_400_mA_T114) | 372 + DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_12_400_mA_T114) | 373 + DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_12_400_mA_T114), 374 + .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_0_000_mA) | 375 + PEAK_CURRENT_LANE1(PEAK_CURRENT_0_000_mA) | 376 + PEAK_CURRENT_LANE2(PEAK_CURRENT_0_000_mA) | 377 + PEAK_CURRENT_LANE3(PEAK_CURRENT_0_000_mA), 378 + }, { /* 225/297MHz modes */ 379 + .pclk = UINT_MAX, 380 + .pll0 = SOR_PLL_ICHPMP(1) | SOR_PLL_BG_V17_S(3) | 381 + SOR_PLL_VCOCAP(0xf) | SOR_PLL_RESISTORSEL, 382 + .pll1 = SOR_PLL_LOADADJ(3) | SOR_PLL_TMDS_TERMADJ(7) 383 + | SOR_PLL_TMDS_TERM_ENABLE, 384 + .pe_current = PE_CURRENT0(PE_CURRENT_0_mA_T114) | 385 + PE_CURRENT1(PE_CURRENT_0_mA_T114) | 386 + PE_CURRENT2(PE_CURRENT_0_mA_T114) | 387 + PE_CURRENT3(PE_CURRENT_0_mA_T114), 388 + .drive_current = 389 + DRIVE_CURRENT_LANE0_T114(DRIVE_CURRENT_25_200_mA_T114) | 390 + DRIVE_CURRENT_LANE1_T114(DRIVE_CURRENT_25_200_mA_T114) | 391 + DRIVE_CURRENT_LANE2_T114(DRIVE_CURRENT_25_200_mA_T114) | 392 + DRIVE_CURRENT_LANE3_T114(DRIVE_CURRENT_19_200_mA_T114), 393 + .peak_current = PEAK_CURRENT_LANE0(PEAK_CURRENT_3_000_mA) | 394 + PEAK_CURRENT_LANE1(PEAK_CURRENT_3_000_mA) | 395 + PEAK_CURRENT_LANE2(PEAK_CURRENT_3_000_mA) | 396 + PEAK_CURRENT_LANE3(PEAK_CURRENT_0_800_mA), 397 + }, 398 + }; 399 + 321 400 static const struct tegra_hdmi_audio_config * 322 401 tegra_hdmi_get_audio_config(unsigned int audio_freq, unsigned int pclk) 323 402 { ··· 1435 1356 .has_sor_io_peak_current = true, 1436 1357 }; 1437 1358 1359 + static const struct tegra_hdmi_config tegra124_hdmi_config = { 1360 + .tmds = tegra124_tmds_config, 1361 + .num_tmds = ARRAY_SIZE(tegra124_tmds_config), 1362 + .fuse_override_offset = HDMI_NV_PDISP_SOR_PAD_CTLS0, 1363 + .fuse_override_value = 1 << 31, 1364 + .has_sor_io_peak_current = true, 1365 + }; 1366 + 1438 1367 static const struct of_device_id tegra_hdmi_of_match[] = { 1368 + { .compatible = "nvidia,tegra124-hdmi", .data = &tegra124_hdmi_config }, 1439 1369 { .compatible = "nvidia,tegra114-hdmi", .data = &tegra114_hdmi_config }, 1440 1370 { .compatible = "nvidia,tegra30-hdmi", .data = &tegra30_hdmi_config }, 1441 1371 { .compatible = "nvidia,tegra20-hdmi", .data = &tegra20_hdmi_config },