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

drm/tegra: sor: Split out tegra_sor_apply_config()

This function is useful in both eDP and DP modes, so split it out in
anticipation of adding DP support.

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

+43 -34
+43 -34
drivers/gpu/drm/tegra/sor.c
··· 678 678 return 0; 679 679 } 680 680 681 + static void tegra_sor_apply_config(struct tegra_sor *sor, 682 + const struct tegra_sor_config *config) 683 + { 684 + u32 value; 685 + 686 + value = tegra_sor_readl(sor, SOR_DP_LINKCTL0); 687 + value &= ~SOR_DP_LINKCTL_TU_SIZE_MASK; 688 + value |= SOR_DP_LINKCTL_TU_SIZE(config->tu_size); 689 + tegra_sor_writel(sor, value, SOR_DP_LINKCTL0); 690 + 691 + value = tegra_sor_readl(sor, SOR_DP_CONFIG0); 692 + value &= ~SOR_DP_CONFIG_WATERMARK_MASK; 693 + value |= SOR_DP_CONFIG_WATERMARK(config->watermark); 694 + 695 + value &= ~SOR_DP_CONFIG_ACTIVE_SYM_COUNT_MASK; 696 + value |= SOR_DP_CONFIG_ACTIVE_SYM_COUNT(config->active_count); 697 + 698 + value &= ~SOR_DP_CONFIG_ACTIVE_SYM_FRAC_MASK; 699 + value |= SOR_DP_CONFIG_ACTIVE_SYM_FRAC(config->active_frac); 700 + 701 + if (config->active_polarity) 702 + value |= SOR_DP_CONFIG_ACTIVE_SYM_POLARITY; 703 + else 704 + value &= ~SOR_DP_CONFIG_ACTIVE_SYM_POLARITY; 705 + 706 + value |= SOR_DP_CONFIG_ACTIVE_SYM_ENABLE; 707 + value |= SOR_DP_CONFIG_DISPARITY_NEGATIVE; 708 + tegra_sor_writel(sor, value, SOR_DP_CONFIG0); 709 + 710 + value = tegra_sor_readl(sor, SOR_DP_AUDIO_HBLANK_SYMBOLS); 711 + value &= ~SOR_DP_AUDIO_HBLANK_SYMBOLS_MASK; 712 + value |= config->hblank_symbols & 0xffff; 713 + tegra_sor_writel(sor, value, SOR_DP_AUDIO_HBLANK_SYMBOLS); 714 + 715 + value = tegra_sor_readl(sor, SOR_DP_AUDIO_VBLANK_SYMBOLS); 716 + value &= ~SOR_DP_AUDIO_VBLANK_SYMBOLS_MASK; 717 + value |= config->vblank_symbols & 0xffff; 718 + tegra_sor_writel(sor, value, SOR_DP_AUDIO_VBLANK_SYMBOLS); 719 + } 720 + 681 721 static int tegra_sor_detach(struct tegra_sor *sor) 682 722 { 683 723 unsigned long value, timeout; ··· 1433 1393 value |= drm_dp_link_rate_to_bw_code(link.rate) << 2; 1434 1394 tegra_sor_writel(sor, value, SOR_CLK_CNTRL); 1435 1395 1436 - /* set linkctl */ 1396 + tegra_sor_apply_config(sor, &config); 1397 + 1398 + /* enable link */ 1437 1399 value = tegra_sor_readl(sor, SOR_DP_LINKCTL0); 1438 1400 value |= SOR_DP_LINKCTL_ENABLE; 1439 - 1440 - value &= ~SOR_DP_LINKCTL_TU_SIZE_MASK; 1441 - value |= SOR_DP_LINKCTL_TU_SIZE(config.tu_size); 1442 - 1443 1401 value |= SOR_DP_LINKCTL_ENHANCED_FRAME; 1444 1402 tegra_sor_writel(sor, value, SOR_DP_LINKCTL0); 1445 1403 ··· 1449 1411 } 1450 1412 1451 1413 tegra_sor_writel(sor, value, SOR_DP_TPG); 1452 - 1453 - value = tegra_sor_readl(sor, SOR_DP_CONFIG0); 1454 - value &= ~SOR_DP_CONFIG_WATERMARK_MASK; 1455 - value |= SOR_DP_CONFIG_WATERMARK(config.watermark); 1456 - 1457 - value &= ~SOR_DP_CONFIG_ACTIVE_SYM_COUNT_MASK; 1458 - value |= SOR_DP_CONFIG_ACTIVE_SYM_COUNT(config.active_count); 1459 - 1460 - value &= ~SOR_DP_CONFIG_ACTIVE_SYM_FRAC_MASK; 1461 - value |= SOR_DP_CONFIG_ACTIVE_SYM_FRAC(config.active_frac); 1462 - 1463 - if (config.active_polarity) 1464 - value |= SOR_DP_CONFIG_ACTIVE_SYM_POLARITY; 1465 - else 1466 - value &= ~SOR_DP_CONFIG_ACTIVE_SYM_POLARITY; 1467 - 1468 - value |= SOR_DP_CONFIG_ACTIVE_SYM_ENABLE; 1469 - value |= SOR_DP_CONFIG_DISPARITY_NEGATIVE; 1470 - tegra_sor_writel(sor, value, SOR_DP_CONFIG0); 1471 - 1472 - value = tegra_sor_readl(sor, SOR_DP_AUDIO_HBLANK_SYMBOLS); 1473 - value &= ~SOR_DP_AUDIO_HBLANK_SYMBOLS_MASK; 1474 - value |= config.hblank_symbols & 0xffff; 1475 - tegra_sor_writel(sor, value, SOR_DP_AUDIO_HBLANK_SYMBOLS); 1476 - 1477 - value = tegra_sor_readl(sor, SOR_DP_AUDIO_VBLANK_SYMBOLS); 1478 - value &= ~SOR_DP_AUDIO_VBLANK_SYMBOLS_MASK; 1479 - value |= config.vblank_symbols & 0xffff; 1480 - tegra_sor_writel(sor, value, SOR_DP_AUDIO_VBLANK_SYMBOLS); 1481 1414 1482 1415 /* enable pad calibration logic */ 1483 1416 value = tegra_sor_readl(sor, SOR_DP_PADCTL0);