// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) 2021 Samsung Electronics Co., Ltd. * http://www.samsung.com * * Author: Sung-Hyun Na * * Chip Abstraction Layer for USB PHY * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include #include #include #include "phy-samsung-usb-cal.h" #include "phy-exynos-usbdp-gen2-reg.h" #include #define CDR_FBB_FINE_VAL 0x2 static inline u32 usbdp_cal_reg_rd(void *addr) { u32 reg; reg = readl(addr); #if defined(USBDP_GEN2_DBG) print_log("[USB/DP]Rd Reg:0x%x\t\tVal:0x%x", addr, reg); #endif return reg; } static inline void usbdp_cal_reg_wr(u32 val, void *addr) { #if defined(USBDP_GEN2_DBG) print_log("[USB/DP]Wr Reg:0x%x\t\tVal:0x%x", addr, val); #endif writel(val, addr); } int phy_exynos_usbdp_g2_rx_cdr_pll_lock(struct exynos_usbphy_info *info) { void __iomem *regs_base = info->regs_base; u8 reg0b84; u8 reg1b84; int cnt; if (info->used_phy_port == 0) { for (cnt = 1000; cnt != 0; cnt--) { reg0b84 = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_A0B84); if ((reg0b84 & USBDP_TRSV_A0B84_LN0_MON_RX_CDR_LOCK_DONE)) break; udelay(1); } } else { for (cnt = 1000; cnt != 0; cnt--) { reg1b84 = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_A1B84); if ((reg1b84 & USBDP_TRSV_A1B84_LN2_MON_RX_CDR_LOCK_DONE)) break; udelay(1); } } if (!cnt) return -1; dev_info(info->dev, "CDR Lock done\n"); return 0; } void phy_exynos_usbdp_g2_tune_each(struct exynos_usbphy_info *info, char *name, u32 val) { void __iomem *regs_base = info->regs_base; u32 reg = 0; if (!name) return; if (val == -1) return; if (!strcmp(name, "ssrx_sqhs_th")) { /* RX squelch detect threshold level */ /* LN0 TX */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_26E_09B8); reg &= USBDP_TRSV_26E_LN0_RX_SQHS_TH_CLR; reg |= USBDP_TRSV_26E_LN0_RX_SQHS_TH(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_26E_09B8); /* LN2 TX */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_066E); reg &= USBDP_TRSV_066E_LN2_RX_SQHS_TH_CLR; reg |= USBDP_TRSV_066E_LN2_RX_SQHS_TH(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_066E); } else if (!strcmp(name, "ssrx_lfps_th")) { /* lfps detect threshold control */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0270); reg &= USBDP_TRSV_0270_LN0_RX_LFPS_TH_CTRL_CLR; reg |= USBDP_TRSV_0270_LN0_RX_LFPS_TH_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0270); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0670); reg &= USBDP_TRSV_0670_LN2_RX_LFPS_TH_CTRL_CLR; reg |= USBDP_TRSV_0670_LN2_RX_LFPS_TH_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0670); } else if (!strcmp(name, "ssrx_mf_eq_en")) { /* RX MF EQ Enable */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0241); reg |= USBDP_TRSV_0241_LN0_RX_CTLE_RL_HF_HBR3(3); // 04.05 reg |= USBDP_TRSV_0241_LN0_RX_CTLE_MF_BWD_EN; reg &= USBDP_TRSV_0241_LN0_RX_CTLE_OC_DAC_PU_CLR; // 04.05 usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0241); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0641); reg |= USBDP_TRSV_0641_LN2_RX_CTLE_RL_HF_HBR3(3); reg |= USBDP_TRSV_0641_LN2_RX_CTLE_MF_BWD_EN; reg &= USBDP_TRSV_0641_LN2_RX_CTLE_OC_DAC_PU_CLR; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0641); } else if (!strcmp(name, "ssrx_mf_eq_ctrl_ss")) { /* RX MF EQ CONTROL */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0311); reg &= USBDP_TRSV_0311_LN0_RX_SSLMS_MF_INIT_RATE_SP_CLR; reg |= USBDP_TRSV_0311_LN0_RX_SSLMS_MF_INIT_RATE_SP(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0311); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0711); reg &= USBDP_TRSV_0711_LN2_RX_SSLMS_MF_INIT_RATE_SP_CLR; reg |= USBDP_TRSV_0711_LN2_RX_SSLMS_MF_INIT_RATE_SP(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0711); } else if (!strcmp(name, "ssrx_hf_eq_ctrl_ss")) { /* RX HF EQ CONTROL */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_030B); reg &= USBDP_TRSV_030B_LN0_RX_SSLMS_HF_INIT_RATE_SP_CLR; reg |= USBDP_TRSV_030B_LN0_RX_SSLMS_HF_INIT_RATE_SP(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_030B); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_070B); reg &= USBDP_TRSV_070B_LN2_RX_SSLMS_HF_INIT_RATE_SP_CLR; reg |= USBDP_TRSV_070B_LN2_RX_SSLMS_HF_INIT_RATE_SP(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_070B); } else if (!strcmp(name, "ssrx_mf_eq_ctrl_ssp")) { /* RX MF EQ CONTROL */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0312); reg &= USBDP_TRSV_0312_LN0_RX_SSLMS_MF_INIT_RATE_SSP_CLR; reg |= USBDP_TRSV_0312_LN0_RX_SSLMS_MF_INIT_RATE_SSP(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0312); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0712); reg &= USBDP_TRSV_0712_LN2_RX_SSLMS_MF_INIT_RATE_SSP_CLR; reg |= USBDP_TRSV_0712_LN2_RX_SSLMS_MF_INIT_RATE_SSP(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0712); } else if (!strcmp(name, "ssrx_hf_eq_ctrl_ssp")) { /* RX HF EQ CONTROL */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_030C); reg &= USBDP_TRSV_030C_LN0_RX_SSLMS_HF_INIT_RATE_SSP_CLR; reg |= USBDP_TRSV_030C_LN0_RX_SSLMS_HF_INIT_RATE_SSP(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_030C); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_070C); reg &= USBDP_TRSV_70C_LN2_RX_SSLMS_HF_INIT_RATE_SSP_CLR; reg |= USBDP_TRSV_70C_LN2_RX_SSLMS_HF_INIT_RATE_SSP(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_070C); } else if (!strcmp(name, "ssrx_dfe1_tap_ctrl")) { /* RX DFE1 TAp CONTROL */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0279); reg &= USBDP_TRSV_0279_LN0_RX_SSLMS_C1_INIT_CLR; reg |= USBDP_TRSV_0279_LN0_RX_SSLMS_C1_INIT(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0279); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0679); reg &= USBDP_TRSV_0679_LN2_RX_SSLMS_C1_INIT_CLR; reg |= USBDP_TRSV_0679_LN2_RX_SSLMS_C1_INIT(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0679); } else if (!strcmp(name, "ssrx_dfe2_tap_ctrl")) { /* RX DFE2 TAp CONTROL */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_027A); reg &= USBDP_TRSV_027A_LN0_RX_SSLMS_C2_INIT_CLR; reg |= USBDP_TRSV_027A_LN0_RX_SSLMS_C2_INIT(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_027A); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_067A); reg &= USBDP_TRSV_067A_LN2_RX_SSLMS_C2_INIT_CLR; reg |= USBDP_TRSV_067A_LN2_RX_SSLMS_C2_INIT(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_067A); } else if (!strcmp(name, "ssrx_dfe3_tap_ctrl")) { /* RX DFE3 TAp CONTROL */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_027B); reg &= USBDP_TRSV_027B_LN0_RX_SSLMS_C3_INIT_CLR; reg |= USBDP_TRSV_027B_LN0_RX_SSLMS_C3_INIT(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_027B); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_067B); reg &= USBDP_TRSV_067B_LN2_RX_SSLMS_C3_INIT_CLR; reg |= USBDP_TRSV_067B_LN2_RX_SSLMS_C3_INIT(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_067B); } else if (!strcmp(name, "ssrx_dfe4_tap_ctrl")) { /* RX DFE4 TAp CONTROL */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_027C); reg &= USBDP_TRSV_027C_LN0_RX_SSLMS_C4_INIT_CLR; reg |= USBDP_TRSV_027C_LN0_RX_SSLMS_C4_INIT(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_027C); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_067C); reg &= USBDP_TRSV_067C_LN2_RX_SSLMS_C4_INIT_CLR; reg |= USBDP_TRSV_067C_LN2_RX_SSLMS_C4_INIT(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_067C); } else if (!strcmp(name, "ssrx_dfe5_tap_ctrl")) { /* RX DFE5 TAp CONTROL */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_027D); reg &= USBDP_TRSV_027D_LN0_RX_SSLMS_C5_INIT_CLR; reg |= USBDP_TRSV_027D_LN0_RX_SSLMS_C5_INIT(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_027D); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_067D); reg &= USBDP_TRSV_067D_LN2_RX_SSLMS_C5_INIT_CLR; reg |= USBDP_TRSV_067D_LN2_RX_SSLMS_C5_INIT(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_067D); } else if (!strcmp(name, "ssrx_term_cal")) { /* RX termination calibration */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_02BD); reg &= USBDP_TRSV_02BD_LN0_RX_RTERM_CTRL_CLR; reg |= USBDP_TRSV_02BD_LN0_RX_RTERM_CTRL(val); reg |= USBDP_TRSV_02BD_LN0_RX_RCAL_OPT_CODE(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_02BD); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_06BD); reg &= USBDP_TRSV_06BD_LN2_RX_RTERM_CTRL_CLR; reg |= USBDP_TRSV_06BD_LN2_RX_RTERM_CTRL(val); reg |= USBDP_TRSV_06BD_LN2_RX_RCAL_OPT_CODE(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_06BD); } else if (!strcmp(name, "sstx_amp")) { /* TX Amplitude */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0404); reg |= USBDP_TRSV_0404_OVRD_LN1_TX_DRV_LVL_CTRL; reg &= USBDP_TRSV_0404_LN1_TX_DRV_LVL_CTRL_CLR; reg |= USBDP_TRSV_0404_LN1_TX_DRV_LVL_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0404); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0804); reg |= USBDP_TRSV_0804_OVRD_LN3_TX_DRV_LVL_CTRL; reg &= USBDP_TRSV_0804_LN3_TX_DRV_LVL_CTRL_CLR; reg |= USBDP_TRSV_0804_LN3_TX_DRV_LVL_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0804); } else if (!strcmp(name, "sstx_deemp")) { /* TX de-emphasise */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0405); reg |= USBDP_TRSV_0405_OVRD_LN1_TX_DRV_POST_LVL_CTRL; reg &= USBDP_TRSV_0405_LN1_TX_DRV_POST_LVL_CTRL_CLR; reg |= USBDP_TRSV_0405_LN1_TX_DRV_POST_LVL_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0405); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0805); reg |= USBDP_TRSV_0805_OVRD_LN3_TX_DRV_POST_LVL_CTRL; reg &= USBDP_TRSV_0805_LN3_TX_DRV_LVL_POST_CTRL_CLR; reg |= USBDP_TRSV_0805_LN3_TX_DRV_LVL_POST_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0805); } else if (!strcmp(name, "sstx_pre_shoot")) { /* TX pre shoot */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0406); reg |= USBDP_TRSV_0406_OVRD_LN1_TX_DRV_PRE_LVL_CTRL; reg &= USBDP_TRSV_0406_LN1_TX_DRV_PRE_LVL_CTRL_CLR; reg |= USBDP_TRSV_0406_LN1_TX_DRV_PRE_LVL_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0406); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0806); reg |= USBDP_TRSV_0806_OVRD_LN3_TX_DRV_PRE_LVL_CTRL; reg &= USBDP_TRSV_0806_LN3_TX_DRV_PRE_LVL_CTRL_CLR; reg |= USBDP_TRSV_0806_LN3_TX_DRV_PRE_LVL_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0806); } else if (!strcmp(name, "sstx_idrv_up")) { /* TX idrv up */ #if !defined(CONFIG_SOC_EXYNOS9820_EVT0) reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0407); reg &= USBDP_TRSV_0407_LN1_TX_DRV_IDRV_IUP_CTRL_CLR; reg |= USBDP_TRSV_0407_LN1_TX_DRV_IDRV_IUP_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0407); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0807); reg &= USBDP_TRSV_0807_LN3_TX_DRV_IDRV_IUP_CTRL_CLR; reg |= USBDP_TRSV_0807_LN3_TX_DRV_IDRV_IUP_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0807); #else reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0407); reg &= USBDP_TRSV_0407_LN1_TX_DRV_IDRV_IUP_CTRL_CLR; reg |= USBDP_TRSV_0407_LN1_TX_DRV_IDRV_IUP_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0407); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0807); reg &= USBDP_TRSV_0807_LN3_TX_DRV_IDRV_IUP_CTRL_CLR; reg |= USBDP_TRSV_0807_LN3_TX_DRV_IDRV_IUP_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0807); #endif } else if (!strcmp(name, "sstx_idrv_dn")) { /* TX idrv down */ #if !defined(CONFIG_SOC_EXYNOS9820_EVT0) reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_CMN_041C); reg &= USBDP_CMN_041C_LN1_TX_DRV_IDRV_IDN_CTRL_CLR; reg |= USBDP_CMN_041C_LN1_TX_DRV_IDRV_IDN_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_041C); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_CMN_0420); reg &= USBDP_CMN_0420_LN3_TX_DRV_IDRV_IDN_CTRL_CLR; reg |= USBDP_CMN_0420_LN3_TX_DRV_IDRV_IDN_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_0420); #else reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0407); reg &= USBDP_TRSV_0407_LN1_TX_DRV_IDRV_IDN_CTRL_CLR; reg |= USBDP_TRSV_0407_LN1_TX_DRV_IDRV_IDN_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0407); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0807); reg &= USBDP_TRSV_0807_LN3_TX_DRV_IDRV_IDN_CTRL_CLR; reg |= USBDP_TRSV_0807_LN3_TX_DRV_IDRV_IDN_CTRL(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0807); #endif } else if (!strcmp(name, "sstx_up_term")) { /* TX up termination */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0420); reg &= USBDP_TRSV_0420_LN1_TX_RCAL_UP_CODE_CLR; reg |= USBDP_TRSV_0420_LN1_TX_RCAL_UP_CODE(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0420); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0820); reg &= USBDP_TRSV_0820_LN3_TX_RCAL_UP_CODE_CLR; reg |= USBDP_TRSV_0820_LN3_TX_RCAL_UP_CODE(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0820); } else if (!strcmp(name, "sstx_dn_term")) { /* TX dn termination */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0420); reg &= USBDP_TRSV_0420_LN1_TX_RCAL_DN_CODE_CLR; reg |= USBDP_TRSV_0420_LN1_TX_RCAL_DN_CODE(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0420); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0820); reg &= USBDP_TRSV_0820_LN3_TX_RCAL_DN_CODE_CLR; reg |= USBDP_TRSV_0820_LN3_TX_RCAL_DN_CODE(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0820); } else if (!strcmp(name, "fbb_fine")) { reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R2A6_0A98); reg |= USBDP_TRSV_R2A6_LN0_RX_CDR_FBB_FINE_CTRL_SET(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R2A6_0A98); } else if (!strcmp(name, "fbb_hi")) { reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_A0a9c); reg |= HI_FBB(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_A0a9c); } else if (!strcmp(name, "fbb_lo")) { reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_A0a9c); reg |= LO_FBB(val); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_A0a9c); } /* 2018.05.18 CDR MF/HF/DFE post setting */ if ((!strcmp(name, "ssrx_mf_eq_ctrl_ss")) || (!strcmp(name, "ssrx_hf_eq_ctrl_ss")) || (!strcmp(name, "ssrx_mf_eq_ctrl_ssp")) || (!strcmp(name, "ssrx_hf_eq_ctrl_ssp")) || (!strcmp(name, "ssrx_dfe1_tap_ctrl"))) { usbdp_cal_reg_wr(0x08, regs_base + 0x0a34); usbdp_cal_reg_wr(0x08, regs_base + 0x1a34); usbdp_cal_reg_wr(0x18, regs_base + 0x0a34); usbdp_cal_reg_wr(0x18, regs_base + 0x1a34); usbdp_cal_reg_wr(0x1e, regs_base + 0x0a34); usbdp_cal_reg_wr(0x1e, regs_base + 0x1a34); } } void phy_exynos_g2_usbdp_tune(struct exynos_usbphy_info *info) { u32 cnt = 0; if (!info) return; if (!info->tune_param) return; for (; info->tune_param[cnt].value != EXYNOS_USB_TUNE_LAST; cnt++) { char *para_name; int val; val = info->tune_param[cnt].value; if (val == -1) continue; para_name = info->tune_param[cnt].name; if (!para_name) break; phy_exynos_usbdp_g2_tune_each(info, para_name, val); } } int phy_exynos_usbdp_g2_check_pll_lock(struct exynos_usbphy_info *info) { void __iomem *regs_base = info->regs_base; u8 reg0350; //u8 reg0354; int cnt; for (cnt = 1000; cnt != 0; cnt--) { reg0350 = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_CMN_A0350); if ((reg0350 & USBDP_CMN_A0350_ANA_LCPLL_LOCK_DONE)) break; udelay(1); } if (!cnt) return -1; dev_info(info->dev, "LC PLL Lock done\n"); return 0; } void phy_exynos_usbdp_g2_run_lane(struct exynos_usbphy_info *info) { void __iomem *regs_base = info->regs_base; u8 reg; #if defined(CONFIG_SOC_EXYNOS9820_EVT0) /* minimize Long chaneel RX data loss : 2018.03.20 */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_08DC); reg &= ~USBDP_TRSV_0237_OVRD_LN0_RX_CTLE_EN; reg &= ~USBDP_TRSV_0237_LN0_RX_CTLE_EN; reg &= ~USBDP_TRSV_0237_OVRD_LN0_RX_CTLE_OC_EN; reg &= ~USBDP_TRSV_0237_LN0_RX_CTLE_OC_EN; reg &= ~USBDP_TRSV_0237_OVRD_LN0_RX_CTLE_MF_FWD_EN; reg |= USBDP_TRSV_0237_LN0_RX_CTLE_MF_FWD_EN; reg |= USBDP_TRSV_0237_LN0_ANA_RX_CTLE_HF_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_08DC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_18DC); reg &= ~USBDP_TRSV_0637_OVRD_LN2_RX_CTLE_EN; reg &= ~USBDP_TRSV_0637_LN2_RX_CTLE_EN; reg &= ~USBDP_TRSV_0637_OVRD_LN2_RX_CTLE_OC_EN; reg &= ~USBDP_TRSV_0637_LN2_RX_CTLE_OC_EN; reg &= ~USBDP_TRSV_0637_OVRD_LN2_RX_CTLE_MF_FWD_EN; reg |= USBDP_TRSV_0637_LN2_RX_CTLE_MF_FWD_EN; reg |= USBDP_TRSV_0637_LN2_ANA_RX_CTLE_HF_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_18DC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_09AC); //reg &= USBDP_TRSV_09AC_LN0_ANA_RX_SQ_VREF_820M_SEL_CLR; reg &= ~USBDP_TRSV_09AC_OVRD_LN0_RX_SQHS_EN; reg &= ~USBDP_TRSV_09AC_LN0_RX_SQHS_EN; reg &= ~USBDP_TRSV_09AC_OVRD_LN0_RX_SQHS_DIFN_OC_EN; reg &= ~USBDP_TRSV_09AC_LN0_RX_SQHS_DIFN_OC_EN; reg &= ~USBDP_TRSV_09AC_LN0_ANA_RX_SQHS_DIFN_OC_CODE_SIGN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_09AC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_19AC); reg &= USBDP_TRSV_066B_LN2_ANA_RX_SQ_VREF_820M_SEL_CLR; reg &= ~USBDP_TRSV_066B_OVRD_LN2_RX_SQHS_EN; reg &= ~USBDP_TRSV_066B_LN2_RX_SQHS_EN; reg &= ~USBDP_TRSV_066B_OVRD_LN2_RX_SQHS_DIFN_OC_EN; reg &= ~USBDP_TRSV_066B_LN2_RX_SQHS_DIFN_OC_EN; reg &= ~USBDP_TRSV_066B_LN2_ANA_RX_SQHS_DIFN_OC_CODE_SIGN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_19AC); /* 2018.03.20 */ #endif reg = 0; reg &= ~USBDP_CMN_A031C_PCS_TX_DRV_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A031C); reg = 0; reg &= ~USBDP_CMN_A0328_PCS_TX_ELECIDLE; reg &= ~USBDP_CMN_A0328_PCS_TX_DRV_PRE_LVL_CTRL_MSK; reg &= ~USBDP_CMN_A0328_OVRD_PCS_TX_DRV_PRE_LVL_CTRL; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0328); reg = 0; reg &= ~USBDP_CMN_A032C_PCS_TX_SER_EN; reg &= ~USBDP_CMN_A032C_PCS_RX_LPFS_EN; reg &= ~USBDP_CMN_A032C_PCS_TX_RCV_DET_EN; reg &= ~USBDP_CMN_A032C_PCS_TX_LPFS_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A032C); } static void phy_exynos_usbdp_g2_set_pcs(struct exynos_usbphy_info *info) { u32 reg; void __iomem *regs_base = info->regs_base_2nd; /* Change Elastic buffer threshold */ reg = usbdp_cal_reg_rd(regs_base + USBDP_GEN2_PCSREG_EBUF_PARAM); reg &= ~(USBDPG2_PCS_NUM_INIT_BUFFERING_MSK | USBDPG2_PCS_SKP_REMOVE_TH_MSK); reg |= USBDPG2_PCS_SKP_REMOVE_TH_SET(0x1); usbdp_cal_reg_wr(reg, regs_base + USBDP_GEN2_PCSREG_EBUF_PARAM); /* Change Elastic buffer Drain param * -> enable TSEQ Mask */ reg = usbdp_cal_reg_rd(regs_base + USBDP_GEN2_PCSREG_EBUF_DRAINER_PARAM); reg |= USBDP_GEN2_PCSREG_EN_MASK_TSEQ; usbdp_cal_reg_wr(reg, regs_base + USBDP_GEN2_PCSREG_EBUF_DRAINER_PARAM); /* abnormal comman pattern mask */ reg = usbdp_cal_reg_rd(regs_base + USBDP_GEN2_PCSREG_BACK_END_MODE_VEC); reg &= ~USBDPG2_PCS_DISABLE_DATA_MASK_MSK; usbdp_cal_reg_wr(reg, regs_base + USBDP_GEN2_PCSREG_BACK_END_MODE_VEC); /* De-serializer enabled when U2 */ reg = usbdp_cal_reg_rd(regs_base + USBDP_GEN2_PCSREG_OUT_VEC_2); reg &= ~USBDP_GEN2_PCSREG_DYN_CON_DESERIAL; reg |= USBDP_GEN2_PCSREG_SEL_OUT_DESERIAL; usbdp_cal_reg_wr(reg, regs_base + USBDP_GEN2_PCSREG_OUT_VEC_2); //usbdp_cal_reg_wr(0x51255, 0x10af014c); /* TX Keeper Disable when U3 */ reg = usbdp_cal_reg_rd(regs_base + USBDP_GEN2_PCSREG_OUT_VEC_3); reg &= ~USBDP_GEN2_PCSREG_DYN_CON_PMA_TX_KEEPER; reg |= USBDP_GEN2_PCSREG_SEL_OUT_PMA_TX_KEEPER; usbdp_cal_reg_wr(reg, regs_base + USBDP_GEN2_PCSREG_OUT_VEC_3); } #define SIGVAL_FILTER_VAL 0x0 void phy_exynos_usbdp_g2_enable(struct exynos_usbphy_info *info) { void __iomem *regs_base = info->regs_base; u32 reg; #if !defined(CONFIG_SOC_EXYNOS9820_EVT0) /* { 2018.07.05 Power Optimization Code */ reg = USBDP_CMN_A0830_LN0_TX_JEQ_EVEN_CTRL_SP_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0830); reg = USBDP_CMN_A1830_LN2_TX_JEQ_EVEN_CTRL_SP_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A1830); reg = USBDP_TRSV_A085C_LN0_TX_LANE_LC_RO_CLK_SEL_SP; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_A085C); reg = USBDP_TRSV_A185C_OVRD_LN2_TX_SER_VREG_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_A185C); reg = USBDP_TRSV_R040C_LN1_TX_JEQ_EVEN_CTRL_SP_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R040C_1030); reg = USBDP_CMN_A1830_LN2_TX_JEQ_EVEN_CTRL_SP_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A2030); reg = USBDP_TRSV_A105C_OVRD_LN1_TX_SER_VREG_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_A105C); reg = USBDP_TRSV_A205C_OVRD_LN3_TX_SER_VREG_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_A205C); reg = 0; reg |= USBDP_CMN_A0228_ANA_ROPLL_CD_HSCLK_WEST_EN; reg |= USBDP_CMN_A0228_ANA_ROPLL_CD_HSCLK_EAST_EN; reg |= USBDP_CMN_A0228_OVRD_ROPLL_CD_VREG_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0228); reg = 0; reg |= USBDP_CMN_R041_PLL_CD_RSTN_SEL_EAST; reg |= USBDP_CMN_R041_PLL_CD_RSTN_SEL_WAST; reg |= USBDP_CMN_R041_PLL_CD_HSCLK_WEST_CTRL_SET(0x0); reg |= USBDP_CMN_R041_PLL_CD_HSCLK_EAST_CTRL_SET(0x0); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R041_0104); reg = 0; reg |= USBDP_CMN_R093_PLL_CD_RSTN_SEL_EAST; reg |= USBDP_CMN_R093_PLL_CD_RSTN_SEL_WAST; reg |= USBDP_CMN_R093_PLL_CD_HSCLK_WEST_CTRL_SET(0x0); reg |= USBDP_CMN_R093_PLL_CD_HSCLK_EAST_CTRL_SET(0x0); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R093_248); /* } 2018.07.05 Power Optimization Code */ /* UE_TASK: Check DP Reset and CDR Watchdog en * usbdp_cal_reg_wr(0x02, regs_base + 0x038c); */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_CMN_A038C); reg &= ~USBDP_CMN_A038C_DP_INIT_RSTN; reg &= ~USBDP_CMN_A038C_DP_CMN_RSTN; reg |= USBDP_CMN_A038C_CDR_WATCHDOG_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A038C); /* UE_TASK: ln0 / ln2 resered port * usbdp_cal_reg_wr(0x04, regs_base + 0x0878); * usbdp_cal_reg_wr(0x04, regs_base + 0x1878); */ reg = 0; usbdp_cal_reg_wr(0x04, regs_base + EXYNOS_USBDP_TRSV_0878); usbdp_cal_reg_wr(0x04, regs_base + EXYNOS_USBDP_TRSV_1878); /* UE_TASK: ln0 / ln2 rx rtem incm ctrl * usbdp_cal_reg_wr(0x07, regs_base + 0x09a4); * usbdp_cal_reg_wr(0x07, regs_base + 0x19a4); */ reg = 0; reg |= USBDP_TRSV_A09A4_LN0_ANA_RX_RTERM_INCM_SW_CTRL_SET(0x1); reg |= USBDP_TRSV_A09A4_LN0_ANA_RX_RTERM_INCM_VCM_CTRL_SET(0x3); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_A09A4); reg = 0; reg |= USBDP_TRSV_A19A4_LN2_ANA_RX_RTERM_INCM_SW_CTRL_SET(0x1); reg |= USBDP_TRSV_A19A4_LN2_ANA_RX_RTERM_INCM_VCM_CTRL_SET(0x3); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_A19A4); /* UE_TASK: ln0 / ln2 rx rterm vcm * usbdp_cal_reg_wr(0x22, regs_base + 0x09a8); * usbdp_cal_reg_wr(0x22, regs_base + 0x19a8); */ reg = 0; reg |= USBDP_TRSV_R026A_LN0_ANA_RX_RTERM_INCM_VCM_CTRL_SET(0x1); reg |= USBDP_TRSV_R026A_LN0_RX_RTERM_VCM_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R026A_09A8); reg = 0; reg |= USBDP_TRSV_R66A_LN2_ANA_RX_RTERM_INCM_VCM_CTRL_SET(0x1); reg |= USBDP_TRSV_R66A_LN2_RX_RTERM_VCM_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R66A_19A8); /* UE_TASK: ln0 / ln2 rx dfe vga rl sp /ssp ctrl * usbdp_cal_reg_wr(0x12, regs_base + 0x0994); * usbdp_cal_reg_wr(0x12, regs_base + 0x1994); */ reg = 0; reg |= USBDP_TRSV_0265_LN0_RX_DFE_VGA_RL_CTRL_SP_SET(0x2); reg |= USBDP_TRSV_0265_LN0_RX_DFE_VGA_RL_CTRL_SSP_SET(0x2); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_0994); reg = 0; reg |= USBDP_TRSV_0665_LN2_RX_DFE_VGA_RL_CTRL_SP_SET(0x2); reg |= USBDP_TRSV_0665_LN2_RX_DFE_VGA_RL_CTRL_SSP_SET(0x2); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_1994); /* UE_TASK: ln0 / ln2 rx dfe vga rl ctrl rbr,hbr * usbdp_cal_reg_wr(0x12, regs_base + 0x0998); * usbdp_cal_reg_wr(0x12, regs_base + 0x1998); */ reg = 0; reg |= USBDP_TRSV_R0266_LN0_RX_DFE_VGA_RL_CTRL_RBR_SET(0x2); reg |= USBDP_TRSV_R0266_LN0_RX_DFE_VGA_RL_CTRL_HBR_SET(0x2); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R0266_0998); reg = 0; reg |= USBDP_TRSV_R666_LN2_RX_DFE_VGA_RL_CTRL_RBR_SET(0x2); reg |= USBDP_TRSV_R666_LN2_RX_DFE_VGA_RL_CTRL_HRB_SET(0x2); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R666_1998); /* UE_TASK: ln0 / ln2 rx dfe vga rl ctrl hbr2, hbr3 * usbdp_cal_reg_wr(0x48, regs_base + 0x099c); * usbdp_cal_reg_wr(0x48, regs_base + 0x199c); */ reg = 0; reg |= USBDP_TRSV_R0267_LN0_RX_DFE_VGA_RL_CTRL_HBR2_SET(0x2); reg |= USBDP_TRSV_R0267_LN0_RX_DFE_VGA_RL_CTRL_HBR3_SET(0x2); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R0267_099C); reg = 0; reg |= USBDP_TRSV_R667_LN2_RX_DFE_VGA_RL_CTRL_HRB2_SET(0x2); reg |= USBDP_TRSV_R667_LN2_RX_DFE_VGA_RL_CTRL_HRB3_SET(0x2); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R667_199C); /* UE_TASK: ln0 / ln2 rx cdr_mdiv_sel_pll sp, ssp * usbdp_cal_reg_wr(0x77, regs_base + 0x0898); * usbdp_cal_reg_wr(0x77, regs_base + 0x1898); */ reg = 0; reg |= USBDP_TRSV_0226_LN0_RX_CDR_MDIV_SEL_PLL_SP_SET(0x7); reg |= USBDP_TRSV_0226_LN0_RX_CDR_MDIV_SEL_PLL_SSP_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_0898); reg = 0; reg |= USBDP_TRSV_0626_LN2_RX_CDR_MDIV_SEL_PLL_SP_SET(0x7); reg |= USBDP_TRSV_0626_LN2_RX_CDR_MDIV_SEL_PLL_SSP_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_1898); /* UE_TASK: lcpll avc force enable * usbdp_cal_reg_wr(0x01, regs_base + 0x0054); */ reg = 0; reg |= USBDP_CMN_015_ANA_LCPLL_AVC_FORCE_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_015_0054); /* UE_TASK: lcpll cd vreg en, hsclk east/west en * usbdp_cal_reg_wr(0x38, regs_base + 0x00e0); */ reg = 0; reg |= USBDP_CMN_038_ANA_LCPLL_CD_HSCLK_WEST_EN; reg |= USBDP_CMN_038_ANA_LCPLL_CD_HSCLK_EAST_EN; reg |= USBDP_CMN_038_OVRD_LCPLL_CD_VREG_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R038_00E0); /* 2018.06.28 enhanced pll stability */ reg = 0; reg &= ~USBDP_CMN_0018_LCPLL_ANA_CPI_CTRL_COARSE_MSK; reg |= USBDP_CMN_0018_LCPLL_ANA_CPI_CTRL_COARSE_SET(0x4); reg &= ~USBDP_CMN_0018_LCPLL_ANA_CPI_CTRL_FINE_MSK; reg |= USBDP_CMN_0018_LCPLL_ANA_CPI_CTRL_FINE_SET(0x4); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_0060); reg = 0; reg &= ~USBDP_CMN_0019_LCPLL_ANA_CPP_CTRL_COARSE_MSK; reg |= USBDP_CMN_0019_LCPLL_ANA_CPP_CTRL_COARSE_SET(0x7); reg &= ~USBDP_CMN_0019_LCPLL_ANA_CPP_CTRL_FINE_MSK; reg |= USBDP_CMN_0019_LCPLL_ANA_CPP_CTRL_FINE_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_0064); reg = 0; reg &= ~USBDP_CMN_001C_LCPLL_ANA_LPF_C_SEL_FINE_MSK; reg |= USBDP_CMN_001C_LCPLL_ANA_LPF_C_SEL_FINE_SET(0x7); reg &= ~USBDP_CMN_001C_LCPLL_ANA_LPF_R_SEL_COARSE_MSK; reg |= USBDP_CMN_001C_LCPLL_ANA_LPF_R_SEL_COARSE_SET(0x6); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_0070); /* ***************************************************** */ #else /* Change Term */ reg = USBDP_CMN_008_ANA_AUX_TX_TERM_SET(0x4); reg |= USBDP_CMN_008_ANA_AUX_RX_TERM_SET(0x8); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_008_0020); /* UE_TASK: Wrtie Value same as Reset Value */ reg = USBDP_CMN_014_ANA_LCPLL_AVC_CNT_RUN_NUM_SET(0x4); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_014_0050); /* for tSSC, not use cal data but forcing 2018.04.06 */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_CMN_015_0054); reg |= USBDP_CMN_015_ANA_LCPLL_AVC_FORCE_EN; reg &= ~USBDP_CMN_015_ANA_LCPLL_AVC_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_015_0054); //usbdp_cal_reg_wr(0x02, regs_base + 0x0054); // 04.06 02 -->01 /* UE_TASK: Wrtie Value same as Reset Value */ reg = USBDP_CMN_016_ANA_LCPLL_AVC_VCI_MAX_SEL_SET(0x6); reg |= USBDP_CMN_016_ANA_LCPLL_AVC_MAN_CAP_BIAS_CODE_SET(0x4); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_016_0058); /* UE_TASK: Wrtie Value same as Reset Value */ reg = USBDP_CMN_017_ANA_LCPLL_AVC_VCI_MIN_SEL_SET(0x2); reg |= USBDP_CMN_017_ANA_LCPLL_AVC_VCI_MID_SEL_SET(0x4); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_017_005C); /* Change LCPLL */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_CMN_R01D_0074); reg &= ~USBDP_CMN_01D_LCPLL_ANA_LPF_R_SEL_FINE_MASK; reg |= USBDP_CMN_01D_LCPLL_ANA_LPF_R_SEL_FINE_SET(0x3); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R01D_0074); /* UE_TASK: Wrtie Value same as Reset Value */ reg = USBDP_CMN_024_ANA_LCPLL_PMS_MDIV_SET(0x60); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R024_0090); /* UE_TASK: Wrtie Value same as Reset Value */ reg = USBDP_CMN_025_ANA_LCPLL_PMS_MDIV_AFC_SET(0x60); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R025_0094); /* UE_TASK: Wrtie Value same as Reset Value */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_CMN_R031_00C4); reg &= ~USBDP_CMN_031_ANA_LCPLL_SDM_PH_NUM_SEL; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R031_00C4); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_CMN_A012C); reg &= ~USBDP_CMN_A012C_ROPLL_ANA_CPP_CTRL_FINE_MASK; reg |= USBDP_CMN_A012C_ROPLL_ANA_CPP_CTRL_FINE_SET(0x4); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A012C); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_CMN_A0134); reg &= ~USBDP_CMN_A0134_ROPLL_ANA_LPF_R_SEL_FINE_MASK; reg |= USBDP_CMN_A0134_ROPLL_ANA_LPF_R_SEL_FINE_SET(0x4); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0134); reg = USBDP_CMN_A015C_ROPLL_PMS_MDIV_RBR_SET(0x4e); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A015C); reg = USBDP_CMN_A0174_ROPLL_PMS_MDIV_AFC_RBR_SET(0x4e); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0174); reg = USBDP_CMN_A018C_ROPLL_PMS_SDIV_RBR_SET(0x4); reg |= USBDP_CMN_A018C_ROPLL_PMS_SDIV_HBR_SET(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A018C); reg = USBDP_CMN_A01AC_ROPLL_SDM_DENOM_RBR_SET(0x2c); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A01AC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_CMN_A01BC); reg |= USBDP_CMN_A01BC_ROPLL_SDM_NUMERATOR_SIGN_RBR; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A01BC); reg = USBDP_CMN_A01C8_ROPLL_SDM_NUMERATOR_RBR_SET(0x8); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A01C8); reg = USBDP_CMN_A01F0_ROPLL_SDC_NUMERATOR_RBR_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A01F0); reg = USBDP_CMN_A0208_ROPLL_SDC_DENOMINATOR_RBR_SET(0x16); usbdp_cal_reg_wr(0x16, regs_base + EXYNOS_USBDP_COM_CMN_A0208); reg = USBDP_CMN_A021C_ANA_ROPLL_SSC_FM_DEVIATION_SET(0x19); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A021C); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_CMN_A0220); reg &= ~USBDP_CMN_A0220_ANA_ROPLL_SSC_FM_FREQ_MASK; reg |= USBDP_CMN_A0220_ANA_ROPLL_SSC_FM_FREQ_SET(0xf); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0220); /* SSC enable */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_CMN_R00B4_02D0); reg &= ~USBDP_CMN_R00B4_CDR_LOCK_DELAY_CODE_MASK; reg &= ~USBDP_CMN_R00B4_RX_OC_DONE_DELAY_CODE_MASK; reg |= USBDP_CMN_R00B4_CDR_LOCK_DELAY_CODE_SET(0x2); reg |= USBDP_CMN_R00B4_RX_OC_DONE_DELAY_CODE_SET(0x2); reg &= ~USBDP_CMN_R00B4_SSC_EN; //20180630 ows usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R00B4_02D0); reg = USBDP_TRSV_R0235_LN0_RX_CDR_VCO_FREQ_BOOST_RBR_SET(0x1); reg |= USBDP_TRSV_R0235_LN0_RX_CDR_VCO_FREQ_BOOST_HBR_SET(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R0235_08CC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R0244_0910); reg &= ~USBDP_TRSV_R0244_LN0_RX_CTLE_I_MF_FWD_CTRL_HBR3_MSK; reg &= ~USBDP_TRSV_R0244_LN0_RX_CTLE_I_HF_CTRL_SP_MSK; reg |= USBDP_TRSV_R0244_LN0_RX_CTLE_I_HF_CTRL_SP_SET(0x1); reg |= USBDP_TRSV_R0244_LN0_RX_CTLE_I_MF_FWD_CTRL_HBR3_SET(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R0244_0910); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R0644_1910); reg &= ~USBDP_TRSV_R0644_LN2_RX_CTLE_I_MF_FWD_CTRL_HBR3_MSK; reg &= ~USBDP_TRSV_R0644_LN2_RX_CTLE_I_HF_CTRL_SP_MSK; reg |= USBDP_TRSV_R0644_LN2_RX_CTLE_I_HF_CTRL_SP_SET(0x1); reg |= USBDP_TRSV_R0644_LN2_RX_CTLE_I_MF_FWD_CTRL_HBR3_SET(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R0644_1910); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_0994); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_0994); reg = USBDP_TRSV_R0266_LN0_RX_DFE_VGA_RL_CTRL_HBR_SET(0x7); reg |= USBDP_TRSV_R0266_LN0_RX_DFE_VGA_RL_CTRL_RBR_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R0266_0998); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R0267_099C); reg &= ~USBDP_TRSV_R0267_LN0_ANA_RX_DFE_VGA_PBIAS_CTRL_MSK; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R0267_099C); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R026A_09A8); reg |= USBDP_TRSV_R026A_OVRD_LN0_RX_RTERM_CM_PULLDN; reg |= USBDP_TRSV_R026A_LN0_RX_RTERM_CM_PULLDN; reg |= USBDP_TRSV_R026A_OVRD_LN0_RX_RTERM_VCM_EN; reg &= ~USBDP_TRSV_R026A_LN0_RX_RTERM_VCM_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R026A_09A8); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R027E_09F8); reg |= ~USBDP_TRSV_R027E_LN0_RX_SSLMS_HF_INIT_MSK; reg |= USBDP_TRSV_R027E_LN0_RX_SSLMS_HF_INIT_SET(0xc); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R027E_09F8); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R27F_09FC); reg &= ~USBDP_TRSV_R27F_LN0_RX_SSLMS_MF_INIT_MSK; reg |= USBDP_TRSV_R27F_LN0_RX_SSLMS_MF_INIT_SET(0xc); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R27F_09FC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R028B_0A2C); reg &= ~USBDP_TRSV_R028B_LN0_RX_SSLMS_ADPA_COEF_SEL8; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R028B_0A2C); reg = USBDP_TRSV_R20BE_LN0_TX_RCAL_UP_OPT_CODE_SET(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R02BE_0AF8); reg = USBDP_TRSV_R20BF_LN0_TX_RCAL_UP_CODE_SET(0x3); reg |= USBDP_TRSV_R20BF_LN0_TX_RCAL_DN_OPT_CODE_SET(0x1); usbdp_cal_reg_wr(0x13, regs_base + EXYNOS_USBDP_TRSV_R02BF_0AFC); reg = USBDP_TRSV_R02C0_LN0_TX_RCAL_DN_CODE_SET(0x3); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R02C0_0B00); reg = USBDP_TRSV_R41E_LN0_RX_DFE_ADD_DIS; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R41E_1078); reg = USBDP_TRSV_R607_LN2_ANA_TX_DRV_ACCDRV_EN; reg |= USBDP_TRSV_R607_LN2_ANA_TX_DRV_IDRV_VREF_SEL; reg |= USBDP_TRSV_R607_LN2_ANA_TX_DRV_IDRV_IUP_CTRL_SET(0x7); reg |= USBDP_TRSV_R607_LN2_ANA_TX_DRV_IDRV_IDN_CTRL_SET(0x0); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R607_181C); reg = USBDP_TRSV_R633_LN2_RX_CDR_VCO_FREQ_BOOST_RBR_SET(0x1); reg |= USBDP_TRSV_R633_LN2_RX_CDR_VCO_FREQ_BOOST_HBR_SET(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R633_18CC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R66A_19A8); reg |= USBDP_TRSV_R66A_OVRD_LN2_ANA_RX_RTERM_CM_PULLDN; reg |= USBDP_TRSV_R66A_LN2_ANA_RX_RTERM_CM_PULLDN; reg |= USBDP_TRSV_R66A_OVRD_LN2_RX_RTERM_VCM_EN; reg &= ~USBDP_TRSV_R66A_LN2_RX_RTERM_VCM_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R66A_19A8); reg = USBDP_TRSV_R67E_LN2_RX_SSLMS_HF_INIT_SET(0xc); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R67E_19F8); reg = USBDP_TRSV_R67F_LN2_RX_SSLMS_MF_INIT_SET(0xc); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R67F_19FC); usbdp_cal_reg_wr(0x00, regs_base + EXYNOS_USBDP_TRSV_R68B_1A2C); reg = USBDP_TRSV_R6BE_LN2_TX_RCAL_UP_OPT_CODE_SET(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R6BE_1AF8); reg = USBDP_TRSV_R6BF_LN2_TX_RCAL_DN_OPT_CODE_SET(0x1); reg |= USBDP_TRSV_R6BF_LN2_TX_RCAL_UP_CODE_SET(0x3); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R6BF_1AFC); reg = USBDP_TRSV_R6C0_LN2_TX_RCAL_DN_CODE_SET(0x3); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R6C0_1B00); reg = USBDP_TRSV_R41E_LN2_RX_DFE_ADD_DIS; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R81E_2078); /* update ATE vector test fixed : 20180309 */ /* UE_TASK: Check LCPLL value * 1. usbdp_cal_reg_wr(0x77, regs_base + 0x0104); * 2. for power saving * reg = USBDP_CMN_A0104_ANA_LCPLL_RSVD_SET(0x44); * usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R041_0104); */ reg = USBDP_CMN_R041_PLL_CD_RSTN_SEL_EAST; reg |= USBDP_CMN_R041_PLL_CD_RSTN_SEL_WAST; reg |= USBDP_CMN_R041_PLL_CD_HSCLK_WEST_CTRL_SET(0x0); reg |= USBDP_CMN_R041_PLL_CD_HSCLK_EAST_CTRL_SET(0x0); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R041_0104); /* UE_TASK: Check ROPLL value * 1. usbdp_cal_reg_wr(0x77, regs_base + 0x0248); * 2. for power saving * reg = USBDP_CMN_A0248_ANA_ROPLL_RSVD_SET(0x44); * usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0248); */ reg = USBDP_CMN_R093_PLL_CD_RSTN_SEL_EAST; reg |= USBDP_CMN_R093_PLL_CD_RSTN_SEL_WAST; reg |= USBDP_CMN_R093_PLL_CD_HSCLK_WEST_CTRL_SET(0x0); reg |= USBDP_CMN_R093_PLL_CD_HSCLK_EAST_CTRL_SET(0x0); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R093_248); /* UE_TASK: Check DP Reset and CDR Watchdog en * usbdp_cal_reg_wr(0x02, regs_base + 0x038c); */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_CMN_A038C); reg &= ~USBDP_CMN_A038C_DP_INIT_RSTN; reg &= ~USBDP_CMN_A038C_DP_CMN_RSTN; reg |= USBDP_CMN_A038C_CDR_WATCHDOG_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A038C); /* RX LFPS 50MHz support */ /* UE_TASK: Check Reset Value is 0x60 * usbdp_cal_reg_wr(0x60, regs_base + 0x09d0); * usbdp_cal_reg_wr(0x60, regs_base + 0x19d0);*/ /* tx_drv_lfps_mode_idrv_iup_ctrl = 0x7 * tx_drv_lfps_mode_idrv_idn_ctrl = 0x0 */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_CMN_R0EA_03A8); reg &= ~USBDP_CMN_R0EA_TX_DRV_LFPS_MODE_IDRV_IUP_CTRL_MSK; reg |= USBDP_CMN_R0EA_TX_DRV_LFPS_MODE_IDRV_IUP_CTRL_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R0EA_03A8); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_CMN_R0EB_03AC); reg &= ~USBDP_CMN_R0EV_TX_DRV_LFPS_MODE_IDRV_IDN_CTRL_MSK; reg |= USBDP_CMN_R0EV_TX_DRV_LFPS_MODE_IDRV_IDN_CTRL_SET(0x0); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R0EB_03AC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_CMN_R207_081C); reg &= ~USBDP_CMN_R207_LN0_ANA_TX_DRV_IDRV_IDN_CTRL_MSK; reg |= USBDP_CMN_R207_LN0_ANA_TX_DRV_IDRV_IDN_CTRL_SET(0x0); reg &= ~USBDP_CMN_R207_LN0_ANA_TX_DRV_IDRV_IUP_CTRL_MSK; reg |= USBDP_CMN_R207_LN0_ANA_TX_DRV_IDRV_IUP_CTRL_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_R207_081C); /* default TUNE: selection tuning parameter basis */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_028C); reg &= USBDP_TRSV_028C_LN0_RX_SSLMS_ADAP_COEF_SEL_CLR; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_028C); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_068C); reg &= USBDP_TRSV_068C_LN2_RX_SSLMS_ADAP_COEF_SEL_CLR; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_068C); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_02BD); reg |= USBDP_TRSV_02BD_LN0_RX_RCAL_OPT_CODE(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_02BD); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_06BD); reg |= USBDP_TRSV_06BD_LN2_RX_RCAL_OPT_CODE(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_06BD); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0404); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0404); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0804); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0804); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0405); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0405); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0805); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0805); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0406); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0406); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_0806); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0806); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_041F); reg &= USBDP_TRSV_041F_LN1_TX_RCAL_UP_OPT_CODE_CLR; reg |= USBDP_TRSV_041F_LN1_TX_RCAL_UP_OPT_CODE(0x1); reg &= USBDP_TRSV_041F_LN1_TX_RCAL_DN_OPT_CODE_CLR; reg |= USBDP_TRSV_041F_LN1_TX_RCAL_DN_OPT_CODE(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_041F); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_081F); reg &= USBDP_TRSV_081F_LN3_TX_RCAL_UP_OPT_CODE_CLR; reg |= USBDP_TRSV_081F_LN3_TX_RCAL_UP_OPT_CODE(0x1); reg &= USBDP_TRSV_081F_LN3_TX_RCAL_DN_OPT_CODE_CLR; reg |= USBDP_TRSV_081F_LN3_TX_RCAL_DN_OPT_CODE(0x1); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_081F); /* 2018.06.28 enhanced pll stability */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_CMN_0060); reg &= ~USBDP_CMN_0018_LCPLL_ANA_CPI_CTRL_COARSE_MSK; reg |= USBDP_CMN_0018_LCPLL_ANA_CPI_CTRL_COARSE_SET(0x4); reg &= ~USBDP_CMN_0018_LCPLL_ANA_CPI_CTRL_FINE_MSK; reg |= USBDP_CMN_0018_LCPLL_ANA_CPI_CTRL_FINE_SET(0x4); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_0060); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_CMN_0064); reg &= ~USBDP_CMN_0019_LCPLL_ANA_CPP_CTRL_COARSE_MSK; reg |= USBDP_CMN_0019_LCPLL_ANA_CPP_CTRL_COARSE_SET(0x7); reg &= ~USBDP_CMN_0019_LCPLL_ANA_CPP_CTRL_FINE_MSK; reg |= USBDP_CMN_0019_LCPLL_ANA_CPP_CTRL_FINE_SET(0x7); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_0064); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_CMN_0070); reg &= ~USBDP_CMN_001C_LCPLL_ANA_LPF_C_SEL_FINE_MSK; reg |= USBDP_CMN_001C_LCPLL_ANA_LPF_C_SEL_FINE_SET(0x7); reg &= ~USBDP_CMN_001C_LCPLL_ANA_LPF_R_SEL_COARSE_MSK; reg |= USBDP_CMN_001C_LCPLL_ANA_LPF_R_SEL_COARSE_SET(0x6); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_CMN_0070); /* else EVT0 */ #endif phy_exynos_g2_usbdp_tune(info); reg = 0; reg &= ~USBDP_CMN_A0310_PCS_PLL_EN; reg &= ~USBDP_CMN_A0310_PCS_LANE_RSTN; reg &= ~USBDP_CMN_A0310_PCS_INIT_RSTN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0310); reg = 0; reg &= ~USBDP_CMN_A0308_PCS_BIAS_EN; reg &= ~USBDP_CMN_A0308_PCS_BGR_EN; reg &= ~USBDP_CMN_A0308_PCS_PM_STATE_MASK; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0308); phy_exynos_usbdp_g2_set_pcs(info); /* hot temp fail test : 0412 */ /* CDR FBB Control */ //reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R2A2_0A88); //reg |= USBDP_TRSV_R2A2_LN0_RX_CDR_FBB_MAN_SEL; //usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R2A2_0A88); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R2A6_0A98); reg &= ~USBDP_TRSV_R2A6_LN0_RX_CDR_FBB_FINE_CTRL_MSK; reg |= USBDP_TRSV_R2A6_LN0_RX_CDR_FBB_FINE_CTRL_SET(CDR_FBB_FINE_VAL); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R2A6_0A98); //reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R6A2_1A88); //reg |= USBDP_TRSV_R6A2_LN2_RX_CDR_FBB_MAN_SEL; //usbdp_cal_reg_wr(0x05, regs_base + EXYNOS_USBDP_TRSV_R6A2_1A88); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_R6A6_1A98); reg &= ~USBDP_TRSV_R6A6_LN2_RX_CDR_FBB_FINE_CTRL_MSK; reg |= USBDP_TRSV_R6A6_LN2_RX_CDR_FBB_FINE_CTRL_SET(CDR_FBB_FINE_VAL); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_R6A6_1A98); if (info->used_phy_port == 0) { reg = 0; reg &= ~USBDP_CMN_A0258_OVRD_CMN_RATE; reg &= ~USBDP_CMN_A0258_CMN_LCPLL_ALONE_MODE; // usb rx0, tx1, dp tx2, tx3 usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0258); #if !defined(CONFIG_SOC_EXYNOS9820_EVT0) reg = 0; reg |= USBDP_CMN_A0288_DP_LANE_EN_SET(0x0); reg |= USBDP_CMN_A0288_LANE_MUX_SEL_DP_SET(0xc); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0288); #else reg = 0; reg |= USBDP_CMN_A0288_DP_LANE_EN_SET(0xc); reg |= USBDP_CMN_A0288_LANE_MUX_SEL_DP_SET(0xc); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0288); #endif #if defined(CONFIG_SOC_EXYNOS9820_EVT0) reg = 0; reg |= USBDP_CMN_A0310_OVRD_PCS_PLL_EN; reg |= USBDP_CMN_A0310_PCS_PLL_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0310); #endif #if !defined(CONFIG_SOC_EXYNOS9820_EVT0) reg = 0; reg |= USBDP_CMN_A028C_OVRD_RX_CDR_DATA_MODE_EXIT; reg |= USBDP_CMN_A028C_RX_CDR_DATA_MODE_EXIT; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A028C); #else reg = 0; reg &= ~USBDP_CMN_A028C_OVRD_RX_CDR_DATA_MODE_EXIT; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A028C); #endif reg = 0; reg |= USBDP_TRSV_0400_LN1_ANA_TX_DRV_BEACON_LFPS_SYNC_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0400); reg = 0; reg |= USBDP_TRSV_0800_LN3_ANA_TX_DRV_BEACON_LFPS_SYNC_EN; reg |= USBDP_TRSV_0800_OVRD_LN3_TX_DRV_BEACON_LFPS_OUT_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0800); /* SIGVAL Filter for lane 0 */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_02BC); reg &= USBDP_TRSV_02BC_LN0_TG_RX_SIGVAL_LPF_DELAY_TIME_CLR; reg |= USBDP_TRSV_02BC_LN0_TG_RX_SIGVAL_LPF_DELAY_TIME_SET(SIGVAL_FILTER_VAL); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_02BC); } else { reg = 0; reg &= ~USBDP_CMN_A0258_OVRD_CMN_RATE; reg &= ~USBDP_CMN_A0258_CMN_LCPLL_ALONE_MODE; // dp rx0, tx1, usb tx2, tx3 usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0258); reg = 0; #if !defined(CONFIG_SOC_EXYNOS9820_EVT0) reg |= USBDP_CMN_A0288_DP_LANE_EN_SET(0x0); #else reg |= USBDP_CMN_A0288_DP_LANE_EN_SET(0x3); #endif reg |= USBDP_CMN_A0288_LANE_MUX_SEL_DP_SET(0x3); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0288); #if !defined(CONFIG_SOC_EXYNOS9820_EVT0) if (reg == 0x33) { /* usbdp alt mode selectin case */ if (exynos_soc_info.sub_rev == 0x0) { /* Apply WA in only EVT1.0 * UE_TASK: usbdp mux signal map error - W/A * usbdp_cal_reg_wr(0x03, regs_base + 0x0310); * usbdp_cal_reg_wr(0x04, regs_base + 0x0b04); */ reg = 0; reg |= USBDP_CMN_A0310_OVRD_PCS_PLL_EN; reg |= USBDP_CMN_A0310_PCS_PLL_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A0310); reg = 0; reg |= USBDP_TRSV_02C1_LN0_MISC_TX_CLK_SRC; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_0B04); } } #endif #if !defined(CONFIG_SOC_EXYNOS9820_EVT0) reg = 0; reg |= USBDP_CMN_A028C_OVRD_RX_CDR_DATA_MODE_EXIT; reg |= USBDP_CMN_A028C_RX_CDR_DATA_MODE_EXIT; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A028C); #else reg = 0; reg &= ~USBDP_CMN_A028C_OVRD_RX_CDR_DATA_MODE_EXIT; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_CMN_A028C); #endif reg = 0; reg |= USBDP_TRSV_0400_LN1_ANA_TX_DRV_BEACON_LFPS_SYNC_EN; reg |= USBDP_TRSV_0400_OVRD_LN1_TX_DRV_BEACON_LFPS_OUT_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0400); reg = 0; reg |= USBDP_TRSV_0800_LN3_ANA_TX_DRV_BEACON_LFPS_SYNC_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_0800); /* SIGVAL Filter for lane 2 */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_COM_TRSV_06BC); reg &= USBDP_TRSV_06BC_LN2_TG_RX_SIGVAL_LPF_DELAY_TIME_CLR; reg |= USBDP_TRSV_06BC_LN2_TG_RX_SIGVAL_LPF_DELAY_TIME_SET(SIGVAL_FILTER_VAL); usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_COM_TRSV_06BC); } #if defined(CONFIG_SOC_EXYNOS9820_EVT0) /* minimize Long chaneel RX data loss : 2018.03.20 */ reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_08DC); reg |= USBDP_TRSV_0237_OVRD_LN0_RX_CTLE_EN; reg |= USBDP_TRSV_0237_LN0_RX_CTLE_EN; reg &= ~USBDP_TRSV_0237_OVRD_LN0_RX_CTLE_OC_EN; reg &= ~USBDP_TRSV_0237_LN0_RX_CTLE_OC_EN; reg |= USBDP_TRSV_0237_OVRD_LN0_RX_CTLE_MF_FWD_EN; reg |= USBDP_TRSV_0237_LN0_RX_CTLE_MF_FWD_EN; reg |= USBDP_TRSV_0237_LN0_ANA_RX_CTLE_HF_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_08DC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_18DC); reg |= USBDP_TRSV_0637_OVRD_LN2_RX_CTLE_EN; reg |= USBDP_TRSV_0637_LN2_RX_CTLE_EN; reg &= ~USBDP_TRSV_0637_OVRD_LN2_RX_CTLE_OC_EN; reg &= ~USBDP_TRSV_0637_LN2_RX_CTLE_OC_EN; reg |= USBDP_TRSV_0637_OVRD_LN2_RX_CTLE_MF_FWD_EN; reg |= USBDP_TRSV_0637_LN2_RX_CTLE_MF_FWD_EN; reg |= USBDP_TRSV_0637_LN2_ANA_RX_CTLE_HF_EN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_18DC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_09AC); reg &= USBDP_TRSV_09AC_LN0_ANA_RX_SQ_VREF_820M_SEL_CLR; reg |= USBDP_TRSV_09AC_OVRD_LN0_RX_SQHS_EN; reg |= USBDP_TRSV_09AC_LN0_RX_SQHS_EN; reg &= ~USBDP_TRSV_09AC_OVRD_LN0_RX_SQHS_DIFN_OC_EN; reg &= ~USBDP_TRSV_09AC_LN0_RX_SQHS_DIFN_OC_EN; reg &= ~USBDP_TRSV_09AC_LN0_ANA_RX_SQHS_DIFN_OC_CODE_SIGN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_09AC); reg = usbdp_cal_reg_rd(regs_base + EXYNOS_USBDP_TRSV_19AC); reg &= USBDP_TRSV_066B_LN2_ANA_RX_SQ_VREF_820M_SEL_CLR; reg |= USBDP_TRSV_066B_OVRD_LN2_RX_SQHS_EN; reg |= USBDP_TRSV_066B_LN2_RX_SQHS_EN; reg &= ~USBDP_TRSV_066B_OVRD_LN2_RX_SQHS_DIFN_OC_EN; reg &= ~USBDP_TRSV_066B_LN2_RX_SQHS_DIFN_OC_EN; reg &= ~USBDP_TRSV_066B_LN2_ANA_RX_SQHS_DIFN_OC_CODE_SIGN; usbdp_cal_reg_wr(reg, regs_base + EXYNOS_USBDP_TRSV_19AC); #endif } void phy_exynos_usbdp_g2_disable(struct exynos_usbphy_info *info) { } void phy_exynos_usbdp_g2_set_dp_lane(struct exynos_usbphy_info *info) { } void phy_exynos_usbdp_g2_set_dtb_mux(struct exynos_usbphy_info *info, int mux_val) { void __iomem *regs_base = info->regs_base; //writel(mux_val & 0xff, regs_base + 0x0284); writel(0x2D, regs_base + 0x0B74); writel(0x02, regs_base + 0x02C4); }