blob: f813bb93cfa23edd27211785ac26f1fe29e32869 [file] [log] [blame]
Yan He759abe92017-12-20 10:58:33 -08001/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
Yan He50222ad2017-11-17 18:22:17 -08002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13/*
14 * MSM PCIe PHY endpoint mode
15 */
16
17#include "ep_pcie_com.h"
18#include "ep_pcie_phy.h"
19
20void ep_pcie_phy_init(struct ep_pcie_dev_t *dev)
21{
22 switch (dev->phy_rev) {
23 case 3:
24 EP_PCIE_DBG(dev,
25 "PCIe V%d: PHY V%d: Initializing 20nm QMP phy - 100MHz\n",
26 dev->rev, dev->phy_rev);
27 break;
28 case 4:
29 EP_PCIE_DBG(dev,
30 "PCIe V%d: PHY V%d: Initializing 14nm QMP phy - 100MHz\n",
31 dev->rev, dev->phy_rev);
32 break;
33 case 5:
34 EP_PCIE_DBG(dev,
35 "PCIe V%d: PHY V%d: Initializing 10nm QMP phy - 100MHz\n",
36 dev->rev, dev->phy_rev);
37 break;
Yan He759abe92017-12-20 10:58:33 -080038 case 6:
39 EP_PCIE_DBG(dev,
40 "PCIe V%d: PHY V%d: Initializing 7nm QMP phy - 100MHz\n",
41 dev->rev, dev->phy_rev);
42 break;
Yan He50222ad2017-11-17 18:22:17 -080043 default:
44 EP_PCIE_ERR(dev,
45 "PCIe V%d: Unexpected phy version %d is caught!\n",
46 dev->rev, dev->phy_rev);
47 }
48
49 if (dev->phy_init_len && dev->phy_init) {
50 int i;
51 struct ep_pcie_phy_info_t *phy_init;
52
53 EP_PCIE_DBG(dev,
54 "PCIe V%d: PHY V%d: process the sequence specified by DT.\n",
55 dev->rev, dev->phy_rev);
56
57 i = dev->phy_init_len;
58 phy_init = dev->phy_init;
59 while (i--) {
60 ep_pcie_write_reg(dev->phy,
61 phy_init->offset,
62 phy_init->val);
63 if (phy_init->delay)
64 usleep_range(phy_init->delay,
65 phy_init->delay + 1);
66 phy_init++;
67 }
68 return;
69 }
70
71 ep_pcie_write_reg(dev->phy, PCIE_PHY_SW_RESET, 0x01);
72 ep_pcie_write_reg(dev->phy, PCIE_PHY_POWER_DOWN_CONTROL, 0x01);
73
74 /* Common block settings */
75 ep_pcie_write_reg(dev->phy, QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x18);
76 ep_pcie_write_reg(dev->phy, QSERDES_COM_CLK_ENABLE1, 0x00);
77 ep_pcie_write_reg(dev->phy, QSERDES_COM_BG_TRIM, 0x0F);
78 ep_pcie_write_reg(dev->phy, QSERDES_COM_LOCK_CMP_EN, 0x01);
79 ep_pcie_write_reg(dev->phy, QSERDES_COM_VCO_TUNE_MAP, 0x00);
80 ep_pcie_write_reg(dev->phy, QSERDES_COM_VCO_TUNE_TIMER1, 0xFF);
81 ep_pcie_write_reg(dev->phy, QSERDES_COM_VCO_TUNE_TIMER2, 0x1F);
82 ep_pcie_write_reg(dev->phy, QSERDES_COM_CMN_CONFIG, 0x06);
83 ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_IVCO, 0x0F);
84 ep_pcie_write_reg(dev->phy, QSERDES_COM_HSCLK_SEL, 0x00);
85 ep_pcie_write_reg(dev->phy, QSERDES_COM_SVS_MODE_CLK_SEL, 0x01);
86 ep_pcie_write_reg(dev->phy, QSERDES_COM_CORE_CLK_EN, 0x20);
87 ep_pcie_write_reg(dev->phy, QSERDES_COM_CORECLK_DIV, 0x0A);
88 ep_pcie_write_reg(dev->phy, QSERDES_COM_RESETSM_CNTRL, 0x20);
89 ep_pcie_write_reg(dev->phy, QSERDES_COM_BG_TIMER, 0x01);
90
91 /* PLL Config Settings */
92 ep_pcie_write_reg(dev->phy, QSERDES_COM_SYSCLK_EN_SEL, 0x00);
93 ep_pcie_write_reg(dev->phy, QSERDES_COM_DEC_START_MODE0, 0x19);
94 ep_pcie_write_reg(dev->phy, QSERDES_COM_DIV_FRAC_START3_MODE0, 0x00);
95 ep_pcie_write_reg(dev->phy, QSERDES_COM_DIV_FRAC_START2_MODE0, 0x00);
96 ep_pcie_write_reg(dev->phy, QSERDES_COM_DIV_FRAC_START1_MODE0, 0x00);
97 ep_pcie_write_reg(dev->phy, QSERDES_COM_LOCK_CMP3_MODE0, 0x00);
98 ep_pcie_write_reg(dev->phy, QSERDES_COM_LOCK_CMP2_MODE0, 0x02);
99 ep_pcie_write_reg(dev->phy, QSERDES_COM_LOCK_CMP1_MODE0, 0x7F);
100 ep_pcie_write_reg(dev->phy, QSERDES_COM_CLK_SELECT, 0x30);
101 ep_pcie_write_reg(dev->phy, QSERDES_COM_SYS_CLK_CTRL, 0x06);
102 ep_pcie_write_reg(dev->phy, QSERDES_COM_SYSCLK_BUF_ENABLE, 0x1E);
103 ep_pcie_write_reg(dev->phy, QSERDES_COM_CP_CTRL_MODE0, 0x3F);
104 ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_RCTRL_MODE0, 0x1A);
105 ep_pcie_write_reg(dev->phy, QSERDES_COM_PLL_CCTRL_MODE0, 0x00);
106 ep_pcie_write_reg(dev->phy, QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x03);
107 ep_pcie_write_reg(dev->phy, QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0xFF);
108
109 /* TX settings */
110 ep_pcie_write_reg(dev->phy, QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN,
111 0x45);
112 ep_pcie_write_reg(dev->phy, QSERDES_TX_LANE_MODE, 0x06);
113 ep_pcie_write_reg(dev->phy, QSERDES_TX_RES_CODE_LANE_OFFSET, 0x02);
114 ep_pcie_write_reg(dev->phy, QSERDES_TX_RCV_DETECT_LVL_2, 0x12);
115
116 /* RX settings */
117 ep_pcie_write_reg(dev->phy, QSERDES_RX_SIGDET_ENABLES, 0x1C);
118 ep_pcie_write_reg(dev->phy, QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x14);
119 ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x01);
120 ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3, 0x00);
121 ep_pcie_write_reg(dev->phy, QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4, 0xDB);
122 ep_pcie_write_reg(dev->phy, QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE,
123 0x4B);
124 ep_pcie_write_reg(dev->phy, QSERDES_RX_UCDR_SO_GAIN, 0x04);
125 ep_pcie_write_reg(dev->phy, QSERDES_RX_UCDR_SO_GAIN_HALF, 0x04);
126
127 /* EP_REF_CLK settings */
128 ep_pcie_write_reg(dev->phy, QSERDES_COM_CLK_EP_DIV, 0x19);
129 ep_pcie_write_reg(dev->phy, PCIE_PHY_ENDPOINT_REFCLK_DRIVE, 0x00);
130
131 /* PCIE L1SS settings */
132 ep_pcie_write_reg(dev->phy, PCIE_PHY_PWRUP_RESET_DLY_TIME_AUXCLK, 0x40);
133 ep_pcie_write_reg(dev->phy, PCIE_PHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_MSB,
134 0x00);
135 ep_pcie_write_reg(dev->phy, PCIE_PHY_L1SS_WAKEUP_DLY_TIME_AUXCLK_LSB,
136 0x40);
137 ep_pcie_write_reg(dev->phy, PCIE_PHY_LP_WAKEUP_DLY_TIME_AUXCLK_MSB,
138 0x00);
139 ep_pcie_write_reg(dev->phy, PCIE_PHY_LP_WAKEUP_DLY_TIME_AUXCLK, 0x40);
140 ep_pcie_write_reg(dev->phy, PCIE_PHY_PLL_LOCK_CHK_DLY_TIME, 0x73);
141
142 /* PCS settings */
143 ep_pcie_write_reg(dev->phy, PCIE_PHY_SIGDET_CNTRL, 0x07);
144 ep_pcie_write_reg(dev->phy, PCIE_PHY_RX_SIGDET_LVL, 0x99);
145 ep_pcie_write_reg(dev->phy, PCIE_PHY_TXDEEMPH_M6DB_V0, 0x15);
146 ep_pcie_write_reg(dev->phy, PCIE_PHY_TXDEEMPH_M3P5DB_V0, 0x0E);
147
148 ep_pcie_write_reg(dev->phy, PCIE_PHY_SW_RESET, 0x00);
149 ep_pcie_write_reg(dev->phy, PCIE_PHY_START_CONTROL, 0x03);
150}
151
152bool ep_pcie_phy_is_ready(struct ep_pcie_dev_t *dev)
153{
154 u32 offset;
155
156 if (dev->phy_status_reg)
157 offset = dev->phy_status_reg;
158 else
159 offset = PCIE_PHY_PCS_STATUS;
160
161 if (readl_relaxed(dev->phy + offset) & BIT(6))
162 return false;
163 else
164 return true;
165}