xref: /rk3399_rockchip-uboot/drivers/phy/phy-rockchip-samsung-hdptx.c (revision d4eed522216edf86425a32589d52d5155566a6ac)
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