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