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