Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

phy: qcom: qmp-ufs: add QMP UFS PHY tables for SM8650

Add QMP UFS PHY support for the SM8650 platform.

Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
Link: https://lore.kernel.org/r/20231030-topic-sm8650-upstream-phy-v2-5-a543a4c4b491@linaro.org
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Neil Armstrong and committed by
Vinod Koul
7c4bf8cb 330df15d

+94
+1
drivers/phy/qualcomm/phy-qcom-qmp-pcs-ufs-v6.h
··· 12 12 #define QPHY_V6_PCS_UFS_SW_RESET 0x008 13 13 #define QPHY_V6_PCS_UFS_TIMER_20US_CORECLK_STEPS_MSB 0x00c 14 14 #define QPHY_V6_PCS_UFS_TIMER_20US_CORECLK_STEPS_LSB 0x010 15 + #define QPHY_V6_PCS_UFS_PCS_CTRL1 0x020 15 16 #define QPHY_V6_PCS_UFS_PLL_CNTL 0x02c 16 17 #define QPHY_V6_PCS_UFS_TX_LARGE_AMP_DRV_LVL 0x030 17 18 #define QPHY_V6_PCS_UFS_TX_SMALL_AMP_DRV_LVL 0x038
+7
drivers/phy/qualcomm/phy-qcom-qmp-qserdes-txrx-ufs-v6.h
··· 10 10 #define QSERDES_UFS_V6_TX_RES_CODE_LANE_RX 0x2c 11 11 #define QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_TX 0x30 12 12 #define QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_RX 0x34 13 + #define QSERDES_UFS_V6_TX_LANE_MODE_1 0x7c 13 14 14 15 #define QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE2 0x08 15 16 #define QSERDES_UFS_V6_RX_UCDR_FASTLOCK_FO_GAIN_RATE4 0x10 17 + #define QSERDES_UFS_V6_RX_UCDR_SO_SATURATION 0x28 18 + #define QSERDES_UFS_V6_RX_UCDR_PI_CTRL1 0x58 19 + #define QSERDES_UFS_V6_RX_RX_TERM_BW_CTRL0 0xc4 20 + #define QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE2 0xd4 21 + #define QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE4 0xdc 16 22 #define QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL 0x178 23 + #define QSERDES_UFS_V6_RX_INTERFACE_MODE 0x1e0 17 24 #define QSERDES_UFS_V6_RX_MODE_RATE_0_1_B0 0x208 18 25 #define QSERDES_UFS_V6_RX_MODE_RATE_0_1_B1 0x20c 19 26 #define QSERDES_UFS_V6_RX_MODE_RATE_0_1_B3 0x214
+86
drivers/phy/qualcomm/phy-qcom-qmp-ufs.c
··· 803 803 QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_MULTI_LANE_CTRL1, 0x02), 804 804 }; 805 805 806 + static const struct qmp_phy_init_tbl sm8650_ufsphy_serdes[] = { 807 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_SYSCLK_EN_SEL, 0xd9), 808 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CMN_CONFIG_1, 0x16), 809 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_SEL_1, 0x11), 810 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_HSCLK_HS_SWITCH_SEL_1, 0x00), 811 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP_EN, 0x01), 812 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_IVCO, 0x0f), 813 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_MAP, 0x44), 814 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_VCO_TUNE_INITVAL2, 0x00), 815 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE0, 0x41), 816 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE0, 0x0a), 817 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE0, 0x18), 818 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE0, 0x14), 819 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE0, 0x7f), 820 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE0, 0x06), 821 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_DEC_START_MODE1, 0x4c), 822 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_CP_CTRL_MODE1, 0x0a), 823 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_RCTRL_MODE1, 0x18), 824 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_PLL_CCTRL_MODE1, 0x14), 825 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP1_MODE1, 0x99), 826 + QMP_PHY_INIT_CFG(QSERDES_V6_COM_LOCK_CMP2_MODE1, 0x07), 827 + }; 828 + 829 + static const struct qmp_phy_init_tbl sm8650_ufsphy_tx[] = { 830 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_LANE_MODE_1, 0x05), 831 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_TX_RES_CODE_LANE_OFFSET_TX, 0x07), 832 + }; 833 + 834 + static const struct qmp_phy_init_tbl sm8650_ufsphy_rx[] = { 835 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE2, 0x0c), 836 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_FO_GAIN_RATE4, 0x0f), 837 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_VGA_CAL_MAN_VAL, 0x0e), 838 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B0, 0xc2), 839 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B1, 0xc2), 840 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B3, 0x1a), 841 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE_0_1_B6, 0x60), 842 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE2_B3, 0x9e), 843 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE2_B6, 0x60), 844 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B3, 0x9e), 845 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B4, 0x0e), 846 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B5, 0x36), 847 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE3_B8, 0x02), 848 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE4_B3, 0xb9), 849 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_MODE_RATE4_B6, 0xff), 850 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_SO_SATURATION, 0x1f), 851 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_UCDR_PI_CTRL1, 0x94), 852 + QMP_PHY_INIT_CFG(QSERDES_UFS_V6_RX_RX_TERM_BW_CTRL0, 0xfa), 853 + }; 854 + 855 + static const struct qmp_phy_init_tbl sm8650_ufsphy_pcs[] = { 856 + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_MULTI_LANE_CTRL1, 0x00), 857 + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_MID_TERM_CTRL1, 0x43), 858 + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PCS_CTRL1, 0xc1), 859 + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_PLL_CNTL, 0x33), 860 + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_HSGEAR_CAPABILITY, 0x04), 861 + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_HSGEAR_CAPABILITY, 0x04), 862 + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_TX_LARGE_AMP_DRV_LVL, 0x0f), 863 + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_RX_SIGDET_CTRL2, 0x69), 864 + QMP_PHY_INIT_CFG(QPHY_V6_PCS_UFS_MULTI_LANE_CTRL1, 0x02), 865 + }; 866 + 806 867 struct qmp_ufs_offsets { 807 868 u16 serdes; 808 869 u16 pcs; ··· 1356 1295 .rx_num = ARRAY_SIZE(sm8550_ufsphy_rx), 1357 1296 .pcs = sm8550_ufsphy_pcs, 1358 1297 .pcs_num = ARRAY_SIZE(sm8550_ufsphy_pcs), 1298 + }, 1299 + .clk_list = sdm845_ufs_phy_clk_l, 1300 + .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l), 1301 + .vreg_list = qmp_phy_vreg_l, 1302 + .num_vregs = ARRAY_SIZE(qmp_phy_vreg_l), 1303 + .regs = ufsphy_v6_regs_layout, 1304 + }; 1305 + 1306 + static const struct qmp_phy_cfg sm8650_ufsphy_cfg = { 1307 + .lanes = 2, 1308 + 1309 + .offsets = &qmp_ufs_offsets_v6, 1310 + 1311 + .tbls = { 1312 + .serdes = sm8650_ufsphy_serdes, 1313 + .serdes_num = ARRAY_SIZE(sm8650_ufsphy_serdes), 1314 + .tx = sm8650_ufsphy_tx, 1315 + .tx_num = ARRAY_SIZE(sm8650_ufsphy_tx), 1316 + .rx = sm8650_ufsphy_rx, 1317 + .rx_num = ARRAY_SIZE(sm8650_ufsphy_rx), 1318 + .pcs = sm8650_ufsphy_pcs, 1319 + .pcs_num = ARRAY_SIZE(sm8650_ufsphy_pcs), 1359 1320 }, 1360 1321 .clk_list = sdm845_ufs_phy_clk_l, 1361 1322 .num_clks = ARRAY_SIZE(sdm845_ufs_phy_clk_l), ··· 1909 1826 }, { 1910 1827 .compatible = "qcom,sm8550-qmp-ufs-phy", 1911 1828 .data = &sm8550_ufsphy_cfg, 1829 + }, { 1830 + .compatible = "qcom,sm8650-qmp-ufs-phy", 1831 + .data = &sm8650_ufsphy_cfg, 1912 1832 }, 1913 1833 { }, 1914 1834 };