···678678 return 0;679679}680680681681+static void tegra_sor_apply_config(struct tegra_sor *sor,682682+ const struct tegra_sor_config *config)683683+{684684+ u32 value;685685+686686+ value = tegra_sor_readl(sor, SOR_DP_LINKCTL0);687687+ value &= ~SOR_DP_LINKCTL_TU_SIZE_MASK;688688+ value |= SOR_DP_LINKCTL_TU_SIZE(config->tu_size);689689+ tegra_sor_writel(sor, value, SOR_DP_LINKCTL0);690690+691691+ value = tegra_sor_readl(sor, SOR_DP_CONFIG0);692692+ value &= ~SOR_DP_CONFIG_WATERMARK_MASK;693693+ value |= SOR_DP_CONFIG_WATERMARK(config->watermark);694694+695695+ value &= ~SOR_DP_CONFIG_ACTIVE_SYM_COUNT_MASK;696696+ value |= SOR_DP_CONFIG_ACTIVE_SYM_COUNT(config->active_count);697697+698698+ value &= ~SOR_DP_CONFIG_ACTIVE_SYM_FRAC_MASK;699699+ value |= SOR_DP_CONFIG_ACTIVE_SYM_FRAC(config->active_frac);700700+701701+ if (config->active_polarity)702702+ value |= SOR_DP_CONFIG_ACTIVE_SYM_POLARITY;703703+ else704704+ value &= ~SOR_DP_CONFIG_ACTIVE_SYM_POLARITY;705705+706706+ value |= SOR_DP_CONFIG_ACTIVE_SYM_ENABLE;707707+ value |= SOR_DP_CONFIG_DISPARITY_NEGATIVE;708708+ tegra_sor_writel(sor, value, SOR_DP_CONFIG0);709709+710710+ value = tegra_sor_readl(sor, SOR_DP_AUDIO_HBLANK_SYMBOLS);711711+ value &= ~SOR_DP_AUDIO_HBLANK_SYMBOLS_MASK;712712+ value |= config->hblank_symbols & 0xffff;713713+ tegra_sor_writel(sor, value, SOR_DP_AUDIO_HBLANK_SYMBOLS);714714+715715+ value = tegra_sor_readl(sor, SOR_DP_AUDIO_VBLANK_SYMBOLS);716716+ value &= ~SOR_DP_AUDIO_VBLANK_SYMBOLS_MASK;717717+ value |= config->vblank_symbols & 0xffff;718718+ tegra_sor_writel(sor, value, SOR_DP_AUDIO_VBLANK_SYMBOLS);719719+}720720+681721static int tegra_sor_detach(struct tegra_sor *sor)682722{683723 unsigned long value, timeout;···14331393 value |= drm_dp_link_rate_to_bw_code(link.rate) << 2;14341394 tegra_sor_writel(sor, value, SOR_CLK_CNTRL);1435139514361436- /* set linkctl */13961396+ tegra_sor_apply_config(sor, &config);13971397+13981398+ /* enable link */14371399 value = tegra_sor_readl(sor, SOR_DP_LINKCTL0);14381400 value |= SOR_DP_LINKCTL_ENABLE;14391439-14401440- value &= ~SOR_DP_LINKCTL_TU_SIZE_MASK;14411441- value |= SOR_DP_LINKCTL_TU_SIZE(config.tu_size);14421442-14431401 value |= SOR_DP_LINKCTL_ENHANCED_FRAME;14441402 tegra_sor_writel(sor, value, SOR_DP_LINKCTL0);14451403···14491411 }1450141214511413 tegra_sor_writel(sor, value, SOR_DP_TPG);14521452-14531453- value = tegra_sor_readl(sor, SOR_DP_CONFIG0);14541454- value &= ~SOR_DP_CONFIG_WATERMARK_MASK;14551455- value |= SOR_DP_CONFIG_WATERMARK(config.watermark);14561456-14571457- value &= ~SOR_DP_CONFIG_ACTIVE_SYM_COUNT_MASK;14581458- value |= SOR_DP_CONFIG_ACTIVE_SYM_COUNT(config.active_count);14591459-14601460- value &= ~SOR_DP_CONFIG_ACTIVE_SYM_FRAC_MASK;14611461- value |= SOR_DP_CONFIG_ACTIVE_SYM_FRAC(config.active_frac);14621462-14631463- if (config.active_polarity)14641464- value |= SOR_DP_CONFIG_ACTIVE_SYM_POLARITY;14651465- else14661466- value &= ~SOR_DP_CONFIG_ACTIVE_SYM_POLARITY;14671467-14681468- value |= SOR_DP_CONFIG_ACTIVE_SYM_ENABLE;14691469- value |= SOR_DP_CONFIG_DISPARITY_NEGATIVE;14701470- tegra_sor_writel(sor, value, SOR_DP_CONFIG0);14711471-14721472- value = tegra_sor_readl(sor, SOR_DP_AUDIO_HBLANK_SYMBOLS);14731473- value &= ~SOR_DP_AUDIO_HBLANK_SYMBOLS_MASK;14741474- value |= config.hblank_symbols & 0xffff;14751475- tegra_sor_writel(sor, value, SOR_DP_AUDIO_HBLANK_SYMBOLS);14761476-14771477- value = tegra_sor_readl(sor, SOR_DP_AUDIO_VBLANK_SYMBOLS);14781478- value &= ~SOR_DP_AUDIO_VBLANK_SYMBOLS_MASK;14791479- value |= config.vblank_symbols & 0xffff;14801480- tegra_sor_writel(sor, value, SOR_DP_AUDIO_VBLANK_SYMBOLS);1481141414821415 /* enable pad calibration logic */14831416 value = tegra_sor_readl(sor, SOR_DP_PADCTL0);