15b2919b9SWyon Bi // SPDX-License-Identifier: GPL-2.0
25b2919b9SWyon Bi /*
35b2919b9SWyon Bi * Rockchip HDMI/DP Combo PHY with Samsung IP block
45b2919b9SWyon Bi *
55b2919b9SWyon Bi * Copyright (c) 2021 Rockchip Electronics Co. Ltd.
65b2919b9SWyon Bi */
75b2919b9SWyon Bi
85b2919b9SWyon Bi #include <common.h>
95b2919b9SWyon Bi #include <dm.h>
105b2919b9SWyon Bi #include <generic-phy.h>
115b2919b9SWyon Bi #include <reset.h>
125b2919b9SWyon Bi #include <regmap.h>
135b2919b9SWyon Bi #include <syscon.h>
145b2919b9SWyon Bi #include <asm/io.h>
155b2919b9SWyon Bi #include <linux/bitfield.h>
165b2919b9SWyon Bi #include <linux/iopoll.h>
175b2919b9SWyon Bi #include <asm/arch/clock.h>
185b2919b9SWyon Bi
195b2919b9SWyon Bi #define HDPTXPHY_GRF_CON0 0x0000
205b2919b9SWyon Bi #define RO_REF_CLK_SEL GENMASK(11, 10)
215b2919b9SWyon Bi #define LC_REF_CLK_SEL GENMASK(9, 8)
225b2919b9SWyon Bi #define PLL_EN BIT(7)
235b2919b9SWyon Bi #define BIAS_EN BIT(6)
245b2919b9SWyon Bi #define BGR_EN BIT(5)
255b2919b9SWyon Bi #define HDPTX_MODE_SEL BIT(0)
265b2919b9SWyon Bi #define HDPTXPHY_GRF_STATUS0 0x0080
275b2919b9SWyon Bi #define PLL_LOCK_DONE BIT(3)
285b2919b9SWyon Bi #define PHY_CLK_RDY BIT(2)
295b2919b9SWyon Bi #define PHY_RDY BIT(1)
305b2919b9SWyon Bi #define SB_RDY BIT(0)
315b2919b9SWyon Bi
325b2919b9SWyon Bi /* cmn_reg0008 */
335b2919b9SWyon Bi #define OVRD_LCPLL_EN BIT(7)
345b2919b9SWyon Bi #define LCPLL_EN BIT(6)
355b2919b9SWyon Bi
365b2919b9SWyon Bi /* cmn_reg003C */
375b2919b9SWyon Bi #define ANA_LCPLL_RESERVED7 BIT(7)
385b2919b9SWyon Bi
395b2919b9SWyon Bi /* cmn_reg003D */
405b2919b9SWyon Bi #define OVRD_ROPLL_EN BIT(7)
415b2919b9SWyon Bi #define ROPLL_EN BIT(6)
425b2919b9SWyon Bi
435b2919b9SWyon Bi /* cmn_reg0046 */
445b2919b9SWyon Bi #define ROPLL_ANA_CPP_CTRL_COARSE GENMASK(7, 4)
455b2919b9SWyon Bi #define ROPLL_ANA_CPP_CTRL_FINE GENMASK(3, 0)
465b2919b9SWyon Bi
475b2919b9SWyon Bi /* cmn_reg0047 */
485b2919b9SWyon Bi #define ROPLL_ANA_LPF_C_SEL_COARSE GENMASK(5, 3)
495b2919b9SWyon Bi #define ROPLL_ANA_LPF_C_SEL_FINE GENMASK(2, 0)
505b2919b9SWyon Bi
515b2919b9SWyon Bi /* cmn_reg004E */
525b2919b9SWyon Bi #define ANA_ROPLL_PI_EN BIT(5)
535b2919b9SWyon Bi
545b2919b9SWyon Bi /* cmn_reg0051 */
555b2919b9SWyon Bi #define ROPLL_PMS_MDIV GENMASK(7, 0)
565b2919b9SWyon Bi
575b2919b9SWyon Bi /* cmn_reg0055 */
585b2919b9SWyon Bi #define ROPLL_PMS_MDIV_AFC GENMASK(7, 0)
595b2919b9SWyon Bi
605b2919b9SWyon Bi /* cmn_reg0059 */
615b2919b9SWyon Bi #define ANA_ROPLL_PMS_PDIV GENMASK(7, 4)
625b2919b9SWyon Bi #define ANA_ROPLL_PMS_REFDIV GENMASK(3, 0)
635b2919b9SWyon Bi
645b2919b9SWyon Bi /* cmn_reg005A */
655b2919b9SWyon Bi #define ROPLL_PMS_SDIV_RBR GENMASK(7, 4)
665b2919b9SWyon Bi #define ROPLL_PMS_SDIV_HBR GENMASK(3, 0)
675b2919b9SWyon Bi
685b2919b9SWyon Bi /* cmn_reg005B */
695b2919b9SWyon Bi #define ROPLL_PMS_SDIV_HBR2 GENMASK(7, 4)
705b2919b9SWyon Bi #define ROPLL_PMS_SDIV_HBR3 GENMASK(3, 0)
715b2919b9SWyon Bi
725b2919b9SWyon Bi /* cmn_reg005D */
735b2919b9SWyon Bi #define OVRD_ROPLL_REF_CLK_SEL BIT(5)
745b2919b9SWyon Bi #define ROPLL_REF_CLK_SEL GENMASK(4, 3)
755b2919b9SWyon Bi
765b2919b9SWyon Bi /* cmn_reg005E */
775b2919b9SWyon Bi #define ANA_ROPLL_SDM_EN BIT(6)
785b2919b9SWyon Bi #define OVRD_ROPLL_SDM_RSTN BIT(5)
795b2919b9SWyon Bi #define ROPLL_SDM_RSTN BIT(4)
805b2919b9SWyon Bi #define ROPLL_SDC_FRACTIONAL_EN_RBR BIT(3)
815b2919b9SWyon Bi #define ROPLL_SDC_FRACTIONAL_EN_HBR BIT(2)
825b2919b9SWyon Bi #define ROPLL_SDC_FRACTIONAL_EN_HBR2 BIT(1)
835b2919b9SWyon Bi #define ROPLL_SDC_FRACTIONAL_EN_HBR3 BIT(0)
845b2919b9SWyon Bi
855b2919b9SWyon Bi /* cmn_reg005F */
865b2919b9SWyon Bi #define OVRD_ROPLL_SDC_RSTN BIT(5)
875b2919b9SWyon Bi #define ROPLL_SDC_RSTN BIT(4)
885b2919b9SWyon Bi
895b2919b9SWyon Bi /* cmn_reg0060 */
905b2919b9SWyon Bi #define ROPLL_SDM_DENOMINATOR GENMASK(7, 0)
915b2919b9SWyon Bi
925b2919b9SWyon Bi /* cmn_reg0064 */
935b2919b9SWyon Bi #define ROPLL_SDM_NUMERATOR_SIGN_RBR BIT(3)
945b2919b9SWyon Bi #define ROPLL_SDM_NUMERATOR_SIGN_HBR BIT(2)
955b2919b9SWyon Bi #define ROPLL_SDM_NUMERATOR_SIGN_HBR2 BIT(1)
965b2919b9SWyon Bi #define ROPLL_SDM_NUMERATOR_SIGN_HBR3 BIT(0)
975b2919b9SWyon Bi
985b2919b9SWyon Bi /* cmn_reg0065 */
995b2919b9SWyon Bi #define ROPLL_SDM_NUMERATOR GENMASK(7, 0)
1005b2919b9SWyon Bi
1015b2919b9SWyon Bi /* cmn_reg0069 */
1025b2919b9SWyon Bi #define ROPLL_SDC_N_RBR GENMASK(2, 0)
1035b2919b9SWyon Bi
1045b2919b9SWyon Bi /* cmn_reg006A */
1055b2919b9SWyon Bi #define ROPLL_SDC_N_HBR GENMASK(5, 3)
1065b2919b9SWyon Bi #define ROPLL_SDC_N_HBR2 GENMASK(2, 0)
1075b2919b9SWyon Bi
1085b2919b9SWyon Bi /* cmn_reg006B */
1095b2919b9SWyon Bi #define ROPLL_SDC_N_HBR3 GENMASK(3, 1)
1105b2919b9SWyon Bi
1115b2919b9SWyon Bi /* cmn_reg006C */
1125b2919b9SWyon Bi #define ROPLL_SDC_NUMERATOR GENMASK(5, 0)
1135b2919b9SWyon Bi
1145b2919b9SWyon Bi /* cmn_reg0070 */
1155b2919b9SWyon Bi #define ROPLL_SDC_DENOMINATOR GENMASK(5, 0)
1165b2919b9SWyon Bi
1175b2919b9SWyon Bi /* cmn_reg0074 */
1185b2919b9SWyon Bi #define OVRD_ROPLL_SDC_NDIV_RSTN BIT(3)
1195b2919b9SWyon Bi #define ROPLL_SDC_NDIV_RSTN BIT(2)
1205b2919b9SWyon Bi #define OVRD_ROPLL_SSC_EN BIT(1)
1215b2919b9SWyon Bi #define ROPLL_SSC_EN BIT(0)
1225b2919b9SWyon Bi
1235b2919b9SWyon Bi /* cmn_reg0075 */
1245b2919b9SWyon Bi #define ANA_ROPLL_SSC_FM_DEVIATION GENMASK(5, 0)
1255b2919b9SWyon Bi
1265b2919b9SWyon Bi /* cmn_reg0076 */
1275b2919b9SWyon Bi #define ANA_ROPLL_SSC_FM_FREQ GENMASK(6, 2)
1285b2919b9SWyon Bi
1295b2919b9SWyon Bi /* cmn_reg0077 */
1305b2919b9SWyon Bi #define ANA_ROPLL_SSC_CLK_DIV_SEL GENMASK(6, 3)
1315b2919b9SWyon Bi
1325b2919b9SWyon Bi /* cmn_reg0081 */
1335b2919b9SWyon Bi #define ANA_PLL_CD_TX_SER_RATE_SEL BIT(3)
1345b2919b9SWyon Bi #define ANA_PLL_CD_HSCLK_WEST_EN BIT(1)
1355b2919b9SWyon Bi #define ANA_PLL_CD_HSCLK_EAST_EN BIT(0)
1365b2919b9SWyon Bi
1375b2919b9SWyon Bi /* cmn_reg0082 */
1385b2919b9SWyon Bi #define ANA_PLL_CD_VREG_GAIN_CTRL GENMASK(3, 0)
1395b2919b9SWyon Bi
1405b2919b9SWyon Bi /* cmn_reg0083 */
1415b2919b9SWyon Bi #define ANA_PLL_CD_VREG_ICTRL GENMASK(6, 5)
1425b2919b9SWyon Bi
1435b2919b9SWyon Bi /* cmn_reg0084 */
1445b2919b9SWyon Bi #define PLL_LCRO_CLK_SEL BIT(5)
1455b2919b9SWyon Bi
1465b2919b9SWyon Bi /* cmn_reg0085 */
1475b2919b9SWyon Bi #define ANA_PLL_SYNC_LOSS_DET_MODE GENMASK(1, 0)
1485b2919b9SWyon Bi
1495b2919b9SWyon Bi /* cmn_reg0087 */
1505b2919b9SWyon Bi #define ANA_PLL_TX_HS_CLK_EN BIT(2)
1515b2919b9SWyon Bi
1525b2919b9SWyon Bi /* cmn_reg0095 */
1535b2919b9SWyon Bi #define DP_TX_LINK_BW GENMASK(1, 0)
1545b2919b9SWyon Bi
1555b2919b9SWyon Bi /* cmn_reg0097 */
1565b2919b9SWyon Bi #define DIG_CLK_SEL BIT(1)
1575b2919b9SWyon Bi
1585b2919b9SWyon Bi /* cmn_reg0099 */
1595b2919b9SWyon Bi #define SSC_EN GENMASK(7, 6)
1605b2919b9SWyon Bi #define CMN_ROPLL_ALONE_MODE BIT(2)
1615b2919b9SWyon Bi
1625b2919b9SWyon Bi /* cmn_reg009A */
1635b2919b9SWyon Bi #define HS_SPEED_SEL BIT(0)
1645b2919b9SWyon Bi
1655b2919b9SWyon Bi /* cmn_reg009B */
1665b2919b9SWyon Bi #define LS_SPEED_SEL BIT(4)
1675b2919b9SWyon Bi
1685b2919b9SWyon Bi /* sb_reg0102 */
1695b2919b9SWyon Bi #define OVRD_SB_RXTERM_EN BIT(5)
1705b2919b9SWyon Bi #define SB_RXRERM_EN BIT(4)
1715b2919b9SWyon Bi #define ANA_SB_RXTERM_OFFSP GENMASK(3, 0)
1725b2919b9SWyon Bi
1735b2919b9SWyon Bi /* sb_reg0103 */
1745b2919b9SWyon Bi #define ANA_SB_RXTERM_OFFSN GENMASK(6, 3)
1755b2919b9SWyon Bi #define OVRD_SB_RX_RESCAL_DONE BIT(1)
1765b2919b9SWyon Bi #define SB_RX_RESCAL_DONE BIT(0)
1775b2919b9SWyon Bi
1785b2919b9SWyon Bi /* sb_reg0104 */
1795b2919b9SWyon Bi #define OVRD_SB_EN BIT(5)
1805b2919b9SWyon Bi #define SB_EN BIT(4)
1815b2919b9SWyon Bi #define OVRD_SB_AUX_EN BIT(1)
1825b2919b9SWyon Bi #define SB_AUX_EN BIT(0)
1835b2919b9SWyon Bi
1845d7a183bSWyon bi /* sb_reg0105 */
1855d7a183bSWyon bi #define ANA_SB_TX_HLVL_PROG GENMASK(2, 0)
1865d7a183bSWyon bi
1875d7a183bSWyon bi /* sb_reg0106 */
1885d7a183bSWyon bi #define ANA_SB_TX_LLVL_PROG GENMASK(6, 4)
1895d7a183bSWyon bi
1905b2919b9SWyon Bi /* sb_reg010D */
1915b2919b9SWyon Bi #define ANA_SB_DMRX_LPBK_DATA BIT(4)
1925b2919b9SWyon Bi
1935b2919b9SWyon Bi /* sb_reg010F */
1945b2919b9SWyon Bi #define OVRD_SB_VREG_EN BIT(7)
1955d7a183bSWyon bi #define SB_VREG_EN BIT(6)
1965b2919b9SWyon Bi #define ANA_SB_VREG_GAIN_CTRL GENMASK(3, 0)
1975b2919b9SWyon Bi
1985b2919b9SWyon Bi /* sb_reg0110 */
1995b2919b9SWyon Bi #define ANA_SB_VREG_OUT_SEL BIT(1)
2005b2919b9SWyon Bi #define ANA_SB_VREG_REF_SEL BIT(0)
2015b2919b9SWyon Bi
2025b2919b9SWyon Bi /* sb_reg0113 */
2035b2919b9SWyon Bi #define SB_RX_RCAL_OPT_CODE GENMASK(5, 4)
2045b2919b9SWyon Bi #define SB_RX_RTERM_CTRL GENMASK(3, 0)
2055b2919b9SWyon Bi
2065b2919b9SWyon Bi /* sb_reg0114 */
2075b2919b9SWyon Bi #define SB_TG_SB_EN_DELAY_TIME GENMASK(5, 3)
2085b2919b9SWyon Bi #define SB_TG_RXTERN_EN_DELAY_TIME GENMASK(2, 0)
2095b2919b9SWyon Bi
2105b2919b9SWyon Bi /* sb_reg0115 */
2115b2919b9SWyon Bi #define SB_READY_DELAY_TIME GENMASK(5, 3)
2125b2919b9SWyon Bi #define SB_TG_OSC_EN_DELAY_TIME GENMASK(2, 0)
2135b2919b9SWyon Bi
2145b2919b9SWyon Bi /* sb_reg0116 */
2155b2919b9SWyon Bi #define SB_TG_OSC_EN_TO_AFC_RSTN_DELAT_TIME GENMASK(6, 4)
2165b2919b9SWyon Bi
2175b2919b9SWyon Bi /* sb_reg0117 */
2185b2919b9SWyon Bi #define SB_TG_PLL_CD_VREG_FAST_PULSE_TIME GENMASK(3, 0)
2195b2919b9SWyon Bi
2205b2919b9SWyon Bi /* sb_reg0118 */
2215b2919b9SWyon Bi #define SB_TG_EARC_DMRX_RECVRD_CLK_CNT GENMASK(7, 0)
2225b2919b9SWyon Bi
2235b2919b9SWyon Bi /* sb_reg011A */
2245b2919b9SWyon Bi #define SB_TG_CNT_RUN_NO_7_0 GENMASK(7, 0)
2255b2919b9SWyon Bi
2265b2919b9SWyon Bi /* sb_reg011B */
2275b2919b9SWyon Bi #define SB_EARC_SIG_DET_BYPASS BIT(4)
2285b2919b9SWyon Bi #define SB_AFC_TOL GENMASK(3, 0)
2295b2919b9SWyon Bi
2305b2919b9SWyon Bi /* sb_reg011C */
2315b2919b9SWyon Bi #define SB_AFC_STB_NUM GENMASK(3, 0)
2325b2919b9SWyon Bi
2335b2919b9SWyon Bi /* sb_reg011D */
2345b2919b9SWyon Bi #define SB_TG_OSC_CNT_MIN GENMASK(7, 0)
2355b2919b9SWyon Bi
2365b2919b9SWyon Bi /* sb_reg011E */
2375b2919b9SWyon Bi #define SB_TG_OSC_CNT_MAX GENMASK(7, 0)
2385b2919b9SWyon Bi
2395b2919b9SWyon Bi /* sb_reg011F */
2405b2919b9SWyon Bi #define SB_PWM_AFC_CTRL GENMASK(7, 2)
2415b2919b9SWyon Bi #define SB_RCAL_RSTN BIT(1)
2425b2919b9SWyon Bi
2435b2919b9SWyon Bi /* sb_reg0120 */
2445b2919b9SWyon Bi #define SB_AUX_EN_IN BIT(7)
2455b2919b9SWyon Bi
2465b2919b9SWyon Bi /* sb_reg0123 */
2475b2919b9SWyon Bi #define OVRD_SB_READY BIT(5)
2485b2919b9SWyon Bi #define SB_READY BIT(4)
2495b2919b9SWyon Bi
2505b2919b9SWyon Bi /* lntop_reg0200 */
2515b2919b9SWyon Bi #define PROTOCOL_SEL BIT(2)
2525b2919b9SWyon Bi
2535b2919b9SWyon Bi /* lntop_reg0206 */
2545b2919b9SWyon Bi #define DATA_BUS_WIDTH GENMASK(2, 1)
2555b2919b9SWyon Bi #define BUS_WIDTH_SEL BIT(0)
2565b2919b9SWyon Bi
2575b2919b9SWyon Bi /* lntop_reg0207 */
2585b2919b9SWyon Bi #define LANE_EN GENMASK(3, 0)
2595b2919b9SWyon Bi
2605d7a183bSWyon bi /* lane_reg0301 */
2615d7a183bSWyon bi #define OVRD_LN_TX_DRV_EI_EN BIT(7)
2625d7a183bSWyon bi #define LN_TX_DRV_EI_EN BIT(6)
2635d7a183bSWyon bi
2645b2919b9SWyon Bi /* lane_reg0303 */
2655b2919b9SWyon Bi #define OVRD_LN_TX_DRV_LVL_CTRL BIT(5)
2665b2919b9SWyon Bi #define LN_TX_DRV_LVL_CTRL GENMASK(4, 0)
2675b2919b9SWyon Bi
2685b2919b9SWyon Bi /* lane_reg0304 */
2695b2919b9SWyon Bi #define OVRD_LN_TX_DRV_POST_LVL_CTRL BIT(4)
2705b2919b9SWyon Bi #define LN_TX_DRV_POST_LVL_CTRL GENMASK(3, 0)
2715b2919b9SWyon Bi
2725b2919b9SWyon Bi /* lane_reg0305 */
2735b2919b9SWyon Bi #define OVRD_LN_TX_DRV_PRE_LVL_CTRL BIT(6)
2745b2919b9SWyon Bi #define LN_TX_DRV_PRE_LVL_CTRL GENMASK(5, 2)
2755b2919b9SWyon Bi
2765d7a183bSWyon bi /* lane_reg0306 */
2775d7a183bSWyon bi #define LN_ANA_TX_DRV_IDRV_IDN_CTRL GENMASK(7, 5)
2785d7a183bSWyon bi #define LN_ANA_TX_DRV_IDRV_IUP_CTRL GENMASK(4, 2)
2795d7a183bSWyon bi #define LN_ANA_TX_DRV_ACCDRV_EN BIT(0)
2805d7a183bSWyon bi
2815d7a183bSWyon bi /* lane_reg0307 */
2825d7a183bSWyon bi #define LN_ANA_TX_DRV_ACCDRV_POL_SEL BIT(6)
2835d7a183bSWyon bi #define LN_ANA_TX_DRV_ACCDRV_CTRL GENMASK(5, 3)
2845d7a183bSWyon bi
2855b2919b9SWyon Bi /* lane_reg030A */
2865b2919b9SWyon Bi #define LN_ANA_TX_JEQ_EN BIT(4)
2875b2919b9SWyon Bi #define LN_TX_JEQ_EVEN_CTRL_RBR GENMASK(3, 0)
2885b2919b9SWyon Bi
2895b2919b9SWyon Bi /* lane_reg030B */
2905b2919b9SWyon Bi #define LN_TX_JEQ_EVEN_CTRL_HBR GENMASK(7, 4)
2915b2919b9SWyon Bi #define LN_TX_JEQ_EVEN_CTRL_HBR2 GENMASK(3, 0)
2925b2919b9SWyon Bi
2935b2919b9SWyon Bi /* lane_reg030C */
2945b2919b9SWyon Bi #define LN_TX_JEQ_EVEN_CTRL_HBR3 GENMASK(7, 4)
2955b2919b9SWyon Bi #define LN_TX_JEQ_ODD_CTRL_RBR GENMASK(3, 0)
2965b2919b9SWyon Bi
2975b2919b9SWyon Bi /* lane_reg030D */
2985b2919b9SWyon Bi #define LN_TX_JEQ_ODD_CTRL_HBR GENMASK(7, 4)
2995b2919b9SWyon Bi #define LN_TX_JEQ_ODD_CTRL_HBR2 GENMASK(3, 0)
3005b2919b9SWyon Bi
3015b2919b9SWyon Bi /* lane_reg030E */
3025b2919b9SWyon Bi #define LN_TX_JEQ_ODD_CTRL_HBR3 GENMASK(7, 4)
3035b2919b9SWyon Bi
3045b2919b9SWyon Bi /* lane_reg0310 */
3055b2919b9SWyon Bi #define LN_ANA_TX_SYNC_LOSS_DET_MODE GENMASK(1, 0)
3065b2919b9SWyon Bi
3075b2919b9SWyon Bi /* lane_reg0311 */
3085b2919b9SWyon Bi #define LN_TX_SER_40BIT_EN_RBR BIT(3)
3095b2919b9SWyon Bi #define LN_TX_SER_40BIT_EN_HBR BIT(2)
3105b2919b9SWyon Bi #define LN_TX_SER_40BIT_EN_HBR2 BIT(1)
3115b2919b9SWyon Bi #define LN_TX_SER_40BIT_EN_HBR3 BIT(0)
3125b2919b9SWyon Bi
3135b2919b9SWyon Bi /* lane_reg0316 */
3145b2919b9SWyon Bi #define LN_ANA_TX_SER_VREG_GAIN_CTRL GENMASK(3, 0)
3155b2919b9SWyon Bi
3165b2919b9SWyon Bi /* lane_reg031B */
3175b2919b9SWyon Bi #define LN_ANA_TX_RESERVED GENMASK(7, 0)
3185b2919b9SWyon Bi
3195b2919b9SWyon Bi /* lane_reg031E */
3205b2919b9SWyon Bi #define LN_POLARITY_INV BIT(2)
321411d39e3SGuochun Huang #define LN_LANE_MODE BIT(1)
3225b2919b9SWyon Bi
3235b2919b9SWyon Bi #define LANE_REG(lane, offset) (0x400 * (lane) + (offset))
3245b2919b9SWyon Bi
3255b2919b9SWyon Bi struct rockchip_hdptx_phy {
3265b2919b9SWyon Bi struct udevice *dev;
32719dbc2d6SWyon Bi struct regmap *regmap;
3285b2919b9SWyon Bi struct regmap *grf;
3295b2919b9SWyon Bi
3305b2919b9SWyon Bi struct reset_ctl apb_reset;
3315b2919b9SWyon Bi struct reset_ctl cmn_reset;
3325b2919b9SWyon Bi struct reset_ctl init_reset;
3335b2919b9SWyon Bi struct reset_ctl lane_reset;
3345b2919b9SWyon Bi u32 lane_polarity_invert[4];
335*d4eed522SDamon Ding bool dp_mode;
3365b2919b9SWyon Bi };
3375b2919b9SWyon Bi
3385b2919b9SWyon Bi enum {
3395b2919b9SWyon Bi DP_BW_RBR,
3405b2919b9SWyon Bi DP_BW_HBR,
3415b2919b9SWyon Bi DP_BW_HBR2,
3425b2919b9SWyon Bi DP_BW_HBR3,
3435b2919b9SWyon Bi };
3445b2919b9SWyon Bi
34528eccf1fSDamon Ding enum {
34628eccf1fSDamon Ding EDP_BW_2_16,
34728eccf1fSDamon Ding EDP_BW_2_43,
34828eccf1fSDamon Ding EDP_BW_3_24,
34928eccf1fSDamon Ding EDP_BW_4_32,
35028eccf1fSDamon Ding };
35128eccf1fSDamon Ding
3525d7a183bSWyon bi struct tx_drv_ctrl {
3535d7a183bSWyon bi u8 tx_drv_lvl_ctrl;
3545d7a183bSWyon bi u8 tx_drv_post_lvl_ctrl;
3555d7a183bSWyon bi u8 ana_tx_drv_idrv_idn_ctrl;
3565d7a183bSWyon bi u8 ana_tx_drv_idrv_iup_ctrl;
3575d7a183bSWyon bi u8 ana_tx_drv_accdrv_en;
3585d7a183bSWyon bi u8 ana_tx_drv_accdrv_ctrl;
3599eb0b875SDamon Ding u8 tx_drv_pre_lvl_ctrl;
3609eb0b875SDamon Ding u8 ana_tx_jeq_en;
3619eb0b875SDamon Ding u8 tx_jeq_even_ctrl;
3629eb0b875SDamon Ding u8 tx_jeq_odd_ctrl;
363cbe88c75SWyon Bi } __packed;
3645d7a183bSWyon bi
36528eccf1fSDamon Ding struct tx_pll_ctrl {
36628eccf1fSDamon Ding u8 mdiv;
36728eccf1fSDamon Ding u8 sdiv;
36828eccf1fSDamon Ding u8 sdm_denominator;
36928eccf1fSDamon Ding u8 sdm_numerator_sign;
37028eccf1fSDamon Ding u8 sdm_numerator;
37128eccf1fSDamon Ding u8 sdc_clock_div;
37228eccf1fSDamon Ding u8 sdc_numerator;
37328eccf1fSDamon Ding u8 sdc_denominator;
37428eccf1fSDamon Ding u8 ssc_deviation;
37528eccf1fSDamon Ding u8 ssc_freq;
37628eccf1fSDamon Ding } __packed;
37728eccf1fSDamon Ding
378cbe88c75SWyon Bi static struct tx_drv_ctrl tx_drv_ctrl_rbr[4][4] = {
3795b2919b9SWyon Bi /* voltage swing 0, pre-emphasis 0->3 */
3805b2919b9SWyon Bi {
3819eb0b875SDamon Ding { 0x2, 0x0, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
3829eb0b875SDamon Ding { 0x4, 0x3, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
3839eb0b875SDamon Ding { 0x7, 0x6, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
3849eb0b875SDamon Ding { 0xd, 0xc, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
3855b2919b9SWyon Bi },
3865b2919b9SWyon Bi
3875b2919b9SWyon Bi /* voltage swing 1, pre-emphasis 0->2 */
3885b2919b9SWyon Bi {
3899eb0b875SDamon Ding { 0x4, 0x0, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
3909eb0b875SDamon Ding { 0x9, 0x5, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
3919eb0b875SDamon Ding { 0xc, 0x8, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
3925b2919b9SWyon Bi },
3935b2919b9SWyon Bi
3945b2919b9SWyon Bi /* voltage swing 2, pre-emphasis 0->1 */
3955b2919b9SWyon Bi {
3969eb0b875SDamon Ding { 0x8, 0x0, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
3979eb0b875SDamon Ding { 0xc, 0x5, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
3985b2919b9SWyon Bi },
3995b2919b9SWyon Bi
4005b2919b9SWyon Bi /* voltage swing 3, pre-emphasis 0 */
4015b2919b9SWyon Bi {
4029eb0b875SDamon Ding { 0xb, 0x0, 0x7, 0x7, 0x1, 0x4, 0x1, 0x1, 0x7, 0x7 },
4035d7a183bSWyon bi }
4045d7a183bSWyon bi };
4055d7a183bSWyon bi
406cbe88c75SWyon Bi static struct tx_drv_ctrl tx_drv_ctrl_hbr[4][4] = {
4075d7a183bSWyon bi /* voltage swing 0, pre-emphasis 0->3 */
4085d7a183bSWyon bi {
4099eb0b875SDamon Ding { 0x2, 0x0, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
4109eb0b875SDamon Ding { 0x5, 0x4, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
4119eb0b875SDamon Ding { 0x9, 0x8, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
4129eb0b875SDamon Ding { 0xd, 0xc, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
4135d7a183bSWyon bi },
4145d7a183bSWyon bi
4155d7a183bSWyon bi /* voltage swing 1, pre-emphasis 0->2 */
4165d7a183bSWyon bi {
4179eb0b875SDamon Ding { 0x6, 0x1, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
4189eb0b875SDamon Ding { 0xa, 0x6, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
4199eb0b875SDamon Ding { 0xc, 0x8, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
4205d7a183bSWyon bi },
4215d7a183bSWyon bi
4225d7a183bSWyon bi /* voltage swing 2, pre-emphasis 0->1 */
4235d7a183bSWyon bi {
4249eb0b875SDamon Ding { 0x9, 0x1, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
4259eb0b875SDamon Ding { 0xd, 0x6, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
4265d7a183bSWyon bi },
4275d7a183bSWyon bi
4285d7a183bSWyon bi /* voltage swing 3, pre-emphasis 0 */
4295d7a183bSWyon bi {
4309eb0b875SDamon Ding { 0xc, 0x1, 0x7, 0x7, 0x1, 0x4, 0x1, 0x1, 0x7, 0x7 },
4315d7a183bSWyon bi }
4325d7a183bSWyon bi };
4335d7a183bSWyon bi
434cbe88c75SWyon Bi static struct tx_drv_ctrl tx_drv_ctrl_hbr2[4][4] = {
4355d7a183bSWyon bi /* voltage swing 0, pre-emphasis 0->3 */
4365d7a183bSWyon bi {
4379eb0b875SDamon Ding { 0x2, 0x1, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
4389eb0b875SDamon Ding { 0x5, 0x4, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
4399eb0b875SDamon Ding { 0x9, 0x8, 0x4, 0x6, 0x1, 0x4, 0x0, 0x1, 0x7, 0x7 },
4409eb0b875SDamon Ding { 0xd, 0xc, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
4415d7a183bSWyon bi },
4425d7a183bSWyon bi
4435d7a183bSWyon bi /* voltage swing 1, pre-emphasis 0->2 */
4445d7a183bSWyon bi {
4459eb0b875SDamon Ding { 0x6, 0x1, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
4469eb0b875SDamon Ding { 0xb, 0x7, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
4479eb0b875SDamon Ding { 0xd, 0x9, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
4485d7a183bSWyon bi },
4495d7a183bSWyon bi
4505d7a183bSWyon bi /* voltage swing 2, pre-emphasis 0->1 */
4515d7a183bSWyon bi {
4529eb0b875SDamon Ding { 0x8, 0x1, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
4539eb0b875SDamon Ding { 0xc, 0x6, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
4545d7a183bSWyon bi },
4555d7a183bSWyon bi
4565d7a183bSWyon bi /* voltage swing 3, pre-emphasis 0 */
4575d7a183bSWyon bi {
4589eb0b875SDamon Ding { 0xb, 0x0, 0x7, 0x7, 0x1, 0x4, 0x1, 0x1, 0x7, 0x7 },
4595b2919b9SWyon Bi }
4605b2919b9SWyon Bi };
4615b2919b9SWyon Bi
462525d40f2SDamon Ding static struct tx_drv_ctrl tx_drv_ctrl_r216_r243[4][4] = {
463525d40f2SDamon Ding /* voltage swing 0, pre-emphasis 0->3 */
464525d40f2SDamon Ding {
465525d40f2SDamon Ding { 0x0, 0x1, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
466525d40f2SDamon Ding { 0x1, 0x2, 0x4, 0x4, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
467525d40f2SDamon Ding { 0x1, 0x3, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
468525d40f2SDamon Ding { 0x3, 0x5, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
469525d40f2SDamon Ding },
470525d40f2SDamon Ding
471525d40f2SDamon Ding /* voltage swing 1, pre-emphasis 0->2 */
472525d40f2SDamon Ding {
473525d40f2SDamon Ding { 0x1, 0x1, 0x4, 0x4, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
474525d40f2SDamon Ding { 0x2, 0x3, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
475525d40f2SDamon Ding { 0x3, 0x4, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
476525d40f2SDamon Ding },
477525d40f2SDamon Ding
478525d40f2SDamon Ding /* voltage swing 2, pre-emphasis 0->1 */
479525d40f2SDamon Ding {
480525d40f2SDamon Ding { 0x1, 0x1, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
481525d40f2SDamon Ding { 0x1, 0x2, 0x7, 0x7, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
482525d40f2SDamon Ding },
483525d40f2SDamon Ding
484525d40f2SDamon Ding /* voltage swing 3, pre-emphasis 0 */
485525d40f2SDamon Ding {
486525d40f2SDamon Ding { 0x3, 0x2, 0x2, 0x2, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
487525d40f2SDamon Ding }
488525d40f2SDamon Ding };
489525d40f2SDamon Ding
490525d40f2SDamon Ding static struct tx_drv_ctrl tx_drv_ctrl_r324[4][4] = {
491525d40f2SDamon Ding /* voltage swing 0, pre-emphasis 0->3 */
492525d40f2SDamon Ding {
493525d40f2SDamon Ding { 0x1, 0x2, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
494525d40f2SDamon Ding { 0x2, 0x3, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
495525d40f2SDamon Ding { 0x2, 0x4, 0x5, 0x5, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
496525d40f2SDamon Ding { 0x4, 0x6, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
497525d40f2SDamon Ding },
498525d40f2SDamon Ding
499525d40f2SDamon Ding /* voltage swing 1, pre-emphasis 0->2 */
500525d40f2SDamon Ding {
501525d40f2SDamon Ding { 0x2, 0x2, 0x4, 0x4, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
502525d40f2SDamon Ding { 0x2, 0x3, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
503525d40f2SDamon Ding { 0x4, 0x5, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
504525d40f2SDamon Ding },
505525d40f2SDamon Ding
506525d40f2SDamon Ding /* voltage swing 2, pre-emphasis 0->1 */
507525d40f2SDamon Ding {
508525d40f2SDamon Ding { 0x2, 0x2, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
509525d40f2SDamon Ding { 0x4, 0x4, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
510525d40f2SDamon Ding },
511525d40f2SDamon Ding
512525d40f2SDamon Ding /* voltage swing 3, pre-emphasis 0 */
513525d40f2SDamon Ding {
514525d40f2SDamon Ding { 0x3, 0x2, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
515525d40f2SDamon Ding }
516525d40f2SDamon Ding };
517525d40f2SDamon Ding
518525d40f2SDamon Ding static struct tx_drv_ctrl tx_drv_ctrl_r432[4][4] = {
519525d40f2SDamon Ding /* voltage swing 0, pre-emphasis 0->3 */
520525d40f2SDamon Ding {
521525d40f2SDamon Ding { 0x1, 0x2, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
522525d40f2SDamon Ding { 0x2, 0x3, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
523525d40f2SDamon Ding { 0x2, 0x4, 0x6, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
524525d40f2SDamon Ding { 0x4, 0x6, 0x6, 0x6, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
525525d40f2SDamon Ding },
526525d40f2SDamon Ding
527525d40f2SDamon Ding /* voltage swing 1, pre-emphasis 0->2 */
528525d40f2SDamon Ding {
529525d40f2SDamon Ding { 0x2, 0x2, 0x4, 0x4, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
530525d40f2SDamon Ding { 0x3, 0x4, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
531525d40f2SDamon Ding { 0x5, 0x6, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
532525d40f2SDamon Ding },
533525d40f2SDamon Ding
534525d40f2SDamon Ding /* voltage swing 2, pre-emphasis 0->1 */
535525d40f2SDamon Ding {
536525d40f2SDamon Ding { 0x2, 0x2, 0x4, 0x4, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
537525d40f2SDamon Ding { 0x4, 0x4, 0x4, 0x4, 0x0, 0x7, 0x0, 0x1, 0x7, 0x7 },
538525d40f2SDamon Ding },
539525d40f2SDamon Ding
540525d40f2SDamon Ding /* voltage swing 3, pre-emphasis 0 */
541525d40f2SDamon Ding {
542525d40f2SDamon Ding { 0x5, 0x3, 0x1, 0x1, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
543525d40f2SDamon Ding }
544525d40f2SDamon Ding };
545525d40f2SDamon Ding
546*d4eed522SDamon Ding static struct tx_drv_ctrl tx_drv_ctrl_rbr_dp_mode[4][4] = {
547*d4eed522SDamon Ding /* voltage swing 0, pre-emphasis 0->3 */
548*d4eed522SDamon Ding {
549*d4eed522SDamon Ding { 0x2, 0x0, 0x2, 0x2, 0x1, 0x4, 0x1, 0x1, 0x7, 0x7 },
550*d4eed522SDamon Ding { 0x4, 0x3, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
551*d4eed522SDamon Ding { 0x7, 0x6, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
552*d4eed522SDamon Ding { 0xd, 0xb, 0x1, 0x1, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
553*d4eed522SDamon Ding },
554*d4eed522SDamon Ding
555*d4eed522SDamon Ding /* voltage swing 1, pre-emphasis 0->2 */
556*d4eed522SDamon Ding {
557*d4eed522SDamon Ding { 0x4, 0x0, 0x4, 0x4, 0x1, 0x4, 0x1, 0x1, 0x7, 0x7 },
558*d4eed522SDamon Ding { 0x9, 0x5, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
559*d4eed522SDamon Ding { 0xc, 0x9, 0x2, 0x2, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
560*d4eed522SDamon Ding },
561*d4eed522SDamon Ding
562*d4eed522SDamon Ding /* voltage swing 2, pre-emphasis 0->1 */
563*d4eed522SDamon Ding {
564*d4eed522SDamon Ding { 0x8, 0x0, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
565*d4eed522SDamon Ding { 0xc, 0x5, 0x3, 0x3, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
566*d4eed522SDamon Ding },
567*d4eed522SDamon Ding
568*d4eed522SDamon Ding /* voltage swing 3, pre-emphasis 0 */
569*d4eed522SDamon Ding {
570*d4eed522SDamon Ding { 0xb, 0x0, 0x7, 0x7, 0x1, 0x4, 0x1, 0x1, 0x7, 0x7 },
571*d4eed522SDamon Ding }
572*d4eed522SDamon Ding };
573*d4eed522SDamon Ding
574*d4eed522SDamon Ding static struct tx_drv_ctrl tx_drv_ctrl_hbr_dp_mode[4][4] = {
575*d4eed522SDamon Ding /* voltage swing 0, pre-emphasis 0->3 */
576*d4eed522SDamon Ding {
577*d4eed522SDamon Ding { 0x2, 0x0, 0x1, 0x1, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
578*d4eed522SDamon Ding { 0x5, 0x4, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
579*d4eed522SDamon Ding { 0x9, 0x8, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
580*d4eed522SDamon Ding { 0xd, 0xc, 0x1, 0x1, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
581*d4eed522SDamon Ding },
582*d4eed522SDamon Ding
583*d4eed522SDamon Ding /* voltage swing 1, pre-emphasis 0->2 */
584*d4eed522SDamon Ding {
585*d4eed522SDamon Ding { 0x6, 0x1, 0x2, 0x2, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
586*d4eed522SDamon Ding { 0xa, 0x6, 0x4, 0x6, 0x0, 0x4, 0x0, 0x1, 0x7, 0x7 },
587*d4eed522SDamon Ding { 0xc, 0x9, 0x2, 0x2, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
588*d4eed522SDamon Ding },
589*d4eed522SDamon Ding
590*d4eed522SDamon Ding /* voltage swing 2, pre-emphasis 0->1 */
591*d4eed522SDamon Ding {
592*d4eed522SDamon Ding { 0x9, 0x1, 0x4, 0x6, 0x0, 0x4, 0x1, 0x1, 0x7, 0x7 },
593*d4eed522SDamon Ding { 0xd, 0x6, 0x3, 0x3, 0x1, 0x7, 0x0, 0x1, 0x7, 0x7 },
594*d4eed522SDamon Ding },
595*d4eed522SDamon Ding
596*d4eed522SDamon Ding /* voltage swing 3, pre-emphasis 0 */
597*d4eed522SDamon Ding {
598*d4eed522SDamon Ding { 0xc, 0x1, 0x7, 0x7, 0x1, 0x4, 0x1, 0x1, 0x7, 0x7 },
599*d4eed522SDamon Ding }
600*d4eed522SDamon Ding };
601*d4eed522SDamon Ding
60228eccf1fSDamon Ding /* pll configurations for link rate R216/R243/R324/R432 */
603525d40f2SDamon Ding static const struct tx_pll_ctrl tx_pll_ctrl_extra[4] = {
604525d40f2SDamon Ding { 0x5a, 0x01, 0x32, 0x00, 0x00, 0x00, 0x01, 0x04, 0x0d, 0x1d }, /* R216 */
605525d40f2SDamon Ding { 0x65, 0x01, 0x60, 0x00, 0x10, 0x01, 0x13, 0x18, 0x1c, 0x0d }, /* R243 */
606525d40f2SDamon Ding { 0x87, 0x01, 0x21, 0x00, 0x00, 0x02, 0x03, 0x08, 0x0d, 0x1c }, /* R324 */
607525d40f2SDamon Ding { 0x5a, 0x00, 0x32, 0x00, 0x00, 0x01, 0x01, 0x01, 0x0e, 0x1a }, /* R432 */
60828eccf1fSDamon Ding };
60928eccf1fSDamon Ding
rockchip_hdptx_phy_parse_training_table(struct udevice * dev)610cbe88c75SWyon Bi static int rockchip_hdptx_phy_parse_training_table(struct udevice *dev)
611cbe88c75SWyon Bi {
612cbe88c75SWyon Bi int size = sizeof(struct tx_drv_ctrl) * 10;
613cbe88c75SWyon Bi const uint8_t *prop;
614cbe88c75SWyon Bi u8 *buf, *training_table;
615cbe88c75SWyon Bi int i, j;
616cbe88c75SWyon Bi
617cbe88c75SWyon Bi prop = dev_read_u8_array_ptr(dev, "training-table", size);
618cbe88c75SWyon Bi if (!prop)
619cbe88c75SWyon Bi return 0;
620cbe88c75SWyon Bi
621cbe88c75SWyon Bi buf = kzalloc(size, GFP_KERNEL);
622cbe88c75SWyon Bi if (!buf)
623cbe88c75SWyon Bi return -ENOMEM;
624cbe88c75SWyon Bi
625cbe88c75SWyon Bi memcpy(buf, prop, size);
626cbe88c75SWyon Bi
627cbe88c75SWyon Bi training_table = buf;
628cbe88c75SWyon Bi
629cbe88c75SWyon Bi for (i = 0; i < 4; i++) {
630cbe88c75SWyon Bi for (j = 0; j < 4; j++) {
631cbe88c75SWyon Bi struct tx_drv_ctrl *ctrl;
632cbe88c75SWyon Bi
633cbe88c75SWyon Bi if (i + j > 3)
634cbe88c75SWyon Bi continue;
635cbe88c75SWyon Bi
636cbe88c75SWyon Bi ctrl = (struct tx_drv_ctrl *)training_table;
637cbe88c75SWyon Bi tx_drv_ctrl_rbr[i][j] = *ctrl;
638cbe88c75SWyon Bi tx_drv_ctrl_hbr[i][j] = *ctrl;
639cbe88c75SWyon Bi tx_drv_ctrl_hbr2[i][j] = *ctrl;
640cbe88c75SWyon Bi training_table += sizeof(*ctrl);
641cbe88c75SWyon Bi }
642cbe88c75SWyon Bi }
643cbe88c75SWyon Bi
644cbe88c75SWyon Bi kfree(buf);
645cbe88c75SWyon Bi
646cbe88c75SWyon Bi return 0;
647cbe88c75SWyon Bi }
648cbe88c75SWyon Bi
rockchip_grf_write(struct regmap * grf,uint reg,uint mask,uint val)64919dbc2d6SWyon Bi static inline void rockchip_grf_write(struct regmap *grf, uint reg, uint mask,
6505b2919b9SWyon Bi uint val)
6515b2919b9SWyon Bi {
65219dbc2d6SWyon Bi regmap_write(grf, reg, (mask << 16) | (val & mask));
6535b2919b9SWyon Bi }
6545b2919b9SWyon Bi
rockchip_hdptx_phy_set_mode(struct phy * phy,enum phy_mode mode,int submode)6555b2919b9SWyon Bi static int rockchip_hdptx_phy_set_mode(struct phy *phy, enum phy_mode mode,
6565b2919b9SWyon Bi int submode)
6575b2919b9SWyon Bi {
658*d4eed522SDamon Ding struct rockchip_hdptx_phy *hdptx = dev_get_priv(phy->dev);
659*d4eed522SDamon Ding
660*d4eed522SDamon Ding hdptx->dp_mode = (submode == PHY_SUBMODE_DP);
661*d4eed522SDamon Ding
6625b2919b9SWyon Bi return 0;
6635b2919b9SWyon Bi }
6645b2919b9SWyon Bi
rockchip_hdptx_phy_verify_config(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp)6655b2919b9SWyon Bi static int rockchip_hdptx_phy_verify_config(struct rockchip_hdptx_phy *hdptx,
6665b2919b9SWyon Bi struct phy_configure_opts_dp *dp)
6675b2919b9SWyon Bi {
6685b2919b9SWyon Bi int i;
6695b2919b9SWyon Bi
6705b2919b9SWyon Bi if (dp->set_rate) {
6715b2919b9SWyon Bi switch (dp->link_rate) {
6725b2919b9SWyon Bi case 1620:
67328eccf1fSDamon Ding case 2160:
67428eccf1fSDamon Ding case 2430:
6755b2919b9SWyon Bi case 2700:
67628eccf1fSDamon Ding case 3240:
67728eccf1fSDamon Ding case 4320:
6785b2919b9SWyon Bi case 5400:
6795b2919b9SWyon Bi break;
6805b2919b9SWyon Bi default:
6815b2919b9SWyon Bi return -EINVAL;
6825b2919b9SWyon Bi }
6835b2919b9SWyon Bi }
6845b2919b9SWyon Bi
6855b2919b9SWyon Bi switch (dp->lanes) {
6865b2919b9SWyon Bi case 1:
6875b2919b9SWyon Bi case 2:
6885b2919b9SWyon Bi case 4:
6895b2919b9SWyon Bi break;
6905b2919b9SWyon Bi default:
6915b2919b9SWyon Bi return -EINVAL;
6925b2919b9SWyon Bi }
6935b2919b9SWyon Bi
6945b2919b9SWyon Bi if (dp->set_voltages) {
6955b2919b9SWyon Bi for (i = 0; i < dp->lanes; i++) {
6965b2919b9SWyon Bi if (dp->voltage[i] > 3 || dp->pre[i] > 3)
6975b2919b9SWyon Bi return -EINVAL;
6985b2919b9SWyon Bi
6995b2919b9SWyon Bi if (dp->voltage[i] + dp->pre[i] > 3)
7005b2919b9SWyon Bi return -EINVAL;
7015b2919b9SWyon Bi }
7025b2919b9SWyon Bi }
7035b2919b9SWyon Bi
7045b2919b9SWyon Bi return 0;
7055b2919b9SWyon Bi }
7065b2919b9SWyon Bi
rockchip_hdptx_phy_set_voltage(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp,u8 lane)7075b2919b9SWyon Bi static void rockchip_hdptx_phy_set_voltage(struct rockchip_hdptx_phy *hdptx,
7085b2919b9SWyon Bi struct phy_configure_opts_dp *dp,
7095b2919b9SWyon Bi u8 lane)
7105b2919b9SWyon Bi {
7115d7a183bSWyon bi const struct tx_drv_ctrl *ctrl;
7125b2919b9SWyon Bi
7135b2919b9SWyon Bi switch (dp->link_rate) {
7145b2919b9SWyon Bi case 1620:
715*d4eed522SDamon Ding if (hdptx->dp_mode)
716*d4eed522SDamon Ding ctrl = &tx_drv_ctrl_rbr_dp_mode[dp->voltage[lane]][dp->pre[lane]];
717*d4eed522SDamon Ding else
7185d7a183bSWyon bi ctrl = &tx_drv_ctrl_rbr[dp->voltage[lane]][dp->pre[lane]];
71919dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
7205b2919b9SWyon Bi LN_TX_SER_40BIT_EN_RBR,
7215b2919b9SWyon Bi FIELD_PREP(LN_TX_SER_40BIT_EN_RBR, 0x1));
7229eb0b875SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c28),
7239eb0b875SDamon Ding LN_TX_JEQ_EVEN_CTRL_RBR,
7249eb0b875SDamon Ding FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_RBR, ctrl->tx_jeq_even_ctrl));
7259eb0b875SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c30),
7269eb0b875SDamon Ding LN_TX_JEQ_ODD_CTRL_RBR,
7279eb0b875SDamon Ding FIELD_PREP(LN_TX_JEQ_ODD_CTRL_RBR, ctrl->tx_jeq_odd_ctrl));
7285b2919b9SWyon Bi break;
72928eccf1fSDamon Ding case 2160:
73028eccf1fSDamon Ding case 2430:
731525d40f2SDamon Ding ctrl = &tx_drv_ctrl_r216_r243[dp->voltage[lane]][dp->pre[lane]];
732525d40f2SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
733525d40f2SDamon Ding LN_TX_SER_40BIT_EN_HBR,
734525d40f2SDamon Ding FIELD_PREP(LN_TX_SER_40BIT_EN_HBR, 0x1));
735525d40f2SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c2c),
736525d40f2SDamon Ding LN_TX_JEQ_EVEN_CTRL_HBR,
737525d40f2SDamon Ding FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_HBR, ctrl->tx_jeq_even_ctrl));
738525d40f2SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c34),
739525d40f2SDamon Ding LN_TX_JEQ_ODD_CTRL_HBR,
740525d40f2SDamon Ding FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR, ctrl->tx_jeq_odd_ctrl));
741525d40f2SDamon Ding break;
7425b2919b9SWyon Bi case 2700:
743*d4eed522SDamon Ding if (hdptx->dp_mode)
744*d4eed522SDamon Ding ctrl = &tx_drv_ctrl_hbr_dp_mode[dp->voltage[lane]][dp->pre[lane]];
745*d4eed522SDamon Ding else
7465d7a183bSWyon bi ctrl = &tx_drv_ctrl_hbr[dp->voltage[lane]][dp->pre[lane]];
74719dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
7485b2919b9SWyon Bi LN_TX_SER_40BIT_EN_HBR,
7495b2919b9SWyon Bi FIELD_PREP(LN_TX_SER_40BIT_EN_HBR, 0x1));
7509eb0b875SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c2c),
7519eb0b875SDamon Ding LN_TX_JEQ_EVEN_CTRL_HBR,
7529eb0b875SDamon Ding FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_HBR, ctrl->tx_jeq_even_ctrl));
7539eb0b875SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c34),
7549eb0b875SDamon Ding LN_TX_JEQ_ODD_CTRL_HBR,
7559eb0b875SDamon Ding FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR, ctrl->tx_jeq_odd_ctrl));
7565b2919b9SWyon Bi break;
75728eccf1fSDamon Ding case 3240:
758525d40f2SDamon Ding ctrl = &tx_drv_ctrl_r324[dp->voltage[lane]][dp->pre[lane]];
759525d40f2SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
760525d40f2SDamon Ding LN_TX_SER_40BIT_EN_HBR2,
761525d40f2SDamon Ding FIELD_PREP(LN_TX_SER_40BIT_EN_HBR2, 0x1));
762525d40f2SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c2c),
763525d40f2SDamon Ding LN_TX_JEQ_EVEN_CTRL_HBR2,
764525d40f2SDamon Ding FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_HBR2, ctrl->tx_jeq_even_ctrl));
765525d40f2SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c34),
766525d40f2SDamon Ding LN_TX_JEQ_ODD_CTRL_HBR2,
767525d40f2SDamon Ding FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR2, ctrl->tx_jeq_odd_ctrl));
768525d40f2SDamon Ding break;
76928eccf1fSDamon Ding case 4320:
770525d40f2SDamon Ding ctrl = &tx_drv_ctrl_r432[dp->voltage[lane]][dp->pre[lane]];
771525d40f2SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
772525d40f2SDamon Ding LN_TX_SER_40BIT_EN_HBR2,
773525d40f2SDamon Ding FIELD_PREP(LN_TX_SER_40BIT_EN_HBR2, 0x1));
774525d40f2SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c2c),
775525d40f2SDamon Ding LN_TX_JEQ_EVEN_CTRL_HBR2,
776525d40f2SDamon Ding FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_HBR2, ctrl->tx_jeq_even_ctrl));
777525d40f2SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c34),
778525d40f2SDamon Ding LN_TX_JEQ_ODD_CTRL_HBR2,
779525d40f2SDamon Ding FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR2, ctrl->tx_jeq_odd_ctrl));
780525d40f2SDamon Ding break;
7815b2919b9SWyon Bi case 5400:
7825d7a183bSWyon bi default:
7835d7a183bSWyon bi ctrl = &tx_drv_ctrl_hbr2[dp->voltage[lane]][dp->pre[lane]];
78419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c44),
7855b2919b9SWyon Bi LN_TX_SER_40BIT_EN_HBR2,
7865b2919b9SWyon Bi FIELD_PREP(LN_TX_SER_40BIT_EN_HBR2, 0x1));
7879eb0b875SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c2c),
7889eb0b875SDamon Ding LN_TX_JEQ_EVEN_CTRL_HBR2,
7899eb0b875SDamon Ding FIELD_PREP(LN_TX_JEQ_EVEN_CTRL_HBR2, ctrl->tx_jeq_even_ctrl));
7909eb0b875SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c34),
7919eb0b875SDamon Ding LN_TX_JEQ_ODD_CTRL_HBR2,
7929eb0b875SDamon Ding FIELD_PREP(LN_TX_JEQ_ODD_CTRL_HBR2, ctrl->tx_jeq_odd_ctrl));
7935b2919b9SWyon Bi break;
7945b2919b9SWyon Bi }
7955b2919b9SWyon Bi
79619dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c0c),
7975b2919b9SWyon Bi OVRD_LN_TX_DRV_LVL_CTRL | LN_TX_DRV_LVL_CTRL,
7985b2919b9SWyon Bi FIELD_PREP(OVRD_LN_TX_DRV_LVL_CTRL, 0x1) |
79919dbc2d6SWyon Bi FIELD_PREP(LN_TX_DRV_LVL_CTRL,
80019dbc2d6SWyon Bi ctrl->tx_drv_lvl_ctrl));
80119dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c10),
80219dbc2d6SWyon Bi OVRD_LN_TX_DRV_POST_LVL_CTRL |
80319dbc2d6SWyon Bi LN_TX_DRV_POST_LVL_CTRL,
8045b2919b9SWyon Bi FIELD_PREP(OVRD_LN_TX_DRV_POST_LVL_CTRL, 0x1) |
8055d7a183bSWyon bi FIELD_PREP(LN_TX_DRV_POST_LVL_CTRL,
8065d7a183bSWyon bi ctrl->tx_drv_post_lvl_ctrl));
8079eb0b875SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c14),
8089eb0b875SDamon Ding OVRD_LN_TX_DRV_PRE_LVL_CTRL |
8099eb0b875SDamon Ding LN_TX_DRV_PRE_LVL_CTRL,
8109eb0b875SDamon Ding FIELD_PREP(OVRD_LN_TX_DRV_PRE_LVL_CTRL, 0x1) |
8119eb0b875SDamon Ding FIELD_PREP(LN_TX_DRV_PRE_LVL_CTRL,
8129eb0b875SDamon Ding ctrl->tx_drv_pre_lvl_ctrl));
81319dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c18),
8145d7a183bSWyon bi LN_ANA_TX_DRV_IDRV_IDN_CTRL |
81519dbc2d6SWyon Bi LN_ANA_TX_DRV_IDRV_IUP_CTRL |
81619dbc2d6SWyon Bi LN_ANA_TX_DRV_ACCDRV_EN,
8175d7a183bSWyon bi FIELD_PREP(LN_ANA_TX_DRV_IDRV_IDN_CTRL,
8185d7a183bSWyon bi ctrl->ana_tx_drv_idrv_idn_ctrl) |
8195d7a183bSWyon bi FIELD_PREP(LN_ANA_TX_DRV_IDRV_IUP_CTRL,
8205d7a183bSWyon bi ctrl->ana_tx_drv_idrv_iup_ctrl) |
8215d7a183bSWyon bi FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_EN,
8225d7a183bSWyon bi ctrl->ana_tx_drv_accdrv_en));
82319dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c1c),
82419dbc2d6SWyon Bi LN_ANA_TX_DRV_ACCDRV_POL_SEL |
82519dbc2d6SWyon Bi LN_ANA_TX_DRV_ACCDRV_CTRL,
8265b2919b9SWyon Bi FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_POL_SEL, 0x1) |
8275d7a183bSWyon bi FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_CTRL,
8285d7a183bSWyon bi ctrl->ana_tx_drv_accdrv_ctrl));
8299eb0b875SDamon Ding regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c28),
8309eb0b875SDamon Ding LN_ANA_TX_JEQ_EN,
8319eb0b875SDamon Ding FIELD_PREP(LN_ANA_TX_JEQ_EN, ctrl->ana_tx_jeq_en));
83219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c6c),
83319dbc2d6SWyon Bi LN_ANA_TX_RESERVED,
8345b2919b9SWyon Bi FIELD_PREP(LN_ANA_TX_RESERVED, 0x1));
83519dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c58),
8365b2919b9SWyon Bi LN_ANA_TX_SER_VREG_GAIN_CTRL,
8375b2919b9SWyon Bi FIELD_PREP(LN_ANA_TX_SER_VREG_GAIN_CTRL, 0x2));
83819dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c40),
8395b2919b9SWyon Bi LN_ANA_TX_SYNC_LOSS_DET_MODE,
8405b2919b9SWyon Bi FIELD_PREP(LN_ANA_TX_SYNC_LOSS_DET_MODE, 0x3));
8415b2919b9SWyon Bi }
8425b2919b9SWyon Bi
rockchip_hdptx_phy_set_voltages(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp)8435b2919b9SWyon Bi static int rockchip_hdptx_phy_set_voltages(struct rockchip_hdptx_phy *hdptx,
8445b2919b9SWyon Bi struct phy_configure_opts_dp *dp)
8455b2919b9SWyon Bi {
8465b2919b9SWyon Bi u8 lane;
847d32bfd71SWyon Bi u32 status;
848d32bfd71SWyon Bi int ret;
8495b2919b9SWyon Bi
8505b2919b9SWyon Bi for (lane = 0; lane < dp->lanes; lane++)
8515b2919b9SWyon Bi rockchip_hdptx_phy_set_voltage(hdptx, dp, lane);
8525b2919b9SWyon Bi
853d32bfd71SWyon Bi reset_deassert(&hdptx->lane_reset);
854d32bfd71SWyon Bi
855d32bfd71SWyon Bi ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
856d32bfd71SWyon Bi status, FIELD_GET(PHY_RDY, status),
857d32bfd71SWyon Bi 50, 5000);
858d32bfd71SWyon Bi if (ret) {
859d32bfd71SWyon Bi dev_err(hdptx->dev, "timeout waiting for phy_rdy\n");
860d32bfd71SWyon Bi return ret;
861d32bfd71SWyon Bi }
862d32bfd71SWyon Bi
8635b2919b9SWyon Bi return 0;
8645b2919b9SWyon Bi }
8655b2919b9SWyon Bi
is_extra_recommended_link_rate(u32 link_rate)86628eccf1fSDamon Ding static bool is_extra_recommended_link_rate(u32 link_rate)
86728eccf1fSDamon Ding {
86828eccf1fSDamon Ding switch (link_rate) {
86928eccf1fSDamon Ding case 2160:
87028eccf1fSDamon Ding case 2430:
87128eccf1fSDamon Ding case 3240:
87228eccf1fSDamon Ding case 4320:
87328eccf1fSDamon Ding return true;
87428eccf1fSDamon Ding }
87528eccf1fSDamon Ding
87628eccf1fSDamon Ding return false;
87728eccf1fSDamon Ding }
87828eccf1fSDamon Ding
rockchip_hdptx_phy_set_rate(struct rockchip_hdptx_phy * hdptx,struct phy_configure_opts_dp * dp)8795b2919b9SWyon Bi static int rockchip_hdptx_phy_set_rate(struct rockchip_hdptx_phy *hdptx,
8805b2919b9SWyon Bi struct phy_configure_opts_dp *dp)
8815b2919b9SWyon Bi {
8825b2919b9SWyon Bi u32 bw, status;
88328eccf1fSDamon Ding u32 bw_extra = 0;
8845b2919b9SWyon Bi int ret;
8855b2919b9SWyon Bi
8865b2919b9SWyon Bi reset_assert(&hdptx->lane_reset);
8875b2919b9SWyon Bi udelay(10);
8885b2919b9SWyon Bi reset_assert(&hdptx->cmn_reset);
8895b2919b9SWyon Bi udelay(10);
89019dbc2d6SWyon Bi rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, PLL_EN,
89119dbc2d6SWyon Bi FIELD_PREP(PLL_EN, 0x0));
8925b2919b9SWyon Bi udelay(10);
89319dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x081c, LANE_EN,
89419dbc2d6SWyon Bi FIELD_PREP(LANE_EN, 0x0));
8955b2919b9SWyon Bi
8965b2919b9SWyon Bi switch (dp->link_rate) {
8975b2919b9SWyon Bi case 1620:
8985b2919b9SWyon Bi bw = DP_BW_RBR;
8995b2919b9SWyon Bi break;
90028eccf1fSDamon Ding case 2160:
90128eccf1fSDamon Ding bw_extra = EDP_BW_2_16;
90228eccf1fSDamon Ding bw = DP_BW_HBR;
90328eccf1fSDamon Ding break;
90428eccf1fSDamon Ding case 2430:
90528eccf1fSDamon Ding bw_extra = EDP_BW_2_43;
90628eccf1fSDamon Ding bw = DP_BW_HBR;
90728eccf1fSDamon Ding break;
9085b2919b9SWyon Bi case 2700:
9095b2919b9SWyon Bi bw = DP_BW_HBR;
9105b2919b9SWyon Bi break;
91128eccf1fSDamon Ding case 3240:
91228eccf1fSDamon Ding bw_extra = EDP_BW_3_24;
91328eccf1fSDamon Ding bw = DP_BW_HBR2;
91428eccf1fSDamon Ding break;
91528eccf1fSDamon Ding case 4320:
91628eccf1fSDamon Ding bw_extra = EDP_BW_4_32;
91728eccf1fSDamon Ding bw = DP_BW_HBR2;
91828eccf1fSDamon Ding break;
9195b2919b9SWyon Bi case 5400:
9205b2919b9SWyon Bi bw = DP_BW_HBR2;
9215b2919b9SWyon Bi break;
9225b2919b9SWyon Bi default:
9235b2919b9SWyon Bi return -EINVAL;
9245b2919b9SWyon Bi }
9255b2919b9SWyon Bi
92628eccf1fSDamon Ding if (is_extra_recommended_link_rate(dp->link_rate)) {
92728eccf1fSDamon Ding const struct tx_pll_ctrl *pll_ctrl = &tx_pll_ctrl_extra[bw_extra];
92828eccf1fSDamon Ding
92928eccf1fSDamon Ding regmap_write(hdptx->regmap, 0x0144 + bw * 0x4,
93028eccf1fSDamon Ding FIELD_PREP(ROPLL_PMS_MDIV, pll_ctrl->mdiv));
93128eccf1fSDamon Ding regmap_write(hdptx->regmap, 0x0180 + bw * 0x4,
93228eccf1fSDamon Ding FIELD_PREP(ROPLL_SDM_DENOMINATOR, pll_ctrl->sdm_denominator));
93328eccf1fSDamon Ding regmap_write(hdptx->regmap, 0x0194 + bw * 0x4,
93428eccf1fSDamon Ding FIELD_PREP(ROPLL_SDM_NUMERATOR, pll_ctrl->sdm_numerator));
93528eccf1fSDamon Ding regmap_write(hdptx->regmap, 0x01b0 + bw * 0x4,
93628eccf1fSDamon Ding FIELD_PREP(ROPLL_SDC_NUMERATOR, pll_ctrl->sdc_numerator));
93728eccf1fSDamon Ding regmap_write(hdptx->regmap, 0x01c0 + bw * 0x4,
93828eccf1fSDamon Ding FIELD_PREP(ROPLL_SDC_DENOMINATOR, pll_ctrl->sdc_denominator));
93928eccf1fSDamon Ding
94028eccf1fSDamon Ding if (bw == DP_BW_RBR) {
94128eccf1fSDamon Ding regmap_update_bits(hdptx->regmap, 0x0168, ROPLL_PMS_SDIV_RBR,
94228eccf1fSDamon Ding FIELD_PREP(ROPLL_PMS_SDIV_RBR, pll_ctrl->sdiv));
94328eccf1fSDamon Ding regmap_update_bits(hdptx->regmap, 0x0190, ROPLL_SDM_NUMERATOR_SIGN_RBR,
94428eccf1fSDamon Ding FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_RBR,
94528eccf1fSDamon Ding pll_ctrl->sdm_numerator_sign));
94628eccf1fSDamon Ding regmap_update_bits(hdptx->regmap, 0x01a4, ROPLL_SDC_N_RBR,
94728eccf1fSDamon Ding FIELD_PREP(ROPLL_SDC_N_RBR, pll_ctrl->sdc_clock_div));
94828eccf1fSDamon Ding } else if (bw == DP_BW_HBR) {
94928eccf1fSDamon Ding regmap_update_bits(hdptx->regmap, 0x0168, ROPLL_PMS_SDIV_HBR,
95028eccf1fSDamon Ding FIELD_PREP(ROPLL_PMS_SDIV_HBR, pll_ctrl->sdiv));
95128eccf1fSDamon Ding regmap_update_bits(hdptx->regmap, 0x0190, ROPLL_SDM_NUMERATOR_SIGN_HBR,
95228eccf1fSDamon Ding FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_HBR,
95328eccf1fSDamon Ding pll_ctrl->sdm_numerator_sign));
95428eccf1fSDamon Ding regmap_update_bits(hdptx->regmap, 0x01a8, ROPLL_SDC_N_HBR,
95528eccf1fSDamon Ding FIELD_PREP(ROPLL_SDC_N_HBR, pll_ctrl->sdc_clock_div));
95628eccf1fSDamon Ding } else {
95728eccf1fSDamon Ding regmap_update_bits(hdptx->regmap, 0x016c, ROPLL_PMS_SDIV_HBR2,
95828eccf1fSDamon Ding FIELD_PREP(ROPLL_PMS_SDIV_HBR2, pll_ctrl->sdiv));
95928eccf1fSDamon Ding regmap_update_bits(hdptx->regmap, 0x0190, ROPLL_SDM_NUMERATOR_SIGN_HBR2,
96028eccf1fSDamon Ding FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_HBR2,
96128eccf1fSDamon Ding pll_ctrl->sdm_numerator_sign));
96228eccf1fSDamon Ding regmap_update_bits(hdptx->regmap, 0x01a8, ROPLL_SDC_N_HBR2,
96328eccf1fSDamon Ding FIELD_PREP(ROPLL_SDC_N_HBR2, pll_ctrl->sdc_clock_div));
96428eccf1fSDamon Ding }
96528eccf1fSDamon Ding }
96628eccf1fSDamon Ding
96719dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0254, DP_TX_LINK_BW,
9685b2919b9SWyon Bi FIELD_PREP(DP_TX_LINK_BW, bw));
9695b2919b9SWyon Bi
9705b2919b9SWyon Bi if (dp->ssc) {
97119dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x01d0,
97219dbc2d6SWyon Bi OVRD_ROPLL_SSC_EN | ROPLL_SSC_EN,
9735b2919b9SWyon Bi FIELD_PREP(OVRD_ROPLL_SSC_EN, 0x1) |
9745b2919b9SWyon Bi FIELD_PREP(ROPLL_SSC_EN, 0x1));
97528eccf1fSDamon Ding if (is_extra_recommended_link_rate(dp->link_rate)) {
97628eccf1fSDamon Ding const struct tx_pll_ctrl *pll_ctrl = &tx_pll_ctrl_extra[bw_extra];
97728eccf1fSDamon Ding
97828eccf1fSDamon Ding regmap_write(hdptx->regmap, 0x01d4,
97928eccf1fSDamon Ding FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION,
98028eccf1fSDamon Ding pll_ctrl->ssc_deviation));
98128eccf1fSDamon Ding regmap_update_bits(hdptx->regmap, 0x01d8,
98228eccf1fSDamon Ding ANA_ROPLL_SSC_FM_FREQ,
98328eccf1fSDamon Ding FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ,
98428eccf1fSDamon Ding pll_ctrl->ssc_freq));
98528eccf1fSDamon Ding } else {
98628eccf1fSDamon Ding regmap_write(hdptx->regmap, 0x01d4,
9875d7a183bSWyon bi FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION, 0xc));
98819dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x01d8,
98919dbc2d6SWyon Bi ANA_ROPLL_SSC_FM_FREQ,
9905d7a183bSWyon bi FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ, 0x1f));
99128eccf1fSDamon Ding }
99219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0264, SSC_EN,
99319dbc2d6SWyon Bi FIELD_PREP(SSC_EN, 0x2));
9945b2919b9SWyon Bi } else {
99519dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x01d0,
99619dbc2d6SWyon Bi OVRD_ROPLL_SSC_EN | ROPLL_SSC_EN,
9975b2919b9SWyon Bi FIELD_PREP(OVRD_ROPLL_SSC_EN, 0x1) |
9985b2919b9SWyon Bi FIELD_PREP(ROPLL_SSC_EN, 0x0));
99919dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x01d4,
100019dbc2d6SWyon Bi ANA_ROPLL_SSC_FM_DEVIATION,
10015b2919b9SWyon Bi FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION, 0x20));
100219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x01d8,
100319dbc2d6SWyon Bi ANA_ROPLL_SSC_FM_FREQ,
10045b2919b9SWyon Bi FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ, 0xc));
100519dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0264, SSC_EN,
100619dbc2d6SWyon Bi FIELD_PREP(SSC_EN, 0x0));
10075b2919b9SWyon Bi }
10085b2919b9SWyon Bi
100919dbc2d6SWyon Bi rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, PLL_EN,
101019dbc2d6SWyon Bi FIELD_PREP(PLL_EN, 0x1));
10115b2919b9SWyon Bi udelay(10);
10125b2919b9SWyon Bi reset_deassert(&hdptx->cmn_reset);
10135b2919b9SWyon Bi udelay(10);
10145b2919b9SWyon Bi
10155b2919b9SWyon Bi ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
10165b2919b9SWyon Bi status, FIELD_GET(PLL_LOCK_DONE, status),
10175b2919b9SWyon Bi 50, 1000);
10185b2919b9SWyon Bi if (ret) {
10195b2919b9SWyon Bi dev_err(hdptx->dev, "timeout waiting for pll_lock_done\n");
10205b2919b9SWyon Bi return ret;
10215b2919b9SWyon Bi }
10225b2919b9SWyon Bi
102319dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x081c, LANE_EN,
10245b2919b9SWyon Bi FIELD_PREP(LANE_EN, GENMASK(dp->lanes - 1, 0)));
10255b2919b9SWyon Bi
10265b2919b9SWyon Bi return 0;
10275b2919b9SWyon Bi }
10285b2919b9SWyon Bi
rockchip_hdptx_phy_configure(struct phy * phy,union phy_configure_opts * opts)10295b2919b9SWyon Bi static int rockchip_hdptx_phy_configure(struct phy *phy,
10305b2919b9SWyon Bi union phy_configure_opts *opts)
10315b2919b9SWyon Bi {
10325b2919b9SWyon Bi struct rockchip_hdptx_phy *hdptx = dev_get_priv(phy->dev);
10335b2919b9SWyon Bi enum phy_mode mode = generic_phy_get_mode(phy);
10345b2919b9SWyon Bi int ret;
10355b2919b9SWyon Bi
10365b2919b9SWyon Bi if (mode != PHY_MODE_DP)
10375b2919b9SWyon Bi return -EINVAL;
10385b2919b9SWyon Bi
10395b2919b9SWyon Bi ret = rockchip_hdptx_phy_verify_config(hdptx, &opts->dp);
10405b2919b9SWyon Bi if (ret) {
10415b2919b9SWyon Bi dev_err(hdptx->dev, "invalid params for phy configure\n");
10425b2919b9SWyon Bi return ret;
10435b2919b9SWyon Bi }
10445b2919b9SWyon Bi
10455b2919b9SWyon Bi if (opts->dp.set_rate) {
10465b2919b9SWyon Bi ret = rockchip_hdptx_phy_set_rate(hdptx, &opts->dp);
10475b2919b9SWyon Bi if (ret) {
10485b2919b9SWyon Bi dev_err(hdptx->dev, "failed to set rate: %d\n", ret);
10495b2919b9SWyon Bi return ret;
10505b2919b9SWyon Bi }
10515b2919b9SWyon Bi }
10525b2919b9SWyon Bi
10535b2919b9SWyon Bi if (opts->dp.set_voltages) {
10545b2919b9SWyon Bi ret = rockchip_hdptx_phy_set_voltages(hdptx, &opts->dp);
10555b2919b9SWyon Bi if (ret) {
10565b2919b9SWyon Bi dev_err(hdptx->dev, "failed to set voltages: %d\n",
10575b2919b9SWyon Bi ret);
10585b2919b9SWyon Bi return ret;
10595b2919b9SWyon Bi }
10605b2919b9SWyon Bi }
10615b2919b9SWyon Bi
10625b2919b9SWyon Bi return 0;
10635b2919b9SWyon Bi }
10645b2919b9SWyon Bi
rockchip_hdptx_phy_dp_pll_init(struct rockchip_hdptx_phy * hdptx)10655b2919b9SWyon Bi static void rockchip_hdptx_phy_dp_pll_init(struct rockchip_hdptx_phy *hdptx)
10665b2919b9SWyon Bi {
106719dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0020, OVRD_LCPLL_EN | LCPLL_EN,
10685b2919b9SWyon Bi FIELD_PREP(OVRD_LCPLL_EN, 0x1) |
10695b2919b9SWyon Bi FIELD_PREP(LCPLL_EN, 0x0));
107019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x00f4, OVRD_ROPLL_EN | ROPLL_EN,
10715b2919b9SWyon Bi FIELD_PREP(OVRD_ROPLL_EN, 0x1) |
10725b2919b9SWyon Bi FIELD_PREP(ROPLL_EN, 0x1));
107319dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0138, ANA_ROPLL_PI_EN,
10745b2919b9SWyon Bi FIELD_PREP(ANA_ROPLL_PI_EN, 0x1));
107519dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0144, FIELD_PREP(ROPLL_PMS_MDIV, 0x87));
107619dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0148, FIELD_PREP(ROPLL_PMS_MDIV, 0x71));
107719dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x014c, FIELD_PREP(ROPLL_PMS_MDIV, 0x71));
107819dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0154,
107919dbc2d6SWyon Bi FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x87));
108019dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0158,
108119dbc2d6SWyon Bi FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x71));
108219dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x015c,
108319dbc2d6SWyon Bi FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x71));
108419dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0164,
108519dbc2d6SWyon Bi FIELD_PREP(ANA_ROPLL_PMS_PDIV, 0x1) |
10865b2919b9SWyon Bi FIELD_PREP(ANA_ROPLL_PMS_REFDIV, 0x1));
108719dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0168,
108819dbc2d6SWyon Bi FIELD_PREP(ROPLL_PMS_SDIV_RBR, 0x3) |
10895b2919b9SWyon Bi FIELD_PREP(ROPLL_PMS_SDIV_HBR, 0x1));
109019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x016c, ROPLL_PMS_SDIV_HBR2,
10915b2919b9SWyon Bi FIELD_PREP(ROPLL_PMS_SDIV_HBR2, 0x0));
109219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0178, ANA_ROPLL_SDM_EN,
10935b2919b9SWyon Bi FIELD_PREP(ANA_ROPLL_SDM_EN, 0x1));
109419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0178,
109519dbc2d6SWyon Bi OVRD_ROPLL_SDM_RSTN | ROPLL_SDM_RSTN,
10965b2919b9SWyon Bi FIELD_PREP(OVRD_ROPLL_SDM_RSTN, 0x1) |
10975b2919b9SWyon Bi FIELD_PREP(ROPLL_SDM_RSTN, 0x1));
109819dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0178, ROPLL_SDC_FRACTIONAL_EN_RBR,
10995b2919b9SWyon Bi FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_RBR, 0x1));
110019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0178, ROPLL_SDC_FRACTIONAL_EN_HBR,
11015b2919b9SWyon Bi FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_HBR, 0x1));
110219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0178, ROPLL_SDC_FRACTIONAL_EN_HBR2,
11035b2919b9SWyon Bi FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_HBR2, 0x1));
110419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x017c,
110519dbc2d6SWyon Bi OVRD_ROPLL_SDC_RSTN | ROPLL_SDC_RSTN,
11065b2919b9SWyon Bi FIELD_PREP(OVRD_ROPLL_SDC_RSTN, 0x1) |
11075b2919b9SWyon Bi FIELD_PREP(ROPLL_SDC_RSTN, 0x1));
110819dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0180,
110919dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x21));
111019dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0184,
111119dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x27));
111219dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0188,
111319dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x27));
111419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0190,
111519dbc2d6SWyon Bi ROPLL_SDM_NUMERATOR_SIGN_RBR |
11165b2919b9SWyon Bi ROPLL_SDM_NUMERATOR_SIGN_HBR |
11175b2919b9SWyon Bi ROPLL_SDM_NUMERATOR_SIGN_HBR2,
11185b2919b9SWyon Bi FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_RBR, 0x0) |
11195b2919b9SWyon Bi FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_HBR, 0x1) |
11205b2919b9SWyon Bi FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_HBR2, 0x1));
112119dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0194,
112219dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDM_NUMERATOR, 0x0));
112319dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x0198,
112419dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDM_NUMERATOR, 0xd));
112519dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x019c,
112619dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDM_NUMERATOR, 0xd));
112719dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x01a4, ROPLL_SDC_N_RBR,
11285b2919b9SWyon Bi FIELD_PREP(ROPLL_SDC_N_RBR, 0x2));
112919dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x01a8,
113019dbc2d6SWyon Bi ROPLL_SDC_N_HBR | ROPLL_SDC_N_HBR2,
11318ca121a7SWyon Bi FIELD_PREP(ROPLL_SDC_N_HBR, 0x2) |
11328ca121a7SWyon Bi FIELD_PREP(ROPLL_SDC_N_HBR2, 0x2));
113319dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x01b0,
113419dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x3));
113519dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x01b4,
113619dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x7));
113719dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x01b8,
113819dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x7));
113919dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x01c0,
114019dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x8));
114119dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x01c4,
114219dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x18));
114319dbc2d6SWyon Bi regmap_write(hdptx->regmap, 0x01c8,
114419dbc2d6SWyon Bi FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x18));
114519dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x01d0,
114619dbc2d6SWyon Bi OVRD_ROPLL_SDC_NDIV_RSTN | ROPLL_SDC_NDIV_RSTN,
11475b2919b9SWyon Bi FIELD_PREP(OVRD_ROPLL_SDC_NDIV_RSTN, 0x1) |
11485b2919b9SWyon Bi FIELD_PREP(ROPLL_SDC_NDIV_RSTN, 0x1));
114919dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x01dc, ANA_ROPLL_SSC_CLK_DIV_SEL,
11505b2919b9SWyon Bi FIELD_PREP(ANA_ROPLL_SSC_CLK_DIV_SEL, 0x1));
115119dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0118,
115219dbc2d6SWyon Bi ROPLL_ANA_CPP_CTRL_COARSE | ROPLL_ANA_CPP_CTRL_FINE,
11535b2919b9SWyon Bi FIELD_PREP(ROPLL_ANA_CPP_CTRL_COARSE, 0xe) |
11545b2919b9SWyon Bi FIELD_PREP(ROPLL_ANA_CPP_CTRL_FINE, 0xe));
115519dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x011c,
115619dbc2d6SWyon Bi ROPLL_ANA_LPF_C_SEL_COARSE |
11575b2919b9SWyon Bi ROPLL_ANA_LPF_C_SEL_FINE,
11585b2919b9SWyon Bi FIELD_PREP(ROPLL_ANA_LPF_C_SEL_COARSE, 0x4) |
11595b2919b9SWyon Bi FIELD_PREP(ROPLL_ANA_LPF_C_SEL_FINE, 0x4));
116019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0204, ANA_PLL_CD_TX_SER_RATE_SEL,
11615b2919b9SWyon Bi FIELD_PREP(ANA_PLL_CD_TX_SER_RATE_SEL, 0x0));
116219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x025c, DIG_CLK_SEL,
11635b2919b9SWyon Bi FIELD_PREP(DIG_CLK_SEL, 0x1));
116419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x021c, ANA_PLL_TX_HS_CLK_EN,
11655b2919b9SWyon Bi FIELD_PREP(ANA_PLL_TX_HS_CLK_EN, 0x1));
116619dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0204,
116719dbc2d6SWyon Bi ANA_PLL_CD_HSCLK_EAST_EN | ANA_PLL_CD_HSCLK_WEST_EN,
11685b2919b9SWyon Bi FIELD_PREP(ANA_PLL_CD_HSCLK_EAST_EN, 0x1) |
11695b2919b9SWyon Bi FIELD_PREP(ANA_PLL_CD_HSCLK_WEST_EN, 0x0));
117019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0264, CMN_ROPLL_ALONE_MODE,
11715b2919b9SWyon Bi FIELD_PREP(CMN_ROPLL_ALONE_MODE, 0x1));
117219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0208, ANA_PLL_CD_VREG_GAIN_CTRL,
11735b2919b9SWyon Bi FIELD_PREP(ANA_PLL_CD_VREG_GAIN_CTRL, 0x4));
117419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x00f0, ANA_LCPLL_RESERVED7,
11755b2919b9SWyon Bi FIELD_PREP(ANA_LCPLL_RESERVED7, 0x1));
117619dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x020c, ANA_PLL_CD_VREG_ICTRL,
11775b2919b9SWyon Bi FIELD_PREP(ANA_PLL_CD_VREG_ICTRL, 0x1));
117819dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0214, ANA_PLL_SYNC_LOSS_DET_MODE,
11795b2919b9SWyon Bi FIELD_PREP(ANA_PLL_SYNC_LOSS_DET_MODE, 0x3));
118019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0210, PLL_LCRO_CLK_SEL,
11815b2919b9SWyon Bi FIELD_PREP(PLL_LCRO_CLK_SEL, 0x1));
118219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0268, HS_SPEED_SEL,
11835b2919b9SWyon Bi FIELD_PREP(HS_SPEED_SEL, 0x1));
118419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x026c, LS_SPEED_SEL,
11855b2919b9SWyon Bi FIELD_PREP(LS_SPEED_SEL, 0x1));
11865b2919b9SWyon Bi }
11875b2919b9SWyon Bi
rockchip_hdptx_phy_dp_aux_init(struct rockchip_hdptx_phy * hdptx)11885b2919b9SWyon Bi static int rockchip_hdptx_phy_dp_aux_init(struct rockchip_hdptx_phy *hdptx)
11895b2919b9SWyon Bi {
11905b2919b9SWyon Bi u32 status;
11915b2919b9SWyon Bi int ret;
11925b2919b9SWyon Bi
119319dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0414, ANA_SB_TX_HLVL_PROG,
11945d7a183bSWyon bi FIELD_PREP(ANA_SB_TX_HLVL_PROG, 0x7));
119519dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0418, ANA_SB_TX_LLVL_PROG,
11965d7a183bSWyon bi FIELD_PREP(ANA_SB_TX_LLVL_PROG, 0x7));
119719dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x044c,
119819dbc2d6SWyon Bi SB_RX_RCAL_OPT_CODE | SB_RX_RTERM_CTRL,
11995b2919b9SWyon Bi FIELD_PREP(SB_RX_RCAL_OPT_CODE, 0x1) |
12005b2919b9SWyon Bi FIELD_PREP(SB_RX_RTERM_CTRL, 0x3));
120119dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0450,
120219dbc2d6SWyon Bi SB_TG_SB_EN_DELAY_TIME | SB_TG_RXTERN_EN_DELAY_TIME,
12035b2919b9SWyon Bi FIELD_PREP(SB_TG_SB_EN_DELAY_TIME, 0x2) |
12045b2919b9SWyon Bi FIELD_PREP(SB_TG_RXTERN_EN_DELAY_TIME, 0x2));
120519dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0454,
120619dbc2d6SWyon Bi SB_READY_DELAY_TIME | SB_TG_OSC_EN_DELAY_TIME,
12075b2919b9SWyon Bi FIELD_PREP(SB_READY_DELAY_TIME, 0x2) |
12085b2919b9SWyon Bi FIELD_PREP(SB_TG_OSC_EN_DELAY_TIME, 0x2));
120919dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0458,
121019dbc2d6SWyon Bi SB_TG_OSC_EN_TO_AFC_RSTN_DELAT_TIME,
12115b2919b9SWyon Bi FIELD_PREP(SB_TG_OSC_EN_TO_AFC_RSTN_DELAT_TIME, 0x2));
121219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x045c,
121319dbc2d6SWyon Bi SB_TG_PLL_CD_VREG_FAST_PULSE_TIME,
12145b2919b9SWyon Bi FIELD_PREP(SB_TG_PLL_CD_VREG_FAST_PULSE_TIME, 0x4));
121519dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0460,
121619dbc2d6SWyon Bi SB_TG_EARC_DMRX_RECVRD_CLK_CNT,
12175b2919b9SWyon Bi FIELD_PREP(SB_TG_EARC_DMRX_RECVRD_CLK_CNT, 0xa));
121819dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0468, SB_TG_CNT_RUN_NO_7_0,
12195b2919b9SWyon Bi FIELD_PREP(SB_TG_CNT_RUN_NO_7_0, 0x3));
122019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x046c,
122119dbc2d6SWyon Bi SB_EARC_SIG_DET_BYPASS | SB_AFC_TOL,
12225b2919b9SWyon Bi FIELD_PREP(SB_EARC_SIG_DET_BYPASS, 0x1) |
12235b2919b9SWyon Bi FIELD_PREP(SB_AFC_TOL, 0x3));
122419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0470, SB_AFC_STB_NUM,
12255b2919b9SWyon Bi FIELD_PREP(SB_AFC_STB_NUM, 0x4));
122619dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0474, SB_TG_OSC_CNT_MIN,
12275b2919b9SWyon Bi FIELD_PREP(SB_TG_OSC_CNT_MIN, 0x67));
122819dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0478, SB_TG_OSC_CNT_MAX,
12295b2919b9SWyon Bi FIELD_PREP(SB_TG_OSC_CNT_MAX, 0x6a));
123019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x047c, SB_PWM_AFC_CTRL,
12315b2919b9SWyon Bi FIELD_PREP(SB_PWM_AFC_CTRL, 0x5));
123219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0434, ANA_SB_DMRX_LPBK_DATA,
12335b2919b9SWyon Bi FIELD_PREP(ANA_SB_DMRX_LPBK_DATA, 0x1));
123419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0440,
123519dbc2d6SWyon Bi ANA_SB_VREG_OUT_SEL | ANA_SB_VREG_REF_SEL,
12365b2919b9SWyon Bi FIELD_PREP(ANA_SB_VREG_OUT_SEL, 0x1) |
12375b2919b9SWyon Bi FIELD_PREP(ANA_SB_VREG_REF_SEL, 0x1));
123819dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x043c, ANA_SB_VREG_GAIN_CTRL,
12395b2919b9SWyon Bi FIELD_PREP(ANA_SB_VREG_GAIN_CTRL, 0x0));
124019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0408, ANA_SB_RXTERM_OFFSP,
12415b2919b9SWyon Bi FIELD_PREP(ANA_SB_RXTERM_OFFSP, 0x3));
124219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x040c, ANA_SB_RXTERM_OFFSN,
12435b2919b9SWyon Bi FIELD_PREP(ANA_SB_RXTERM_OFFSN, 0x3));
124419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x047c, SB_RCAL_RSTN,
12455b2919b9SWyon Bi FIELD_PREP(SB_RCAL_RSTN, 0x1));
124619dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0410, SB_AUX_EN,
12475b2919b9SWyon Bi FIELD_PREP(SB_AUX_EN, 0x1));
124819dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0480, SB_AUX_EN_IN,
12495b2919b9SWyon Bi FIELD_PREP(SB_AUX_EN_IN, 0x1));
125019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x040c, OVRD_SB_RX_RESCAL_DONE,
12515b2919b9SWyon Bi FIELD_PREP(OVRD_SB_RX_RESCAL_DONE, 0x1));
125219dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0410, OVRD_SB_EN,
12535b2919b9SWyon Bi FIELD_PREP(OVRD_SB_EN, 0x1));
125419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0408, OVRD_SB_RXTERM_EN,
12555b2919b9SWyon Bi FIELD_PREP(OVRD_SB_RXTERM_EN, 0x1));
125619dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x043c, OVRD_SB_VREG_EN,
12575b2919b9SWyon Bi FIELD_PREP(OVRD_SB_VREG_EN, 0x1));
125819dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0410, OVRD_SB_AUX_EN,
12595b2919b9SWyon Bi FIELD_PREP(OVRD_SB_AUX_EN, 0x1));
12605b2919b9SWyon Bi
126119dbc2d6SWyon Bi rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BGR_EN,
126219dbc2d6SWyon Bi FIELD_PREP(BGR_EN, 0x1));
126319dbc2d6SWyon Bi rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BIAS_EN,
126419dbc2d6SWyon Bi FIELD_PREP(BIAS_EN, 0x1));
12655b2919b9SWyon Bi udelay(10);
12665b2919b9SWyon Bi reset_deassert(&hdptx->init_reset);
12675b2919b9SWyon Bi udelay(1000);
12685b2919b9SWyon Bi reset_deassert(&hdptx->cmn_reset);
12695b2919b9SWyon Bi udelay(20);
12705b2919b9SWyon Bi
127119dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x040c, SB_RX_RESCAL_DONE,
12725b2919b9SWyon Bi FIELD_PREP(SB_RX_RESCAL_DONE, 0x1));
12735b2919b9SWyon Bi udelay(100);
127419dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0410, SB_EN,
127519dbc2d6SWyon Bi FIELD_PREP(SB_EN, 0x1));
12765b2919b9SWyon Bi udelay(100);
127719dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0408, SB_RXRERM_EN,
12785b2919b9SWyon Bi FIELD_PREP(SB_RXRERM_EN, 0x1));
12795b2919b9SWyon Bi udelay(10);
128019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x043c, SB_VREG_EN,
128119dbc2d6SWyon Bi FIELD_PREP(SB_VREG_EN, 0x1));
12825b2919b9SWyon Bi udelay(10);
128319dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0410, SB_AUX_EN,
128419dbc2d6SWyon Bi FIELD_PREP(SB_AUX_EN, 0x1));
12855b2919b9SWyon Bi udelay(100);
12865b2919b9SWyon Bi
12875b2919b9SWyon Bi ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
12885b2919b9SWyon Bi status, FIELD_GET(SB_RDY, status),
12895b2919b9SWyon Bi 50, 1000);
12905b2919b9SWyon Bi if (ret) {
12915b2919b9SWyon Bi dev_err(hdptx->dev, "timeout waiting for sb_rdy\n");
12925b2919b9SWyon Bi return ret;
12935b2919b9SWyon Bi }
12945b2919b9SWyon Bi
12955b2919b9SWyon Bi return 0;
12965b2919b9SWyon Bi }
12975b2919b9SWyon Bi
rockchip_hdptx_phy_reset(struct rockchip_hdptx_phy * hdptx)12985b2919b9SWyon Bi static void rockchip_hdptx_phy_reset(struct rockchip_hdptx_phy *hdptx)
12995b2919b9SWyon Bi {
13005d7a183bSWyon bi u32 lane;
13015d7a183bSWyon bi
13025b2919b9SWyon Bi reset_assert(&hdptx->lane_reset);
13035b2919b9SWyon Bi reset_assert(&hdptx->cmn_reset);
13045b2919b9SWyon Bi reset_assert(&hdptx->init_reset);
13055b2919b9SWyon Bi
13065d7a183bSWyon bi reset_assert(&hdptx->apb_reset);
13075d7a183bSWyon bi udelay(10);
13085d7a183bSWyon bi reset_deassert(&hdptx->apb_reset);
13095d7a183bSWyon bi
13105d7a183bSWyon bi for (lane = 0; lane < 4; lane++)
131119dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c04),
13125d7a183bSWyon bi OVRD_LN_TX_DRV_EI_EN | LN_TX_DRV_EI_EN,
13135d7a183bSWyon bi FIELD_PREP(OVRD_LN_TX_DRV_EI_EN, 1) |
13145d7a183bSWyon bi FIELD_PREP(LN_TX_DRV_EI_EN, 0));
13155d7a183bSWyon bi
131619dbc2d6SWyon Bi rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, PLL_EN,
131719dbc2d6SWyon Bi FIELD_PREP(PLL_EN, 0));
131819dbc2d6SWyon Bi rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BIAS_EN,
131919dbc2d6SWyon Bi FIELD_PREP(BIAS_EN, 0));
132019dbc2d6SWyon Bi rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0, BGR_EN,
132119dbc2d6SWyon Bi FIELD_PREP(BGR_EN, 0));
13225b2919b9SWyon Bi }
13235b2919b9SWyon Bi
rockchip_hdptx_phy_power_on(struct phy * phy)13245b2919b9SWyon Bi static int rockchip_hdptx_phy_power_on(struct phy *phy)
13255b2919b9SWyon Bi {
13265b2919b9SWyon Bi struct rockchip_hdptx_phy *hdptx = dev_get_priv(phy->dev);
13275b2919b9SWyon Bi enum phy_mode mode = generic_phy_get_mode(phy);
13285b2919b9SWyon Bi u32 lane;
13295b2919b9SWyon Bi
13305b2919b9SWyon Bi rockchip_hdptx_phy_reset(hdptx);
13315b2919b9SWyon Bi
13325b2919b9SWyon Bi for (lane = 0; lane < 4; lane++) {
13335b2919b9SWyon Bi u32 invert = hdptx->lane_polarity_invert[lane];
13345b2919b9SWyon Bi
133519dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, LANE_REG(lane, 0x0c78),
1336411d39e3SGuochun Huang LN_POLARITY_INV | LN_LANE_MODE,
1337411d39e3SGuochun Huang FIELD_PREP(LN_POLARITY_INV, invert) |
1338411d39e3SGuochun Huang FIELD_PREP(LN_LANE_MODE, 1));
13395b2919b9SWyon Bi }
13405b2919b9SWyon Bi
13415b2919b9SWyon Bi if (mode == PHY_MODE_DP) {
134219dbc2d6SWyon Bi rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0,
134319dbc2d6SWyon Bi HDPTX_MODE_SEL,
13445b2919b9SWyon Bi FIELD_PREP(HDPTX_MODE_SEL, 0x1));
13455b2919b9SWyon Bi
134619dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0800, PROTOCOL_SEL,
13475b2919b9SWyon Bi FIELD_PREP(PROTOCOL_SEL, 0x0));
134819dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0818, DATA_BUS_WIDTH,
13495b2919b9SWyon Bi FIELD_PREP(DATA_BUS_WIDTH, 0x1));
135019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0818, BUS_WIDTH_SEL,
13515b2919b9SWyon Bi FIELD_PREP(BUS_WIDTH_SEL, 0x0));
13525b2919b9SWyon Bi
13535b2919b9SWyon Bi rockchip_hdptx_phy_dp_pll_init(hdptx);
13545b2919b9SWyon Bi rockchip_hdptx_phy_dp_aux_init(hdptx);
13555b2919b9SWyon Bi } else {
135619dbc2d6SWyon Bi rockchip_grf_write(hdptx->grf, HDPTXPHY_GRF_CON0,
135719dbc2d6SWyon Bi HDPTX_MODE_SEL,
13585b2919b9SWyon Bi FIELD_PREP(HDPTX_MODE_SEL, 0x0));
13595b2919b9SWyon Bi
136019dbc2d6SWyon Bi regmap_update_bits(hdptx->regmap, 0x0800, PROTOCOL_SEL,
13615b2919b9SWyon Bi FIELD_PREP(PROTOCOL_SEL, 0x1));
13625b2919b9SWyon Bi }
13635b2919b9SWyon Bi
13645b2919b9SWyon Bi return 0;
13655b2919b9SWyon Bi }
13665b2919b9SWyon Bi
rockchip_hdptx_phy_power_off(struct phy * phy)13675b2919b9SWyon Bi static int rockchip_hdptx_phy_power_off(struct phy *phy)
13685b2919b9SWyon Bi {
13695b2919b9SWyon Bi struct rockchip_hdptx_phy *hdptx = dev_get_priv(phy->dev);
13705b2919b9SWyon Bi
13715b2919b9SWyon Bi rockchip_hdptx_phy_reset(hdptx);
13725b2919b9SWyon Bi
13735b2919b9SWyon Bi return 0;
13745b2919b9SWyon Bi }
13755b2919b9SWyon Bi
13765b2919b9SWyon Bi static const struct phy_ops rockchip_hdptx_phy_ops = {
13775b2919b9SWyon Bi .set_mode = rockchip_hdptx_phy_set_mode,
13785b2919b9SWyon Bi .configure = rockchip_hdptx_phy_configure,
13795b2919b9SWyon Bi .power_on = rockchip_hdptx_phy_power_on,
13805b2919b9SWyon Bi .power_off = rockchip_hdptx_phy_power_off,
13815b2919b9SWyon Bi };
13825b2919b9SWyon Bi
rockchip_hdptx_phy_probe(struct udevice * dev)13835b2919b9SWyon Bi static int rockchip_hdptx_phy_probe(struct udevice *dev)
13845b2919b9SWyon Bi {
13855b2919b9SWyon Bi struct rockchip_hdptx_phy *hdptx = dev_get_priv(dev);
13865b2919b9SWyon Bi struct udevice *syscon;
1387da258a0dSWyon Bi u32 prop[4];
13885b2919b9SWyon Bi int ret;
13895b2919b9SWyon Bi
139019dbc2d6SWyon Bi ret = regmap_init_mem(dev, &hdptx->regmap);
139119dbc2d6SWyon Bi if (ret)
139219dbc2d6SWyon Bi return ret;
13935b2919b9SWyon Bi
13945b2919b9SWyon Bi ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
13955b2919b9SWyon Bi &syscon);
13965b2919b9SWyon Bi if (ret)
13975b2919b9SWyon Bi return ret;
13985b2919b9SWyon Bi
13995b2919b9SWyon Bi hdptx->grf = syscon_get_regmap(syscon);
14005b2919b9SWyon Bi if (IS_ERR(hdptx->grf)) {
14015b2919b9SWyon Bi ret = PTR_ERR(hdptx->grf);
14025b2919b9SWyon Bi dev_err(dev, "unable to find regmap: %d\n", ret);
14035b2919b9SWyon Bi return ret;
14045b2919b9SWyon Bi }
14055b2919b9SWyon Bi
14065b2919b9SWyon Bi hdptx->dev = dev;
14075b2919b9SWyon Bi
14085b2919b9SWyon Bi ret = reset_get_by_name(dev, "apb", &hdptx->apb_reset);
14095b2919b9SWyon Bi if (ret < 0) {
14105b2919b9SWyon Bi dev_err(dev, "failed to get apb reset: %d\n", ret);
14115b2919b9SWyon Bi return ret;
14125b2919b9SWyon Bi }
14135b2919b9SWyon Bi
14145b2919b9SWyon Bi ret = reset_get_by_name(dev, "init", &hdptx->init_reset);
14155b2919b9SWyon Bi if (ret < 0) {
14165b2919b9SWyon Bi dev_err(dev, "failed to get init reset: %d\n", ret);
14175b2919b9SWyon Bi return ret;
14185b2919b9SWyon Bi }
14195b2919b9SWyon Bi
14205b2919b9SWyon Bi ret = reset_get_by_name(dev, "cmn", &hdptx->cmn_reset);
14215b2919b9SWyon Bi if (ret < 0) {
14225b2919b9SWyon Bi dev_err(dev, "failed to get cmn reset: %d\n", ret);
14235b2919b9SWyon Bi return ret;
14245b2919b9SWyon Bi }
14255b2919b9SWyon Bi
14265b2919b9SWyon Bi ret = reset_get_by_name(dev, "lane", &hdptx->lane_reset);
14275b2919b9SWyon Bi if (ret < 0) {
14285b2919b9SWyon Bi dev_err(dev, "failed to get lane reset: %d\n", ret);
14295b2919b9SWyon Bi return ret;
14305b2919b9SWyon Bi }
14315b2919b9SWyon Bi
1432cbe88c75SWyon Bi ret = rockchip_hdptx_phy_parse_training_table(dev);
1433cbe88c75SWyon Bi if (ret) {
1434cbe88c75SWyon Bi dev_err(dev, "failed to parse training table: %d\n", ret);
1435cbe88c75SWyon Bi return ret;
1436cbe88c75SWyon Bi }
1437cbe88c75SWyon Bi
1438da258a0dSWyon Bi if (!dev_read_u32_array(dev, "lane-polarity-invert", prop, ARRAY_SIZE(prop))) {
1439da258a0dSWyon Bi hdptx->lane_polarity_invert[0] = prop[0];
1440da258a0dSWyon Bi hdptx->lane_polarity_invert[1] = prop[1];
1441da258a0dSWyon Bi hdptx->lane_polarity_invert[2] = prop[2];
1442da258a0dSWyon Bi hdptx->lane_polarity_invert[3] = prop[3];
1443da258a0dSWyon Bi }
14445b2919b9SWyon Bi
14455b2919b9SWyon Bi return 0;
14465b2919b9SWyon Bi }
14475b2919b9SWyon Bi
14485b2919b9SWyon Bi static const struct udevice_id rockchip_hdptx_phy_ids[] = {
14495b2919b9SWyon Bi { .compatible = "rockchip,rk3588-hdptx-phy", },
14505b2919b9SWyon Bi {}
14515b2919b9SWyon Bi };
14525b2919b9SWyon Bi
14535b2919b9SWyon Bi U_BOOT_DRIVER(rockchip_hdptx_phy) = {
14545b2919b9SWyon Bi .name = "rockchip_hdptx_phy",
14555b2919b9SWyon Bi .id = UCLASS_PHY,
14565b2919b9SWyon Bi .ops = &rockchip_hdptx_phy_ops,
14575b2919b9SWyon Bi .of_match = rockchip_hdptx_phy_ids,
14585b2919b9SWyon Bi .probe = rockchip_hdptx_phy_probe,
14595b2919b9SWyon Bi .priv_auto_alloc_size = sizeof(struct rockchip_hdptx_phy),
14605b2919b9SWyon Bi };
1461