xref: /rk3399_rockchip-uboot/drivers/phy/phy-rockchip-samsung-hdptx.c (revision cbe88c75594486e65142c8d2cbda3bbba53edbdf)
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)
3215b2919b9SWyon Bi 
3225b2919b9SWyon Bi #define LANE_REG(lane, offset)			(0x400 * (lane) + (offset))
3235b2919b9SWyon Bi 
3245b2919b9SWyon Bi struct rockchip_hdptx_phy {
3255b2919b9SWyon Bi 	struct udevice *dev;
3265b2919b9SWyon Bi 	void __iomem *base;
3275b2919b9SWyon Bi 	struct regmap *grf;
3285b2919b9SWyon Bi 
3295b2919b9SWyon Bi 	struct reset_ctl apb_reset;
3305b2919b9SWyon Bi 	struct reset_ctl cmn_reset;
3315b2919b9SWyon Bi 	struct reset_ctl init_reset;
3325b2919b9SWyon Bi 	struct reset_ctl lane_reset;
3335b2919b9SWyon Bi 	u32 lane_polarity_invert[4];
3345b2919b9SWyon Bi };
3355b2919b9SWyon Bi 
3365b2919b9SWyon Bi enum {
3375b2919b9SWyon Bi 	DP_BW_RBR,
3385b2919b9SWyon Bi 	DP_BW_HBR,
3395b2919b9SWyon Bi 	DP_BW_HBR2,
3405b2919b9SWyon Bi 	DP_BW_HBR3,
3415b2919b9SWyon Bi };
3425b2919b9SWyon Bi 
3435d7a183bSWyon bi struct tx_drv_ctrl {
3445d7a183bSWyon bi 	u8 tx_drv_lvl_ctrl;
3455d7a183bSWyon bi 	u8 tx_drv_post_lvl_ctrl;
3465d7a183bSWyon bi 	u8 ana_tx_drv_idrv_idn_ctrl;
3475d7a183bSWyon bi 	u8 ana_tx_drv_idrv_iup_ctrl;
3485d7a183bSWyon bi 	u8 ana_tx_drv_accdrv_en;
3495d7a183bSWyon bi 	u8 ana_tx_drv_accdrv_ctrl;
350*cbe88c75SWyon Bi } __packed;
3515d7a183bSWyon bi 
352*cbe88c75SWyon Bi static struct tx_drv_ctrl tx_drv_ctrl_rbr[4][4] = {
3535b2919b9SWyon Bi 	/* voltage swing 0, pre-emphasis 0->3 */
3545b2919b9SWyon Bi 	{
3555d7a183bSWyon bi 		{ 0x1, 0x0, 0x4, 0x6, 0x0, 0x4 },
3565d7a183bSWyon bi 		{ 0x4, 0x3, 0x4, 0x6, 0x0, 0x4 },
3575d7a183bSWyon bi 		{ 0x7, 0x6, 0x4, 0x6, 0x0, 0x4 },
3585d7a183bSWyon bi 		{ 0xd, 0xb, 0x7, 0x7, 0x1, 0x7 },
3595b2919b9SWyon Bi 	},
3605b2919b9SWyon Bi 
3615b2919b9SWyon Bi 	/* voltage swing 1, pre-emphasis 0->2 */
3625b2919b9SWyon Bi 	{
3635d7a183bSWyon bi 		{ 0x4, 0x0, 0x4, 0x6, 0x0, 0x4 },
3645d7a183bSWyon bi 		{ 0xa, 0x5, 0x4, 0x6, 0x0, 0x4 },
3655d7a183bSWyon bi 		{ 0xd, 0x8, 0x7, 0x7, 0x1, 0x7 },
3665b2919b9SWyon Bi 	},
3675b2919b9SWyon Bi 
3685b2919b9SWyon Bi 	/* voltage swing 2, pre-emphasis 0->1 */
3695b2919b9SWyon Bi 	{
3705d7a183bSWyon bi 		{ 0x8, 0x0, 0x4, 0x6, 0x0, 0x4 },
3715d7a183bSWyon bi 		{ 0xd, 0x5, 0x7, 0x7, 0x1, 0x7 },
3725b2919b9SWyon Bi 	},
3735b2919b9SWyon Bi 
3745b2919b9SWyon Bi 	/* voltage swing 3, pre-emphasis 0 */
3755b2919b9SWyon Bi 	{
3765d7a183bSWyon bi 		{ 0xd, 0x0, 0x7, 0x7, 0x1, 0x4 },
3775d7a183bSWyon bi 	}
3785d7a183bSWyon bi };
3795d7a183bSWyon bi 
380*cbe88c75SWyon Bi static struct tx_drv_ctrl tx_drv_ctrl_hbr[4][4] = {
3815d7a183bSWyon bi 	/* voltage swing 0, pre-emphasis 0->3 */
3825d7a183bSWyon bi 	{
3835d7a183bSWyon bi 		{ 0x2, 0x1, 0x4, 0x6, 0x0, 0x4 },
3845d7a183bSWyon bi 		{ 0x5, 0x4, 0x4, 0x6, 0x0, 0x4 },
3855d7a183bSWyon bi 		{ 0x9, 0x8, 0x4, 0x6, 0x0, 0x4 },
3865d7a183bSWyon bi 		{ 0xd, 0xb, 0x7, 0x7, 0x1, 0x7 },
3875d7a183bSWyon bi 	},
3885d7a183bSWyon bi 
3895d7a183bSWyon bi 	/* voltage swing 1, pre-emphasis 0->2 */
3905d7a183bSWyon bi 	{
3915d7a183bSWyon bi 		{ 0x6, 0x1, 0x4, 0x6, 0x0, 0x4 },
3925d7a183bSWyon bi 		{ 0xb, 0x6, 0x4, 0x6, 0x0, 0x4 },
3935d7a183bSWyon bi 		{ 0xd, 0x8, 0x7, 0x7, 0x1, 0x7 },
3945d7a183bSWyon bi 	},
3955d7a183bSWyon bi 
3965d7a183bSWyon bi 	/* voltage swing 2, pre-emphasis 0->1 */
3975d7a183bSWyon bi 	{
3985d7a183bSWyon bi 		{ 0x9, 0x1, 0x4, 0x6, 0x0, 0x4 },
3995d7a183bSWyon bi 		{ 0xd, 0x6, 0x7, 0x7, 0x1, 0x7 },
4005d7a183bSWyon bi 	},
4015d7a183bSWyon bi 
4025d7a183bSWyon bi 	/* voltage swing 3, pre-emphasis 0 */
4035d7a183bSWyon bi 	{
4045d7a183bSWyon bi 		{ 0xd, 0x1, 0x7, 0x7, 0x1, 0x4 },
4055d7a183bSWyon bi 	}
4065d7a183bSWyon bi };
4075d7a183bSWyon bi 
408*cbe88c75SWyon Bi static struct tx_drv_ctrl tx_drv_ctrl_hbr2[4][4] = {
4095d7a183bSWyon bi 	/* voltage swing 0, pre-emphasis 0->3 */
4105d7a183bSWyon bi 	{
4115d7a183bSWyon bi 		{ 0x2, 0x1, 0x4, 0x6, 0x0, 0x4 },
4125d7a183bSWyon bi 		{ 0x5, 0x4, 0x4, 0x6, 0x0, 0x4 },
4135d7a183bSWyon bi 		{ 0x9, 0x8, 0x4, 0x6, 0x1, 0x4 },
4145d7a183bSWyon bi 		{ 0xd, 0xb, 0x7, 0x7, 0x1, 0x7 },
4155d7a183bSWyon bi 	},
4165d7a183bSWyon bi 
4175d7a183bSWyon bi 	/* voltage swing 1, pre-emphasis 0->2 */
4185d7a183bSWyon bi 	{
4195d7a183bSWyon bi 		{ 0x6, 0x1, 0x4, 0x6, 0x0, 0x4 },
4205d7a183bSWyon bi 		{ 0xc, 0x7, 0x4, 0x6, 0x0, 0x4 },
4215d7a183bSWyon bi 		{ 0xd, 0x8, 0x7, 0x7, 0x1, 0x7 },
4225d7a183bSWyon bi 	},
4235d7a183bSWyon bi 
4245d7a183bSWyon bi 	/* voltage swing 2, pre-emphasis 0->1 */
4255d7a183bSWyon bi 	{
4265d7a183bSWyon bi 		{ 0x9, 0x1, 0x4, 0x6, 0x0, 0x4 },
4275d7a183bSWyon bi 		{ 0xd, 0x6, 0x7, 0x7, 0x1, 0x7 },
4285d7a183bSWyon bi 	},
4295d7a183bSWyon bi 
4305d7a183bSWyon bi 	/* voltage swing 3, pre-emphasis 0 */
4315d7a183bSWyon bi 	{
4325d7a183bSWyon bi 		{ 0xd, 0x0, 0x7, 0x7, 0x1, 0x4 },
4335b2919b9SWyon Bi 	}
4345b2919b9SWyon Bi };
4355b2919b9SWyon Bi 
436*cbe88c75SWyon Bi static int rockchip_hdptx_phy_parse_training_table(struct udevice *dev)
437*cbe88c75SWyon Bi {
438*cbe88c75SWyon Bi 	int size = sizeof(struct tx_drv_ctrl) * 10;
439*cbe88c75SWyon Bi 	const uint8_t *prop;
440*cbe88c75SWyon Bi 	u8 *buf, *training_table;
441*cbe88c75SWyon Bi 	int i, j;
442*cbe88c75SWyon Bi 
443*cbe88c75SWyon Bi 	prop = dev_read_u8_array_ptr(dev, "training-table", size);
444*cbe88c75SWyon Bi 	if (!prop)
445*cbe88c75SWyon Bi 		return 0;
446*cbe88c75SWyon Bi 
447*cbe88c75SWyon Bi 	buf = kzalloc(size, GFP_KERNEL);
448*cbe88c75SWyon Bi 	if (!buf)
449*cbe88c75SWyon Bi 		return -ENOMEM;
450*cbe88c75SWyon Bi 
451*cbe88c75SWyon Bi 	memcpy(buf, prop, size);
452*cbe88c75SWyon Bi 
453*cbe88c75SWyon Bi 	training_table = buf;
454*cbe88c75SWyon Bi 
455*cbe88c75SWyon Bi 	for (i = 0; i < 4; i++) {
456*cbe88c75SWyon Bi 		for (j = 0; j < 4; j++) {
457*cbe88c75SWyon Bi 			struct tx_drv_ctrl *ctrl;
458*cbe88c75SWyon Bi 
459*cbe88c75SWyon Bi 			if (i + j > 3)
460*cbe88c75SWyon Bi 				continue;
461*cbe88c75SWyon Bi 
462*cbe88c75SWyon Bi 			ctrl = (struct tx_drv_ctrl *)training_table;
463*cbe88c75SWyon Bi 			tx_drv_ctrl_rbr[i][j] = *ctrl;
464*cbe88c75SWyon Bi 			tx_drv_ctrl_hbr[i][j] = *ctrl;
465*cbe88c75SWyon Bi 			tx_drv_ctrl_hbr2[i][j] = *ctrl;
466*cbe88c75SWyon Bi 			training_table += sizeof(*ctrl);
467*cbe88c75SWyon Bi 		}
468*cbe88c75SWyon Bi 	}
469*cbe88c75SWyon Bi 
470*cbe88c75SWyon Bi 	kfree(buf);
471*cbe88c75SWyon Bi 
472*cbe88c75SWyon Bi 	return 0;
473*cbe88c75SWyon Bi }
474*cbe88c75SWyon Bi 
4755b2919b9SWyon Bi static inline void phy_write(struct rockchip_hdptx_phy *hdptx, uint reg,
4765b2919b9SWyon Bi 			     uint val)
4775b2919b9SWyon Bi {
4785b2919b9SWyon Bi 	writel(val, hdptx->base + reg);
4795b2919b9SWyon Bi }
4805b2919b9SWyon Bi 
4815b2919b9SWyon Bi static inline uint phy_read(struct rockchip_hdptx_phy *hdptx, uint reg)
4825b2919b9SWyon Bi {
4835b2919b9SWyon Bi 	return readl(hdptx->base + reg);
4845b2919b9SWyon Bi }
4855b2919b9SWyon Bi 
4865b2919b9SWyon Bi static void phy_update_bits(struct rockchip_hdptx_phy *hdptx, uint reg,
4875b2919b9SWyon Bi 			    uint mask, uint val)
4885b2919b9SWyon Bi {
4895b2919b9SWyon Bi 	uint orig, tmp;
4905b2919b9SWyon Bi 
4915b2919b9SWyon Bi 	orig = phy_read(hdptx, reg);
4925b2919b9SWyon Bi 	tmp = orig & ~mask;
4935b2919b9SWyon Bi 	tmp |= val & mask;
4945b2919b9SWyon Bi 	phy_write(hdptx, reg, tmp);
4955b2919b9SWyon Bi }
4965b2919b9SWyon Bi 
4975b2919b9SWyon Bi static void grf_write(struct rockchip_hdptx_phy *hdptx, uint reg,
4985b2919b9SWyon Bi 		      uint mask, uint val)
4995b2919b9SWyon Bi {
5005b2919b9SWyon Bi 	regmap_write(hdptx->grf, reg, (mask << 16) | (val & mask));
5015b2919b9SWyon Bi }
5025b2919b9SWyon Bi 
5035b2919b9SWyon Bi static int rockchip_hdptx_phy_set_mode(struct phy *phy, enum phy_mode mode,
5045b2919b9SWyon Bi 				       int submode)
5055b2919b9SWyon Bi {
5065b2919b9SWyon Bi 	return 0;
5075b2919b9SWyon Bi }
5085b2919b9SWyon Bi 
5095b2919b9SWyon Bi static int rockchip_hdptx_phy_verify_config(struct rockchip_hdptx_phy *hdptx,
5105b2919b9SWyon Bi 					    struct phy_configure_opts_dp *dp)
5115b2919b9SWyon Bi {
5125b2919b9SWyon Bi 	int i;
5135b2919b9SWyon Bi 
5145b2919b9SWyon Bi 	if (dp->set_rate) {
5155b2919b9SWyon Bi 		switch (dp->link_rate) {
5165b2919b9SWyon Bi 		case 1620:
5175b2919b9SWyon Bi 		case 2700:
5185b2919b9SWyon Bi 		case 5400:
5195b2919b9SWyon Bi 			break;
5205b2919b9SWyon Bi 		default:
5215b2919b9SWyon Bi 			return -EINVAL;
5225b2919b9SWyon Bi 		}
5235b2919b9SWyon Bi 	}
5245b2919b9SWyon Bi 
5255b2919b9SWyon Bi 	switch (dp->lanes) {
5265b2919b9SWyon Bi 	case 1:
5275b2919b9SWyon Bi 	case 2:
5285b2919b9SWyon Bi 	case 4:
5295b2919b9SWyon Bi 		break;
5305b2919b9SWyon Bi 	default:
5315b2919b9SWyon Bi 		return -EINVAL;
5325b2919b9SWyon Bi 	}
5335b2919b9SWyon Bi 
5345b2919b9SWyon Bi 	if (dp->set_voltages) {
5355b2919b9SWyon Bi 		for (i = 0; i < dp->lanes; i++) {
5365b2919b9SWyon Bi 			if (dp->voltage[i] > 3 || dp->pre[i] > 3)
5375b2919b9SWyon Bi 				return -EINVAL;
5385b2919b9SWyon Bi 
5395b2919b9SWyon Bi 			if (dp->voltage[i] + dp->pre[i] > 3)
5405b2919b9SWyon Bi 				return -EINVAL;
5415b2919b9SWyon Bi 		}
5425b2919b9SWyon Bi 	}
5435b2919b9SWyon Bi 
5445b2919b9SWyon Bi 	return 0;
5455b2919b9SWyon Bi }
5465b2919b9SWyon Bi 
5475b2919b9SWyon Bi static void rockchip_hdptx_phy_set_voltage(struct rockchip_hdptx_phy *hdptx,
5485b2919b9SWyon Bi 					   struct phy_configure_opts_dp *dp,
5495b2919b9SWyon Bi 					   u8 lane)
5505b2919b9SWyon Bi {
5515d7a183bSWyon bi 	const struct tx_drv_ctrl *ctrl;
5525b2919b9SWyon Bi 
5535b2919b9SWyon Bi 	switch (dp->link_rate) {
5545b2919b9SWyon Bi 	case 1620:
5555d7a183bSWyon bi 		ctrl = &tx_drv_ctrl_rbr[dp->voltage[lane]][dp->pre[lane]];
5565b2919b9SWyon Bi 		phy_update_bits(hdptx, LANE_REG(lane, 0x0c44),
5575b2919b9SWyon Bi 				LN_TX_SER_40BIT_EN_RBR,
5585b2919b9SWyon Bi 				FIELD_PREP(LN_TX_SER_40BIT_EN_RBR, 0x1));
5595b2919b9SWyon Bi 		break;
5605b2919b9SWyon Bi 	case 2700:
5615d7a183bSWyon bi 		ctrl = &tx_drv_ctrl_hbr[dp->voltage[lane]][dp->pre[lane]];
5625b2919b9SWyon Bi 		phy_update_bits(hdptx, LANE_REG(lane, 0x0c44),
5635b2919b9SWyon Bi 				LN_TX_SER_40BIT_EN_HBR,
5645b2919b9SWyon Bi 				FIELD_PREP(LN_TX_SER_40BIT_EN_HBR, 0x1));
5655b2919b9SWyon Bi 		break;
5665b2919b9SWyon Bi 	case 5400:
5675d7a183bSWyon bi 	default:
5685d7a183bSWyon bi 		ctrl = &tx_drv_ctrl_hbr2[dp->voltage[lane]][dp->pre[lane]];
5695b2919b9SWyon Bi 		phy_update_bits(hdptx, LANE_REG(lane, 0x0c44),
5705b2919b9SWyon Bi 				LN_TX_SER_40BIT_EN_HBR2,
5715b2919b9SWyon Bi 				FIELD_PREP(LN_TX_SER_40BIT_EN_HBR2, 0x1));
5725b2919b9SWyon Bi 		break;
5735b2919b9SWyon Bi 	}
5745b2919b9SWyon Bi 
5755b2919b9SWyon Bi 	phy_update_bits(hdptx, LANE_REG(lane, 0x0c0c),
5765b2919b9SWyon Bi 			OVRD_LN_TX_DRV_LVL_CTRL | LN_TX_DRV_LVL_CTRL,
5775b2919b9SWyon Bi 			FIELD_PREP(OVRD_LN_TX_DRV_LVL_CTRL, 0x1) |
5785d7a183bSWyon bi 			FIELD_PREP(LN_TX_DRV_LVL_CTRL, ctrl->tx_drv_lvl_ctrl));
5795b2919b9SWyon Bi 
5805b2919b9SWyon Bi 	phy_update_bits(hdptx, LANE_REG(lane, 0x0c10),
5815b2919b9SWyon Bi 			OVRD_LN_TX_DRV_POST_LVL_CTRL | LN_TX_DRV_POST_LVL_CTRL,
5825b2919b9SWyon Bi 			FIELD_PREP(OVRD_LN_TX_DRV_POST_LVL_CTRL, 0x1) |
5835d7a183bSWyon bi 			FIELD_PREP(LN_TX_DRV_POST_LVL_CTRL,
5845d7a183bSWyon bi 				   ctrl->tx_drv_post_lvl_ctrl));
5855b2919b9SWyon Bi 
5865d7a183bSWyon bi 	phy_update_bits(hdptx, LANE_REG(lane, 0x0c18),
5875d7a183bSWyon bi 			LN_ANA_TX_DRV_IDRV_IDN_CTRL |
5885d7a183bSWyon bi 			LN_ANA_TX_DRV_IDRV_IUP_CTRL | LN_ANA_TX_DRV_ACCDRV_EN,
5895d7a183bSWyon bi 			FIELD_PREP(LN_ANA_TX_DRV_IDRV_IDN_CTRL,
5905d7a183bSWyon bi 				   ctrl->ana_tx_drv_idrv_idn_ctrl) |
5915d7a183bSWyon bi 			FIELD_PREP(LN_ANA_TX_DRV_IDRV_IUP_CTRL,
5925d7a183bSWyon bi 				   ctrl->ana_tx_drv_idrv_iup_ctrl) |
5935d7a183bSWyon bi 			FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_EN,
5945d7a183bSWyon bi 				   ctrl->ana_tx_drv_accdrv_en));
5955b2919b9SWyon Bi 
5965b2919b9SWyon Bi 	phy_update_bits(hdptx, LANE_REG(lane, 0x0c1c),
5975b2919b9SWyon Bi 			LN_ANA_TX_DRV_ACCDRV_POL_SEL | LN_ANA_TX_DRV_ACCDRV_CTRL,
5985b2919b9SWyon Bi 			FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_POL_SEL, 0x1) |
5995d7a183bSWyon bi 			FIELD_PREP(LN_ANA_TX_DRV_ACCDRV_CTRL,
6005d7a183bSWyon bi 				   ctrl->ana_tx_drv_accdrv_ctrl));
6015b2919b9SWyon Bi 	phy_update_bits(hdptx, LANE_REG(lane, 0x0c6c), LN_ANA_TX_RESERVED,
6025b2919b9SWyon Bi 			FIELD_PREP(LN_ANA_TX_RESERVED, 0x1));
6035b2919b9SWyon Bi 	phy_update_bits(hdptx, LANE_REG(lane, 0x0c58),
6045b2919b9SWyon Bi 			LN_ANA_TX_SER_VREG_GAIN_CTRL,
6055b2919b9SWyon Bi 			FIELD_PREP(LN_ANA_TX_SER_VREG_GAIN_CTRL, 0x2));
6065b2919b9SWyon Bi 	phy_update_bits(hdptx, LANE_REG(lane, 0x0c40),
6075b2919b9SWyon Bi 			LN_ANA_TX_SYNC_LOSS_DET_MODE,
6085b2919b9SWyon Bi 			FIELD_PREP(LN_ANA_TX_SYNC_LOSS_DET_MODE, 0x3));
6095b2919b9SWyon Bi }
6105b2919b9SWyon Bi 
6115b2919b9SWyon Bi static int rockchip_hdptx_phy_set_voltages(struct rockchip_hdptx_phy *hdptx,
6125b2919b9SWyon Bi 					   struct phy_configure_opts_dp *dp)
6135b2919b9SWyon Bi {
6145b2919b9SWyon Bi 	u8 lane;
6155b2919b9SWyon Bi 
6165b2919b9SWyon Bi 	for (lane = 0; lane < dp->lanes; lane++)
6175b2919b9SWyon Bi 		rockchip_hdptx_phy_set_voltage(hdptx, dp, lane);
6185b2919b9SWyon Bi 
6195b2919b9SWyon Bi 	return 0;
6205b2919b9SWyon Bi }
6215b2919b9SWyon Bi 
6225b2919b9SWyon Bi static int rockchip_hdptx_phy_set_rate(struct rockchip_hdptx_phy *hdptx,
6235b2919b9SWyon Bi 				       struct phy_configure_opts_dp *dp)
6245b2919b9SWyon Bi {
6255b2919b9SWyon Bi 	u32 bw, status;
6265b2919b9SWyon Bi 	int ret;
6275b2919b9SWyon Bi 
6285b2919b9SWyon Bi 	reset_assert(&hdptx->lane_reset);
6295b2919b9SWyon Bi 	udelay(10);
6305b2919b9SWyon Bi 	reset_assert(&hdptx->cmn_reset);
6315b2919b9SWyon Bi 	udelay(10);
6325b2919b9SWyon Bi 	grf_write(hdptx, HDPTXPHY_GRF_CON0, PLL_EN, FIELD_PREP(PLL_EN, 0x0));
6335b2919b9SWyon Bi 	udelay(10);
6345b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x081c, LANE_EN, FIELD_PREP(LANE_EN, 0x0));
6355b2919b9SWyon Bi 
6365b2919b9SWyon Bi 	switch (dp->link_rate) {
6375b2919b9SWyon Bi 	case 1620:
6385b2919b9SWyon Bi 		bw = DP_BW_RBR;
6395b2919b9SWyon Bi 		break;
6405b2919b9SWyon Bi 	case 2700:
6415b2919b9SWyon Bi 		bw = DP_BW_HBR;
6425b2919b9SWyon Bi 		break;
6435b2919b9SWyon Bi 	case 5400:
6445b2919b9SWyon Bi 		bw = DP_BW_HBR2;
6455b2919b9SWyon Bi 		break;
6465b2919b9SWyon Bi 	default:
6475b2919b9SWyon Bi 		return -EINVAL;
6485b2919b9SWyon Bi 	}
6495b2919b9SWyon Bi 
6505b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0254, DP_TX_LINK_BW,
6515b2919b9SWyon Bi 			FIELD_PREP(DP_TX_LINK_BW, bw));
6525b2919b9SWyon Bi 
6535b2919b9SWyon Bi 	if (dp->ssc) {
6545b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x01d0, OVRD_ROPLL_SSC_EN | ROPLL_SSC_EN,
6555b2919b9SWyon Bi 				FIELD_PREP(OVRD_ROPLL_SSC_EN, 0x1) |
6565b2919b9SWyon Bi 				FIELD_PREP(ROPLL_SSC_EN, 0x1));
6575b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x01d4, ANA_ROPLL_SSC_FM_DEVIATION,
6585d7a183bSWyon bi 				FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION, 0xc));
6595b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x01d8, ANA_ROPLL_SSC_FM_FREQ,
6605d7a183bSWyon bi 				FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ, 0x1f));
6615b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x0264, SSC_EN, FIELD_PREP(SSC_EN, 0x2));
6625b2919b9SWyon Bi 	} else {
6635b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x01d0, OVRD_ROPLL_SSC_EN | ROPLL_SSC_EN,
6645b2919b9SWyon Bi 				FIELD_PREP(OVRD_ROPLL_SSC_EN, 0x1) |
6655b2919b9SWyon Bi 				FIELD_PREP(ROPLL_SSC_EN, 0x0));
6665b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x01d4, ANA_ROPLL_SSC_FM_DEVIATION,
6675b2919b9SWyon Bi 				FIELD_PREP(ANA_ROPLL_SSC_FM_DEVIATION, 0x20));
6685b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x01d8, ANA_ROPLL_SSC_FM_FREQ,
6695b2919b9SWyon Bi 				FIELD_PREP(ANA_ROPLL_SSC_FM_FREQ, 0xc));
6705b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x0264, SSC_EN, FIELD_PREP(SSC_EN, 0x0));
6715b2919b9SWyon Bi 	}
6725b2919b9SWyon Bi 
6735b2919b9SWyon Bi 	grf_write(hdptx, HDPTXPHY_GRF_CON0, PLL_EN, FIELD_PREP(PLL_EN, 0x1));
6745b2919b9SWyon Bi 	udelay(10);
6755b2919b9SWyon Bi 	reset_deassert(&hdptx->cmn_reset);
6765b2919b9SWyon Bi 	udelay(10);
6775b2919b9SWyon Bi 
6785b2919b9SWyon Bi 	ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
6795b2919b9SWyon Bi 				       status, FIELD_GET(PLL_LOCK_DONE, status),
6805b2919b9SWyon Bi 				       50, 1000);
6815b2919b9SWyon Bi 	if (ret) {
6825b2919b9SWyon Bi 		dev_err(hdptx->dev, "timeout waiting for pll_lock_done\n");
6835b2919b9SWyon Bi 		return ret;
6845b2919b9SWyon Bi 	}
6855b2919b9SWyon Bi 
6865b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x081c, LANE_EN,
6875b2919b9SWyon Bi 			FIELD_PREP(LANE_EN, GENMASK(dp->lanes - 1, 0)));
6885b2919b9SWyon Bi 
6895b2919b9SWyon Bi 	reset_deassert(&hdptx->lane_reset);
6905b2919b9SWyon Bi 	udelay(10);
6915b2919b9SWyon Bi 
6925b2919b9SWyon Bi 	ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
6935b2919b9SWyon Bi 				       status, FIELD_GET(PHY_RDY, status),
6945b2919b9SWyon Bi 				       50, 1000);
6955b2919b9SWyon Bi 	if (ret) {
6965b2919b9SWyon Bi 		dev_err(hdptx->dev, "timeout waiting for phy_rdy\n");
6975b2919b9SWyon Bi 		return ret;
6985b2919b9SWyon Bi 	}
6995b2919b9SWyon Bi 
7005b2919b9SWyon Bi 	return 0;
7015b2919b9SWyon Bi }
7025b2919b9SWyon Bi 
7035b2919b9SWyon Bi static int rockchip_hdptx_phy_configure(struct phy *phy,
7045b2919b9SWyon Bi 					union phy_configure_opts *opts)
7055b2919b9SWyon Bi {
7065b2919b9SWyon Bi 	struct rockchip_hdptx_phy *hdptx = dev_get_priv(phy->dev);
7075b2919b9SWyon Bi 	enum phy_mode mode = generic_phy_get_mode(phy);
7085b2919b9SWyon Bi 	int ret;
7095b2919b9SWyon Bi 
7105b2919b9SWyon Bi 	if (mode != PHY_MODE_DP)
7115b2919b9SWyon Bi 		return -EINVAL;
7125b2919b9SWyon Bi 
7135b2919b9SWyon Bi 	ret = rockchip_hdptx_phy_verify_config(hdptx, &opts->dp);
7145b2919b9SWyon Bi 	if (ret) {
7155b2919b9SWyon Bi 		dev_err(hdptx->dev, "invalid params for phy configure\n");
7165b2919b9SWyon Bi 		return ret;
7175b2919b9SWyon Bi 	}
7185b2919b9SWyon Bi 
7195b2919b9SWyon Bi 	if (opts->dp.set_rate) {
7205b2919b9SWyon Bi 		ret = rockchip_hdptx_phy_set_rate(hdptx, &opts->dp);
7215b2919b9SWyon Bi 		if (ret) {
7225b2919b9SWyon Bi 			dev_err(hdptx->dev, "failed to set rate: %d\n", ret);
7235b2919b9SWyon Bi 			return ret;
7245b2919b9SWyon Bi 		}
7255b2919b9SWyon Bi 	}
7265b2919b9SWyon Bi 
7275b2919b9SWyon Bi 	if (opts->dp.set_voltages) {
7285b2919b9SWyon Bi 		ret = rockchip_hdptx_phy_set_voltages(hdptx, &opts->dp);
7295b2919b9SWyon Bi 		if (ret) {
7305b2919b9SWyon Bi 			dev_err(hdptx->dev, "failed to set voltages: %d\n",
7315b2919b9SWyon Bi 				ret);
7325b2919b9SWyon Bi 			return ret;
7335b2919b9SWyon Bi 		}
7345b2919b9SWyon Bi 	}
7355b2919b9SWyon Bi 
7365b2919b9SWyon Bi 	return 0;
7375b2919b9SWyon Bi }
7385b2919b9SWyon Bi 
7395b2919b9SWyon Bi static void rockchip_hdptx_phy_dp_pll_init(struct rockchip_hdptx_phy *hdptx)
7405b2919b9SWyon Bi {
7415b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0020, OVRD_LCPLL_EN | LCPLL_EN,
7425b2919b9SWyon Bi 			FIELD_PREP(OVRD_LCPLL_EN, 0x1) |
7435b2919b9SWyon Bi 			FIELD_PREP(LCPLL_EN, 0x0));
7445b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x00f4, OVRD_ROPLL_EN | ROPLL_EN,
7455b2919b9SWyon Bi 			FIELD_PREP(OVRD_ROPLL_EN, 0x1) |
7465b2919b9SWyon Bi 			FIELD_PREP(ROPLL_EN, 0x1));
7475b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0138, ANA_ROPLL_PI_EN,
7485b2919b9SWyon Bi 			FIELD_PREP(ANA_ROPLL_PI_EN, 0x1));
7495b2919b9SWyon Bi 
7505b2919b9SWyon Bi 	phy_write(hdptx, 0x0144, FIELD_PREP(ROPLL_PMS_MDIV, 0x87));
7515b2919b9SWyon Bi 	phy_write(hdptx, 0x0148, FIELD_PREP(ROPLL_PMS_MDIV, 0x71));
7525b2919b9SWyon Bi 	phy_write(hdptx, 0x014c, FIELD_PREP(ROPLL_PMS_MDIV, 0x71));
7535b2919b9SWyon Bi 
7545b2919b9SWyon Bi 	phy_write(hdptx, 0x0154, FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x87));
7555b2919b9SWyon Bi 	phy_write(hdptx, 0x0158, FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x71));
7565b2919b9SWyon Bi 	phy_write(hdptx, 0x015c, FIELD_PREP(ROPLL_PMS_MDIV_AFC, 0x71));
7575b2919b9SWyon Bi 
7585b2919b9SWyon Bi 	phy_write(hdptx, 0x0164, FIELD_PREP(ANA_ROPLL_PMS_PDIV, 0x1) |
7595b2919b9SWyon Bi 		  FIELD_PREP(ANA_ROPLL_PMS_REFDIV, 0x1));
7605b2919b9SWyon Bi 
7615b2919b9SWyon Bi 	phy_write(hdptx, 0x0168, FIELD_PREP(ROPLL_PMS_SDIV_RBR, 0x3) |
7625b2919b9SWyon Bi 		  FIELD_PREP(ROPLL_PMS_SDIV_HBR, 0x1));
7635b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x016c, ROPLL_PMS_SDIV_HBR2,
7645b2919b9SWyon Bi 			FIELD_PREP(ROPLL_PMS_SDIV_HBR2, 0x0));
7655b2919b9SWyon Bi 
7665b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0178, ANA_ROPLL_SDM_EN,
7675b2919b9SWyon Bi 			FIELD_PREP(ANA_ROPLL_SDM_EN, 0x1));
7685b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0178, OVRD_ROPLL_SDM_RSTN | ROPLL_SDM_RSTN,
7695b2919b9SWyon Bi 			FIELD_PREP(OVRD_ROPLL_SDM_RSTN, 0x1) |
7705b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDM_RSTN, 0x1));
7715b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0178, ROPLL_SDC_FRACTIONAL_EN_RBR,
7725b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_RBR, 0x1));
7735b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0178, ROPLL_SDC_FRACTIONAL_EN_HBR,
7745b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_HBR, 0x1));
7755b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0178, ROPLL_SDC_FRACTIONAL_EN_HBR2,
7765b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDC_FRACTIONAL_EN_HBR2, 0x1));
7775b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x017c, OVRD_ROPLL_SDC_RSTN | ROPLL_SDC_RSTN,
7785b2919b9SWyon Bi 			FIELD_PREP(OVRD_ROPLL_SDC_RSTN, 0x1) |
7795b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDC_RSTN, 0x1));
7805b2919b9SWyon Bi 
7815b2919b9SWyon Bi 	phy_write(hdptx, 0x0180, FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x21));
7825b2919b9SWyon Bi 	phy_write(hdptx, 0x0184, FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x27));
7835b2919b9SWyon Bi 	phy_write(hdptx, 0x0188, FIELD_PREP(ROPLL_SDM_DENOMINATOR, 0x27));
7845b2919b9SWyon Bi 
7855b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0190, ROPLL_SDM_NUMERATOR_SIGN_RBR |
7865b2919b9SWyon Bi 			ROPLL_SDM_NUMERATOR_SIGN_HBR |
7875b2919b9SWyon Bi 			ROPLL_SDM_NUMERATOR_SIGN_HBR2,
7885b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_RBR, 0x0) |
7895b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_HBR, 0x1) |
7905b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDM_NUMERATOR_SIGN_HBR2, 0x1));
7915b2919b9SWyon Bi 
7925b2919b9SWyon Bi 	phy_write(hdptx, 0x0194, FIELD_PREP(ROPLL_SDM_NUMERATOR, 0x0));
7935b2919b9SWyon Bi 	phy_write(hdptx, 0x0198, FIELD_PREP(ROPLL_SDM_NUMERATOR, 0xd));
7945b2919b9SWyon Bi 	phy_write(hdptx, 0x019c, FIELD_PREP(ROPLL_SDM_NUMERATOR, 0xd));
7955b2919b9SWyon Bi 
7965b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x01a4, ROPLL_SDC_N_RBR,
7975b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDC_N_RBR, 0x2));
7985b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x01a8, ROPLL_SDC_N_HBR | ROPLL_SDC_N_HBR2,
7995b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDC_N_HBR, 0x1) |
8005b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDC_N_HBR2, 0x1));
8015b2919b9SWyon Bi 
8025b2919b9SWyon Bi 	phy_write(hdptx, 0x01b0, FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x3));
8035b2919b9SWyon Bi 	phy_write(hdptx, 0x01b4, FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x7));
8045b2919b9SWyon Bi 	phy_write(hdptx, 0x01b8, FIELD_PREP(ROPLL_SDC_NUMERATOR, 0x7));
8055b2919b9SWyon Bi 
8065b2919b9SWyon Bi 	phy_write(hdptx, 0x01c0, FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x8));
8075b2919b9SWyon Bi 	phy_write(hdptx, 0x01c4, FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x18));
8085b2919b9SWyon Bi 	phy_write(hdptx, 0x01c8, FIELD_PREP(ROPLL_SDC_DENOMINATOR, 0x18));
8095b2919b9SWyon Bi 
8105b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x01d0, OVRD_ROPLL_SDC_NDIV_RSTN |
8115b2919b9SWyon Bi 			ROPLL_SDC_NDIV_RSTN,
8125b2919b9SWyon Bi 			FIELD_PREP(OVRD_ROPLL_SDC_NDIV_RSTN, 0x1) |
8135b2919b9SWyon Bi 			FIELD_PREP(ROPLL_SDC_NDIV_RSTN, 0x1));
8145b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x01dc, ANA_ROPLL_SSC_CLK_DIV_SEL,
8155b2919b9SWyon Bi 			FIELD_PREP(ANA_ROPLL_SSC_CLK_DIV_SEL, 0x1));
8165b2919b9SWyon Bi 
8175b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0118, ROPLL_ANA_CPP_CTRL_COARSE |
8185b2919b9SWyon Bi 			ROPLL_ANA_CPP_CTRL_FINE,
8195b2919b9SWyon Bi 			FIELD_PREP(ROPLL_ANA_CPP_CTRL_COARSE, 0xe) |
8205b2919b9SWyon Bi 			FIELD_PREP(ROPLL_ANA_CPP_CTRL_FINE, 0xe));
8215b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x011c, ROPLL_ANA_LPF_C_SEL_COARSE |
8225b2919b9SWyon Bi 			ROPLL_ANA_LPF_C_SEL_FINE,
8235b2919b9SWyon Bi 			FIELD_PREP(ROPLL_ANA_LPF_C_SEL_COARSE, 0x4) |
8245b2919b9SWyon Bi 			FIELD_PREP(ROPLL_ANA_LPF_C_SEL_FINE, 0x4));
8255b2919b9SWyon Bi 
8265b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0204, ANA_PLL_CD_TX_SER_RATE_SEL,
8275b2919b9SWyon Bi 			FIELD_PREP(ANA_PLL_CD_TX_SER_RATE_SEL, 0x0));
8285b2919b9SWyon Bi 
8295b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x025c, DIG_CLK_SEL,
8305b2919b9SWyon Bi 			FIELD_PREP(DIG_CLK_SEL, 0x1));
8315b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x021c, ANA_PLL_TX_HS_CLK_EN,
8325b2919b9SWyon Bi 			FIELD_PREP(ANA_PLL_TX_HS_CLK_EN, 0x1));
8335b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0204, ANA_PLL_CD_HSCLK_EAST_EN |
8345b2919b9SWyon Bi 			ANA_PLL_CD_HSCLK_WEST_EN,
8355b2919b9SWyon Bi 			FIELD_PREP(ANA_PLL_CD_HSCLK_EAST_EN, 0x1) |
8365b2919b9SWyon Bi 			FIELD_PREP(ANA_PLL_CD_HSCLK_WEST_EN, 0x0));
8375b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0264, CMN_ROPLL_ALONE_MODE,
8385b2919b9SWyon Bi 			FIELD_PREP(CMN_ROPLL_ALONE_MODE, 0x1));
8395b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0208, ANA_PLL_CD_VREG_GAIN_CTRL,
8405b2919b9SWyon Bi 			FIELD_PREP(ANA_PLL_CD_VREG_GAIN_CTRL, 0x4));
8415b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x00f0, ANA_LCPLL_RESERVED7,
8425b2919b9SWyon Bi 			FIELD_PREP(ANA_LCPLL_RESERVED7, 0x1));
8435b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x020c, ANA_PLL_CD_VREG_ICTRL,
8445b2919b9SWyon Bi 			FIELD_PREP(ANA_PLL_CD_VREG_ICTRL, 0x1));
8455b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0214, ANA_PLL_SYNC_LOSS_DET_MODE,
8465b2919b9SWyon Bi 			FIELD_PREP(ANA_PLL_SYNC_LOSS_DET_MODE, 0x3));
8475b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0210, PLL_LCRO_CLK_SEL,
8485b2919b9SWyon Bi 			FIELD_PREP(PLL_LCRO_CLK_SEL, 0x1));
8495b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0268, HS_SPEED_SEL,
8505b2919b9SWyon Bi 			FIELD_PREP(HS_SPEED_SEL, 0x1));
8515b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x026c, LS_SPEED_SEL,
8525b2919b9SWyon Bi 			FIELD_PREP(LS_SPEED_SEL, 0x1));
8535b2919b9SWyon Bi }
8545b2919b9SWyon Bi 
8555b2919b9SWyon Bi static int rockchip_hdptx_phy_dp_aux_init(struct rockchip_hdptx_phy *hdptx)
8565b2919b9SWyon Bi {
8575b2919b9SWyon Bi 	u32 status;
8585b2919b9SWyon Bi 	int ret;
8595b2919b9SWyon Bi 
8605d7a183bSWyon bi 	phy_update_bits(hdptx, 0x0414, ANA_SB_TX_HLVL_PROG,
8615d7a183bSWyon bi 			FIELD_PREP(ANA_SB_TX_HLVL_PROG, 0x7));
8625d7a183bSWyon bi 	phy_update_bits(hdptx, 0x0418, ANA_SB_TX_LLVL_PROG,
8635d7a183bSWyon bi 			FIELD_PREP(ANA_SB_TX_LLVL_PROG, 0x7));
8645d7a183bSWyon bi 
8655b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x044c, SB_RX_RCAL_OPT_CODE | SB_RX_RTERM_CTRL,
8665b2919b9SWyon Bi 			FIELD_PREP(SB_RX_RCAL_OPT_CODE, 0x1) |
8675b2919b9SWyon Bi 			FIELD_PREP(SB_RX_RTERM_CTRL, 0x3));
8685b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0450, SB_TG_SB_EN_DELAY_TIME |
8695b2919b9SWyon Bi 			SB_TG_RXTERN_EN_DELAY_TIME,
8705b2919b9SWyon Bi 			FIELD_PREP(SB_TG_SB_EN_DELAY_TIME, 0x2) |
8715b2919b9SWyon Bi 			FIELD_PREP(SB_TG_RXTERN_EN_DELAY_TIME, 0x2));
8725b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0454, SB_READY_DELAY_TIME |
8735b2919b9SWyon Bi 			SB_TG_OSC_EN_DELAY_TIME,
8745b2919b9SWyon Bi 			FIELD_PREP(SB_READY_DELAY_TIME, 0x2) |
8755b2919b9SWyon Bi 			FIELD_PREP(SB_TG_OSC_EN_DELAY_TIME, 0x2));
8765b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0458, SB_TG_OSC_EN_TO_AFC_RSTN_DELAT_TIME,
8775b2919b9SWyon Bi 			FIELD_PREP(SB_TG_OSC_EN_TO_AFC_RSTN_DELAT_TIME, 0x2));
8785b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x045c, SB_TG_PLL_CD_VREG_FAST_PULSE_TIME,
8795b2919b9SWyon Bi 			FIELD_PREP(SB_TG_PLL_CD_VREG_FAST_PULSE_TIME, 0x4));
8805b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0460, SB_TG_EARC_DMRX_RECVRD_CLK_CNT,
8815b2919b9SWyon Bi 			FIELD_PREP(SB_TG_EARC_DMRX_RECVRD_CLK_CNT, 0xa));
8825b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0468, SB_TG_CNT_RUN_NO_7_0,
8835b2919b9SWyon Bi 			FIELD_PREP(SB_TG_CNT_RUN_NO_7_0, 0x3));
8845b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x046c, SB_EARC_SIG_DET_BYPASS | SB_AFC_TOL,
8855b2919b9SWyon Bi 			FIELD_PREP(SB_EARC_SIG_DET_BYPASS, 0x1) |
8865b2919b9SWyon Bi 			FIELD_PREP(SB_AFC_TOL, 0x3));
8875b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0470, SB_AFC_STB_NUM,
8885b2919b9SWyon Bi 			FIELD_PREP(SB_AFC_STB_NUM, 0x4));
8895b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0474, SB_TG_OSC_CNT_MIN,
8905b2919b9SWyon Bi 			FIELD_PREP(SB_TG_OSC_CNT_MIN, 0x67));
8915b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0478, SB_TG_OSC_CNT_MAX,
8925b2919b9SWyon Bi 			FIELD_PREP(SB_TG_OSC_CNT_MAX, 0x6a));
8935b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x047c, SB_PWM_AFC_CTRL,
8945b2919b9SWyon Bi 			FIELD_PREP(SB_PWM_AFC_CTRL, 0x5));
8955b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0434, ANA_SB_DMRX_LPBK_DATA,
8965b2919b9SWyon Bi 			FIELD_PREP(ANA_SB_DMRX_LPBK_DATA, 0x1));
8975b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0440, ANA_SB_VREG_OUT_SEL |
8985b2919b9SWyon Bi 			ANA_SB_VREG_REF_SEL,
8995b2919b9SWyon Bi 			FIELD_PREP(ANA_SB_VREG_OUT_SEL, 0x1) |
9005b2919b9SWyon Bi 			FIELD_PREP(ANA_SB_VREG_REF_SEL, 0x1));
9015b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x043c, ANA_SB_VREG_GAIN_CTRL,
9025b2919b9SWyon Bi 			FIELD_PREP(ANA_SB_VREG_GAIN_CTRL, 0x0));
9035b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0408, ANA_SB_RXTERM_OFFSP,
9045b2919b9SWyon Bi 			FIELD_PREP(ANA_SB_RXTERM_OFFSP, 0x3));
9055b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x040c, ANA_SB_RXTERM_OFFSN,
9065b2919b9SWyon Bi 			FIELD_PREP(ANA_SB_RXTERM_OFFSN, 0x3));
9075b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x047c, SB_RCAL_RSTN,
9085b2919b9SWyon Bi 			FIELD_PREP(SB_RCAL_RSTN, 0x1));
9095b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0410, SB_AUX_EN,
9105b2919b9SWyon Bi 			FIELD_PREP(SB_AUX_EN, 0x1));
9115b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0480, SB_AUX_EN_IN,
9125b2919b9SWyon Bi 			FIELD_PREP(SB_AUX_EN_IN, 0x1));
9135b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x040c, OVRD_SB_RX_RESCAL_DONE,
9145b2919b9SWyon Bi 			FIELD_PREP(OVRD_SB_RX_RESCAL_DONE, 0x1));
9155b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0410, OVRD_SB_EN,
9165b2919b9SWyon Bi 			FIELD_PREP(OVRD_SB_EN, 0x1));
9175b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0408, OVRD_SB_RXTERM_EN,
9185b2919b9SWyon Bi 			FIELD_PREP(OVRD_SB_RXTERM_EN, 0x1));
9195b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x043c, OVRD_SB_VREG_EN,
9205b2919b9SWyon Bi 			FIELD_PREP(OVRD_SB_VREG_EN, 0x1));
9215b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0410, OVRD_SB_AUX_EN,
9225b2919b9SWyon Bi 			FIELD_PREP(OVRD_SB_AUX_EN, 0x1));
9235b2919b9SWyon Bi 
9245b2919b9SWyon Bi 	grf_write(hdptx, HDPTXPHY_GRF_CON0, BGR_EN, FIELD_PREP(BGR_EN, 0x1));
9255b2919b9SWyon Bi 	grf_write(hdptx, HDPTXPHY_GRF_CON0, BIAS_EN, FIELD_PREP(BIAS_EN, 0x1));
9265b2919b9SWyon Bi 	udelay(10);
9275b2919b9SWyon Bi 	reset_deassert(&hdptx->init_reset);
9285b2919b9SWyon Bi 	udelay(1000);
9295b2919b9SWyon Bi 	reset_deassert(&hdptx->cmn_reset);
9305b2919b9SWyon Bi 	udelay(20);
9315b2919b9SWyon Bi 
9325b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x040c, SB_RX_RESCAL_DONE,
9335b2919b9SWyon Bi 			FIELD_PREP(SB_RX_RESCAL_DONE, 0x1));
9345b2919b9SWyon Bi 	udelay(100);
9355b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0410, SB_EN, FIELD_PREP(SB_EN, 0x1));
9365b2919b9SWyon Bi 	udelay(100);
9375b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0408, SB_RXRERM_EN,
9385b2919b9SWyon Bi 			FIELD_PREP(SB_RXRERM_EN, 0x1));
9395b2919b9SWyon Bi 	udelay(10);
9405b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x043c, SB_VREG_EN, FIELD_PREP(SB_VREG_EN, 0x1));
9415b2919b9SWyon Bi 	udelay(10);
9425b2919b9SWyon Bi 	phy_update_bits(hdptx, 0x0410, SB_AUX_EN, FIELD_PREP(SB_AUX_EN, 0x1));
9435b2919b9SWyon Bi 	udelay(100);
9445b2919b9SWyon Bi 
9455b2919b9SWyon Bi 	ret = regmap_read_poll_timeout(hdptx->grf, HDPTXPHY_GRF_STATUS0,
9465b2919b9SWyon Bi 				       status, FIELD_GET(SB_RDY, status),
9475b2919b9SWyon Bi 				       50, 1000);
9485b2919b9SWyon Bi 	if (ret) {
9495b2919b9SWyon Bi 		dev_err(hdptx->dev, "timeout waiting for sb_rdy\n");
9505b2919b9SWyon Bi 		return ret;
9515b2919b9SWyon Bi 	}
9525b2919b9SWyon Bi 
9535b2919b9SWyon Bi 	return 0;
9545b2919b9SWyon Bi }
9555b2919b9SWyon Bi 
9565b2919b9SWyon Bi static void rockchip_hdptx_phy_reset(struct rockchip_hdptx_phy *hdptx)
9575b2919b9SWyon Bi {
9585d7a183bSWyon bi 	u32 lane;
9595d7a183bSWyon bi 
9605b2919b9SWyon Bi 	reset_assert(&hdptx->lane_reset);
9615b2919b9SWyon Bi 	reset_assert(&hdptx->cmn_reset);
9625b2919b9SWyon Bi 	reset_assert(&hdptx->init_reset);
9635b2919b9SWyon Bi 
9645d7a183bSWyon bi 	reset_assert(&hdptx->apb_reset);
9655d7a183bSWyon bi 	udelay(10);
9665d7a183bSWyon bi 	reset_deassert(&hdptx->apb_reset);
9675d7a183bSWyon bi 
9685d7a183bSWyon bi 	for (lane = 0; lane < 4; lane++)
9695d7a183bSWyon bi 		phy_update_bits(hdptx, LANE_REG(lane, 0x0c04),
9705d7a183bSWyon bi 				OVRD_LN_TX_DRV_EI_EN | LN_TX_DRV_EI_EN,
9715d7a183bSWyon bi 				FIELD_PREP(OVRD_LN_TX_DRV_EI_EN, 1) |
9725d7a183bSWyon bi 				FIELD_PREP(LN_TX_DRV_EI_EN, 0));
9735d7a183bSWyon bi 
9745b2919b9SWyon Bi 	grf_write(hdptx, HDPTXPHY_GRF_CON0, PLL_EN, FIELD_PREP(PLL_EN, 0));
9755b2919b9SWyon Bi 	grf_write(hdptx, HDPTXPHY_GRF_CON0, BIAS_EN, FIELD_PREP(BIAS_EN, 0));
9765b2919b9SWyon Bi 	grf_write(hdptx, HDPTXPHY_GRF_CON0, BGR_EN, FIELD_PREP(BGR_EN, 0));
9775b2919b9SWyon Bi }
9785b2919b9SWyon Bi 
9795b2919b9SWyon Bi static int rockchip_hdptx_phy_power_on(struct phy *phy)
9805b2919b9SWyon Bi {
9815b2919b9SWyon Bi 	struct rockchip_hdptx_phy *hdptx = dev_get_priv(phy->dev);
9825b2919b9SWyon Bi 	enum phy_mode mode = generic_phy_get_mode(phy);
9835b2919b9SWyon Bi 	u32 lane;
9845b2919b9SWyon Bi 
9855b2919b9SWyon Bi 	rockchip_hdptx_phy_reset(hdptx);
9865b2919b9SWyon Bi 
9875b2919b9SWyon Bi 	for (lane = 0; lane < 4; lane++) {
9885b2919b9SWyon Bi 		u32 invert = hdptx->lane_polarity_invert[lane];
9895b2919b9SWyon Bi 
9905b2919b9SWyon Bi 		phy_update_bits(hdptx, LANE_REG(lane, 0x0c78), LN_POLARITY_INV,
9915b2919b9SWyon Bi 				FIELD_PREP(LN_POLARITY_INV, invert));
9925b2919b9SWyon Bi 	}
9935b2919b9SWyon Bi 
9945b2919b9SWyon Bi 	if (mode == PHY_MODE_DP) {
9955b2919b9SWyon Bi 		grf_write(hdptx, HDPTXPHY_GRF_CON0, HDPTX_MODE_SEL,
9965b2919b9SWyon Bi 			  FIELD_PREP(HDPTX_MODE_SEL, 0x1));
9975b2919b9SWyon Bi 
9985b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x0800, PROTOCOL_SEL,
9995b2919b9SWyon Bi 				FIELD_PREP(PROTOCOL_SEL, 0x0));
10005b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x0818, DATA_BUS_WIDTH,
10015b2919b9SWyon Bi 				FIELD_PREP(DATA_BUS_WIDTH, 0x1));
10025b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x0818, BUS_WIDTH_SEL,
10035b2919b9SWyon Bi 				FIELD_PREP(BUS_WIDTH_SEL, 0x0));
10045b2919b9SWyon Bi 
10055b2919b9SWyon Bi 		rockchip_hdptx_phy_dp_pll_init(hdptx);
10065b2919b9SWyon Bi 		rockchip_hdptx_phy_dp_aux_init(hdptx);
10075b2919b9SWyon Bi 	} else {
10085b2919b9SWyon Bi 		grf_write(hdptx, HDPTXPHY_GRF_CON0, HDPTX_MODE_SEL,
10095b2919b9SWyon Bi 			  FIELD_PREP(HDPTX_MODE_SEL, 0x0));
10105b2919b9SWyon Bi 
10115b2919b9SWyon Bi 		phy_update_bits(hdptx, 0x0800, PROTOCOL_SEL,
10125b2919b9SWyon Bi 				FIELD_PREP(PROTOCOL_SEL, 0x1));
10135b2919b9SWyon Bi 	}
10145b2919b9SWyon Bi 
10155b2919b9SWyon Bi 	return 0;
10165b2919b9SWyon Bi }
10175b2919b9SWyon Bi 
10185b2919b9SWyon Bi static int rockchip_hdptx_phy_power_off(struct phy *phy)
10195b2919b9SWyon Bi {
10205b2919b9SWyon Bi 	struct rockchip_hdptx_phy *hdptx = dev_get_priv(phy->dev);
10215b2919b9SWyon Bi 
10225b2919b9SWyon Bi 	rockchip_hdptx_phy_reset(hdptx);
10235b2919b9SWyon Bi 
10245b2919b9SWyon Bi 	return 0;
10255b2919b9SWyon Bi }
10265b2919b9SWyon Bi 
10275b2919b9SWyon Bi static const struct phy_ops rockchip_hdptx_phy_ops = {
10285b2919b9SWyon Bi 	.set_mode	= rockchip_hdptx_phy_set_mode,
10295b2919b9SWyon Bi 	.configure	= rockchip_hdptx_phy_configure,
10305b2919b9SWyon Bi 	.power_on	= rockchip_hdptx_phy_power_on,
10315b2919b9SWyon Bi 	.power_off	= rockchip_hdptx_phy_power_off,
10325b2919b9SWyon Bi };
10335b2919b9SWyon Bi 
10345b2919b9SWyon Bi static int rockchip_hdptx_phy_probe(struct udevice *dev)
10355b2919b9SWyon Bi {
10365b2919b9SWyon Bi 	struct rockchip_hdptx_phy *hdptx = dev_get_priv(dev);
10375b2919b9SWyon Bi 	struct udevice *syscon;
10385b2919b9SWyon Bi 	int ret;
10395b2919b9SWyon Bi 
10405b2919b9SWyon Bi 	hdptx->base = dev_read_addr_ptr(dev);
10415b2919b9SWyon Bi 	if (!hdptx->base)
10425b2919b9SWyon Bi 		return -ENOENT;
10435b2919b9SWyon Bi 
10445b2919b9SWyon Bi 	ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,grf",
10455b2919b9SWyon Bi 					   &syscon);
10465b2919b9SWyon Bi 	if (ret)
10475b2919b9SWyon Bi 		return ret;
10485b2919b9SWyon Bi 
10495b2919b9SWyon Bi 	hdptx->grf = syscon_get_regmap(syscon);
10505b2919b9SWyon Bi 	if (IS_ERR(hdptx->grf)) {
10515b2919b9SWyon Bi 		ret = PTR_ERR(hdptx->grf);
10525b2919b9SWyon Bi 		dev_err(dev, "unable to find regmap: %d\n", ret);
10535b2919b9SWyon Bi 		return ret;
10545b2919b9SWyon Bi 	}
10555b2919b9SWyon Bi 
10565b2919b9SWyon Bi 	hdptx->dev = dev;
10575b2919b9SWyon Bi 
10585b2919b9SWyon Bi 	ret = reset_get_by_name(dev, "apb", &hdptx->apb_reset);
10595b2919b9SWyon Bi 	if (ret < 0) {
10605b2919b9SWyon Bi 		dev_err(dev, "failed to get apb reset: %d\n", ret);
10615b2919b9SWyon Bi 		return ret;
10625b2919b9SWyon Bi 	}
10635b2919b9SWyon Bi 
10645b2919b9SWyon Bi 	ret = reset_get_by_name(dev, "init", &hdptx->init_reset);
10655b2919b9SWyon Bi 	if (ret < 0) {
10665b2919b9SWyon Bi 		dev_err(dev, "failed to get init reset: %d\n", ret);
10675b2919b9SWyon Bi 		return ret;
10685b2919b9SWyon Bi 	}
10695b2919b9SWyon Bi 
10705b2919b9SWyon Bi 	ret = reset_get_by_name(dev, "cmn", &hdptx->cmn_reset);
10715b2919b9SWyon Bi 	if (ret < 0) {
10725b2919b9SWyon Bi 		dev_err(dev, "failed to get cmn reset: %d\n", ret);
10735b2919b9SWyon Bi 		return ret;
10745b2919b9SWyon Bi 	}
10755b2919b9SWyon Bi 
10765b2919b9SWyon Bi 	ret = reset_get_by_name(dev, "lane", &hdptx->lane_reset);
10775b2919b9SWyon Bi 	if (ret < 0) {
10785b2919b9SWyon Bi 		dev_err(dev, "failed to get lane reset: %d\n", ret);
10795b2919b9SWyon Bi 		return ret;
10805b2919b9SWyon Bi 	}
10815b2919b9SWyon Bi 
1082*cbe88c75SWyon Bi 	ret = rockchip_hdptx_phy_parse_training_table(dev);
1083*cbe88c75SWyon Bi 	if (ret) {
1084*cbe88c75SWyon Bi 		dev_err(dev, "failed to parse training table: %d\n", ret);
1085*cbe88c75SWyon Bi 		return ret;
1086*cbe88c75SWyon Bi 	}
1087*cbe88c75SWyon Bi 
10885b2919b9SWyon Bi 	dev_read_u32_array(dev, "lane-polarity-invert",
10895b2919b9SWyon Bi 			   hdptx->lane_polarity_invert, 4);
10905b2919b9SWyon Bi 
10915b2919b9SWyon Bi 	return 0;
10925b2919b9SWyon Bi }
10935b2919b9SWyon Bi 
10945b2919b9SWyon Bi static const struct udevice_id rockchip_hdptx_phy_ids[] = {
10955b2919b9SWyon Bi 	{ .compatible = "rockchip,rk3588-hdptx-phy", },
10965b2919b9SWyon Bi 	{}
10975b2919b9SWyon Bi };
10985b2919b9SWyon Bi 
10995b2919b9SWyon Bi U_BOOT_DRIVER(rockchip_hdptx_phy) = {
11005b2919b9SWyon Bi 	.name		= "rockchip_hdptx_phy",
11015b2919b9SWyon Bi 	.id		= UCLASS_PHY,
11025b2919b9SWyon Bi 	.ops		= &rockchip_hdptx_phy_ops,
11035b2919b9SWyon Bi 	.of_match	= rockchip_hdptx_phy_ids,
11045b2919b9SWyon Bi 	.probe		= rockchip_hdptx_phy_probe,
11055b2919b9SWyon Bi 	.priv_auto_alloc_size = sizeof(struct rockchip_hdptx_phy),
11065b2919b9SWyon Bi };
1107