162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2017, The Linux Foundation. All rights reserved.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/clk.h>
762306a36Sopenharmony_ci#include <linux/clk-provider.h>
862306a36Sopenharmony_ci#include <linux/delay.h>
962306a36Sopenharmony_ci#include <linux/err.h>
1062306a36Sopenharmony_ci#include <linux/io.h>
1162306a36Sopenharmony_ci#include <linux/iopoll.h>
1262306a36Sopenharmony_ci#include <linux/kernel.h>
1362306a36Sopenharmony_ci#include <linux/module.h>
1462306a36Sopenharmony_ci#include <linux/of.h>
1562306a36Sopenharmony_ci#include <linux/of_address.h>
1662306a36Sopenharmony_ci#include <linux/phy/phy.h>
1762306a36Sopenharmony_ci#include <linux/platform_device.h>
1862306a36Sopenharmony_ci#include <linux/regulator/consumer.h>
1962306a36Sopenharmony_ci#include <linux/reset.h>
2062306a36Sopenharmony_ci#include <linux/slab.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#include <ufs/unipro.h>
2362306a36Sopenharmony_ci#include "phy-qcom-qmp.h"
2462306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-ufs-v2.h"
2562306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-ufs-v3.h"
2662306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-ufs-v4.h"
2762306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-ufs-v5.h"
2862306a36Sopenharmony_ci#include "phy-qcom-qmp-pcs-ufs-v6.h"
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#include "phy-qcom-qmp-qserdes-txrx-ufs-v6.h"
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/* QPHY_SW_RESET bit */
3362306a36Sopenharmony_ci#define SW_RESET				BIT(0)
3462306a36Sopenharmony_ci/* QPHY_POWER_DOWN_CONTROL */
3562306a36Sopenharmony_ci#define SW_PWRDN				BIT(0)
3662306a36Sopenharmony_ci/* QPHY_START_CONTROL bits */
3762306a36Sopenharmony_ci#define SERDES_START				BIT(0)
3862306a36Sopenharmony_ci#define PCS_START				BIT(1)
3962306a36Sopenharmony_ci/* QPHY_PCS_READY_STATUS bit */
4062306a36Sopenharmony_ci#define PCS_READY				BIT(0)
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define PHY_INIT_COMPLETE_TIMEOUT		10000
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct qmp_phy_init_tbl {
4562306a36Sopenharmony_ci	unsigned int offset;
4662306a36Sopenharmony_ci	unsigned int val;
4762306a36Sopenharmony_ci	/*
4862306a36Sopenharmony_ci	 * mask of lanes for which this register is written
4962306a36Sopenharmony_ci	 * for cases when second lane needs different values
5062306a36Sopenharmony_ci	 */
5162306a36Sopenharmony_ci	u8 lane_mask;
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci#define QMP_PHY_INIT_CFG(o, v)		\
5562306a36Sopenharmony_ci	{				\
5662306a36Sopenharmony_ci		.offset = o,		\
5762306a36Sopenharmony_ci		.val = v,		\
5862306a36Sopenharmony_ci		.lane_mask = 0xff,	\
5962306a36Sopenharmony_ci	}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define QMP_PHY_INIT_CFG_LANE(o, v, l)	\
6262306a36Sopenharmony_ci	{				\
6362306a36Sopenharmony_ci		.offset = o,		\
6462306a36Sopenharmony_ci		.val = v,		\
6562306a36Sopenharmony_ci		.lane_mask = l,		\
6662306a36Sopenharmony_ci	}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/* set of registers with offsets different per-PHY */
6962306a36Sopenharmony_cienum qphy_reg_layout {
7062306a36Sopenharmony_ci	/* PCS registers */
7162306a36Sopenharmony_ci	QPHY_SW_RESET,
7262306a36Sopenharmony_ci	QPHY_START_CTRL,
7362306a36Sopenharmony_ci	QPHY_PCS_READY_STATUS,
7462306a36Sopenharmony_ci	QPHY_PCS_POWER_DOWN_CONTROL,
7562306a36Sopenharmony_ci	/* Keep last to ensure regs_layout arrays are properly initialized */
7662306a36Sopenharmony_ci	QPHY_LAYOUT_SIZE
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistatic const unsigned int ufsphy_v2_regs_layout[QPHY_LAYOUT_SIZE] = {
8062306a36Sopenharmony_ci	[QPHY_START_CTRL]		= QPHY_V2_PCS_UFS_PHY_START,
8162306a36Sopenharmony_ci	[QPHY_PCS_READY_STATUS]		= QPHY_V2_PCS_UFS_READY_STATUS,
8262306a36Sopenharmony_ci	[QPHY_PCS_POWER_DOWN_CONTROL]	= QPHY_V2_PCS_UFS_POWER_DOWN_CONTROL,
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistatic const unsigned int ufsphy_v3_regs_layout[QPHY_LAYOUT_SIZE] = {
8662306a36Sopenharmony_ci	[QPHY_START_CTRL]		= QPHY_V3_PCS_UFS_PHY_START,
8762306a36Sopenharmony_ci	[QPHY_PCS_READY_STATUS]		= QPHY_V3_PCS_UFS_READY_STATUS,
8862306a36Sopenharmony_ci	[QPHY_PCS_POWER_DOWN_CONTROL]	= QPHY_V3_PCS_UFS_POWER_DOWN_CONTROL,
8962306a36Sopenharmony_ci};
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_cistatic const unsigned int ufsphy_v4_regs_layout[QPHY_LAYOUT_SIZE] = {
9262306a36Sopenharmony_ci	[QPHY_START_CTRL]		= QPHY_V4_PCS_UFS_PHY_START,
9362306a36Sopenharmony_ci	[QPHY_PCS_READY_STATUS]		= QPHY_V4_PCS_UFS_READY_STATUS,
9462306a36Sopenharmony_ci	[QPHY_SW_RESET]			= QPHY_V4_PCS_UFS_SW_RESET,
9562306a36Sopenharmony_ci	[QPHY_PCS_POWER_DOWN_CONTROL]	= QPHY_V4_PCS_UFS_POWER_DOWN_CONTROL,
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic const unsigned int ufsphy_v5_regs_layout[QPHY_LAYOUT_SIZE] = {
9962306a36Sopenharmony_ci	[QPHY_START_CTRL]		= QPHY_V5_PCS_UFS_PHY_START,
10062306a36Sopenharmony_ci	[QPHY_PCS_READY_STATUS]		= QPHY_V5_PCS_UFS_READY_STATUS,
10162306a36Sopenharmony_ci	[QPHY_SW_RESET]			= QPHY_V5_PCS_UFS_SW_RESET,
10262306a36Sopenharmony_ci	[QPHY_PCS_POWER_DOWN_CONTROL]	= QPHY_V5_PCS_UFS_POWER_DOWN_CONTROL,
10362306a36Sopenharmony_ci};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistatic const unsigned int ufsphy_v6_regs_layout[QPHY_LAYOUT_SIZE] = {
10662306a36Sopenharmony_ci	[QPHY_START_CTRL]		= QPHY_V6_PCS_UFS_PHY_START,
10762306a36Sopenharmony_ci	[QPHY_PCS_READY_STATUS]		= QPHY_V6_PCS_UFS_READY_STATUS,
10862306a36Sopenharmony_ci	[QPHY_SW_RESET]			= QPHY_V6_PCS_UFS_SW_RESET,
10962306a36Sopenharmony_ci	[QPHY_PCS_POWER_DOWN_CONTROL]	= QPHY_V6_PCS_UFS_POWER_DOWN_CONTROL,
11062306a36Sopenharmony_ci};
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl msm8996_ufsphy_serdes[] = {
11362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x0e),
11462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0xd7),
11562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
11662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x06),
11762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
11862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
11962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x05),
12062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
12162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV_MODE1, 0x0a),
12262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x01),
12362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x10),
12462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL, 0x20),
12562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
12662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
12762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
12862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x3f),
12962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x54),
13062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x05),
13162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
13262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x00),
13362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x00),
13462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x00),
13562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
13662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
13762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
13862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
13962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
14062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE0, 0x28),
14162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE0, 0x02),
14262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0xff),
14362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x0c),
14462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
14562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE1, 0x98),
14662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE1, 0x00),
14762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE1, 0x00),
14862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE1, 0x00),
14962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE1, 0x0b),
15062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE1, 0x16),
15162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE1, 0x28),
15262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE1, 0x80),
15362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
15462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE1, 0xd6),
15562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE1, 0x00),
15662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE1, 0x32),
15762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE1, 0x0f),
15862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE1, 0x00),
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl msm8996_ufsphy_tx[] = {
16262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
16362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x02),
16462306a36Sopenharmony_ci};
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl msm8996_ufsphy_rx[] = {
16762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x24),
16862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x02),
16962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_INTERFACE_MODE, 0x00),
17062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x18),
17162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0B),
17262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_TERM_BW, 0x5b),
17362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_LSB, 0xff),
17462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_MSB, 0x3f),
17562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_LSB, 0xff),
17662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_MSB, 0x0f),
17762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0E),
17862306a36Sopenharmony_ci};
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm6115_ufsphy_serdes[] = {
18162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CMN_CONFIG, 0x0e),
18262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_SYSCLK_EN_SEL, 0x14),
18362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CLK_SELECT, 0x30),
18462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_SYS_CLK_CTRL, 0x02),
18562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x08),
18662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_BG_TIMER, 0x0a),
18762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_HSCLK_SEL, 0x00),
18862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV, 0x0a),
18962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CORECLK_DIV_MODE1, 0x0a),
19062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_EN, 0x01),
19162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_CTRL, 0x00),
19262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_RESETSM_CNTRL, 0x20),
19362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CORE_CLK_EN, 0x00),
19462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP_CFG, 0x00),
19562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER1, 0xff),
19662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_TIMER2, 0x3f),
19762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x04),
19862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_SVS_MODE_CLK_SEL, 0x05),
19962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE0, 0x82),
20062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE0, 0x00),
20162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE0, 0x00),
20262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE0, 0x00),
20362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE0, 0x0b),
20462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE0, 0x16),
20562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE0, 0x28),
20662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE0, 0x80),
20762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
20862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE0, 0x28),
20962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE0, 0x02),
21062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE0, 0xff),
21162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE0, 0x0c),
21262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE0, 0x00),
21362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DEC_START_MODE1, 0x98),
21462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START1_MODE1, 0x00),
21562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START2_MODE1, 0x00),
21662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_DIV_FRAC_START3_MODE1, 0x00),
21762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_CP_CTRL_MODE1, 0x0b),
21862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_PLL_RCTRL_MODE1, 0x16),
21962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_PLL_CCTRL_MODE1, 0x28),
22062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN0_MODE1, 0x80),
22162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
22262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE1_MODE1, 0xd6),
22362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE2_MODE1, 0x00),
22462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP1_MODE1, 0x32),
22562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP2_MODE1, 0x0f),
22662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_LOCK_CMP3_MODE1, 0x00),
22762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_PLL_IVCO, 0x0f),
22862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_BG_TRIM, 0x0f),
22962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_INITVAL1, 0xff),
23062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_INITVAL2, 0x00),
23162306a36Sopenharmony_ci};
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm6115_ufsphy_hs_b_serdes[] = {
23462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_COM_VCO_TUNE_MAP, 0x44),
23562306a36Sopenharmony_ci};
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm6115_ufsphy_tx[] = {
23862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_TX_HIGHZ_TRANSCEIVEREN_BIAS_DRVR_EN, 0x45),
23962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_TX_LANE_MODE, 0x06),
24062306a36Sopenharmony_ci};
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm6115_ufsphy_rx[] = {
24362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_LVL, 0x24),
24462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_CNTRL, 0x0F),
24562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_INTERFACE_MODE, 0x40),
24662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_SIGDET_DEGLITCH_CNTRL, 0x1E),
24762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_FASTLOCK_FO_GAIN, 0x0B),
24862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_TERM_BW, 0x5B),
24962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_LSB, 0xFF),
25062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN1_MSB, 0x3F),
25162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_LSB, 0xFF),
25262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQ_GAIN2_MSB, 0x3F),
25362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2, 0x0D),
25462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SVS_SO_GAIN_HALF, 0x04),
25562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SVS_SO_GAIN_QUARTER, 0x04),
25662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SVS_SO_GAIN, 0x04),
25762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5B),
25862306a36Sopenharmony_ci};
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm6115_ufsphy_pcs[] = {
26162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_RX_PWM_GEAR_BAND, 0x15),
26262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
26362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0f),
26462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
26562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_RX_MIN_STALL_NOCONFIG_TIME_CAP, 0x28),
26662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_RX_SYM_RESYNC_CTRL, 0x03),
26762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_TX_LARGE_AMP_POST_EMP_LVL, 0x12),
26862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_TX_SMALL_AMP_POST_EMP_LVL, 0x0f),
26962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V2_PCS_UFS_RX_MIN_HIBERN8_TIME, 0x9a), /* 8 us */
27062306a36Sopenharmony_ci};
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sdm845_ufsphy_serdes[] = {
27362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYS_CLK_CTRL, 0x02),
27462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_BIAS_EN_CLKBUFLR_EN, 0x04),
27562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_BG_TIMER, 0x0a),
27662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_IVCO, 0x07),
27762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CMN_CONFIG, 0x06),
27862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SYSCLK_EN_SEL, 0xd5),
27962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_RESETSM_CNTRL, 0x20),
28062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CLK_SELECT, 0x30),
28162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_HSCLK_SEL, 0x00),
28262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP_EN, 0x01),
28362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_CTRL, 0x00),
28462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CORE_CLK_EN, 0x00),
28562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x04),
28662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_SVS_MODE_CLK_SEL, 0x05),
28762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_INITVAL1, 0xff),
28862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_INITVAL2, 0x00),
28962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE0, 0x82),
29062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE0, 0x06),
29162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE0, 0x16),
29262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE0, 0x36),
29362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE0, 0x3f),
29462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE0, 0x00),
29562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE0, 0xda),
29662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE0, 0x01),
29762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE0, 0xff),
29862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE0, 0x0c),
29962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_DEC_START_MODE1, 0x98),
30062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_CP_CTRL_MODE1, 0x06),
30162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_RCTRL_MODE1, 0x16),
30262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_PLL_CCTRL_MODE1, 0x36),
30362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN0_MODE1, 0x3f),
30462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_INTEGLOOP_GAIN1_MODE1, 0x00),
30562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE1_MODE1, 0xc1),
30662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE2_MODE1, 0x00),
30762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP1_MODE1, 0x32),
30862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_LOCK_CMP2_MODE1, 0x0f),
30962306a36Sopenharmony_ci};
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sdm845_ufsphy_hs_b_serdes[] = {
31262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_COM_VCO_TUNE_MAP, 0x44),
31362306a36Sopenharmony_ci};
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sdm845_ufsphy_tx[] = {
31662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_LANE_MODE_1, 0x06),
31762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_TX, 0x04),
31862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_TX_RES_CODE_LANE_OFFSET_RX, 0x07),
31962306a36Sopenharmony_ci};
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sdm845_ufsphy_rx[] = {
32262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_LVL, 0x24),
32362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x0f),
32462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
32562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
32662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
32762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_TERM_BW, 0x5b),
32862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
32962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
33062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1b),
33162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_HALF, 0x04),
33262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_QUARTER, 0x04),
33362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN, 0x04),
33462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
33562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x81),
33662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
33762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x59),
33862306a36Sopenharmony_ci};
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sdm845_ufsphy_pcs[] = {
34162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_SIGDET_CTRL2, 0x6e),
34262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
34362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
34462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_SYM_RESYNC_CTRL, 0x03),
34562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
34662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_SIGDET_CTRL1, 0x0f),
34762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_MIN_HIBERN8_TIME, 0x9a),
34862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
34962306a36Sopenharmony_ci};
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm7150_ufsphy_rx[] = {
35262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_LVL, 0x24),
35362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_CNTRL, 0x0f),
35462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
35562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_INTERFACE_MODE, 0x40),
35662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_FO_GAIN, 0x0b),
35762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_TERM_BW, 0x5b),
35862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
35962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
36062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1b),
36162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_HALF, 0x04),
36262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN_QUARTER, 0x04),
36362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SVS_SO_GAIN, 0x04),
36462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5b),
36562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_PI_CONTROLS, 0x81),
36662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
36762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V3_RX_RX_MODE_00, 0x59),
36862306a36Sopenharmony_ci};
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm7150_ufsphy_pcs[] = {
37162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_SIGDET_CTRL2, 0x6f),
37262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0f),
37362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
37462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_SYM_RESYNC_CTRL, 0x03),
37562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
37662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_SIGDET_CTRL1, 0x0f),
37762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_RX_MIN_HIBERN8_TIME, 0xff),
37862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V3_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
37962306a36Sopenharmony_ci};
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_ufsphy_serdes[] = {
38262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_SYSCLK_EN_SEL, 0xd9),
38362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_SEL, 0x11),
38462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_HSCLK_HS_SWITCH_SEL, 0x00),
38562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP_EN, 0x01),
38662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x02),
38762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_IVCO, 0x0f),
38862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_INITVAL2, 0x00),
38962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
39062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE0, 0x82),
39162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE0, 0x06),
39262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE0, 0x16),
39362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE0, 0x36),
39462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE0, 0xff),
39562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE0, 0x0c),
39662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xac),
39762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
39862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_DEC_START_MODE1, 0x98),
39962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_CP_CTRL_MODE1, 0x06),
40062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_RCTRL_MODE1, 0x16),
40162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_PLL_CCTRL_MODE1, 0x36),
40262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP1_MODE1, 0x32),
40362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_LOCK_CMP2_MODE1, 0x0f),
40462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xdd),
40562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x23),
40662306a36Sopenharmony_ci};
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_ufsphy_hs_b_serdes[] = {
40962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_COM_VCO_TUNE_MAP, 0x06),
41062306a36Sopenharmony_ci};
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_ufsphy_tx[] = {
41362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_1_DIVIDER_BAND0_1, 0x06),
41462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_2_DIVIDER_BAND0_1, 0x03),
41562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_3_DIVIDER_BAND0_1, 0x01),
41662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_PWM_GEAR_4_DIVIDER_BAND0_1, 0x00),
41762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x05),
41862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_TRAN_DRVR_EMP_EN, 0x0c),
41962306a36Sopenharmony_ci};
42062306a36Sopenharmony_ci
42162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_ufsphy_hs_g4_tx[] = {
42262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0x75),
42362306a36Sopenharmony_ci};
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_ufsphy_rx[] = {
42662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_LVL, 0x24),
42762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_CNTRL, 0x0f),
42862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
42962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_BAND, 0x18),
43062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_FO_GAIN, 0x0a),
43162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x4b),
43262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CONTROLS, 0xf1),
43362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
43462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x80),
43562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0c),
43662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_GAIN, 0x04),
43762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x1b),
43862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
43962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
44062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1d),
44162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x00),
44262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x10),
44362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
44462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
44562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x36),
44662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0x36),
44762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xf6),
44862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x3b),
44962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x3d),
45062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0xe0),
45162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0xc8),
45262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xc8),
45362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH3, 0x3b),
45462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0xb1),
45562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_LOW, 0xe0),
45662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH, 0xc8),
45762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH2, 0xc8),
45862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH3, 0x3b),
45962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_10_HIGH4, 0xb1),
46062306a36Sopenharmony_ci};
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_ufsphy_hs_g4_rx[] = {
46362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5a),
46462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x81),
46562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0e),
46662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x6f),
46762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x20),
46862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0x80),
46962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x01),
47062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x3f),
47162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff),
47262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xff),
47362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
47462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x6c),
47562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0x6d),
47662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0x6d),
47762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xed),
47862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0x3c),
47962306a36Sopenharmony_ci};
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_ufsphy_pcs[] = {
48262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
48362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
48462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
48562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
48662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_DEBUG_BUS_CLKSEL, 0x1f),
48762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_RX_MIN_HIBERN8_TIME, 0xff),
48862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
48962306a36Sopenharmony_ci};
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8150_ufsphy_hs_g4_pcs[] = {
49262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x10),
49362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V4_PCS_UFS_BIST_FIXED_PAT_CTRL, 0x0a),
49462306a36Sopenharmony_ci};
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8250_ufsphy_hs_g4_tx[] = {
49762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_TX_LANE_MODE_1, 0xe5),
49862306a36Sopenharmony_ci};
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8250_ufsphy_hs_g4_rx[] = {
50162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5a),
50262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_PI_CTRL2, 0x81),
50362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_UCDR_FO_GAIN, 0x0e),
50462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_TERM_BW, 0x6f),
50562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL1, 0x04),
50662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL2, 0x00),
50762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL3, 0x09),
50862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQU_ADAPTOR_CNTRL4, 0x07),
50962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x17),
51062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_MEASURE_TIME, 0x20),
51162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_LOW, 0x80),
51262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_IDAC_TSETTLE_HIGH, 0x01),
51362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_LOW, 0x3f),
51462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH, 0xff),
51562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH2, 0xff),
51662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH3, 0x7f),
51762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_00_HIGH4, 0x2c),
51862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_LOW, 0x6d),
51962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH, 0x6d),
52062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH2, 0xed),
52162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V4_RX_RX_MODE_01_HIGH4, 0x3c),
52262306a36Sopenharmony_ci};
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_ufsphy_serdes[] = {
52562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_SYSCLK_EN_SEL, 0xd9),
52662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_SEL, 0x11),
52762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_HSCLK_HS_SWITCH_SEL, 0x00),
52862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP_EN, 0x42),
52962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x02),
53062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_IVCO, 0x0f),
53162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_INITVAL2, 0x00),
53262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_HSCLK_SEL, 0x11),
53362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE0, 0x82),
53462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE0, 0x14),
53562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE0, 0x18),
53662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE0, 0x18),
53762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE0, 0xff),
53862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE0, 0x19),
53962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE1_MODE0, 0xac),
54062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE2_MODE0, 0x1e),
54162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_DEC_START_MODE1, 0x98),
54262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_CP_CTRL_MODE1, 0x14),
54362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_RCTRL_MODE1, 0x18),
54462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_PLL_CCTRL_MODE1, 0x18),
54562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP1_MODE1, 0x65),
54662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_LOCK_CMP2_MODE1, 0x1e),
54762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE1_MODE1, 0xdd),
54862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_BIN_VCOCAL_CMP_CODE2_MODE1, 0x23),
54962306a36Sopenharmony_ci};
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_ufsphy_hs_b_serdes[] = {
55262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_COM_VCO_TUNE_MAP, 0x06),
55362306a36Sopenharmony_ci};
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_ufsphy_tx[] = {
55662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_1_DIVIDER_BAND0_1, 0x06),
55762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_2_DIVIDER_BAND0_1, 0x03),
55862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_3_DIVIDER_BAND0_1, 0x01),
55962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_PWM_GEAR_4_DIVIDER_BAND0_1, 0x00),
56062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0xf5),
56162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_3, 0x3f),
56262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_TX, 0x09),
56362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_RES_CODE_LANE_OFFSET_RX, 0x09),
56462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_TRAN_DRVR_EMP_EN, 0x0c),
56562306a36Sopenharmony_ci};
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_ufsphy_rx[] = {
56862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_LVL, 0x24),
56962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_CNTRL, 0x0f),
57062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_SIGDET_DEGLITCH_CNTRL, 0x1e),
57162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_BAND, 0x18),
57262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_FO_GAIN, 0x0a),
57362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_SATURATION_AND_ENABLE, 0x5a),
57462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CONTROLS, 0xf1),
57562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FASTLOCK_COUNT_LOW, 0x80),
57662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CTRL2, 0x80),
57762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_FO_GAIN, 0x0e),
57862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_SO_GAIN, 0x04),
57962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_TERM_BW, 0x1b),
58062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL1, 0x04),
58162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x06),
58262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x04),
58362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x1a),
58462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1, 0x17),
58562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_OFFSET_ADAPTOR_CNTRL2, 0x00),
58662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_MEASURE_TIME, 0x10),
58762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0xc0),
58862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x00),
58962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0x6d),
59062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0x6d),
59162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0xed),
59262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x3b),
59362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0x3c),
59462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0xe0),
59562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0xc8),
59662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xc8),
59762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH3, 0x3b),
59862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0xb7),
59962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_LOW, 0xe0),
60062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH, 0xc8),
60162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH2, 0xc8),
60262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH3, 0x3b),
60362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_10_HIGH4, 0xb7),
60462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_DCC_CTRL1, 0x0c),
60562306a36Sopenharmony_ci};
60662306a36Sopenharmony_ci
60762306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_ufsphy_pcs[] = {
60862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_RX_SIGDET_CTRL2, 0x6d),
60962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0a),
61062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_SMALL_AMP_DRV_LVL, 0x02),
61162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
61262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_DEBUG_BUS_CLKSEL, 0x1f),
61362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_RX_MIN_HIBERN8_TIME, 0xff),
61462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_RX_SIGDET_CTRL1, 0x0e),
61562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
61662306a36Sopenharmony_ci};
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_ufsphy_g4_tx[] = {
61962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_TX_LANE_MODE_1, 0xe5),
62062306a36Sopenharmony_ci};
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_ufsphy_g4_rx[] = {
62362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_UCDR_PI_CTRL2, 0x81),
62462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_TERM_BW, 0x6f),
62562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL2, 0x00),
62662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL3, 0x4a),
62762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_EQU_ADAPTOR_CNTRL4, 0x0a),
62862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_MEASURE_TIME, 0x20),
62962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_LOW, 0x80),
63062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_IDAC_TSETTLE_HIGH, 0x01),
63162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_LOW, 0xbf),
63262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH, 0xbf),
63362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH2, 0x7f),
63462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH3, 0x7f),
63562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_00_HIGH4, 0x2d),
63662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_LOW, 0x6d),
63762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH, 0x6d),
63862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH2, 0xed),
63962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V5_RX_RX_MODE_01_HIGH4, 0x3c),
64062306a36Sopenharmony_ci};
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8350_ufsphy_g4_pcs[] = {
64362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V5_PCS_UFS_BIST_FIXED_PAT_CTRL, 0x0a),
64462306a36Sopenharmony_ci};
64562306a36Sopenharmony_ci
64662306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_ufsphy_serdes[] = {
64762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0xd9),
64862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x16),
64962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x11),
65062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_HS_SWITCH_SEL_1, 0x00),
65162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x01),
65262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x04),
65362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f),
65462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_INITVAL2, 0x00),
65562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41),
65662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x0a),
65762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x18),
65862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x14),
65962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x7f),
66062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x06),
66162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x4c),
66262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x0a),
66362306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x18),
66462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x14),
66562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x99),
66662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x07),
66762306a36Sopenharmony_ci};
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_ufsphy_tx[] = {
67062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_V6_TX_LANE_MODE_1, 0x05),
67162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x07),
67262306a36Sopenharmony_ci};
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_ufsphy_rx[] = {
67562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE2, 0x0c),
67662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE4, 0x0f),
67762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL, 0x0e),
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B0, 0xc2),
68062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B1, 0xc2),
68162306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B3, 0x1a),
68262306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B6, 0x60),
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE2_B3, 0x9e),
68562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE2_B6, 0x60),
68662306a36Sopenharmony_ci
68762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B3, 0x9e),
68862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B4, 0x0e),
68962306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B5, 0x36),
69062306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B8, 0x02),
69162306a36Sopenharmony_ci};
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_cistatic const struct qmp_phy_init_tbl sm8550_ufsphy_pcs[] = {
69462306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_SIGDET_CTRL2, 0x69),
69562306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0f),
69662306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_MID_TERM_CTRL1, 0x43),
69762306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PLL_CNTL, 0x2b),
69862306a36Sopenharmony_ci	QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_MULTI_LANE_CTRL1, 0x02),
69962306a36Sopenharmony_ci};
70062306a36Sopenharmony_ci
70162306a36Sopenharmony_cistruct qmp_ufs_offsets {
70262306a36Sopenharmony_ci	u16 serdes;
70362306a36Sopenharmony_ci	u16 pcs;
70462306a36Sopenharmony_ci	u16 tx;
70562306a36Sopenharmony_ci	u16 rx;
70662306a36Sopenharmony_ci	u16 tx2;
70762306a36Sopenharmony_ci	u16 rx2;
70862306a36Sopenharmony_ci};
70962306a36Sopenharmony_ci
71062306a36Sopenharmony_cistruct qmp_phy_cfg_tbls {
71162306a36Sopenharmony_ci	/* Init sequence for PHY blocks - serdes, tx, rx, pcs */
71262306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *serdes;
71362306a36Sopenharmony_ci	int serdes_num;
71462306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *tx;
71562306a36Sopenharmony_ci	int tx_num;
71662306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *rx;
71762306a36Sopenharmony_ci	int rx_num;
71862306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *pcs;
71962306a36Sopenharmony_ci	int pcs_num;
72062306a36Sopenharmony_ci};
72162306a36Sopenharmony_ci
72262306a36Sopenharmony_ci/* struct qmp_phy_cfg - per-PHY initialization config */
72362306a36Sopenharmony_cistruct qmp_phy_cfg {
72462306a36Sopenharmony_ci	int lanes;
72562306a36Sopenharmony_ci
72662306a36Sopenharmony_ci	const struct qmp_ufs_offsets *offsets;
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci	/* Main init sequence for PHY blocks - serdes, tx, rx, pcs */
72962306a36Sopenharmony_ci	const struct qmp_phy_cfg_tbls tbls;
73062306a36Sopenharmony_ci	/* Additional sequence for HS Series B */
73162306a36Sopenharmony_ci	const struct qmp_phy_cfg_tbls tbls_hs_b;
73262306a36Sopenharmony_ci	/* Additional sequence for HS G4 */
73362306a36Sopenharmony_ci	const struct qmp_phy_cfg_tbls tbls_hs_g4;
73462306a36Sopenharmony_ci
73562306a36Sopenharmony_ci	/* clock ids to be requested */
73662306a36Sopenharmony_ci	const char * const *clk_list;
73762306a36Sopenharmony_ci	int num_clks;
73862306a36Sopenharmony_ci	/* regulators to be requested */
73962306a36Sopenharmony_ci	const char * const *vreg_list;
74062306a36Sopenharmony_ci	int num_vregs;
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ci	/* array of registers with different offsets */
74362306a36Sopenharmony_ci	const unsigned int *regs;
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_ci	/* true, if PCS block has no separate SW_RESET register */
74662306a36Sopenharmony_ci	bool no_pcs_sw_reset;
74762306a36Sopenharmony_ci};
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_cistruct qmp_ufs {
75062306a36Sopenharmony_ci	struct device *dev;
75162306a36Sopenharmony_ci
75262306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg;
75362306a36Sopenharmony_ci
75462306a36Sopenharmony_ci	void __iomem *serdes;
75562306a36Sopenharmony_ci	void __iomem *pcs;
75662306a36Sopenharmony_ci	void __iomem *pcs_misc;
75762306a36Sopenharmony_ci	void __iomem *tx;
75862306a36Sopenharmony_ci	void __iomem *rx;
75962306a36Sopenharmony_ci	void __iomem *tx2;
76062306a36Sopenharmony_ci	void __iomem *rx2;
76162306a36Sopenharmony_ci
76262306a36Sopenharmony_ci	struct clk_bulk_data *clks;
76362306a36Sopenharmony_ci	struct regulator_bulk_data *vregs;
76462306a36Sopenharmony_ci	struct reset_control *ufs_reset;
76562306a36Sopenharmony_ci
76662306a36Sopenharmony_ci	struct phy *phy;
76762306a36Sopenharmony_ci	u32 mode;
76862306a36Sopenharmony_ci	u32 submode;
76962306a36Sopenharmony_ci};
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_cistatic inline void qphy_setbits(void __iomem *base, u32 offset, u32 val)
77262306a36Sopenharmony_ci{
77362306a36Sopenharmony_ci	u32 reg;
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_ci	reg = readl(base + offset);
77662306a36Sopenharmony_ci	reg |= val;
77762306a36Sopenharmony_ci	writel(reg, base + offset);
77862306a36Sopenharmony_ci
77962306a36Sopenharmony_ci	/* ensure that above write is through */
78062306a36Sopenharmony_ci	readl(base + offset);
78162306a36Sopenharmony_ci}
78262306a36Sopenharmony_ci
78362306a36Sopenharmony_cistatic inline void qphy_clrbits(void __iomem *base, u32 offset, u32 val)
78462306a36Sopenharmony_ci{
78562306a36Sopenharmony_ci	u32 reg;
78662306a36Sopenharmony_ci
78762306a36Sopenharmony_ci	reg = readl(base + offset);
78862306a36Sopenharmony_ci	reg &= ~val;
78962306a36Sopenharmony_ci	writel(reg, base + offset);
79062306a36Sopenharmony_ci
79162306a36Sopenharmony_ci	/* ensure that above write is through */
79262306a36Sopenharmony_ci	readl(base + offset);
79362306a36Sopenharmony_ci}
79462306a36Sopenharmony_ci
79562306a36Sopenharmony_ci/* list of clocks required by phy */
79662306a36Sopenharmony_cistatic const char * const msm8996_ufs_phy_clk_l[] = {
79762306a36Sopenharmony_ci	"ref",
79862306a36Sopenharmony_ci};
79962306a36Sopenharmony_ci
80062306a36Sopenharmony_ci/* the primary usb3 phy on sm8250 doesn't have a ref clock */
80162306a36Sopenharmony_cistatic const char * const sm8450_ufs_phy_clk_l[] = {
80262306a36Sopenharmony_ci	"qref", "ref", "ref_aux",
80362306a36Sopenharmony_ci};
80462306a36Sopenharmony_ci
80562306a36Sopenharmony_cistatic const char * const sdm845_ufs_phy_clk_l[] = {
80662306a36Sopenharmony_ci	"ref", "ref_aux",
80762306a36Sopenharmony_ci};
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_ci/* list of regulators */
81062306a36Sopenharmony_cistatic const char * const qmp_phy_vreg_l[] = {
81162306a36Sopenharmony_ci	"vdda-phy", "vdda-pll",
81262306a36Sopenharmony_ci};
81362306a36Sopenharmony_ci
81462306a36Sopenharmony_cistatic const struct qmp_ufs_offsets qmp_ufs_offsets = {
81562306a36Sopenharmony_ci	.serdes		= 0,
81662306a36Sopenharmony_ci	.pcs		= 0xc00,
81762306a36Sopenharmony_ci	.tx		= 0x400,
81862306a36Sopenharmony_ci	.rx		= 0x600,
81962306a36Sopenharmony_ci	.tx2		= 0x800,
82062306a36Sopenharmony_ci	.rx2		= 0xa00,
82162306a36Sopenharmony_ci};
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_cistatic const struct qmp_ufs_offsets qmp_ufs_offsets_v6 = {
82462306a36Sopenharmony_ci	.serdes		= 0,
82562306a36Sopenharmony_ci	.pcs		= 0x0400,
82662306a36Sopenharmony_ci	.tx		= 0x1000,
82762306a36Sopenharmony_ci	.rx		= 0x1200,
82862306a36Sopenharmony_ci	.tx2		= 0x1800,
82962306a36Sopenharmony_ci	.rx2		= 0x1a00,
83062306a36Sopenharmony_ci};
83162306a36Sopenharmony_ci
83262306a36Sopenharmony_cistatic const struct qmp_phy_cfg msm8996_ufsphy_cfg = {
83362306a36Sopenharmony_ci	.lanes			= 1,
83462306a36Sopenharmony_ci
83562306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets,
83662306a36Sopenharmony_ci
83762306a36Sopenharmony_ci	.tbls = {
83862306a36Sopenharmony_ci		.serdes		= msm8996_ufsphy_serdes,
83962306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(msm8996_ufsphy_serdes),
84062306a36Sopenharmony_ci		.tx		= msm8996_ufsphy_tx,
84162306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(msm8996_ufsphy_tx),
84262306a36Sopenharmony_ci		.rx		= msm8996_ufsphy_rx,
84362306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(msm8996_ufsphy_rx),
84462306a36Sopenharmony_ci	},
84562306a36Sopenharmony_ci
84662306a36Sopenharmony_ci	.clk_list		= msm8996_ufs_phy_clk_l,
84762306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(msm8996_ufs_phy_clk_l),
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
85062306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
85162306a36Sopenharmony_ci
85262306a36Sopenharmony_ci	.regs			= ufsphy_v2_regs_layout,
85362306a36Sopenharmony_ci
85462306a36Sopenharmony_ci	.no_pcs_sw_reset	= true,
85562306a36Sopenharmony_ci};
85662306a36Sopenharmony_ci
85762306a36Sopenharmony_cistatic const struct qmp_phy_cfg sa8775p_ufsphy_cfg = {
85862306a36Sopenharmony_ci	.lanes			= 2,
85962306a36Sopenharmony_ci
86062306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets,
86162306a36Sopenharmony_ci
86262306a36Sopenharmony_ci	.tbls = {
86362306a36Sopenharmony_ci		.serdes		= sm8350_ufsphy_serdes,
86462306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8350_ufsphy_serdes),
86562306a36Sopenharmony_ci		.tx		= sm8350_ufsphy_tx,
86662306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8350_ufsphy_tx),
86762306a36Sopenharmony_ci		.rx		= sm8350_ufsphy_rx,
86862306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8350_ufsphy_rx),
86962306a36Sopenharmony_ci		.pcs		= sm8350_ufsphy_pcs,
87062306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8350_ufsphy_pcs),
87162306a36Sopenharmony_ci	},
87262306a36Sopenharmony_ci	.tbls_hs_b = {
87362306a36Sopenharmony_ci		.serdes		= sm8350_ufsphy_hs_b_serdes,
87462306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8350_ufsphy_hs_b_serdes),
87562306a36Sopenharmony_ci	},
87662306a36Sopenharmony_ci	.tbls_hs_g4 = {
87762306a36Sopenharmony_ci		.tx		= sm8350_ufsphy_g4_tx,
87862306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8350_ufsphy_g4_tx),
87962306a36Sopenharmony_ci		.rx		= sm8350_ufsphy_g4_rx,
88062306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8350_ufsphy_g4_rx),
88162306a36Sopenharmony_ci		.pcs		= sm8350_ufsphy_g4_pcs,
88262306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8350_ufsphy_g4_pcs),
88362306a36Sopenharmony_ci	},
88462306a36Sopenharmony_ci	.clk_list		= sm8450_ufs_phy_clk_l,
88562306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(sm8450_ufs_phy_clk_l),
88662306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
88762306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
88862306a36Sopenharmony_ci	.regs			= ufsphy_v5_regs_layout,
88962306a36Sopenharmony_ci};
89062306a36Sopenharmony_ci
89162306a36Sopenharmony_cistatic const struct qmp_phy_cfg sc8280xp_ufsphy_cfg = {
89262306a36Sopenharmony_ci	.lanes			= 2,
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets,
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci	.tbls = {
89762306a36Sopenharmony_ci		.serdes		= sm8350_ufsphy_serdes,
89862306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8350_ufsphy_serdes),
89962306a36Sopenharmony_ci		.tx		= sm8350_ufsphy_tx,
90062306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8350_ufsphy_tx),
90162306a36Sopenharmony_ci		.rx		= sm8350_ufsphy_rx,
90262306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8350_ufsphy_rx),
90362306a36Sopenharmony_ci		.pcs		= sm8350_ufsphy_pcs,
90462306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8350_ufsphy_pcs),
90562306a36Sopenharmony_ci	},
90662306a36Sopenharmony_ci	.tbls_hs_b = {
90762306a36Sopenharmony_ci		.serdes		= sm8350_ufsphy_hs_b_serdes,
90862306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8350_ufsphy_hs_b_serdes),
90962306a36Sopenharmony_ci	},
91062306a36Sopenharmony_ci	.tbls_hs_g4 = {
91162306a36Sopenharmony_ci		.tx		= sm8350_ufsphy_g4_tx,
91262306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8350_ufsphy_g4_tx),
91362306a36Sopenharmony_ci		.rx		= sm8350_ufsphy_g4_rx,
91462306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8350_ufsphy_g4_rx),
91562306a36Sopenharmony_ci		.pcs		= sm8350_ufsphy_g4_pcs,
91662306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8350_ufsphy_g4_pcs),
91762306a36Sopenharmony_ci	},
91862306a36Sopenharmony_ci	.clk_list		= sdm845_ufs_phy_clk_l,
91962306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(sdm845_ufs_phy_clk_l),
92062306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
92162306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
92262306a36Sopenharmony_ci	.regs			= ufsphy_v5_regs_layout,
92362306a36Sopenharmony_ci};
92462306a36Sopenharmony_ci
92562306a36Sopenharmony_cistatic const struct qmp_phy_cfg sdm845_ufsphy_cfg = {
92662306a36Sopenharmony_ci	.lanes			= 2,
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets,
92962306a36Sopenharmony_ci
93062306a36Sopenharmony_ci	.tbls = {
93162306a36Sopenharmony_ci		.serdes		= sdm845_ufsphy_serdes,
93262306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sdm845_ufsphy_serdes),
93362306a36Sopenharmony_ci		.tx		= sdm845_ufsphy_tx,
93462306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sdm845_ufsphy_tx),
93562306a36Sopenharmony_ci		.rx		= sdm845_ufsphy_rx,
93662306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sdm845_ufsphy_rx),
93762306a36Sopenharmony_ci		.pcs		= sdm845_ufsphy_pcs,
93862306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sdm845_ufsphy_pcs),
93962306a36Sopenharmony_ci	},
94062306a36Sopenharmony_ci	.tbls_hs_b = {
94162306a36Sopenharmony_ci		.serdes		= sdm845_ufsphy_hs_b_serdes,
94262306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sdm845_ufsphy_hs_b_serdes),
94362306a36Sopenharmony_ci	},
94462306a36Sopenharmony_ci	.clk_list		= sdm845_ufs_phy_clk_l,
94562306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(sdm845_ufs_phy_clk_l),
94662306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
94762306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
94862306a36Sopenharmony_ci	.regs			= ufsphy_v3_regs_layout,
94962306a36Sopenharmony_ci
95062306a36Sopenharmony_ci	.no_pcs_sw_reset	= true,
95162306a36Sopenharmony_ci};
95262306a36Sopenharmony_ci
95362306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm6115_ufsphy_cfg = {
95462306a36Sopenharmony_ci	.lanes			= 1,
95562306a36Sopenharmony_ci
95662306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets,
95762306a36Sopenharmony_ci
95862306a36Sopenharmony_ci	.tbls = {
95962306a36Sopenharmony_ci		.serdes		= sm6115_ufsphy_serdes,
96062306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm6115_ufsphy_serdes),
96162306a36Sopenharmony_ci		.tx		= sm6115_ufsphy_tx,
96262306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm6115_ufsphy_tx),
96362306a36Sopenharmony_ci		.rx		= sm6115_ufsphy_rx,
96462306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm6115_ufsphy_rx),
96562306a36Sopenharmony_ci		.pcs		= sm6115_ufsphy_pcs,
96662306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm6115_ufsphy_pcs),
96762306a36Sopenharmony_ci	},
96862306a36Sopenharmony_ci	.tbls_hs_b = {
96962306a36Sopenharmony_ci		.serdes		= sm6115_ufsphy_hs_b_serdes,
97062306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm6115_ufsphy_hs_b_serdes),
97162306a36Sopenharmony_ci	},
97262306a36Sopenharmony_ci	.clk_list		= sdm845_ufs_phy_clk_l,
97362306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(sdm845_ufs_phy_clk_l),
97462306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
97562306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
97662306a36Sopenharmony_ci	.regs			= ufsphy_v2_regs_layout,
97762306a36Sopenharmony_ci
97862306a36Sopenharmony_ci	.no_pcs_sw_reset	= true,
97962306a36Sopenharmony_ci};
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm7150_ufsphy_cfg = {
98262306a36Sopenharmony_ci	.lanes			= 1,
98362306a36Sopenharmony_ci
98462306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets,
98562306a36Sopenharmony_ci
98662306a36Sopenharmony_ci	.tbls = {
98762306a36Sopenharmony_ci		.serdes		= sdm845_ufsphy_serdes,
98862306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sdm845_ufsphy_serdes),
98962306a36Sopenharmony_ci		.tx		= sdm845_ufsphy_tx,
99062306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sdm845_ufsphy_tx),
99162306a36Sopenharmony_ci		.rx		= sm7150_ufsphy_rx,
99262306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm7150_ufsphy_rx),
99362306a36Sopenharmony_ci		.pcs		= sm7150_ufsphy_pcs,
99462306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm7150_ufsphy_pcs),
99562306a36Sopenharmony_ci	},
99662306a36Sopenharmony_ci	.tbls_hs_b = {
99762306a36Sopenharmony_ci		.serdes		= sdm845_ufsphy_hs_b_serdes,
99862306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sdm845_ufsphy_hs_b_serdes),
99962306a36Sopenharmony_ci	},
100062306a36Sopenharmony_ci	.clk_list		= sdm845_ufs_phy_clk_l,
100162306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(sdm845_ufs_phy_clk_l),
100262306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
100362306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
100462306a36Sopenharmony_ci	.regs			= ufsphy_v3_regs_layout,
100562306a36Sopenharmony_ci
100662306a36Sopenharmony_ci	.no_pcs_sw_reset	= true,
100762306a36Sopenharmony_ci};
100862306a36Sopenharmony_ci
100962306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8150_ufsphy_cfg = {
101062306a36Sopenharmony_ci	.lanes			= 2,
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets,
101362306a36Sopenharmony_ci
101462306a36Sopenharmony_ci	.tbls = {
101562306a36Sopenharmony_ci		.serdes		= sm8150_ufsphy_serdes,
101662306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8150_ufsphy_serdes),
101762306a36Sopenharmony_ci		.tx		= sm8150_ufsphy_tx,
101862306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8150_ufsphy_tx),
101962306a36Sopenharmony_ci		.rx		= sm8150_ufsphy_rx,
102062306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8150_ufsphy_rx),
102162306a36Sopenharmony_ci		.pcs		= sm8150_ufsphy_pcs,
102262306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8150_ufsphy_pcs),
102362306a36Sopenharmony_ci	},
102462306a36Sopenharmony_ci	.tbls_hs_b = {
102562306a36Sopenharmony_ci		.serdes		= sm8150_ufsphy_hs_b_serdes,
102662306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8150_ufsphy_hs_b_serdes),
102762306a36Sopenharmony_ci	},
102862306a36Sopenharmony_ci	.tbls_hs_g4 = {
102962306a36Sopenharmony_ci		.tx		= sm8150_ufsphy_hs_g4_tx,
103062306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8150_ufsphy_hs_g4_tx),
103162306a36Sopenharmony_ci		.rx		= sm8150_ufsphy_hs_g4_rx,
103262306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8150_ufsphy_hs_g4_rx),
103362306a36Sopenharmony_ci		.pcs		= sm8150_ufsphy_hs_g4_pcs,
103462306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8150_ufsphy_hs_g4_pcs),
103562306a36Sopenharmony_ci	},
103662306a36Sopenharmony_ci	.clk_list		= sdm845_ufs_phy_clk_l,
103762306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(sdm845_ufs_phy_clk_l),
103862306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
103962306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
104062306a36Sopenharmony_ci	.regs			= ufsphy_v4_regs_layout,
104162306a36Sopenharmony_ci};
104262306a36Sopenharmony_ci
104362306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8250_ufsphy_cfg = {
104462306a36Sopenharmony_ci	.lanes			= 2,
104562306a36Sopenharmony_ci
104662306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets,
104762306a36Sopenharmony_ci
104862306a36Sopenharmony_ci	.tbls = {
104962306a36Sopenharmony_ci		.serdes		= sm8150_ufsphy_serdes,
105062306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8150_ufsphy_serdes),
105162306a36Sopenharmony_ci		.tx		= sm8150_ufsphy_tx,
105262306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8150_ufsphy_tx),
105362306a36Sopenharmony_ci		.rx		= sm8150_ufsphy_rx,
105462306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8150_ufsphy_rx),
105562306a36Sopenharmony_ci		.pcs		= sm8150_ufsphy_pcs,
105662306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8150_ufsphy_pcs),
105762306a36Sopenharmony_ci	},
105862306a36Sopenharmony_ci	.tbls_hs_b = {
105962306a36Sopenharmony_ci		.serdes		= sm8150_ufsphy_hs_b_serdes,
106062306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8150_ufsphy_hs_b_serdes),
106162306a36Sopenharmony_ci	},
106262306a36Sopenharmony_ci	.tbls_hs_g4 = {
106362306a36Sopenharmony_ci		.tx		= sm8250_ufsphy_hs_g4_tx,
106462306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8250_ufsphy_hs_g4_tx),
106562306a36Sopenharmony_ci		.rx		= sm8250_ufsphy_hs_g4_rx,
106662306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8250_ufsphy_hs_g4_rx),
106762306a36Sopenharmony_ci		.pcs		= sm8150_ufsphy_hs_g4_pcs,
106862306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8150_ufsphy_hs_g4_pcs),
106962306a36Sopenharmony_ci	},
107062306a36Sopenharmony_ci	.clk_list		= sdm845_ufs_phy_clk_l,
107162306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(sdm845_ufs_phy_clk_l),
107262306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
107362306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
107462306a36Sopenharmony_ci	.regs			= ufsphy_v4_regs_layout,
107562306a36Sopenharmony_ci};
107662306a36Sopenharmony_ci
107762306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8350_ufsphy_cfg = {
107862306a36Sopenharmony_ci	.lanes			= 2,
107962306a36Sopenharmony_ci
108062306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets,
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ci	.tbls = {
108362306a36Sopenharmony_ci		.serdes		= sm8350_ufsphy_serdes,
108462306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8350_ufsphy_serdes),
108562306a36Sopenharmony_ci		.tx		= sm8350_ufsphy_tx,
108662306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8350_ufsphy_tx),
108762306a36Sopenharmony_ci		.rx		= sm8350_ufsphy_rx,
108862306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8350_ufsphy_rx),
108962306a36Sopenharmony_ci		.pcs		= sm8350_ufsphy_pcs,
109062306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8350_ufsphy_pcs),
109162306a36Sopenharmony_ci	},
109262306a36Sopenharmony_ci	.tbls_hs_b = {
109362306a36Sopenharmony_ci		.serdes		= sm8350_ufsphy_hs_b_serdes,
109462306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8350_ufsphy_hs_b_serdes),
109562306a36Sopenharmony_ci	},
109662306a36Sopenharmony_ci	.tbls_hs_g4 = {
109762306a36Sopenharmony_ci		.tx		= sm8350_ufsphy_g4_tx,
109862306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8350_ufsphy_g4_tx),
109962306a36Sopenharmony_ci		.rx		= sm8350_ufsphy_g4_rx,
110062306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8350_ufsphy_g4_rx),
110162306a36Sopenharmony_ci		.pcs		= sm8350_ufsphy_g4_pcs,
110262306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8350_ufsphy_g4_pcs),
110362306a36Sopenharmony_ci	},
110462306a36Sopenharmony_ci	.clk_list		= sdm845_ufs_phy_clk_l,
110562306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(sdm845_ufs_phy_clk_l),
110662306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
110762306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
110862306a36Sopenharmony_ci	.regs			= ufsphy_v5_regs_layout,
110962306a36Sopenharmony_ci};
111062306a36Sopenharmony_ci
111162306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8450_ufsphy_cfg = {
111262306a36Sopenharmony_ci	.lanes			= 2,
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets,
111562306a36Sopenharmony_ci
111662306a36Sopenharmony_ci	.tbls = {
111762306a36Sopenharmony_ci		.serdes		= sm8350_ufsphy_serdes,
111862306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8350_ufsphy_serdes),
111962306a36Sopenharmony_ci		.tx		= sm8350_ufsphy_tx,
112062306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8350_ufsphy_tx),
112162306a36Sopenharmony_ci		.rx		= sm8350_ufsphy_rx,
112262306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8350_ufsphy_rx),
112362306a36Sopenharmony_ci		.pcs		= sm8350_ufsphy_pcs,
112462306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8350_ufsphy_pcs),
112562306a36Sopenharmony_ci	},
112662306a36Sopenharmony_ci	.tbls_hs_b = {
112762306a36Sopenharmony_ci		.serdes		= sm8350_ufsphy_hs_b_serdes,
112862306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8350_ufsphy_hs_b_serdes),
112962306a36Sopenharmony_ci	},
113062306a36Sopenharmony_ci	.tbls_hs_g4 = {
113162306a36Sopenharmony_ci		.tx		= sm8350_ufsphy_g4_tx,
113262306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8350_ufsphy_g4_tx),
113362306a36Sopenharmony_ci		.rx		= sm8350_ufsphy_g4_rx,
113462306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8350_ufsphy_g4_rx),
113562306a36Sopenharmony_ci		.pcs		= sm8350_ufsphy_g4_pcs,
113662306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8350_ufsphy_g4_pcs),
113762306a36Sopenharmony_ci	},
113862306a36Sopenharmony_ci	.clk_list		= sm8450_ufs_phy_clk_l,
113962306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(sm8450_ufs_phy_clk_l),
114062306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
114162306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
114262306a36Sopenharmony_ci	.regs			= ufsphy_v5_regs_layout,
114362306a36Sopenharmony_ci};
114462306a36Sopenharmony_ci
114562306a36Sopenharmony_cistatic const struct qmp_phy_cfg sm8550_ufsphy_cfg = {
114662306a36Sopenharmony_ci	.lanes			= 2,
114762306a36Sopenharmony_ci
114862306a36Sopenharmony_ci	.offsets		= &qmp_ufs_offsets_v6,
114962306a36Sopenharmony_ci
115062306a36Sopenharmony_ci	.tbls = {
115162306a36Sopenharmony_ci		.serdes		= sm8550_ufsphy_serdes,
115262306a36Sopenharmony_ci		.serdes_num	= ARRAY_SIZE(sm8550_ufsphy_serdes),
115362306a36Sopenharmony_ci		.tx		= sm8550_ufsphy_tx,
115462306a36Sopenharmony_ci		.tx_num		= ARRAY_SIZE(sm8550_ufsphy_tx),
115562306a36Sopenharmony_ci		.rx		= sm8550_ufsphy_rx,
115662306a36Sopenharmony_ci		.rx_num		= ARRAY_SIZE(sm8550_ufsphy_rx),
115762306a36Sopenharmony_ci		.pcs		= sm8550_ufsphy_pcs,
115862306a36Sopenharmony_ci		.pcs_num	= ARRAY_SIZE(sm8550_ufsphy_pcs),
115962306a36Sopenharmony_ci	},
116062306a36Sopenharmony_ci	.clk_list		= sdm845_ufs_phy_clk_l,
116162306a36Sopenharmony_ci	.num_clks		= ARRAY_SIZE(sdm845_ufs_phy_clk_l),
116262306a36Sopenharmony_ci	.vreg_list		= qmp_phy_vreg_l,
116362306a36Sopenharmony_ci	.num_vregs		= ARRAY_SIZE(qmp_phy_vreg_l),
116462306a36Sopenharmony_ci	.regs			= ufsphy_v6_regs_layout,
116562306a36Sopenharmony_ci};
116662306a36Sopenharmony_ci
116762306a36Sopenharmony_cistatic void qmp_ufs_configure_lane(void __iomem *base,
116862306a36Sopenharmony_ci					const struct qmp_phy_init_tbl tbl[],
116962306a36Sopenharmony_ci					int num,
117062306a36Sopenharmony_ci					u8 lane_mask)
117162306a36Sopenharmony_ci{
117262306a36Sopenharmony_ci	int i;
117362306a36Sopenharmony_ci	const struct qmp_phy_init_tbl *t = tbl;
117462306a36Sopenharmony_ci
117562306a36Sopenharmony_ci	if (!t)
117662306a36Sopenharmony_ci		return;
117762306a36Sopenharmony_ci
117862306a36Sopenharmony_ci	for (i = 0; i < num; i++, t++) {
117962306a36Sopenharmony_ci		if (!(t->lane_mask & lane_mask))
118062306a36Sopenharmony_ci			continue;
118162306a36Sopenharmony_ci
118262306a36Sopenharmony_ci		writel(t->val, base + t->offset);
118362306a36Sopenharmony_ci	}
118462306a36Sopenharmony_ci}
118562306a36Sopenharmony_ci
118662306a36Sopenharmony_cistatic void qmp_ufs_configure(void __iomem *base,
118762306a36Sopenharmony_ci				   const struct qmp_phy_init_tbl tbl[],
118862306a36Sopenharmony_ci				   int num)
118962306a36Sopenharmony_ci{
119062306a36Sopenharmony_ci	qmp_ufs_configure_lane(base, tbl, num, 0xff);
119162306a36Sopenharmony_ci}
119262306a36Sopenharmony_ci
119362306a36Sopenharmony_cistatic void qmp_ufs_serdes_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tbls *tbls)
119462306a36Sopenharmony_ci{
119562306a36Sopenharmony_ci	void __iomem *serdes = qmp->serdes;
119662306a36Sopenharmony_ci
119762306a36Sopenharmony_ci	qmp_ufs_configure(serdes, tbls->serdes, tbls->serdes_num);
119862306a36Sopenharmony_ci}
119962306a36Sopenharmony_ci
120062306a36Sopenharmony_cistatic void qmp_ufs_lanes_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tbls *tbls)
120162306a36Sopenharmony_ci{
120262306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
120362306a36Sopenharmony_ci	void __iomem *tx = qmp->tx;
120462306a36Sopenharmony_ci	void __iomem *rx = qmp->rx;
120562306a36Sopenharmony_ci
120662306a36Sopenharmony_ci	qmp_ufs_configure_lane(tx, tbls->tx, tbls->tx_num, 1);
120762306a36Sopenharmony_ci	qmp_ufs_configure_lane(rx, tbls->rx, tbls->rx_num, 1);
120862306a36Sopenharmony_ci
120962306a36Sopenharmony_ci	if (cfg->lanes >= 2) {
121062306a36Sopenharmony_ci		qmp_ufs_configure_lane(qmp->tx2, tbls->tx, tbls->tx_num, 2);
121162306a36Sopenharmony_ci		qmp_ufs_configure_lane(qmp->rx2, tbls->rx, tbls->rx_num, 2);
121262306a36Sopenharmony_ci	}
121362306a36Sopenharmony_ci}
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_cistatic void qmp_ufs_pcs_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tbls *tbls)
121662306a36Sopenharmony_ci{
121762306a36Sopenharmony_ci	void __iomem *pcs = qmp->pcs;
121862306a36Sopenharmony_ci
121962306a36Sopenharmony_ci	qmp_ufs_configure(pcs, tbls->pcs, tbls->pcs_num);
122062306a36Sopenharmony_ci}
122162306a36Sopenharmony_ci
122262306a36Sopenharmony_cistatic void qmp_ufs_init_registers(struct qmp_ufs *qmp, const struct qmp_phy_cfg *cfg)
122362306a36Sopenharmony_ci{
122462306a36Sopenharmony_ci	qmp_ufs_serdes_init(qmp, &cfg->tbls);
122562306a36Sopenharmony_ci	if (qmp->mode == PHY_MODE_UFS_HS_B)
122662306a36Sopenharmony_ci		qmp_ufs_serdes_init(qmp, &cfg->tbls_hs_b);
122762306a36Sopenharmony_ci	qmp_ufs_lanes_init(qmp, &cfg->tbls);
122862306a36Sopenharmony_ci	if (qmp->submode == UFS_HS_G4)
122962306a36Sopenharmony_ci		qmp_ufs_lanes_init(qmp, &cfg->tbls_hs_g4);
123062306a36Sopenharmony_ci	qmp_ufs_pcs_init(qmp, &cfg->tbls);
123162306a36Sopenharmony_ci	if (qmp->submode == UFS_HS_G4)
123262306a36Sopenharmony_ci		qmp_ufs_pcs_init(qmp, &cfg->tbls_hs_g4);
123362306a36Sopenharmony_ci}
123462306a36Sopenharmony_ci
123562306a36Sopenharmony_cistatic int qmp_ufs_com_init(struct qmp_ufs *qmp)
123662306a36Sopenharmony_ci{
123762306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
123862306a36Sopenharmony_ci	void __iomem *pcs = qmp->pcs;
123962306a36Sopenharmony_ci	int ret;
124062306a36Sopenharmony_ci
124162306a36Sopenharmony_ci	ret = regulator_bulk_enable(cfg->num_vregs, qmp->vregs);
124262306a36Sopenharmony_ci	if (ret) {
124362306a36Sopenharmony_ci		dev_err(qmp->dev, "failed to enable regulators, err=%d\n", ret);
124462306a36Sopenharmony_ci		return ret;
124562306a36Sopenharmony_ci	}
124662306a36Sopenharmony_ci
124762306a36Sopenharmony_ci	ret = clk_bulk_prepare_enable(cfg->num_clks, qmp->clks);
124862306a36Sopenharmony_ci	if (ret)
124962306a36Sopenharmony_ci		goto err_disable_regulators;
125062306a36Sopenharmony_ci
125162306a36Sopenharmony_ci	qphy_setbits(pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL], SW_PWRDN);
125262306a36Sopenharmony_ci
125362306a36Sopenharmony_ci	return 0;
125462306a36Sopenharmony_ci
125562306a36Sopenharmony_cierr_disable_regulators:
125662306a36Sopenharmony_ci	regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
125762306a36Sopenharmony_ci
125862306a36Sopenharmony_ci	return ret;
125962306a36Sopenharmony_ci}
126062306a36Sopenharmony_ci
126162306a36Sopenharmony_cistatic int qmp_ufs_com_exit(struct qmp_ufs *qmp)
126262306a36Sopenharmony_ci{
126362306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
126462306a36Sopenharmony_ci
126562306a36Sopenharmony_ci	reset_control_assert(qmp->ufs_reset);
126662306a36Sopenharmony_ci
126762306a36Sopenharmony_ci	clk_bulk_disable_unprepare(cfg->num_clks, qmp->clks);
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_ci	regulator_bulk_disable(cfg->num_vregs, qmp->vregs);
127062306a36Sopenharmony_ci
127162306a36Sopenharmony_ci	return 0;
127262306a36Sopenharmony_ci}
127362306a36Sopenharmony_ci
127462306a36Sopenharmony_cistatic int qmp_ufs_init(struct phy *phy)
127562306a36Sopenharmony_ci{
127662306a36Sopenharmony_ci	struct qmp_ufs *qmp = phy_get_drvdata(phy);
127762306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
127862306a36Sopenharmony_ci	int ret;
127962306a36Sopenharmony_ci	dev_vdbg(qmp->dev, "Initializing QMP phy\n");
128062306a36Sopenharmony_ci
128162306a36Sopenharmony_ci	if (cfg->no_pcs_sw_reset) {
128262306a36Sopenharmony_ci		/*
128362306a36Sopenharmony_ci		 * Get UFS reset, which is delayed until now to avoid a
128462306a36Sopenharmony_ci		 * circular dependency where UFS needs its PHY, but the PHY
128562306a36Sopenharmony_ci		 * needs this UFS reset.
128662306a36Sopenharmony_ci		 */
128762306a36Sopenharmony_ci		if (!qmp->ufs_reset) {
128862306a36Sopenharmony_ci			qmp->ufs_reset =
128962306a36Sopenharmony_ci				devm_reset_control_get_exclusive(qmp->dev,
129062306a36Sopenharmony_ci								 "ufsphy");
129162306a36Sopenharmony_ci
129262306a36Sopenharmony_ci			if (IS_ERR(qmp->ufs_reset)) {
129362306a36Sopenharmony_ci				ret = PTR_ERR(qmp->ufs_reset);
129462306a36Sopenharmony_ci				dev_err(qmp->dev,
129562306a36Sopenharmony_ci					"failed to get UFS reset: %d\n",
129662306a36Sopenharmony_ci					ret);
129762306a36Sopenharmony_ci
129862306a36Sopenharmony_ci				qmp->ufs_reset = NULL;
129962306a36Sopenharmony_ci				return ret;
130062306a36Sopenharmony_ci			}
130162306a36Sopenharmony_ci		}
130262306a36Sopenharmony_ci
130362306a36Sopenharmony_ci		ret = reset_control_assert(qmp->ufs_reset);
130462306a36Sopenharmony_ci		if (ret)
130562306a36Sopenharmony_ci			return ret;
130662306a36Sopenharmony_ci	}
130762306a36Sopenharmony_ci
130862306a36Sopenharmony_ci	ret = qmp_ufs_com_init(qmp);
130962306a36Sopenharmony_ci	if (ret)
131062306a36Sopenharmony_ci		return ret;
131162306a36Sopenharmony_ci
131262306a36Sopenharmony_ci	return 0;
131362306a36Sopenharmony_ci}
131462306a36Sopenharmony_ci
131562306a36Sopenharmony_cistatic int qmp_ufs_power_on(struct phy *phy)
131662306a36Sopenharmony_ci{
131762306a36Sopenharmony_ci	struct qmp_ufs *qmp = phy_get_drvdata(phy);
131862306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
131962306a36Sopenharmony_ci	void __iomem *pcs = qmp->pcs;
132062306a36Sopenharmony_ci	void __iomem *status;
132162306a36Sopenharmony_ci	unsigned int val;
132262306a36Sopenharmony_ci	int ret;
132362306a36Sopenharmony_ci
132462306a36Sopenharmony_ci	qmp_ufs_init_registers(qmp, cfg);
132562306a36Sopenharmony_ci
132662306a36Sopenharmony_ci	ret = reset_control_deassert(qmp->ufs_reset);
132762306a36Sopenharmony_ci	if (ret)
132862306a36Sopenharmony_ci		return ret;
132962306a36Sopenharmony_ci
133062306a36Sopenharmony_ci	/* Pull PHY out of reset state */
133162306a36Sopenharmony_ci	if (!cfg->no_pcs_sw_reset)
133262306a36Sopenharmony_ci		qphy_clrbits(pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_ci	/* start SerDes */
133562306a36Sopenharmony_ci	qphy_setbits(pcs, cfg->regs[QPHY_START_CTRL], SERDES_START);
133662306a36Sopenharmony_ci
133762306a36Sopenharmony_ci	status = pcs + cfg->regs[QPHY_PCS_READY_STATUS];
133862306a36Sopenharmony_ci	ret = readl_poll_timeout(status, val, (val & PCS_READY), 200,
133962306a36Sopenharmony_ci				 PHY_INIT_COMPLETE_TIMEOUT);
134062306a36Sopenharmony_ci	if (ret) {
134162306a36Sopenharmony_ci		dev_err(qmp->dev, "phy initialization timed-out\n");
134262306a36Sopenharmony_ci		return ret;
134362306a36Sopenharmony_ci	}
134462306a36Sopenharmony_ci
134562306a36Sopenharmony_ci	return 0;
134662306a36Sopenharmony_ci}
134762306a36Sopenharmony_ci
134862306a36Sopenharmony_cistatic int qmp_ufs_power_off(struct phy *phy)
134962306a36Sopenharmony_ci{
135062306a36Sopenharmony_ci	struct qmp_ufs *qmp = phy_get_drvdata(phy);
135162306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
135262306a36Sopenharmony_ci
135362306a36Sopenharmony_ci	/* PHY reset */
135462306a36Sopenharmony_ci	if (!cfg->no_pcs_sw_reset)
135562306a36Sopenharmony_ci		qphy_setbits(qmp->pcs, cfg->regs[QPHY_SW_RESET], SW_RESET);
135662306a36Sopenharmony_ci
135762306a36Sopenharmony_ci	/* stop SerDes */
135862306a36Sopenharmony_ci	qphy_clrbits(qmp->pcs, cfg->regs[QPHY_START_CTRL], SERDES_START);
135962306a36Sopenharmony_ci
136062306a36Sopenharmony_ci	/* Put PHY into POWER DOWN state: active low */
136162306a36Sopenharmony_ci	qphy_clrbits(qmp->pcs, cfg->regs[QPHY_PCS_POWER_DOWN_CONTROL],
136262306a36Sopenharmony_ci			SW_PWRDN);
136362306a36Sopenharmony_ci
136462306a36Sopenharmony_ci	return 0;
136562306a36Sopenharmony_ci}
136662306a36Sopenharmony_ci
136762306a36Sopenharmony_cistatic int qmp_ufs_exit(struct phy *phy)
136862306a36Sopenharmony_ci{
136962306a36Sopenharmony_ci	struct qmp_ufs *qmp = phy_get_drvdata(phy);
137062306a36Sopenharmony_ci
137162306a36Sopenharmony_ci	qmp_ufs_com_exit(qmp);
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ci	return 0;
137462306a36Sopenharmony_ci}
137562306a36Sopenharmony_ci
137662306a36Sopenharmony_cistatic int qmp_ufs_enable(struct phy *phy)
137762306a36Sopenharmony_ci{
137862306a36Sopenharmony_ci	int ret;
137962306a36Sopenharmony_ci
138062306a36Sopenharmony_ci	ret = qmp_ufs_init(phy);
138162306a36Sopenharmony_ci	if (ret)
138262306a36Sopenharmony_ci		return ret;
138362306a36Sopenharmony_ci
138462306a36Sopenharmony_ci	ret = qmp_ufs_power_on(phy);
138562306a36Sopenharmony_ci	if (ret)
138662306a36Sopenharmony_ci		qmp_ufs_exit(phy);
138762306a36Sopenharmony_ci
138862306a36Sopenharmony_ci	return ret;
138962306a36Sopenharmony_ci}
139062306a36Sopenharmony_ci
139162306a36Sopenharmony_cistatic int qmp_ufs_disable(struct phy *phy)
139262306a36Sopenharmony_ci{
139362306a36Sopenharmony_ci	int ret;
139462306a36Sopenharmony_ci
139562306a36Sopenharmony_ci	ret = qmp_ufs_power_off(phy);
139662306a36Sopenharmony_ci	if (ret)
139762306a36Sopenharmony_ci		return ret;
139862306a36Sopenharmony_ci	return qmp_ufs_exit(phy);
139962306a36Sopenharmony_ci}
140062306a36Sopenharmony_ci
140162306a36Sopenharmony_cistatic int qmp_ufs_set_mode(struct phy *phy, enum phy_mode mode, int submode)
140262306a36Sopenharmony_ci{
140362306a36Sopenharmony_ci	struct qmp_ufs *qmp = phy_get_drvdata(phy);
140462306a36Sopenharmony_ci
140562306a36Sopenharmony_ci	qmp->mode = mode;
140662306a36Sopenharmony_ci	qmp->submode = submode;
140762306a36Sopenharmony_ci
140862306a36Sopenharmony_ci	return 0;
140962306a36Sopenharmony_ci}
141062306a36Sopenharmony_ci
141162306a36Sopenharmony_cistatic const struct phy_ops qcom_qmp_ufs_phy_ops = {
141262306a36Sopenharmony_ci	.power_on	= qmp_ufs_enable,
141362306a36Sopenharmony_ci	.power_off	= qmp_ufs_disable,
141462306a36Sopenharmony_ci	.set_mode	= qmp_ufs_set_mode,
141562306a36Sopenharmony_ci	.owner		= THIS_MODULE,
141662306a36Sopenharmony_ci};
141762306a36Sopenharmony_ci
141862306a36Sopenharmony_cistatic int qmp_ufs_vreg_init(struct qmp_ufs *qmp)
141962306a36Sopenharmony_ci{
142062306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
142162306a36Sopenharmony_ci	struct device *dev = qmp->dev;
142262306a36Sopenharmony_ci	int num = cfg->num_vregs;
142362306a36Sopenharmony_ci	int i;
142462306a36Sopenharmony_ci
142562306a36Sopenharmony_ci	qmp->vregs = devm_kcalloc(dev, num, sizeof(*qmp->vregs), GFP_KERNEL);
142662306a36Sopenharmony_ci	if (!qmp->vregs)
142762306a36Sopenharmony_ci		return -ENOMEM;
142862306a36Sopenharmony_ci
142962306a36Sopenharmony_ci	for (i = 0; i < num; i++)
143062306a36Sopenharmony_ci		qmp->vregs[i].supply = cfg->vreg_list[i];
143162306a36Sopenharmony_ci
143262306a36Sopenharmony_ci	return devm_regulator_bulk_get(dev, num, qmp->vregs);
143362306a36Sopenharmony_ci}
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_cistatic int qmp_ufs_clk_init(struct qmp_ufs *qmp)
143662306a36Sopenharmony_ci{
143762306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
143862306a36Sopenharmony_ci	struct device *dev = qmp->dev;
143962306a36Sopenharmony_ci	int num = cfg->num_clks;
144062306a36Sopenharmony_ci	int i;
144162306a36Sopenharmony_ci
144262306a36Sopenharmony_ci	qmp->clks = devm_kcalloc(dev, num, sizeof(*qmp->clks), GFP_KERNEL);
144362306a36Sopenharmony_ci	if (!qmp->clks)
144462306a36Sopenharmony_ci		return -ENOMEM;
144562306a36Sopenharmony_ci
144662306a36Sopenharmony_ci	for (i = 0; i < num; i++)
144762306a36Sopenharmony_ci		qmp->clks[i].id = cfg->clk_list[i];
144862306a36Sopenharmony_ci
144962306a36Sopenharmony_ci	return devm_clk_bulk_get(dev, num, qmp->clks);
145062306a36Sopenharmony_ci}
145162306a36Sopenharmony_ci
145262306a36Sopenharmony_cistatic void qmp_ufs_clk_release_provider(void *res)
145362306a36Sopenharmony_ci{
145462306a36Sopenharmony_ci	of_clk_del_provider(res);
145562306a36Sopenharmony_ci}
145662306a36Sopenharmony_ci
145762306a36Sopenharmony_ci#define UFS_SYMBOL_CLOCKS 3
145862306a36Sopenharmony_ci
145962306a36Sopenharmony_cistatic int qmp_ufs_register_clocks(struct qmp_ufs *qmp, struct device_node *np)
146062306a36Sopenharmony_ci{
146162306a36Sopenharmony_ci	struct clk_hw_onecell_data *clk_data;
146262306a36Sopenharmony_ci	struct clk_hw *hw;
146362306a36Sopenharmony_ci	char name[64];
146462306a36Sopenharmony_ci	int ret;
146562306a36Sopenharmony_ci
146662306a36Sopenharmony_ci	clk_data = devm_kzalloc(qmp->dev,
146762306a36Sopenharmony_ci				struct_size(clk_data, hws, UFS_SYMBOL_CLOCKS),
146862306a36Sopenharmony_ci				GFP_KERNEL);
146962306a36Sopenharmony_ci	if (!clk_data)
147062306a36Sopenharmony_ci		return -ENOMEM;
147162306a36Sopenharmony_ci
147262306a36Sopenharmony_ci	clk_data->num = UFS_SYMBOL_CLOCKS;
147362306a36Sopenharmony_ci
147462306a36Sopenharmony_ci	snprintf(name, sizeof(name), "%s::rx_symbol_0", dev_name(qmp->dev));
147562306a36Sopenharmony_ci	hw = devm_clk_hw_register_fixed_rate(qmp->dev, name, NULL, 0, 0);
147662306a36Sopenharmony_ci	if (IS_ERR(hw))
147762306a36Sopenharmony_ci		return PTR_ERR(hw);
147862306a36Sopenharmony_ci
147962306a36Sopenharmony_ci	clk_data->hws[0] = hw;
148062306a36Sopenharmony_ci
148162306a36Sopenharmony_ci	snprintf(name, sizeof(name), "%s::rx_symbol_1", dev_name(qmp->dev));
148262306a36Sopenharmony_ci	hw = devm_clk_hw_register_fixed_rate(qmp->dev, name, NULL, 0, 0);
148362306a36Sopenharmony_ci	if (IS_ERR(hw))
148462306a36Sopenharmony_ci		return PTR_ERR(hw);
148562306a36Sopenharmony_ci
148662306a36Sopenharmony_ci	clk_data->hws[1] = hw;
148762306a36Sopenharmony_ci
148862306a36Sopenharmony_ci	snprintf(name, sizeof(name), "%s::tx_symbol_0", dev_name(qmp->dev));
148962306a36Sopenharmony_ci	hw = devm_clk_hw_register_fixed_rate(qmp->dev, name, NULL, 0, 0);
149062306a36Sopenharmony_ci	if (IS_ERR(hw))
149162306a36Sopenharmony_ci		return PTR_ERR(hw);
149262306a36Sopenharmony_ci
149362306a36Sopenharmony_ci	clk_data->hws[2] = hw;
149462306a36Sopenharmony_ci
149562306a36Sopenharmony_ci	ret = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data);
149662306a36Sopenharmony_ci	if (ret)
149762306a36Sopenharmony_ci		return ret;
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci	/*
150062306a36Sopenharmony_ci	 * Roll a devm action because the clock provider can be a child node.
150162306a36Sopenharmony_ci	 */
150262306a36Sopenharmony_ci	return devm_add_action_or_reset(qmp->dev, qmp_ufs_clk_release_provider, np);
150362306a36Sopenharmony_ci}
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_cistatic int qmp_ufs_parse_dt_legacy(struct qmp_ufs *qmp, struct device_node *np)
150662306a36Sopenharmony_ci{
150762306a36Sopenharmony_ci	struct platform_device *pdev = to_platform_device(qmp->dev);
150862306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
150962306a36Sopenharmony_ci	struct device *dev = qmp->dev;
151062306a36Sopenharmony_ci
151162306a36Sopenharmony_ci	qmp->serdes = devm_platform_ioremap_resource(pdev, 0);
151262306a36Sopenharmony_ci	if (IS_ERR(qmp->serdes))
151362306a36Sopenharmony_ci		return PTR_ERR(qmp->serdes);
151462306a36Sopenharmony_ci
151562306a36Sopenharmony_ci	/*
151662306a36Sopenharmony_ci	 * Get memory resources for the PHY:
151762306a36Sopenharmony_ci	 * Resources are indexed as: tx -> 0; rx -> 1; pcs -> 2.
151862306a36Sopenharmony_ci	 * For dual lane PHYs: tx2 -> 3, rx2 -> 4, pcs_misc (optional) -> 5
151962306a36Sopenharmony_ci	 * For single lane PHYs: pcs_misc (optional) -> 3.
152062306a36Sopenharmony_ci	 */
152162306a36Sopenharmony_ci	qmp->tx = devm_of_iomap(dev, np, 0, NULL);
152262306a36Sopenharmony_ci	if (IS_ERR(qmp->tx))
152362306a36Sopenharmony_ci		return PTR_ERR(qmp->tx);
152462306a36Sopenharmony_ci
152562306a36Sopenharmony_ci	qmp->rx = devm_of_iomap(dev, np, 1, NULL);
152662306a36Sopenharmony_ci	if (IS_ERR(qmp->rx))
152762306a36Sopenharmony_ci		return PTR_ERR(qmp->rx);
152862306a36Sopenharmony_ci
152962306a36Sopenharmony_ci	qmp->pcs = devm_of_iomap(dev, np, 2, NULL);
153062306a36Sopenharmony_ci	if (IS_ERR(qmp->pcs))
153162306a36Sopenharmony_ci		return PTR_ERR(qmp->pcs);
153262306a36Sopenharmony_ci
153362306a36Sopenharmony_ci	if (cfg->lanes >= 2) {
153462306a36Sopenharmony_ci		qmp->tx2 = devm_of_iomap(dev, np, 3, NULL);
153562306a36Sopenharmony_ci		if (IS_ERR(qmp->tx2))
153662306a36Sopenharmony_ci			return PTR_ERR(qmp->tx2);
153762306a36Sopenharmony_ci
153862306a36Sopenharmony_ci		qmp->rx2 = devm_of_iomap(dev, np, 4, NULL);
153962306a36Sopenharmony_ci		if (IS_ERR(qmp->rx2))
154062306a36Sopenharmony_ci			return PTR_ERR(qmp->rx2);
154162306a36Sopenharmony_ci
154262306a36Sopenharmony_ci		qmp->pcs_misc = devm_of_iomap(dev, np, 5, NULL);
154362306a36Sopenharmony_ci	} else {
154462306a36Sopenharmony_ci		qmp->pcs_misc = devm_of_iomap(dev, np, 3, NULL);
154562306a36Sopenharmony_ci	}
154662306a36Sopenharmony_ci
154762306a36Sopenharmony_ci	if (IS_ERR(qmp->pcs_misc))
154862306a36Sopenharmony_ci		dev_vdbg(dev, "PHY pcs_misc-reg not used\n");
154962306a36Sopenharmony_ci
155062306a36Sopenharmony_ci	return 0;
155162306a36Sopenharmony_ci}
155262306a36Sopenharmony_ci
155362306a36Sopenharmony_cistatic int qmp_ufs_parse_dt(struct qmp_ufs *qmp)
155462306a36Sopenharmony_ci{
155562306a36Sopenharmony_ci	struct platform_device *pdev = to_platform_device(qmp->dev);
155662306a36Sopenharmony_ci	const struct qmp_phy_cfg *cfg = qmp->cfg;
155762306a36Sopenharmony_ci	const struct qmp_ufs_offsets *offs = cfg->offsets;
155862306a36Sopenharmony_ci	void __iomem *base;
155962306a36Sopenharmony_ci
156062306a36Sopenharmony_ci	if (!offs)
156162306a36Sopenharmony_ci		return -EINVAL;
156262306a36Sopenharmony_ci
156362306a36Sopenharmony_ci	base = devm_platform_ioremap_resource(pdev, 0);
156462306a36Sopenharmony_ci	if (IS_ERR(base))
156562306a36Sopenharmony_ci		return PTR_ERR(base);
156662306a36Sopenharmony_ci
156762306a36Sopenharmony_ci	qmp->serdes = base + offs->serdes;
156862306a36Sopenharmony_ci	qmp->pcs = base + offs->pcs;
156962306a36Sopenharmony_ci	qmp->tx = base + offs->tx;
157062306a36Sopenharmony_ci	qmp->rx = base + offs->rx;
157162306a36Sopenharmony_ci
157262306a36Sopenharmony_ci	if (cfg->lanes >= 2) {
157362306a36Sopenharmony_ci		qmp->tx2 = base + offs->tx2;
157462306a36Sopenharmony_ci		qmp->rx2 = base + offs->rx2;
157562306a36Sopenharmony_ci	}
157662306a36Sopenharmony_ci
157762306a36Sopenharmony_ci	return 0;
157862306a36Sopenharmony_ci}
157962306a36Sopenharmony_ci
158062306a36Sopenharmony_cistatic int qmp_ufs_probe(struct platform_device *pdev)
158162306a36Sopenharmony_ci{
158262306a36Sopenharmony_ci	struct device *dev = &pdev->dev;
158362306a36Sopenharmony_ci	struct phy_provider *phy_provider;
158462306a36Sopenharmony_ci	struct device_node *np;
158562306a36Sopenharmony_ci	struct qmp_ufs *qmp;
158662306a36Sopenharmony_ci	int ret;
158762306a36Sopenharmony_ci
158862306a36Sopenharmony_ci	qmp = devm_kzalloc(dev, sizeof(*qmp), GFP_KERNEL);
158962306a36Sopenharmony_ci	if (!qmp)
159062306a36Sopenharmony_ci		return -ENOMEM;
159162306a36Sopenharmony_ci
159262306a36Sopenharmony_ci	qmp->dev = dev;
159362306a36Sopenharmony_ci
159462306a36Sopenharmony_ci	qmp->cfg = of_device_get_match_data(dev);
159562306a36Sopenharmony_ci	if (!qmp->cfg)
159662306a36Sopenharmony_ci		return -EINVAL;
159762306a36Sopenharmony_ci
159862306a36Sopenharmony_ci	ret = qmp_ufs_clk_init(qmp);
159962306a36Sopenharmony_ci	if (ret)
160062306a36Sopenharmony_ci		return ret;
160162306a36Sopenharmony_ci
160262306a36Sopenharmony_ci	ret = qmp_ufs_vreg_init(qmp);
160362306a36Sopenharmony_ci	if (ret)
160462306a36Sopenharmony_ci		return ret;
160562306a36Sopenharmony_ci
160662306a36Sopenharmony_ci	/* Check for legacy binding with child node. */
160762306a36Sopenharmony_ci	np = of_get_next_available_child(dev->of_node, NULL);
160862306a36Sopenharmony_ci	if (np) {
160962306a36Sopenharmony_ci		ret = qmp_ufs_parse_dt_legacy(qmp, np);
161062306a36Sopenharmony_ci	} else {
161162306a36Sopenharmony_ci		np = of_node_get(dev->of_node);
161262306a36Sopenharmony_ci		ret = qmp_ufs_parse_dt(qmp);
161362306a36Sopenharmony_ci	}
161462306a36Sopenharmony_ci	if (ret)
161562306a36Sopenharmony_ci		goto err_node_put;
161662306a36Sopenharmony_ci
161762306a36Sopenharmony_ci	ret = qmp_ufs_register_clocks(qmp, np);
161862306a36Sopenharmony_ci	if (ret)
161962306a36Sopenharmony_ci		goto err_node_put;
162062306a36Sopenharmony_ci
162162306a36Sopenharmony_ci	qmp->phy = devm_phy_create(dev, np, &qcom_qmp_ufs_phy_ops);
162262306a36Sopenharmony_ci	if (IS_ERR(qmp->phy)) {
162362306a36Sopenharmony_ci		ret = PTR_ERR(qmp->phy);
162462306a36Sopenharmony_ci		dev_err(dev, "failed to create PHY: %d\n", ret);
162562306a36Sopenharmony_ci		goto err_node_put;
162662306a36Sopenharmony_ci	}
162762306a36Sopenharmony_ci
162862306a36Sopenharmony_ci	phy_set_drvdata(qmp->phy, qmp);
162962306a36Sopenharmony_ci
163062306a36Sopenharmony_ci	of_node_put(np);
163162306a36Sopenharmony_ci
163262306a36Sopenharmony_ci	phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
163362306a36Sopenharmony_ci
163462306a36Sopenharmony_ci	return PTR_ERR_OR_ZERO(phy_provider);
163562306a36Sopenharmony_ci
163662306a36Sopenharmony_cierr_node_put:
163762306a36Sopenharmony_ci	of_node_put(np);
163862306a36Sopenharmony_ci	return ret;
163962306a36Sopenharmony_ci}
164062306a36Sopenharmony_ci
164162306a36Sopenharmony_cistatic const struct of_device_id qmp_ufs_of_match_table[] = {
164262306a36Sopenharmony_ci	{
164362306a36Sopenharmony_ci		.compatible = "qcom,msm8996-qmp-ufs-phy",
164462306a36Sopenharmony_ci		.data = &msm8996_ufsphy_cfg,
164562306a36Sopenharmony_ci	}, {
164662306a36Sopenharmony_ci		.compatible = "qcom,msm8998-qmp-ufs-phy",
164762306a36Sopenharmony_ci		.data = &sdm845_ufsphy_cfg,
164862306a36Sopenharmony_ci	}, {
164962306a36Sopenharmony_ci		.compatible = "qcom,sa8775p-qmp-ufs-phy",
165062306a36Sopenharmony_ci		.data = &sa8775p_ufsphy_cfg,
165162306a36Sopenharmony_ci	}, {
165262306a36Sopenharmony_ci		.compatible = "qcom,sc8180x-qmp-ufs-phy",
165362306a36Sopenharmony_ci		.data = &sm8150_ufsphy_cfg,
165462306a36Sopenharmony_ci	}, {
165562306a36Sopenharmony_ci		.compatible = "qcom,sc8280xp-qmp-ufs-phy",
165662306a36Sopenharmony_ci		.data = &sc8280xp_ufsphy_cfg,
165762306a36Sopenharmony_ci	}, {
165862306a36Sopenharmony_ci		.compatible = "qcom,sdm845-qmp-ufs-phy",
165962306a36Sopenharmony_ci		.data = &sdm845_ufsphy_cfg,
166062306a36Sopenharmony_ci	}, {
166162306a36Sopenharmony_ci		.compatible = "qcom,sm6115-qmp-ufs-phy",
166262306a36Sopenharmony_ci		.data = &sm6115_ufsphy_cfg,
166362306a36Sopenharmony_ci	}, {
166462306a36Sopenharmony_ci		.compatible = "qcom,sm6125-qmp-ufs-phy",
166562306a36Sopenharmony_ci		.data = &sm6115_ufsphy_cfg,
166662306a36Sopenharmony_ci	}, {
166762306a36Sopenharmony_ci		.compatible = "qcom,sm6350-qmp-ufs-phy",
166862306a36Sopenharmony_ci		.data = &sdm845_ufsphy_cfg,
166962306a36Sopenharmony_ci	}, {
167062306a36Sopenharmony_ci		.compatible = "qcom,sm7150-qmp-ufs-phy",
167162306a36Sopenharmony_ci		.data = &sm7150_ufsphy_cfg,
167262306a36Sopenharmony_ci	}, {
167362306a36Sopenharmony_ci		.compatible = "qcom,sm8150-qmp-ufs-phy",
167462306a36Sopenharmony_ci		.data = &sm8150_ufsphy_cfg,
167562306a36Sopenharmony_ci	}, {
167662306a36Sopenharmony_ci		.compatible = "qcom,sm8250-qmp-ufs-phy",
167762306a36Sopenharmony_ci		.data = &sm8250_ufsphy_cfg,
167862306a36Sopenharmony_ci	}, {
167962306a36Sopenharmony_ci		.compatible = "qcom,sm8350-qmp-ufs-phy",
168062306a36Sopenharmony_ci		.data = &sm8350_ufsphy_cfg,
168162306a36Sopenharmony_ci	}, {
168262306a36Sopenharmony_ci		.compatible = "qcom,sm8450-qmp-ufs-phy",
168362306a36Sopenharmony_ci		.data = &sm8450_ufsphy_cfg,
168462306a36Sopenharmony_ci	}, {
168562306a36Sopenharmony_ci		.compatible = "qcom,sm8550-qmp-ufs-phy",
168662306a36Sopenharmony_ci		.data = &sm8550_ufsphy_cfg,
168762306a36Sopenharmony_ci	},
168862306a36Sopenharmony_ci	{ },
168962306a36Sopenharmony_ci};
169062306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, qmp_ufs_of_match_table);
169162306a36Sopenharmony_ci
169262306a36Sopenharmony_cistatic struct platform_driver qmp_ufs_driver = {
169362306a36Sopenharmony_ci	.probe		= qmp_ufs_probe,
169462306a36Sopenharmony_ci	.driver = {
169562306a36Sopenharmony_ci		.name	= "qcom-qmp-ufs-phy",
169662306a36Sopenharmony_ci		.of_match_table = qmp_ufs_of_match_table,
169762306a36Sopenharmony_ci	},
169862306a36Sopenharmony_ci};
169962306a36Sopenharmony_ci
170062306a36Sopenharmony_cimodule_platform_driver(qmp_ufs_driver);
170162306a36Sopenharmony_ci
170262306a36Sopenharmony_ciMODULE_AUTHOR("Vivek Gautam <vivek.gautam@codeaurora.org>");
170362306a36Sopenharmony_ciMODULE_DESCRIPTION("Qualcomm QMP UFS PHY driver");
170462306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
1705