blob: f3c606847fb695c162ccee443e797182dae9cb55 [file] [log] [blame]
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +02001// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (c) 2017, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2023-2024 Linaro Limited
5 * Authors:
6 * - Bhupesh Sharma <bhupesh.sharma@linaro.org>
7 * - Neil Armstrong <neil.armstrong@linaro.org>
8 *
9 * Based on Linux driver
10 */
11
12#include <clk.h>
13#include <clk-uclass.h>
14#include <dm.h>
15#include <dm/device_compat.h>
16#include <dm/devres.h>
17#include <generic-phy.h>
18#include <malloc.h>
19#include <reset.h>
20
21#include <asm/io.h>
22#include <linux/bitops.h>
23#include <linux/clk-provider.h>
24#include <linux/delay.h>
25#include <linux/iopoll.h>
26#include <linux/ioport.h>
27
28#include "phy-qcom-qmp.h"
29#include "phy-qcom-qmp-pcs-ufs-v2.h"
30#include "phy-qcom-qmp-pcs-ufs-v3.h"
31#include "phy-qcom-qmp-pcs-ufs-v4.h"
32#include "phy-qcom-qmp-pcs-ufs-v5.h"
33#include "phy-qcom-qmp-pcs-ufs-v6.h"
34
35#include "phy-qcom-qmp-qserdes-com-v4.h"
Varadarajan Narayananbcf49ae2025-01-10 10:38:15 +053036#include "phy-qcom-qmp-qserdes-com-v5.h"
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +020037#include "phy-qcom-qmp-qserdes-com-v6.h"
38#include "phy-qcom-qmp-qserdes-txrx-v4.h"
Varadarajan Narayananbcf49ae2025-01-10 10:38:15 +053039#include "phy-qcom-qmp-qserdes-txrx-v5.h"
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +020040#include "phy-qcom-qmp-qserdes-txrx-ufs-v6.h"
41
42/* QPHY_SW_RESET bit */
43#define SW_RESET BIT(0)
44/* QPHY_POWER_DOWN_CONTROL */
45#define SW_PWRDN BIT(0)
46/* QPHY_START_CONTROL bits */
47#define SERDES_START BIT(0)
48#define PCS_START BIT(1)
49/* QPHY_PCS_READY_STATUS bit */
50#define PCS_READY BIT(0)
51
52#define PHY_INIT_COMPLETE_TIMEOUT (200 * 10000)
53
54struct qmp_ufs_init_tbl {
55 unsigned int offset;
56 unsigned int val;
57 /*
58 * mask of lanes for which this register is written
59 * for cases when second lane needs different values
60 */
61 u8 lane_mask;
62};
63
64#define QMP_PHY_INIT_CFG(o, v) \
65 { \
66 .offset = o, \
67 .val = v, \
68 .lane_mask = 0xff, \
69 }
70
71#define QMP_PHY_INIT_CFG_LANE(o, v, l) \
72 { \
73 .offset = o, \
74 .val = v, \
75 .lane_mask = l, \
76 }
77
78/* set of registers with offsets different per-PHY */
79enum qphy_reg_layout {
80 /* PCS registers */
81 QPHY_SW_RESET,
82 QPHY_START_CTRL,
83 QPHY_PCS_READY_STATUS,
84 QPHY_PCS_POWER_DOWN_CONTROL,
85 /* Keep last to ensure regs_layout arrays are properly initialized */
86 QPHY_LAYOUT_SIZE
87};
88
Aswin Murugan5a3f0c92025-05-21 09:23:21 +053089static const unsigned int ufsphy_v2_regs_layout[QPHY_LAYOUT_SIZE] = {
90 [QPHY_START_CTRL] = QPHY_V2_PCS_UFS_PHY_START,
91 [QPHY_PCS_READY_STATUS] = QPHY_V2_PCS_UFS_READY_STATUS,
92 [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V2_PCS_UFS_POWER_DOWN_CONTROL,
93};
94
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +020095static const unsigned int ufsphy_v3_regs_layout[QPHY_LAYOUT_SIZE] = {
96 [QPHY_START_CTRL] = QPHY_V3_PCS_UFS_PHY_START,
97 [QPHY_PCS_READY_STATUS] = QPHY_V3_PCS_UFS_READY_STATUS,
98 [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V3_PCS_UFS_POWER_DOWN_CONTROL,
99};
100
101static const unsigned int ufsphy_v4_regs_layout[QPHY_LAYOUT_SIZE] = {
102 [QPHY_START_CTRL] = QPHY_V4_PCS_UFS_PHY_START,
103 [QPHY_PCS_READY_STATUS] = QPHY_V4_PCS_UFS_READY_STATUS,
104 [QPHY_SW_RESET] = QPHY_V4_PCS_UFS_SW_RESET,
105 [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V4_PCS_UFS_POWER_DOWN_CONTROL,
106};
107
Varadarajan Narayananbcf49ae2025-01-10 10:38:15 +0530108static const unsigned int ufsphy_v5_regs_layout[QPHY_LAYOUT_SIZE] = {
109 [QPHY_START_CTRL] = QPHY_V5_PCS_UFS_PHY_START,
110 [QPHY_PCS_READY_STATUS] = QPHY_V5_PCS_UFS_READY_STATUS,
111 [QPHY_SW_RESET] = QPHY_V5_PCS_UFS_SW_RESET,
112 [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V5_PCS_UFS_POWER_DOWN_CONTROL,
113};
114
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +0200115static const unsigned int ufsphy_v6_regs_layout[QPHY_LAYOUT_SIZE] = {
116 [QPHY_START_CTRL] = QPHY_V6_PCS_UFS_PHY_START,
117 [QPHY_PCS_READY_STATUS] = QPHY_V6_PCS_UFS_READY_STATUS,
118 [QPHY_SW_RESET] = QPHY_V6_PCS_UFS_SW_RESET,
119 [QPHY_PCS_POWER_DOWN_CONTROL] = QPHY_V6_PCS_UFS_POWER_DOWN_CONTROL,
120};
121
122static const struct qmp_ufs_init_tbl sdm845_ufsphy_serdes[] = {
123 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
124 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
125 QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
126 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
127 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
128 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0xd5),
129 QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
130 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
131 QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
132 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
133 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00),
134 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
135 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x04),
136 QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x05),
137 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_INITVAL1, 0xff),
138 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_INITVAL2, 0x00),
139 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
140 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
141 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
142 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
143 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
144 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
145 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xda),
146 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
147 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0xff),
148 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0c),
149 QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE1, 0x98),
150 QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE1, 0x06),
151 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE1, 0x16),
152 QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE1, 0x36),
153 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE1, 0x3f),
154 QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
155 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE1, 0xc1),
156 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE1, 0x00),
157 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE1, 0x32),
158 QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE1, 0x0f),
159};
160
161static const struct qmp_ufs_init_tbl sdm845_ufsphy_hs_b_serdes[] = {
162 QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x44),
163};
164
165static const struct qmp_ufs_init_tbl sdm845_ufsphy_tx[] = {
166 QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
167 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x04),
168 QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07),
169};
170
171static const struct qmp_ufs_init_tbl sdm845_ufsphy_rx[] = {
172 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_LVL, 0x24),
173 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x0f),
174 QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
175 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
176 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
177 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_TERM_BW, 0x5b),
178 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
179 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
180 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1b),
181 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_HALF, 0x04),
182 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_QUARTER, 0x04),
183 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN, 0x04),
184 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
185 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x81),
186 QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
187 QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x59),
188};
189
190static const struct qmp_ufs_init_tbl sdm845_ufsphy_pcs[] = {
191 QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_SIGDET_CTRL2, 0x6e),
192 QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
193 QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
194 QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_SYM_RESYNC_CTRL, 0x03),
195 QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
196 QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_SIGDET_CTRL1, 0x0f),
197 QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_MIN_HIBERN8_TIME, 0x9a),
198 QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
199};
200
Julius Lehmann425a9122024-10-02 20:52:17 +0200201static const struct qmp_ufs_init_tbl sm8150_ufsphy_hs_g4_tx[] = {
202 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x75),
203};
204
205static const struct qmp_ufs_init_tbl sm8150_ufsphy_hs_g4_rx[] = {
206 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5a),
207 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x81),
208 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0e),
209 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x6f),
210 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x20),
211 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0x80),
212 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x01),
213 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x3f),
214 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff),
215 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xff),
216 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
217 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x6c),
218 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0x6d),
219 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0x6d),
220 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xed),
221 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0x3c),
222};
223
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +0200224static const struct qmp_ufs_init_tbl sm8150_ufsphy_serdes[] = {
225 QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0xd9),
226 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x11),
227 QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_HS_SWITCH_SEL, 0x00),
228 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x01),
229 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
230 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
231 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_INITVAL2, 0x00),
232 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
233 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
234 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
235 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
236 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
237 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0xff),
238 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x0c),
239 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xac),
240 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
241 QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x98),
242 QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
243 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
244 QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
245 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x32),
246 QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x0f),
247 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xdd),
248 QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x23),
249};
250
251static const struct qmp_ufs_init_tbl sm8150_ufsphy_hs_b_serdes[] = {
252 QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x06),
253};
254
255static const struct qmp_ufs_init_tbl sm8150_ufsphy_tx[] = {
256 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_1_DIVIDER_BAND0_1, 0x06),
257 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_2_DIVIDER_BAND0_1, 0x03),
258 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_3_DIVIDER_BAND0_1, 0x01),
259 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_4_DIVIDER_BAND0_1, 0x00),
260 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x05),
261 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TRAN_DRVR_EMP_EN, 0x0c),
262};
263
264static const struct qmp_ufs_init_tbl sm8150_ufsphy_rx[] = {
265 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_LVL, 0x24),
266 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x0f),
267 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
268 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_BAND, 0x18),
269 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x0a),
270 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
271 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0xf1),
272 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
273 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x80),
274 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0c),
275 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x04),
276 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x1b),
277 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
278 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
279 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1d),
280 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x00),
281 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x10),
282 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
283 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
284 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x36),
285 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x36),
286 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xf6),
287 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x3b),
288 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x3d),
289 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xe0),
290 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xc8),
291 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xc8),
292 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x3b),
293 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb1),
294 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_LOW, 0xe0),
295 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH, 0xc8),
296 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH2, 0xc8),
297 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH3, 0x3b),
298 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH4, 0xb1),
299};
300
301static const struct qmp_ufs_init_tbl sm8150_ufsphy_pcs[] = {
302 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
303 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
304 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
305 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
306 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_DEBUG_BUS_CLKSEL, 0x1f),
307 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_MIN_HIBERN8_TIME, 0xff),
308 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
309};
310
311static const struct qmp_ufs_init_tbl sm8150_ufsphy_hs_g4_pcs[] = {
312 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x10),
313 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_BIST_FIXED_PAT_CTRL, 0x0a),
314};
315
316static const struct qmp_ufs_init_tbl sm8250_ufsphy_hs_g4_tx[] = {
317 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xe5),
318};
319
320static const struct qmp_ufs_init_tbl sm8250_ufsphy_hs_g4_rx[] = {
321 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5a),
322 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x81),
323 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0e),
324 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x6f),
325 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL1, 0x04),
326 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x00),
327 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x09),
328 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x07),
329 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x17),
330 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x20),
331 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0x80),
332 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x01),
333 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x3f),
334 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff),
335 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xff),
336 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
337 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x2c),
338 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0x6d),
339 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0x6d),
340 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xed),
341 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0x3c),
342};
343
344static const struct qmp_ufs_init_tbl sm8550_ufsphy_serdes[] = {
345 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0xd9),
346 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x16),
347 QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x11),
348 QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_HS_SWITCH_SEL_1, 0x00),
349 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x01),
350 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x04),
351 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f),
352 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_INITVAL2, 0x00),
353 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41),
354 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x0a),
355 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x18),
356 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x14),
357 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x7f),
358 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x06),
359 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x4c),
360 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x0a),
361 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x18),
362 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x14),
363 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x99),
364 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x07),
365};
366
367static const struct qmp_ufs_init_tbl sm8550_ufsphy_hs_b_serdes[] = {
368 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x44),
369};
370
371static const struct qmp_ufs_init_tbl sm8550_ufsphy_tx[] = {
372 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_LANE_MODE_1, 0x05),
373 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x07),
374 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_FR_DCC_CTRL, 0x4c),
375};
376
377static const struct qmp_ufs_init_tbl sm8550_ufsphy_rx[] = {
378 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE2, 0x0c),
379 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL, 0x0e),
380
381 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B0, 0xc2),
382 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B1, 0xc2),
383 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B3, 0x1a),
384 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B6, 0x60),
385
386 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE2_B3, 0x9e),
387 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE2_B6, 0x60),
388
389 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B3, 0x9e),
390 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B4, 0x0e),
391 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B5, 0x36),
392 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B8, 0x02),
393
394};
395
396static const struct qmp_ufs_init_tbl sm8550_ufsphy_pcs[] = {
397 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_SIGDET_CTRL2, 0x69),
398 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0f),
399 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
400 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
401 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PLL_CNTL, 0x2b),
402 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_HSGEAR_CAPABILITY, 0x04),
403 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HSGEAR_CAPABILITY, 0x04),
404 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PLL_CNTL, 0x33),
405 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HS_G5_SYNC_LENGTH_CAPABILITY, 0x4f),
406 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HSG5_SYNC_WAIT_TIME, 0x9e),
407};
408
409static const struct qmp_ufs_init_tbl sm8650_ufsphy_serdes[] = {
410 QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0xd9),
411 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x16),
412 QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x11),
413 QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_HS_SWITCH_SEL_1, 0x00),
414 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x01),
415 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x1f),
416 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO_MODE1, 0x1f),
417 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_IETRIM, 0x0a),
418 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_IPTRIM, 0x17),
419 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x04),
420 QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_INITVAL2, 0x00),
421 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41),
422 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x06),
423 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x18),
424 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x14),
425 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x7f),
426 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x06),
427 QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x4c),
428 QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x06),
429 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x18),
430 QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x14),
431 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x99),
432 QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x07),
433};
434
435static const struct qmp_ufs_init_tbl sm8650_ufsphy_tx[] = {
436 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_LANE_MODE_1, 0x01),
437 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x07),
438 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_RX, 0x0e),
439};
440
441static const struct qmp_ufs_init_tbl sm8650_ufsphy_rx[] = {
442 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE2, 0x0c),
443 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE4, 0x0c),
444 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_SO_GAIN_RATE4, 0x04),
445 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x14),
446 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_PI_CONTROLS, 0x07),
447 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_OFFSET_ADAPTOR_CNTRL3, 0x0e),
448 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FASTLOCK_COUNT_HIGH_RATE4, 0x02),
449 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE4, 0x1c),
450 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FASTLOCK_SO_GAIN_RATE4, 0x06),
451 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL, 0x3e),
452 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0f),
453 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B0, 0xce),
454 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B1, 0xce),
455 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B2, 0x18),
456 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B3, 0x1a),
457 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B4, 0x0f),
458 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B6, 0x60),
459 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE2_B3, 0x9e),
460 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE2_B6, 0x60),
461 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B3, 0x9e),
462 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B4, 0x0e),
463 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B5, 0x36),
464 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B8, 0x02),
465 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE4_B0, 0x24),
466 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE4_B1, 0x24),
467 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE4_B2, 0x20),
468 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE4_B3, 0xb9),
469 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE4_B4, 0x4f),
470 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_SO_SATURATION, 0x1f),
471 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_PI_CTRL1, 0x94),
472 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_RX_TERM_BW_CTRL0, 0xfa),
473 QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_DLL0_FTUNE_CTRL, 0x30),
474};
475
Varadarajan Narayananbcf49ae2025-01-10 10:38:15 +0530476static const struct qmp_ufs_init_tbl sm8350_ufsphy_serdes[] = {
477 QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_EN_SEL, 0xd9),
478 QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_SEL, 0x11),
479 QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_HS_SWITCH_SEL, 0x00),
480 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP_EN, 0x42),
481 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x02),
482 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_IVCO, 0x0f),
483 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_INITVAL2, 0x00),
484 QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
485 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE0, 0x82),
486 QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE0, 0x14),
487 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE0, 0x18),
488 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE0, 0x18),
489 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE0, 0xff),
490 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE0, 0x19),
491 QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xac),
492 QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
493 QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE1, 0x98),
494 QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE1, 0x14),
495 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE1, 0x18),
496 QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE1, 0x18),
497 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE1, 0x65),
498 QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE1, 0x1e),
499 QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xdd),
500 QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x23),
501};
502
503static const struct qmp_ufs_init_tbl sm8350_ufsphy_hs_b_serdes[] = {
504 QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x06),
505};
506
507static const struct qmp_ufs_init_tbl sm8350_ufsphy_tx[] = {
508 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_1_DIVIDER_BAND0_1, 0x06),
509 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_2_DIVIDER_BAND0_1, 0x03),
510 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_3_DIVIDER_BAND0_1, 0x01),
511 QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_4_DIVIDER_BAND0_1, 0x00),
512 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0xf5),
513 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f),
514 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x09),
515 QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
516 QMP_PHY_INIT_CFG(QSERDES_V5_TX_TRAN_DRVR_EMP_EN, 0x0c),
517};
518
519static const struct qmp_ufs_init_tbl sm8350_ufsphy_rx[] = {
520 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_LVL, 0x24),
521 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x0f),
522 QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
523 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_BAND, 0x18),
524 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x0a),
525 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5a),
526 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0xf1),
527 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
528 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CTRL2, 0x80),
529 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0e),
530 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x04),
531 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_TERM_BW, 0x1b),
532 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL1, 0x04),
533 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
534 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
535 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1a),
536 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x17),
537 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x00),
538 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_MEASURE_TIME, 0x10),
539 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
540 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
541 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0x6d),
542 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x6d),
543 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xed),
544 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3b),
545 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0x3c),
546 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0xe0),
547 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0xc8),
548 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xc8),
549 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x3b),
550 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xb7),
551 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_LOW, 0xe0),
552 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH, 0xc8),
553 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH2, 0xc8),
554 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH3, 0x3b),
555 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH4, 0xb7),
556 QMP_PHY_INIT_CFG(QSERDES_V5_RX_DCC_CTRL1, 0x0c),
557};
558
559static const struct qmp_ufs_init_tbl sm8350_ufsphy_pcs[] = {
560 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
561 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
562 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
563 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
564 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_DEBUG_BUS_CLKSEL, 0x1f),
565 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_RX_MIN_HIBERN8_TIME, 0xff),
566 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_RX_SIGDET_CTRL1, 0x0e),
567 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
568};
569
570static const struct qmp_ufs_init_tbl sm8350_ufsphy_g4_tx[] = {
571 QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0xe5),
572};
573
574static const struct qmp_ufs_init_tbl sm8350_ufsphy_g4_rx[] = {
575 QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CTRL2, 0x81),
576 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_TERM_BW, 0x6f),
577 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x00),
578 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
579 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
580 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_MEASURE_TIME, 0x20),
581 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0x80),
582 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x01),
583 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0xbf),
584 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0xbf),
585 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0x7f),
586 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x7f),
587 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0x2d),
588 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0x6d),
589 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0x6d),
590 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xed),
591 QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0x3c),
592};
593
594static const struct qmp_ufs_init_tbl sm8350_ufsphy_g4_pcs[] = {
595 QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_BIST_FIXED_PAT_CTRL, 0x0a),
596};
597
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +0200598static const struct qmp_ufs_init_tbl sm8650_ufsphy_pcs[] = {
599 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
600 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
601 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PCS_CTRL1, 0xc1),
602 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0f),
603 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_SIGDET_CTRL2, 0x68),
604 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_POST_EMP_LVL_S4, 0x0e),
605 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_POST_EMP_LVL_S5, 0x12),
606 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_POST_EMP_LVL_S6, 0x15),
607 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_POST_EMP_LVL_S7, 0x19),
608 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PLL_CNTL, 0x13),
609 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_HSGEAR_CAPABILITY, 0x04),
610 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HSGEAR_CAPABILITY, 0x04),
611 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PLL_CNTL, 0x33),
612 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_HSGEAR_CAPABILITY, 0x05),
613 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HSGEAR_CAPABILITY, 0x05),
614 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HS_G5_SYNC_LENGTH_CAPABILITY, 0x4d),
615 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HSG5_SYNC_WAIT_TIME, 0x9e),
616};
617
Caleb Connollyf2021a22024-10-12 15:22:05 +0200618
619static const struct qmp_ufs_init_tbl sc7280_ufsphy_tx[] = {
620 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_1_DIVIDER_BAND0_1, 0x06),
621 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_2_DIVIDER_BAND0_1, 0x03),
622 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_3_DIVIDER_BAND0_1, 0x01),
623 QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_4_DIVIDER_BAND0_1, 0x00),
624 QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x35),
625 QMP_PHY_INIT_CFG(QSERDES_V4_TX_TRAN_DRVR_EMP_EN, 0x0c),
626};
627
628static const struct qmp_ufs_init_tbl sc7280_ufsphy_rx[] = {
629 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_LVL, 0x24),
630 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x0f),
631 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
632 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_BAND, 0x18),
633 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x0a),
634 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5a),
635 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0xf1),
636 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
637 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x80),
638 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0e),
639 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x04),
640 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x1b),
641 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
642 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
643 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1d),
644 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x00),
645 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x10),
646 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
647 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
648 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x6d),
649 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x6d),
650 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xed),
651 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x3b),
652 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x3c),
653 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xe0),
654 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xc8),
655 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xc8),
656 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x3b),
657 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb1),
658 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_LOW, 0xe0),
659 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH, 0xc8),
660 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH2, 0xc8),
661 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH3, 0x3b),
662 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH4, 0xb1),
663 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
664};
665
666static const struct qmp_ufs_init_tbl sc7280_ufsphy_pcs[] = {
667 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
668 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
669 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
670 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
671 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_DEBUG_BUS_CLKSEL, 0x1f),
672 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_MIN_HIBERN8_TIME, 0xff),
673 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
674 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_PLL_CNTL, 0x03),
675 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TIMER_20US_CORECLK_STEPS_MSB, 0x16),
676 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TIMER_20US_CORECLK_STEPS_LSB, 0xd8),
677 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_PWM_GEAR_BAND, 0xaa),
678 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_HS_GEAR_BAND, 0x06),
679 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_HSGEAR_CAPABILITY, 0x03),
680 QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_HSGEAR_CAPABILITY, 0x03),
681};
682
683static const struct qmp_ufs_init_tbl sc7280_ufsphy_hs_g4_rx[] = {
684 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_LVL, 0x24),
685 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x0f),
686 QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
687 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_BAND, 0x18),
688 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x0a),
689 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5a),
690 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0xf1),
691 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
692 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x81),
693 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0e),
694 QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x04),
695 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x6f),
696 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL1, 0x04),
697 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x00),
698 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x09),
699 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x07),
700 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x17),
701 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x00),
702 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x20),
703 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0x80),
704 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x01),
705 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x3f),
706 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff),
707 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xff),
708 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
709 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x2c),
710 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0x6d),
711 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0x6d),
712 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xed),
713 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x3b),
714 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0x3c),
715 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_LOW, 0xe0),
716 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH, 0xc8),
717 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH2, 0xc8),
718 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH3, 0x3b),
719 QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH4, 0xb1),
720 QMP_PHY_INIT_CFG(QSERDES_V4_RX_DCC_CTRL1, 0x0c),
721 QMP_PHY_INIT_CFG(QSERDES_V4_RX_GM_CAL, 0x0f),
722};
723
Aswin Murugan5a3f0c92025-05-21 09:23:21 +0530724static const struct qmp_ufs_init_tbl sm6115_ufsphy_serdes[] = {
725 QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x0e),
726 QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x14),
727 QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
728 QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x02),
729 QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
730 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
731 QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
732 QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
733 QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV_MODE1, 0x0a),
734 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x01),
735 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x00),
736 QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL, 0x20),
737 QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
738 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
739 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
740 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x3f),
741 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x04),
742 QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x05),
743 QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
744 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x00),
745 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x00),
746 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x00),
747 QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
748 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
749 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
750 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
751 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
752 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE0, 0x28),
753 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE0, 0x02),
754 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0xff),
755 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x0c),
756 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
757 QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE1, 0x98),
758 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE1, 0x00),
759 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE1, 0x00),
760 QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE1, 0x00),
761 QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE1, 0x0b),
762 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE1, 0x16),
763 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE1, 0x28),
764 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE1, 0x80),
765 QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
766 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE1, 0xd6),
767 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE1, 0x00),
768 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE1, 0x32),
769 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE1, 0x0f),
770 QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE1, 0x00),
771 QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
772 QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
773 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_INITVAL1, 0xff),
774 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_INITVAL2, 0x00),
775};
776
777static const struct qmp_ufs_init_tbl sm6115_ufsphy_hs_b_serdes[] = {
778 QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x44),
779};
780
781static const struct qmp_ufs_init_tbl sm6115_ufsphy_tx[] = {
782 QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
783 QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x06),
784};
785
786static const struct qmp_ufs_init_tbl sm6115_ufsphy_rx[] = {
787 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x24),
788 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x0f),
789 QMP_PHY_INIT_CFG(QSERDES_RX_RX_INTERFACE_MODE, 0x40),
790 QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
791 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
792 QMP_PHY_INIT_CFG(QSERDES_RX_RX_TERM_BW, 0x5b),
793 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_LSB, 0xff),
794 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_MSB, 0x3f),
795 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_LSB, 0xff),
796 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_MSB, 0x3f),
797 QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0d),
798 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SVS_SO_GAIN_HALF, 0x04),
799 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SVS_SO_GAIN_QUARTER, 0x04),
800 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SVS_SO_GAIN, 0x04),
801 QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5b),
802};
803
804static const struct qmp_ufs_init_tbl sm6115_ufsphy_pcs[] = {
805 QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_RX_PWM_GEAR_BAND, 0x15),
806 QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
807 QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0f),
808 QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
809 QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_RX_MIN_STALL_NOCONFIG_TIME_CAP, 0x28),
810 QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_RX_SYM_RESYNC_CTRL, 0x03),
811 QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_TX_LARGE_AMP_POST_EMP_LVL, 0x12),
812 QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_TX_SMALL_AMP_POST_EMP_LVL, 0x0f),
813 QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_RX_MIN_HIBERN8_TIME, 0x9a), /* 8 us */
814};
815
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +0200816struct qmp_ufs_offsets {
817 u16 serdes;
818 u16 pcs;
819 u16 tx;
820 u16 rx;
821 /* for PHYs with >= 2 lanes */
822 u16 tx2;
823 u16 rx2;
824};
825
826struct qmp_ufs_cfg_tbls {
827 /* Init sequence for PHY blocks - serdes, tx, rx, pcs */
828 const struct qmp_ufs_init_tbl *serdes;
829 int serdes_num;
830 const struct qmp_ufs_init_tbl *tx;
831 int tx_num;
832 const struct qmp_ufs_init_tbl *rx;
833 int rx_num;
834 const struct qmp_ufs_init_tbl *pcs;
835 int pcs_num;
836};
837
838/* struct qmp_ufs_cfg - per-PHY initialization config */
839struct qmp_ufs_cfg {
840 int lanes;
841
842 const struct qmp_ufs_offsets *offsets;
843
844 /* Main init sequence for PHY blocks - serdes, tx, rx, pcs */
845 const struct qmp_ufs_cfg_tbls tbls;
846 /* Additional sequence for HS Series B */
847 const struct qmp_ufs_cfg_tbls tbls_hs_b;
848 /* Additional sequence for HS G4 */
849 const struct qmp_ufs_cfg_tbls tbls_hs_g4;
850
851 /* clock ids to be requested */
852 const char * const *clk_list;
853 int num_clks;
854 /* regulators to be requested */
855 const char * const *vreg_list;
856 int num_vregs;
857 /* resets to be requested */
858 const char * const *reset_list;
859 int num_resets;
860
861 /* array of registers with different offsets */
862 const unsigned int *regs;
863
864 /* true, if PCS block has no separate SW_RESET register */
865 bool no_pcs_sw_reset;
866};
867
868struct qmp_ufs_priv {
869 struct phy *phy;
870
871 void __iomem *serdes;
872 void __iomem *pcs;
873 void __iomem *pcs_misc;
874 void __iomem *tx;
875 void __iomem *rx;
876 void __iomem *tx2;
877 void __iomem *rx2;
878
879 struct clk *clks;
880 unsigned int clk_count;
881
882 struct reset_ctl *resets;
883 unsigned int reset_count;
884
885 const struct qmp_ufs_cfg *cfg;
886
887 struct udevice *dev;
888
889 u32 mode;
890 u32 submode;
891};
892
893static inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
894{
895 u32 reg;
896
897 reg = readl(base + offset);
898 reg |= val;
899 writel(reg, base + offset);
900
901 /* ensure that above write is through */
902 readl(base + offset);
903}
904
905static inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val)
906{
907 u32 reg;
908
909 reg = readl(base + offset);
910 reg &= ~val;
911 writel(reg, base + offset);
912
913 /* ensure that above write is through */
914 readl(base + offset);
915}
916
917/* list of clocks required by phy */
918static const char * const sdm845_ufs_phy_clk_l[] = {
919 "ref", "ref_aux",
920};
921
Varadarajan Narayananbcf49ae2025-01-10 10:38:15 +0530922/* the primary usb3 phy on sm8250 doesn't have a ref clock */
923static const char * const sm8450_ufs_phy_clk_l[] = {
924 "qref", "ref", "ref_aux",
925};
926
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +0200927/* list of regulators */
928static const char * const qmp_ufs_vreg_l[] = {
929 "vdda-phy", "vdda-pll",
930};
931
932/* list of resets */
933static const char * const qmp_ufs_reset_l[] = {
934 "ufsphy",
935};
936
937static const struct qmp_ufs_offsets qmp_ufs_offsets = {
938 .serdes = 0,
939 .pcs = 0xc00,
940 .tx = 0x400,
941 .rx = 0x600,
942 .tx2 = 0x800,
943 .rx2 = 0xa00,
944};
945
946static const struct qmp_ufs_offsets qmp_ufs_offsets_v6 = {
947 .serdes = 0,
948 .pcs = 0x0400,
949 .tx = 0x1000,
950 .rx = 0x1200,
951 .tx2 = 0x1800,
952 .rx2 = 0x1a00,
953};
954
955static const struct qmp_ufs_cfg sdm845_ufsphy_cfg = {
956 .lanes = 2,
957
958 .offsets = &qmp_ufs_offsets,
959
960 .tbls = {
961 .serdes = sdm845_ufsphy_serdes,
962 .serdes_num = ARRAY_SIZE(sdm845_ufsphy_serdes),
963 .tx = sdm845_ufsphy_tx,
964 .tx_num = ARRAY_SIZE(sdm845_ufsphy_tx),
965 .rx = sdm845_ufsphy_rx,
966 .rx_num = ARRAY_SIZE(sdm845_ufsphy_rx),
967 .pcs = sdm845_ufsphy_pcs,
968 .pcs_num = ARRAY_SIZE(sdm845_ufsphy_pcs),
969 },
970 .tbls_hs_b = {
971 .serdes = sdm845_ufsphy_hs_b_serdes,
972 .serdes_num = ARRAY_SIZE(sdm845_ufsphy_hs_b_serdes),
973 },
974 .clk_list = sdm845_ufs_phy_clk_l,
975 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
976 .vreg_list = qmp_ufs_vreg_l,
977 .num_vregs = ARRAY_SIZE(qmp_ufs_vreg_l),
978 .regs = ufsphy_v3_regs_layout,
979
980 .no_pcs_sw_reset = true,
981};
982
Julius Lehmann425a9122024-10-02 20:52:17 +0200983static const struct qmp_ufs_cfg sm8150_ufsphy_cfg = {
984 .lanes = 2,
985
986 .offsets = &qmp_ufs_offsets,
987
988 .tbls = {
989 .serdes = sm8150_ufsphy_serdes,
990 .serdes_num = ARRAY_SIZE(sm8150_ufsphy_serdes),
991 .tx = sm8150_ufsphy_tx,
992 .tx_num = ARRAY_SIZE(sm8150_ufsphy_tx),
993 .rx = sm8150_ufsphy_rx,
994 .rx_num = ARRAY_SIZE(sm8150_ufsphy_rx),
995 .pcs = sm8150_ufsphy_pcs,
996 .pcs_num = ARRAY_SIZE(sm8150_ufsphy_pcs),
997 },
998 .tbls_hs_b = {
999 .serdes = sm8150_ufsphy_hs_b_serdes,
1000 .serdes_num = ARRAY_SIZE(sm8150_ufsphy_hs_b_serdes),
1001 },
1002 .tbls_hs_g4 = {
1003 .tx = sm8150_ufsphy_hs_g4_tx,
1004 .tx_num = ARRAY_SIZE(sm8150_ufsphy_hs_g4_tx),
1005 .rx = sm8150_ufsphy_hs_g4_rx,
1006 .rx_num = ARRAY_SIZE(sm8150_ufsphy_hs_g4_rx),
1007 .pcs = sm8150_ufsphy_hs_g4_pcs,
1008 .pcs_num = ARRAY_SIZE(sm8150_ufsphy_hs_g4_pcs),
1009 },
1010 .clk_list = sdm845_ufs_phy_clk_l,
1011 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
1012 .vreg_list = qmp_ufs_vreg_l,
1013 .num_vregs = ARRAY_SIZE(qmp_ufs_vreg_l),
1014 .reset_list = qmp_ufs_reset_l,
1015 .num_resets = ARRAY_SIZE(qmp_ufs_reset_l),
1016 .regs = ufsphy_v4_regs_layout,
1017
1018 .no_pcs_sw_reset = false,
1019};
1020
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +02001021static const struct qmp_ufs_cfg sm8250_ufsphy_cfg = {
1022 .lanes = 2,
1023
1024 .offsets = &qmp_ufs_offsets,
1025
1026 .tbls = {
1027 .serdes = sm8150_ufsphy_serdes,
1028 .serdes_num = ARRAY_SIZE(sm8150_ufsphy_serdes),
1029 .tx = sm8150_ufsphy_tx,
1030 .tx_num = ARRAY_SIZE(sm8150_ufsphy_tx),
1031 .rx = sm8150_ufsphy_rx,
1032 .rx_num = ARRAY_SIZE(sm8150_ufsphy_rx),
1033 .pcs = sm8150_ufsphy_pcs,
1034 .pcs_num = ARRAY_SIZE(sm8150_ufsphy_pcs),
1035 },
1036 .tbls_hs_b = {
1037 .serdes = sm8150_ufsphy_hs_b_serdes,
1038 .serdes_num = ARRAY_SIZE(sm8150_ufsphy_hs_b_serdes),
1039 },
1040 .tbls_hs_g4 = {
1041 .tx = sm8250_ufsphy_hs_g4_tx,
1042 .tx_num = ARRAY_SIZE(sm8250_ufsphy_hs_g4_tx),
1043 .rx = sm8250_ufsphy_hs_g4_rx,
1044 .rx_num = ARRAY_SIZE(sm8250_ufsphy_hs_g4_rx),
1045 .pcs = sm8150_ufsphy_hs_g4_pcs,
1046 .pcs_num = ARRAY_SIZE(sm8150_ufsphy_hs_g4_pcs),
1047 },
1048 .clk_list = sdm845_ufs_phy_clk_l,
1049 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
1050 .vreg_list = qmp_ufs_vreg_l,
1051 .num_vregs = ARRAY_SIZE(qmp_ufs_vreg_l),
1052 .reset_list = qmp_ufs_reset_l,
1053 .num_resets = ARRAY_SIZE(qmp_ufs_reset_l),
1054 .regs = ufsphy_v4_regs_layout,
1055
1056 .no_pcs_sw_reset = false,
1057};
1058
1059static const struct qmp_ufs_cfg sm8550_ufsphy_cfg = {
1060 .lanes = 2,
1061
1062 .offsets = &qmp_ufs_offsets_v6,
1063
1064 .tbls = {
1065 .serdes = sm8550_ufsphy_serdes,
1066 .serdes_num = ARRAY_SIZE(sm8550_ufsphy_serdes),
1067 .tx = sm8550_ufsphy_tx,
1068 .tx_num = ARRAY_SIZE(sm8550_ufsphy_tx),
1069 .rx = sm8550_ufsphy_rx,
1070 .rx_num = ARRAY_SIZE(sm8550_ufsphy_rx),
1071 .pcs = sm8550_ufsphy_pcs,
1072 .pcs_num = ARRAY_SIZE(sm8550_ufsphy_pcs),
1073 },
1074 .tbls_hs_b = {
1075 .serdes = sm8550_ufsphy_hs_b_serdes,
1076 .serdes_num = ARRAY_SIZE(sm8550_ufsphy_hs_b_serdes),
1077 },
1078 .clk_list = sdm845_ufs_phy_clk_l,
1079 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
1080 .vreg_list = qmp_ufs_vreg_l,
1081 .num_vregs = ARRAY_SIZE(qmp_ufs_vreg_l),
1082 .regs = ufsphy_v6_regs_layout,
1083
1084 .no_pcs_sw_reset = false,
1085};
1086
1087static const struct qmp_ufs_cfg sm8650_ufsphy_cfg = {
1088 .lanes = 2,
1089
1090 .offsets = &qmp_ufs_offsets_v6,
1091
1092 .tbls = {
1093 .serdes = sm8650_ufsphy_serdes,
1094 .serdes_num = ARRAY_SIZE(sm8650_ufsphy_serdes),
1095 .tx = sm8650_ufsphy_tx,
1096 .tx_num = ARRAY_SIZE(sm8650_ufsphy_tx),
1097 .rx = sm8650_ufsphy_rx,
1098 .rx_num = ARRAY_SIZE(sm8650_ufsphy_rx),
1099 .pcs = sm8650_ufsphy_pcs,
1100 .pcs_num = ARRAY_SIZE(sm8650_ufsphy_pcs),
1101 },
1102 .clk_list = sdm845_ufs_phy_clk_l,
1103 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
1104 .vreg_list = qmp_ufs_vreg_l,
1105 .num_vregs = ARRAY_SIZE(qmp_ufs_vreg_l),
1106 .regs = ufsphy_v6_regs_layout,
1107
1108 .no_pcs_sw_reset = false,
1109};
1110
Caleb Connollyf2021a22024-10-12 15:22:05 +02001111
1112static const struct qmp_ufs_cfg sc7280_ufsphy_cfg = {
1113 .lanes = 2,
1114
1115 .offsets = &qmp_ufs_offsets,
1116
1117 .tbls = {
1118 .serdes = sm8150_ufsphy_serdes,
1119 .serdes_num = ARRAY_SIZE(sm8150_ufsphy_serdes),
1120 .tx = sc7280_ufsphy_tx,
1121 .tx_num = ARRAY_SIZE(sc7280_ufsphy_tx),
1122 .rx = sc7280_ufsphy_rx,
1123 .rx_num = ARRAY_SIZE(sc7280_ufsphy_rx),
1124 .pcs = sc7280_ufsphy_pcs,
1125 .pcs_num = ARRAY_SIZE(sc7280_ufsphy_pcs),
1126 },
1127 .tbls_hs_b = {
1128 .serdes = sm8150_ufsphy_hs_b_serdes,
1129 .serdes_num = ARRAY_SIZE(sm8150_ufsphy_hs_b_serdes),
1130 },
1131 .tbls_hs_g4 = {
1132 .tx = sm8250_ufsphy_hs_g4_tx,
1133 .tx_num = ARRAY_SIZE(sm8250_ufsphy_hs_g4_tx),
1134 .rx = sc7280_ufsphy_hs_g4_rx,
1135 .rx_num = ARRAY_SIZE(sc7280_ufsphy_hs_g4_rx),
1136 .pcs = sm8150_ufsphy_hs_g4_pcs,
1137 .pcs_num = ARRAY_SIZE(sm8150_ufsphy_hs_g4_pcs),
1138 },
1139 .clk_list = sdm845_ufs_phy_clk_l,
1140 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
1141 .vreg_list = qmp_ufs_vreg_l,
1142 .num_vregs = ARRAY_SIZE(qmp_ufs_vreg_l),
1143 .regs = ufsphy_v4_regs_layout,
1144};
1145
Varadarajan Narayananbcf49ae2025-01-10 10:38:15 +05301146static const struct qmp_ufs_cfg sa8775p_ufsphy_cfg = {
1147 .lanes = 2,
1148
1149 .offsets = &qmp_ufs_offsets,
1150
1151 .tbls = {
1152 .serdes = sm8350_ufsphy_serdes,
1153 .serdes_num = ARRAY_SIZE(sm8350_ufsphy_serdes),
1154 .tx = sm8350_ufsphy_tx,
1155 .tx_num = ARRAY_SIZE(sm8350_ufsphy_tx),
1156 .rx = sm8350_ufsphy_rx,
1157 .rx_num = ARRAY_SIZE(sm8350_ufsphy_rx),
1158 .pcs = sm8350_ufsphy_pcs,
1159 .pcs_num = ARRAY_SIZE(sm8350_ufsphy_pcs),
1160 },
1161 .tbls_hs_b = {
1162 .serdes = sm8350_ufsphy_hs_b_serdes,
1163 .serdes_num = ARRAY_SIZE(sm8350_ufsphy_hs_b_serdes),
1164 },
1165 .tbls_hs_g4 = {
1166 .tx = sm8350_ufsphy_g4_tx,
1167 .tx_num = ARRAY_SIZE(sm8350_ufsphy_g4_tx),
1168 .rx = sm8350_ufsphy_g4_rx,
1169 .rx_num = ARRAY_SIZE(sm8350_ufsphy_g4_rx),
1170 .pcs = sm8350_ufsphy_g4_pcs,
1171 .pcs_num = ARRAY_SIZE(sm8350_ufsphy_g4_pcs),
1172 },
1173 .clk_list = sm8450_ufs_phy_clk_l,
1174 .num_clks = ARRAY_SIZE(sm8450_ufs_phy_clk_l),
1175 .vreg_list = qmp_ufs_vreg_l,
1176 .num_vregs = ARRAY_SIZE(qmp_ufs_vreg_l),
1177 .regs = ufsphy_v5_regs_layout,
1178};
1179
Aswin Murugan5a3f0c92025-05-21 09:23:21 +05301180static const struct qmp_ufs_cfg sm6115_ufsphy_cfg = {
1181 .lanes = 1,
1182
1183 .offsets = &qmp_ufs_offsets,
1184
1185 .tbls = {
1186 .serdes = sm6115_ufsphy_serdes,
1187 .serdes_num = ARRAY_SIZE(sm6115_ufsphy_serdes),
1188 .tx = sm6115_ufsphy_tx,
1189 .tx_num = ARRAY_SIZE(sm6115_ufsphy_tx),
1190 .rx = sm6115_ufsphy_rx,
1191 .rx_num = ARRAY_SIZE(sm6115_ufsphy_rx),
1192 .pcs = sm6115_ufsphy_pcs,
1193 .pcs_num = ARRAY_SIZE(sm6115_ufsphy_pcs),
1194 },
1195 .tbls_hs_b = {
1196 .serdes = sm6115_ufsphy_hs_b_serdes,
1197 .serdes_num = ARRAY_SIZE(sm6115_ufsphy_hs_b_serdes),
1198 },
1199 .clk_list = sdm845_ufs_phy_clk_l,
1200 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l),
1201 .vreg_list = qmp_ufs_vreg_l,
1202 .num_vregs = ARRAY_SIZE(qmp_ufs_vreg_l),
1203 .regs = ufsphy_v2_regs_layout,
1204
1205 .no_pcs_sw_reset = true,
1206};
1207
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +02001208static void qmp_ufs_configure_lane(void __iomem *base,
1209 const struct qmp_ufs_init_tbl tbl[],
1210 int num,
1211 u8 lane_mask)
1212{
1213 int i;
1214 const struct qmp_ufs_init_tbl *t = tbl;
1215
1216 if (!t)
1217 return;
1218
1219 for (i = 0; i < num; i++, t++) {
1220 if (!(t->lane_mask & lane_mask))
1221 continue;
1222
1223 writel(t->val, base + t->offset);
1224 }
1225}
1226
1227static void qmp_ufs_configure(void __iomem *base,
1228 const struct qmp_ufs_init_tbl tbl[],
1229 int num)
1230{
1231 qmp_ufs_configure_lane(base, tbl, num, 0xff);
1232}
1233
1234static void qmp_ufs_serdes_init(struct qmp_ufs_priv *qmp, const struct qmp_ufs_cfg_tbls *tbls)
1235{
1236 void __iomem *serdes = qmp->serdes;
1237
1238 qmp_ufs_configure(serdes, tbls->serdes, tbls->serdes_num);
1239}
1240
1241static void qmp_ufs_lanes_init(struct qmp_ufs_priv *qmp, const struct qmp_ufs_cfg_tbls *tbls)
1242{
1243 const struct qmp_ufs_cfg *cfg = qmp->cfg;
1244 void __iomem *tx = qmp->tx;
1245 void __iomem *rx = qmp->rx;
1246
1247 qmp_ufs_configure_lane(tx, tbls->tx, tbls->tx_num, 1);
1248 qmp_ufs_configure_lane(rx, tbls->rx, tbls->rx_num, 1);
1249
1250 if (cfg->lanes >= 2) {
1251 qmp_ufs_configure_lane(qmp->tx2, tbls->tx, tbls->tx_num, 2);
1252 qmp_ufs_configure_lane(qmp->rx2, tbls->rx, tbls->rx_num, 2);
1253 }
1254}
1255
1256static void qmp_ufs_pcs_init(struct qmp_ufs_priv *qmp, const struct qmp_ufs_cfg_tbls *tbls)
1257{
1258 void __iomem *pcs = qmp->pcs;
1259
1260 qmp_ufs_configure(pcs, tbls->pcs, tbls->pcs_num);
1261}
1262
1263static void qmp_ufs_init_registers(struct qmp_ufs_priv *qmp, const struct qmp_ufs_cfg *cfg)
1264{
1265 /* We support 'PHY_MODE_UFS_HS_B' mode & 'UFS_HS_G3' submode for now. */
1266 qmp_ufs_serdes_init(qmp, &cfg->tbls);
1267 qmp_ufs_serdes_init(qmp, &cfg->tbls_hs_b);
1268 qmp_ufs_serdes_init(qmp, &cfg->tbls_hs_g4);
1269 qmp_ufs_lanes_init(qmp, &cfg->tbls);
1270 qmp_ufs_pcs_init(qmp, &cfg->tbls);
1271}
1272
1273static int qmp_ufs_do_reset(struct qmp_ufs_priv *qmp)
1274{
1275 int i, ret;
1276
1277 for (i = 0; i < qmp->reset_count; i++) {
1278 ret = reset_assert(&qmp->resets[i]);
1279 if (ret)
1280 return ret;
1281 }
1282
1283 udelay(10);
1284
1285 for (i = 0; i < qmp->reset_count; i++) {
1286 ret = reset_deassert(&qmp->resets[i]);
1287 if (ret)
1288 return ret;
1289 }
1290
1291 udelay(50);
1292
1293 return 0;
1294}
1295
1296static int qmp_ufs_power_on(struct phy *phy)
1297{
1298 struct qmp_ufs_priv *qmp = dev_get_priv(phy->dev);
1299 const struct qmp_ufs_cfg *cfg = qmp->cfg;
1300 void __iomem *pcs = qmp->pcs;
1301 void __iomem *status;
1302 unsigned int val;
1303 int ret;
1304
1305 /* Power down PHY */
1306 qphy_setbits(pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], SW_PWRDN);
1307
1308 qmp_ufs_init_registers(qmp, cfg);
1309
1310 if (cfg->no_pcs_sw_reset) {
1311 ret = qmp_ufs_do_reset(qmp);
1312 if (ret) {
1313 dev_err(phy->dev, "qmp reset failed\n");
1314 return ret;
1315 }
1316 }
1317
1318 /* Pull PHY out of reset state */
1319 if (!cfg->no_pcs_sw_reset)
1320 qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
1321
1322 /* start SerDes */
1323 qphy_setbits(pcs, cfg->regs[QPHY_START_CTRL], SERDES_START);
1324
1325 status = pcs + cfg->regs[QPHY_PCS_READY_STATUS];
1326 ret = readl_poll_timeout(status, val, (val & PCS_READY), PHY_INIT_COMPLETE_TIMEOUT);
1327 if (ret) {
1328 dev_err(phy->dev, "phy initialization timed-out\n");
1329 return ret;
1330 }
1331
1332 return 0;
1333}
1334
1335static int qmp_ufs_power_off(struct phy *phy)
1336{
1337 struct qmp_ufs_priv *qmp = dev_get_priv(phy->dev);
1338 const struct qmp_ufs_cfg *cfg = qmp->cfg;
1339
1340 /* PHY reset */
1341 qphy_setbits(qmp->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
1342
1343 /* stop SerDes and Phy-Coding-Sublayer */
1344 qphy_clrbits(qmp->pcs, cfg->regs[QPHY_START_CTRL],
1345 SERDES_START | PCS_START);
1346
1347 /* Put PHY into POWER DOWN state: active low */
1348 qphy_clrbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
1349 SW_PWRDN);
1350
1351 clk_release_all(qmp->clks, qmp->clk_count);
1352
1353 return 0;
1354}
1355
1356static int qmp_ufs_vreg_init(struct udevice *dev, struct qmp_ufs_priv *qmp)
1357{
1358 /* TOFIX: Add regulator support, but they should be voted at boot time already */
1359
1360 return 0;
1361}
1362
1363static int qmp_ufs_reset_init(struct udevice *dev, struct qmp_ufs_priv *qmp)
1364{
1365 const struct qmp_ufs_cfg *cfg = qmp->cfg;
1366 int num = cfg->num_resets;
1367 int i, ret;
1368
1369 qmp->reset_count = 0;
1370 qmp->resets = devm_kcalloc(dev, num, sizeof(*qmp->resets), GFP_KERNEL);
1371 if (!qmp->resets)
1372 return -ENOMEM;
1373
1374 for (i = 0; i < num; i++) {
1375 ret = reset_get_by_index(dev, i, &qmp->resets[i]);
1376 if (ret < 0) {
1377 dev_err(dev, "failed to get reset %d\n", i);
1378 goto reset_get_err;
1379 }
1380
1381 ++qmp->reset_count;
1382 }
1383
1384 return 0;
1385
1386reset_get_err:
1387 ret = reset_release_all(qmp->resets, qmp->reset_count);
1388 if (ret)
1389 dev_warn(dev, "failed to disable all resets\n");
1390
1391 return ret;
1392}
1393
1394static int qmp_ufs_clk_init(struct udevice *dev, struct qmp_ufs_priv *qmp)
1395{
1396 const struct qmp_ufs_cfg *cfg = qmp->cfg;
1397 int num = cfg->num_clks;
1398 int i, ret;
1399
1400 qmp->clk_count = 0;
1401 qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL);
1402 if (!qmp->clks)
1403 return -ENOMEM;
1404
1405 for (i = 0; i < num; i++) {
1406 ret = clk_get_by_index(dev, i, &qmp->clks[i]);
1407 if (ret < 0)
1408 goto clk_get_err;
1409
1410 ret = clk_enable(&qmp->clks[i]);
1411 if (ret && ret != -ENOSYS) {
1412 dev_err(dev, "failed to enable clock %d\n", i);
1413 goto clk_get_err;
1414 }
1415
1416 ++qmp->clk_count;
1417 }
1418
1419 return 0;
1420
1421clk_get_err:
1422 ret = clk_release_all(qmp->clks, qmp->clk_count);
1423 if (ret)
1424 dev_warn(dev, "failed to disable all clocks\n");
1425
1426 return ret;
1427}
1428
1429static int qmp_ufs_probe_generic_child(struct udevice *dev,
1430 ofnode child)
1431{
1432 struct qmp_ufs_priv *qmp = dev_get_priv(dev);
1433 const struct qmp_ufs_cfg *cfg = qmp->cfg;
1434 struct resource res;
1435 int ret;
1436
1437 /*
1438 * Get memory resources for the PHY:
1439 * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2.
1440 * For dual lane PHYs: tx2 -> 3, rx2 -> 4, pcs_misc (optional) -> 5
1441 * For single lane PHYs: pcs_misc (optional) -> 3.
1442 */
1443 ret = ofnode_read_resource(child, 0, &res);
1444 if (ret) {
1445 dev_err(dev, "can't get reg property of child %s\n",
1446 ofnode_get_name(child));
1447 return ret;
1448 }
1449
1450 qmp->tx = (void __iomem *)res.start;
1451
1452 ret = ofnode_read_resource(child, 1, &res);
1453 if (ret) {
1454 dev_err(dev, "can't get reg property of child %s\n",
1455 ofnode_get_name(child));
1456 return ret;
1457 }
1458
1459 qmp->rx = (void __iomem *)res.start;
1460
1461 ret = ofnode_read_resource(child, 2, &res);
1462 if (ret) {
1463 dev_err(dev, "can't get reg property of child %s\n",
1464 ofnode_get_name(child));
1465 return ret;
1466 }
1467
1468 qmp->pcs = (void __iomem *)res.start;
1469
1470 if (cfg->lanes >= 2) {
1471 ret = ofnode_read_resource(child, 3, &res);
1472 if (ret) {
1473 dev_err(dev, "can't get reg property of child %s\n",
1474 ofnode_get_name(child));
1475 return ret;
1476 }
1477
1478 qmp->tx2 = (void __iomem *)res.start;
1479
1480 ret = ofnode_read_resource(child, 4, &res);
1481 if (ret) {
1482 dev_err(dev, "can't get reg property of child %s\n",
1483 ofnode_get_name(child));
1484 return ret;
1485 }
1486
1487 qmp->rx2 = (void __iomem *)res.start;
1488
1489 ret = ofnode_read_resource(child, 5, &res);
1490 if (ret)
1491 qmp->pcs_misc = NULL;
1492 } else {
1493 ret = ofnode_read_resource(child, 3, &res);
1494 if (ret)
1495 qmp->pcs_misc = NULL;
1496 }
1497
1498 return 0;
1499}
1500
1501static int qmp_ufs_probe_dt_children(struct udevice *dev)
1502{
1503 int ret;
1504 ofnode child;
1505
1506 ofnode_for_each_subnode(child, dev_ofnode(dev)) {
1507 ret = qmp_ufs_probe_generic_child(dev, child);
1508 if (ret) {
1509 dev_err(dev, "Cannot parse child %s:%d\n",
1510 ofnode_get_name(child), ret);
1511 return ret;
1512 }
1513 }
1514
1515 return 0;
1516}
1517
1518static int qmp_ufs_probe(struct udevice *dev)
1519{
1520 struct qmp_ufs_priv *qmp = dev_get_priv(dev);
1521 int ret;
1522
1523 qmp->serdes = (void __iomem *)dev_read_addr(dev);
1524 if (IS_ERR(qmp->serdes))
1525 return PTR_ERR(qmp->serdes);
1526
1527 qmp->cfg = (const struct qmp_ufs_cfg *)dev_get_driver_data(dev);
1528 if (!qmp->cfg)
1529 return -EINVAL;
1530
1531 ret = qmp_ufs_clk_init(dev, qmp);
1532 if (ret) {
1533 dev_err(dev, "failed to get UFS clks\n");
1534 return ret;
1535 }
1536
1537 ret = qmp_ufs_vreg_init(dev, qmp);
1538 if (ret) {
1539 dev_err(dev, "failed to get UFS voltage regulators\n");
1540 return ret;
1541 }
1542
1543 if (qmp->cfg->no_pcs_sw_reset) {
1544 ret = qmp_ufs_reset_init(dev, qmp);
1545 if (ret) {
1546 dev_err(dev, "failed to get UFS resets\n");
1547 return ret;
1548 }
1549 }
1550
1551 qmp->dev = dev;
1552
1553 if (ofnode_get_child_count(dev_ofnode(dev))) {
1554 ret = qmp_ufs_probe_dt_children(dev);
1555 if (ret) {
1556 dev_err(dev, "failed to get UFS dt regs\n");
1557 return ret;
1558 }
1559 } else {
1560 const struct qmp_ufs_offsets *offs = qmp->cfg->offsets;
1561 struct resource res;
1562
1563 if (!qmp->cfg->offsets) {
1564 dev_err(dev, "missing UFS offsets\n");
1565 return -EINVAL;
1566 }
1567
1568 ret = ofnode_read_resource(dev_ofnode(dev), 0, &res);
1569 if (ret) {
1570 dev_err(dev, "can't get reg property\n");
1571 return ret;
1572 }
1573
1574 qmp->serdes = (void __iomem *)res.start + offs->serdes;
1575 qmp->pcs = (void __iomem *)res.start + offs->pcs;
1576 qmp->tx = (void __iomem *)res.start + offs->tx;
1577 qmp->rx = (void __iomem *)res.start + offs->rx;
1578
1579 if (qmp->cfg->lanes >= 2) {
1580 qmp->tx2 = (void __iomem *)res.start + offs->tx2;
1581 qmp->rx2 = (void __iomem *)res.start + offs->rx2;
1582 }
1583 }
1584
1585 return 0;
1586}
1587
1588static struct phy_ops qmp_ufs_ops = {
1589 .power_on = qmp_ufs_power_on,
1590 .power_off = qmp_ufs_power_off,
1591};
1592
1593static const struct udevice_id qmp_ufs_ids[] = {
Varadarajan Narayananbcf49ae2025-01-10 10:38:15 +05301594 { .compatible = "qcom,sa8775p-qmp-ufs-phy", .data = (ulong)&sa8775p_ufsphy_cfg, },
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +02001595 { .compatible = "qcom,sdm845-qmp-ufs-phy", .data = (ulong)&sdm845_ufsphy_cfg },
Julius Lehmann425a9122024-10-02 20:52:17 +02001596 { .compatible = "qcom,sm8150-qmp-ufs-phy", .data = (ulong)&sm8150_ufsphy_cfg },
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +02001597 { .compatible = "qcom,sm8250-qmp-ufs-phy", .data = (ulong)&sm8250_ufsphy_cfg },
Balaji Selvanathane4966af2025-05-29 21:19:29 +05301598 { .compatible = "qcom,qcs8300-qmp-ufs-phy", .data = (ulong)&sa8775p_ufsphy_cfg },
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +02001599 { .compatible = "qcom,sm8550-qmp-ufs-phy", .data = (ulong)&sm8550_ufsphy_cfg },
1600 { .compatible = "qcom,sm8650-qmp-ufs-phy", .data = (ulong)&sm8650_ufsphy_cfg },
Caleb Connollyf2021a22024-10-12 15:22:05 +02001601 { .compatible = "qcom,sc7280-qmp-ufs-phy", .data = (ulong)&sc7280_ufsphy_cfg, },
Aswin Murugan5a3f0c92025-05-21 09:23:21 +05301602 { .compatible = "qcom,qcs615-qmp-ufs-phy", .data = (ulong)&sm6115_ufsphy_cfg, },
Bhupesh Sharmaf0cbbc92024-09-10 11:11:58 +02001603 { }
1604};
1605
1606U_BOOT_DRIVER(qcom_qmp_ufs) = {
1607 .name = "qcom-qmp-ufs",
1608 .id = UCLASS_PHY,
1609 .of_match = qmp_ufs_ids,
1610 .ops = &qmp_ufs_ops,
1611 .probe = qmp_ufs_probe,
1612 .priv_auto = sizeof(struct qmp_ufs_priv),
1613};