// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
 *              http://www.samsung.com
 *
 * Author: Sung-Hyun Na <sunghyun.na@samsung.com>
 *
 * 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 <linux/delay.h>
#include <linux/io.h>
#include <linux/platform_device.h>
#include "phy-samsung-usb-cal.h"
#include "phy-exynos-usbdp-gen2-reg.h"
#include <linux/soc/samsung/exynos-soc.h>

#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);
}