1925c5749SYifeng Zhao // SPDX-License-Identifier: GPL-2.0 2925c5749SYifeng Zhao /* 3925c5749SYifeng Zhao * Rockchip USB3.0/PCIe Gen2/SATA/SGMII combphy driver 4925c5749SYifeng Zhao * 5925c5749SYifeng Zhao * Copyright (C) 2021 Rockchip Electronics Co., Ltd. 6925c5749SYifeng Zhao */ 7925c5749SYifeng Zhao 8925c5749SYifeng Zhao #include <common.h> 9925c5749SYifeng Zhao #include <clk.h> 10925c5749SYifeng Zhao #include <dm.h> 11925c5749SYifeng Zhao #include <dm/lists.h> 12925c5749SYifeng Zhao #include <dt-bindings/phy/phy.h> 13925c5749SYifeng Zhao #include <generic-phy.h> 14925c5749SYifeng Zhao #include <syscon.h> 15925c5749SYifeng Zhao #include <asm/io.h> 16925c5749SYifeng Zhao #include <asm/arch/clock.h> 17925c5749SYifeng Zhao #include <regmap.h> 18925c5749SYifeng Zhao #include <reset-uclass.h> 1914d5da7dSwilliam.wu #include <linux/iopoll.h> 20925c5749SYifeng Zhao 21925c5749SYifeng Zhao #define BIT_WRITEABLE_SHIFT 16 22925c5749SYifeng Zhao 23925c5749SYifeng Zhao struct rockchip_combphy_priv; 24925c5749SYifeng Zhao 25925c5749SYifeng Zhao struct combphy_reg { 263452d642SJianwei Zheng u32 offset; 27925c5749SYifeng Zhao u16 bitend; 28925c5749SYifeng Zhao u16 bitstart; 29925c5749SYifeng Zhao u16 disable; 30925c5749SYifeng Zhao u16 enable; 31925c5749SYifeng Zhao }; 32925c5749SYifeng Zhao 33925c5749SYifeng Zhao struct rockchip_combphy_grfcfg { 34925c5749SYifeng Zhao struct combphy_reg pcie_mode_set; 35925c5749SYifeng Zhao struct combphy_reg usb_mode_set; 36925c5749SYifeng Zhao struct combphy_reg sgmii_mode_set; 37925c5749SYifeng Zhao struct combphy_reg qsgmii_mode_set; 38925c5749SYifeng Zhao struct combphy_reg pipe_rxterm_set; 39925c5749SYifeng Zhao struct combphy_reg pipe_txelec_set; 40925c5749SYifeng Zhao struct combphy_reg pipe_txcomp_set; 413452d642SJianwei Zheng struct combphy_reg pipe_clk_24m; 42925c5749SYifeng Zhao struct combphy_reg pipe_clk_25m; 43925c5749SYifeng Zhao struct combphy_reg pipe_clk_100m; 44925c5749SYifeng Zhao struct combphy_reg pipe_phymode_sel; 45925c5749SYifeng Zhao struct combphy_reg pipe_rate_sel; 46925c5749SYifeng Zhao struct combphy_reg pipe_rxterm_sel; 47925c5749SYifeng Zhao struct combphy_reg pipe_txelec_sel; 48925c5749SYifeng Zhao struct combphy_reg pipe_txcomp_sel; 49925c5749SYifeng Zhao struct combphy_reg pipe_clk_ext; 50925c5749SYifeng Zhao struct combphy_reg pipe_sel_usb; 51925c5749SYifeng Zhao struct combphy_reg pipe_sel_qsgmii; 52925c5749SYifeng Zhao struct combphy_reg pipe_phy_status; 53925c5749SYifeng Zhao struct combphy_reg con0_for_pcie; 54925c5749SYifeng Zhao struct combphy_reg con1_for_pcie; 55925c5749SYifeng Zhao struct combphy_reg con2_for_pcie; 56925c5749SYifeng Zhao struct combphy_reg con3_for_pcie; 57925c5749SYifeng Zhao struct combphy_reg con0_for_sata; 58925c5749SYifeng Zhao struct combphy_reg con1_for_sata; 59925c5749SYifeng Zhao struct combphy_reg con2_for_sata; 60925c5749SYifeng Zhao struct combphy_reg con3_for_sata; 61925c5749SYifeng Zhao struct combphy_reg pipe_con0_for_sata; 62cf3c44cbSJon Lin struct combphy_reg pipe_con1_for_sata; 63925c5749SYifeng Zhao struct combphy_reg pipe_sgmii_mac_sel; 64925c5749SYifeng Zhao struct combphy_reg pipe_xpcs_phy_ready; 65925c5749SYifeng Zhao struct combphy_reg u3otg0_port_en; 66925c5749SYifeng Zhao struct combphy_reg u3otg1_port_en; 6714d5da7dSwilliam.wu struct combphy_reg u3otg0_pipe_clk_sel; 6886b316b4SFrank Wang struct combphy_reg pipe_phy_grf_reset; 69925c5749SYifeng Zhao }; 70925c5749SYifeng Zhao 71925c5749SYifeng Zhao struct rockchip_combphy_cfg { 72925c5749SYifeng Zhao const struct rockchip_combphy_grfcfg *grfcfg; 73925c5749SYifeng Zhao int (*combphy_cfg)(struct rockchip_combphy_priv *priv); 74925c5749SYifeng Zhao }; 75925c5749SYifeng Zhao 76925c5749SYifeng Zhao struct rockchip_combphy_priv { 77925c5749SYifeng Zhao u32 mode; 78925c5749SYifeng Zhao void __iomem *mmio; 79925c5749SYifeng Zhao struct udevice *dev; 80925c5749SYifeng Zhao struct regmap *pipe_grf; 81925c5749SYifeng Zhao struct regmap *phy_grf; 82925c5749SYifeng Zhao struct phy *phy; 83925c5749SYifeng Zhao struct reset_ctl phy_rst; 84925c5749SYifeng Zhao struct clk ref_clk; 85925c5749SYifeng Zhao const struct rockchip_combphy_cfg *cfg; 86925c5749SYifeng Zhao }; 87925c5749SYifeng Zhao 88925c5749SYifeng Zhao static int param_write(struct regmap *base, 89925c5749SYifeng Zhao const struct combphy_reg *reg, bool en) 90925c5749SYifeng Zhao { 91925c5749SYifeng Zhao u32 val, mask, tmp; 92925c5749SYifeng Zhao 93925c5749SYifeng Zhao tmp = en ? reg->enable : reg->disable; 94925c5749SYifeng Zhao mask = GENMASK(reg->bitend, reg->bitstart); 95925c5749SYifeng Zhao val = (tmp << reg->bitstart) | (mask << BIT_WRITEABLE_SHIFT); 96925c5749SYifeng Zhao 97925c5749SYifeng Zhao return regmap_write(base, reg->offset, val); 98925c5749SYifeng Zhao } 99925c5749SYifeng Zhao 10014d5da7dSwilliam.wu static u32 rockchip_combphy_is_ready(struct rockchip_combphy_priv *priv) 10114d5da7dSwilliam.wu { 10214d5da7dSwilliam.wu const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; 10314d5da7dSwilliam.wu u32 mask, val; 10414d5da7dSwilliam.wu 10514d5da7dSwilliam.wu mask = GENMASK(cfg->pipe_phy_status.bitend, 10614d5da7dSwilliam.wu cfg->pipe_phy_status.bitstart); 10714d5da7dSwilliam.wu 10814d5da7dSwilliam.wu regmap_read(priv->phy_grf, cfg->pipe_phy_status.offset, &val); 10914d5da7dSwilliam.wu val = (val & mask) >> cfg->pipe_phy_status.bitstart; 11014d5da7dSwilliam.wu 11114d5da7dSwilliam.wu return val; 11214d5da7dSwilliam.wu } 11314d5da7dSwilliam.wu 114925c5749SYifeng Zhao static int rockchip_combphy_pcie_init(struct rockchip_combphy_priv *priv) 115925c5749SYifeng Zhao { 116925c5749SYifeng Zhao int ret = 0; 117925c5749SYifeng Zhao 118925c5749SYifeng Zhao if (priv->cfg->combphy_cfg) { 119925c5749SYifeng Zhao ret = priv->cfg->combphy_cfg(priv); 120925c5749SYifeng Zhao if (ret) { 121925c5749SYifeng Zhao dev_err(priv->dev, "failed to init phy for pcie\n"); 122925c5749SYifeng Zhao return ret; 123925c5749SYifeng Zhao } 124925c5749SYifeng Zhao } 125925c5749SYifeng Zhao 126925c5749SYifeng Zhao return ret; 127925c5749SYifeng Zhao } 128925c5749SYifeng Zhao 129925c5749SYifeng Zhao static int rockchip_combphy_usb3_init(struct rockchip_combphy_priv *priv) 130925c5749SYifeng Zhao { 131925c5749SYifeng Zhao int ret = 0; 132925c5749SYifeng Zhao 133925c5749SYifeng Zhao if (priv->cfg->combphy_cfg) { 134925c5749SYifeng Zhao ret = priv->cfg->combphy_cfg(priv); 135925c5749SYifeng Zhao if (ret) { 136925c5749SYifeng Zhao dev_err(priv->dev, "failed to init phy for usb3\n"); 137925c5749SYifeng Zhao return ret; 138925c5749SYifeng Zhao } 139925c5749SYifeng Zhao } 140925c5749SYifeng Zhao 141925c5749SYifeng Zhao return ret; 142925c5749SYifeng Zhao } 143925c5749SYifeng Zhao 144925c5749SYifeng Zhao static int rockchip_combphy_sata_init(struct rockchip_combphy_priv *priv) 145925c5749SYifeng Zhao { 146925c5749SYifeng Zhao int ret = 0; 147925c5749SYifeng Zhao 148925c5749SYifeng Zhao if (priv->cfg->combphy_cfg) { 149925c5749SYifeng Zhao ret = priv->cfg->combphy_cfg(priv); 150925c5749SYifeng Zhao if (ret) { 151925c5749SYifeng Zhao dev_err(priv->dev, "failed to init phy for sata\n"); 152925c5749SYifeng Zhao return ret; 153925c5749SYifeng Zhao } 154925c5749SYifeng Zhao } 155925c5749SYifeng Zhao 156925c5749SYifeng Zhao return ret; 157925c5749SYifeng Zhao } 158925c5749SYifeng Zhao 159925c5749SYifeng Zhao static int rockchip_combphy_sgmii_init(struct rockchip_combphy_priv *priv) 160925c5749SYifeng Zhao { 161925c5749SYifeng Zhao int ret = 0; 162925c5749SYifeng Zhao 163925c5749SYifeng Zhao if (priv->cfg->combphy_cfg) { 164925c5749SYifeng Zhao ret = priv->cfg->combphy_cfg(priv); 165925c5749SYifeng Zhao if (ret) { 166925c5749SYifeng Zhao dev_err(priv->dev, "failed to init phy for sgmii\n"); 167925c5749SYifeng Zhao return ret; 168925c5749SYifeng Zhao } 169925c5749SYifeng Zhao } 170925c5749SYifeng Zhao 171925c5749SYifeng Zhao return ret; 172925c5749SYifeng Zhao } 173925c5749SYifeng Zhao 17414d5da7dSwilliam.wu int rockchip_combphy_usb3_uboot_init(void) 17514d5da7dSwilliam.wu { 17614d5da7dSwilliam.wu struct udevice *udev; 17714d5da7dSwilliam.wu struct rockchip_combphy_priv *priv; 17814d5da7dSwilliam.wu const struct rockchip_combphy_grfcfg *cfg; 17914d5da7dSwilliam.wu u32 val; 18014d5da7dSwilliam.wu int ret; 18114d5da7dSwilliam.wu 18214d5da7dSwilliam.wu ret = uclass_get_device_by_driver(UCLASS_PHY, 18314d5da7dSwilliam.wu DM_GET_DRIVER(rockchip_naneng_combphy), 18414d5da7dSwilliam.wu &udev); 18514d5da7dSwilliam.wu if (ret) { 18614d5da7dSwilliam.wu pr_err("%s: get usb3-phy node failed: %d\n", __func__, ret); 18714d5da7dSwilliam.wu return ret; 18814d5da7dSwilliam.wu } 18914d5da7dSwilliam.wu 19014d5da7dSwilliam.wu priv = dev_get_priv(udev); 19114d5da7dSwilliam.wu priv->mode = PHY_TYPE_USB3; 19214d5da7dSwilliam.wu cfg = priv->cfg->grfcfg; 19314d5da7dSwilliam.wu 19414d5da7dSwilliam.wu rockchip_combphy_usb3_init(priv); 19514d5da7dSwilliam.wu reset_deassert(&priv->phy_rst); 19614d5da7dSwilliam.wu 19714d5da7dSwilliam.wu if (cfg->pipe_phy_grf_reset.enable) 19814d5da7dSwilliam.wu param_write(priv->phy_grf, &cfg->pipe_phy_grf_reset, false); 19914d5da7dSwilliam.wu 20014d5da7dSwilliam.wu if (priv->mode == PHY_TYPE_USB3) { 20114d5da7dSwilliam.wu ret = readx_poll_timeout(rockchip_combphy_is_ready, 20214d5da7dSwilliam.wu priv, val, 20314d5da7dSwilliam.wu val == cfg->pipe_phy_status.enable, 20414d5da7dSwilliam.wu 1000); 20514d5da7dSwilliam.wu if (ret) { 20614d5da7dSwilliam.wu dev_err(priv->dev, "wait phy status ready timeout\n"); 20714d5da7dSwilliam.wu param_write(priv->phy_grf, &cfg->usb_mode_set, false); 20814d5da7dSwilliam.wu if (cfg->u3otg0_pipe_clk_sel.disable) 20914d5da7dSwilliam.wu param_write(priv->phy_grf, &cfg->u3otg0_pipe_clk_sel, false); 21014d5da7dSwilliam.wu return ret; 21114d5da7dSwilliam.wu } 21214d5da7dSwilliam.wu } 21314d5da7dSwilliam.wu 21414d5da7dSwilliam.wu /* Select clk_usb3otg0_pipe for source clk */ 21514d5da7dSwilliam.wu if (cfg->u3otg0_pipe_clk_sel.disable) 21614d5da7dSwilliam.wu param_write(priv->phy_grf, &cfg->u3otg0_pipe_clk_sel, true); 21714d5da7dSwilliam.wu 21814d5da7dSwilliam.wu return ret; 21914d5da7dSwilliam.wu } 22014d5da7dSwilliam.wu 221925c5749SYifeng Zhao static int rockchip_combphy_set_mode(struct rockchip_combphy_priv *priv) 222925c5749SYifeng Zhao { 223925c5749SYifeng Zhao switch (priv->mode) { 224925c5749SYifeng Zhao case PHY_TYPE_PCIE: 225925c5749SYifeng Zhao rockchip_combphy_pcie_init(priv); 226925c5749SYifeng Zhao break; 227925c5749SYifeng Zhao case PHY_TYPE_USB3: 228925c5749SYifeng Zhao rockchip_combphy_usb3_init(priv); 229925c5749SYifeng Zhao break; 230925c5749SYifeng Zhao case PHY_TYPE_SATA: 231925c5749SYifeng Zhao rockchip_combphy_sata_init(priv); 232925c5749SYifeng Zhao break; 233925c5749SYifeng Zhao case PHY_TYPE_SGMII: 234925c5749SYifeng Zhao case PHY_TYPE_QSGMII: 235925c5749SYifeng Zhao return rockchip_combphy_sgmii_init(priv); 236925c5749SYifeng Zhao default: 237925c5749SYifeng Zhao dev_err(priv->dev, "incompatible PHY type\n"); 238925c5749SYifeng Zhao return -EINVAL; 239925c5749SYifeng Zhao } 240925c5749SYifeng Zhao 241925c5749SYifeng Zhao return 0; 242925c5749SYifeng Zhao } 243925c5749SYifeng Zhao 244925c5749SYifeng Zhao static int rockchip_combphy_init(struct phy *phy) 245925c5749SYifeng Zhao { 246925c5749SYifeng Zhao struct rockchip_combphy_priv *priv = dev_get_priv(phy->dev); 24786b316b4SFrank Wang const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; 248925c5749SYifeng Zhao int ret; 249925c5749SYifeng Zhao 250925c5749SYifeng Zhao ret = clk_enable(&priv->ref_clk); 251925c5749SYifeng Zhao if (ret < 0 && ret != -ENOSYS) 252925c5749SYifeng Zhao return ret; 253925c5749SYifeng Zhao 254925c5749SYifeng Zhao ret = rockchip_combphy_set_mode(priv); 255925c5749SYifeng Zhao if (ret) 256925c5749SYifeng Zhao goto err_clk; 257925c5749SYifeng Zhao 258925c5749SYifeng Zhao reset_deassert(&priv->phy_rst); 259925c5749SYifeng Zhao 26086b316b4SFrank Wang if (cfg->pipe_phy_grf_reset.enable) 26186b316b4SFrank Wang param_write(priv->phy_grf, &cfg->pipe_phy_grf_reset, false); 26286b316b4SFrank Wang 263925c5749SYifeng Zhao return 0; 264925c5749SYifeng Zhao 265925c5749SYifeng Zhao err_clk: 266925c5749SYifeng Zhao clk_disable(&priv->ref_clk); 267925c5749SYifeng Zhao 268925c5749SYifeng Zhao return ret; 269925c5749SYifeng Zhao } 270925c5749SYifeng Zhao 271925c5749SYifeng Zhao static int rockchip_combphy_exit(struct phy *phy) 272925c5749SYifeng Zhao { 273925c5749SYifeng Zhao struct rockchip_combphy_priv *priv = dev_get_priv(phy->dev); 27486b316b4SFrank Wang const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; 275925c5749SYifeng Zhao 27686b316b4SFrank Wang if (cfg->pipe_phy_grf_reset.enable) 27786b316b4SFrank Wang param_write(priv->phy_grf, &cfg->pipe_phy_grf_reset, true); 27886b316b4SFrank Wang 279925c5749SYifeng Zhao reset_assert(&priv->phy_rst); 28086b316b4SFrank Wang clk_disable(&priv->ref_clk); 281925c5749SYifeng Zhao 282925c5749SYifeng Zhao return 0; 283925c5749SYifeng Zhao } 284925c5749SYifeng Zhao 285925c5749SYifeng Zhao static int rockchip_combphy_xlate(struct phy *phy, struct ofnode_phandle_args *args) 286925c5749SYifeng Zhao { 287925c5749SYifeng Zhao struct rockchip_combphy_priv *priv = dev_get_priv(phy->dev); 288925c5749SYifeng Zhao 289925c5749SYifeng Zhao if (args->args_count != 1) { 290925c5749SYifeng Zhao pr_err("invalid number of arguments\n"); 291925c5749SYifeng Zhao return -EINVAL; 292925c5749SYifeng Zhao } 293925c5749SYifeng Zhao 294925c5749SYifeng Zhao priv->mode = args->args[0]; 295925c5749SYifeng Zhao 296925c5749SYifeng Zhao return 0; 297925c5749SYifeng Zhao } 298925c5749SYifeng Zhao 299925c5749SYifeng Zhao static const struct phy_ops rochchip_combphy_ops = { 300925c5749SYifeng Zhao .init = rockchip_combphy_init, 301925c5749SYifeng Zhao .exit = rockchip_combphy_exit, 302925c5749SYifeng Zhao .of_xlate = rockchip_combphy_xlate, 303925c5749SYifeng Zhao }; 304925c5749SYifeng Zhao 305925c5749SYifeng Zhao static int rockchip_combphy_parse_dt(struct udevice *dev, 306925c5749SYifeng Zhao struct rockchip_combphy_priv *priv) 307925c5749SYifeng Zhao { 308925c5749SYifeng Zhao struct udevice *syscon; 309925c5749SYifeng Zhao int ret; 3107cc44222SJon Lin u32 vals[4]; 311925c5749SYifeng Zhao 312925c5749SYifeng Zhao ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pipe-grf", &syscon); 313925c5749SYifeng Zhao if (ret) { 314cf3c44cbSJon Lin dev_err(dev, "failed to find peri_ctrl pipe-grf regmap ret= %d\n", ret); 315925c5749SYifeng Zhao return ret; 316925c5749SYifeng Zhao } 317925c5749SYifeng Zhao priv->pipe_grf = syscon_get_regmap(syscon); 318925c5749SYifeng Zhao 319925c5749SYifeng Zhao ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pipe-phy-grf", &syscon); 320925c5749SYifeng Zhao if (ret) { 321925c5749SYifeng Zhao dev_err(dev, "failed to find peri_ctrl pipe-phy-grf regmap\n"); 322925c5749SYifeng Zhao return ret; 323925c5749SYifeng Zhao } 324925c5749SYifeng Zhao priv->phy_grf = syscon_get_regmap(syscon); 325925c5749SYifeng Zhao 326925c5749SYifeng Zhao ret = clk_get_by_index(dev, 0, &priv->ref_clk); 327925c5749SYifeng Zhao if (ret) { 328925c5749SYifeng Zhao dev_err(dev, "failed to find ref clock\n"); 329925c5749SYifeng Zhao return PTR_ERR(&priv->ref_clk); 330925c5749SYifeng Zhao } 331925c5749SYifeng Zhao 332dbf89912SRen Jianing ret = reset_get_by_name(dev, "combphy", &priv->phy_rst); 333925c5749SYifeng Zhao if (ret) { 334925c5749SYifeng Zhao dev_err(dev, "no phy reset control specified\n"); 335925c5749SYifeng Zhao return ret; 336925c5749SYifeng Zhao } 337925c5749SYifeng Zhao 3387cc44222SJon Lin if (!dev_read_u32_array(dev, "rockchip,pcie1ln-sel-bits", 3397cc44222SJon Lin vals, ARRAY_SIZE(vals))) 3407cc44222SJon Lin regmap_write(priv->pipe_grf, vals[0], 3417cc44222SJon Lin (GENMASK(vals[2], vals[1]) << 16) | vals[3]); 3427cc44222SJon Lin 343925c5749SYifeng Zhao return 0; 344925c5749SYifeng Zhao } 345925c5749SYifeng Zhao 346925c5749SYifeng Zhao static int rockchip_combphy_probe(struct udevice *udev) 347925c5749SYifeng Zhao { 348925c5749SYifeng Zhao struct rockchip_combphy_priv *priv = dev_get_priv(udev); 349925c5749SYifeng Zhao const struct rockchip_combphy_cfg *phy_cfg; 350925c5749SYifeng Zhao 351925c5749SYifeng Zhao priv->mmio = (void __iomem *)dev_read_addr(udev); 352925c5749SYifeng Zhao if (IS_ERR(priv->mmio)) 353925c5749SYifeng Zhao return PTR_ERR(priv->mmio); 354925c5749SYifeng Zhao 355925c5749SYifeng Zhao phy_cfg = (const struct rockchip_combphy_cfg *)dev_get_driver_data(udev); 356925c5749SYifeng Zhao if (!phy_cfg) { 357925c5749SYifeng Zhao dev_err(udev, "No OF match data provided\n"); 358925c5749SYifeng Zhao return -EINVAL; 359925c5749SYifeng Zhao } 360925c5749SYifeng Zhao 361925c5749SYifeng Zhao priv->dev = udev; 362925c5749SYifeng Zhao priv->mode = PHY_TYPE_SATA; 363925c5749SYifeng Zhao priv->cfg = phy_cfg; 364925c5749SYifeng Zhao 3655eec6d12SJon Lin return rockchip_combphy_parse_dt(udev, priv); 366925c5749SYifeng Zhao } 367925c5749SYifeng Zhao 368fc22f2adSWilliam Wu #ifdef CONFIG_ROCKCHIP_RK3528 3693452d642SJianwei Zheng static int rk3528_combphy_cfg(struct rockchip_combphy_priv *priv) 3703452d642SJianwei Zheng { 3713452d642SJianwei Zheng const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; 3723452d642SJianwei Zheng u32 val; 3733452d642SJianwei Zheng 3743452d642SJianwei Zheng switch (priv->mode) { 3753452d642SJianwei Zheng case PHY_TYPE_PCIE: 3763452d642SJianwei Zheng /* Set SSC downward spread spectrum */ 3773452d642SJianwei Zheng val = readl(priv->mmio + 0x18); 3783452d642SJianwei Zheng val &= ~GENMASK(5, 4); 3793452d642SJianwei Zheng val |= 0x01 << 4; 3803452d642SJianwei Zheng writel(val, priv->mmio + 0x18); 3813452d642SJianwei Zheng 3823452d642SJianwei Zheng param_write(priv->phy_grf, &cfg->con0_for_pcie, true); 3833452d642SJianwei Zheng param_write(priv->phy_grf, &cfg->con1_for_pcie, true); 3843452d642SJianwei Zheng param_write(priv->phy_grf, &cfg->con2_for_pcie, true); 3853452d642SJianwei Zheng param_write(priv->phy_grf, &cfg->con3_for_pcie, true); 3863452d642SJianwei Zheng break; 3873452d642SJianwei Zheng case PHY_TYPE_USB3: 3883452d642SJianwei Zheng /* Set SSC downward spread spectrum */ 3893452d642SJianwei Zheng val = readl(priv->mmio + 0x18); 3903452d642SJianwei Zheng val &= ~GENMASK(5, 4); 3913452d642SJianwei Zheng val |= 0x01 << 4; 3923452d642SJianwei Zheng writel(val, priv->mmio + 0x18); 3933452d642SJianwei Zheng 3943452d642SJianwei Zheng /* Enable adaptive CTLE for USB3.0 Rx */ 3953452d642SJianwei Zheng val = readl(priv->mmio + 0x200); 3963452d642SJianwei Zheng val &= ~GENMASK(17, 17); 3973452d642SJianwei Zheng val |= 0x01; 3983452d642SJianwei Zheng writel(val, priv->mmio + 0x200); 3993452d642SJianwei Zheng 400fc3847fcSWilliam Wu /* Set Rx squelch input filler bandwidth */ 401fc3847fcSWilliam Wu val = readl(priv->mmio + 0x20c); 402fc3847fcSWilliam Wu val &= ~GENMASK(2, 0); 403fc3847fcSWilliam Wu val |= 0x06; 404fc3847fcSWilliam Wu writel(val, priv->mmio + 0x20c); 405fc3847fcSWilliam Wu 4063452d642SJianwei Zheng param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false); 4073452d642SJianwei Zheng param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false); 4083452d642SJianwei Zheng param_write(priv->phy_grf, &cfg->usb_mode_set, true); 4093452d642SJianwei Zheng break; 4103452d642SJianwei Zheng default: 4113452d642SJianwei Zheng dev_err(priv->dev, "incompatible PHY type\n"); 4123452d642SJianwei Zheng return -EINVAL; 4133452d642SJianwei Zheng } 4143452d642SJianwei Zheng 4153452d642SJianwei Zheng param_write(priv->phy_grf, &cfg->pipe_clk_100m, true); 4163452d642SJianwei Zheng if (priv->mode == PHY_TYPE_PCIE) { 4173452d642SJianwei Zheng /* PLL KVCO tuning fine */ 4183452d642SJianwei Zheng val = readl(priv->mmio + 0x18); 4193452d642SJianwei Zheng val &= ~(0x7 << 10); 4203452d642SJianwei Zheng val |= 0x2 << 10; 4213452d642SJianwei Zheng writel(val, priv->mmio + 0x18); 4223452d642SJianwei Zheng 4233452d642SJianwei Zheng /* su_trim[6:4]=111, [10:7]=1001, [2:0]=000 */ 4243452d642SJianwei Zheng val = readl(priv->mmio + 0x108); 4253452d642SJianwei Zheng val &= ~(0x7f7); 4263452d642SJianwei Zheng val |= 0x4f0; 4273452d642SJianwei Zheng writel(val, priv->mmio + 0x108); 4283452d642SJianwei Zheng } 4293452d642SJianwei Zheng 4303452d642SJianwei Zheng return 0; 4313452d642SJianwei Zheng } 4323452d642SJianwei Zheng 4333452d642SJianwei Zheng static const struct rockchip_combphy_grfcfg rk3528_combphy_grfcfgs = { 4343452d642SJianwei Zheng /* pipe-phy-grf */ 4353452d642SJianwei Zheng .pcie_mode_set = { 0x48000, 5, 0, 0x00, 0x11 }, 4363452d642SJianwei Zheng .usb_mode_set = { 0x48000, 5, 0, 0x00, 0x04 }, 4373452d642SJianwei Zheng .pipe_rxterm_set = { 0x48000, 12, 12, 0x00, 0x01 }, 4383452d642SJianwei Zheng .pipe_txelec_set = { 0x48004, 1, 1, 0x00, 0x01 }, 4393452d642SJianwei Zheng .pipe_txcomp_set = { 0x48004, 4, 4, 0x00, 0x01 }, 4403452d642SJianwei Zheng .pipe_clk_24m = { 0x48004, 14, 13, 0x00, 0x00 }, 4413452d642SJianwei Zheng .pipe_clk_100m = { 0x48004, 14, 13, 0x00, 0x02 }, 4423452d642SJianwei Zheng .pipe_rxterm_sel = { 0x48008, 8, 8, 0x00, 0x01 }, 4433452d642SJianwei Zheng .pipe_txelec_sel = { 0x48008, 12, 12, 0x00, 0x01 }, 4443452d642SJianwei Zheng .pipe_txcomp_sel = { 0x48008, 15, 15, 0x00, 0x01 }, 4453452d642SJianwei Zheng .pipe_clk_ext = { 0x4800c, 9, 8, 0x02, 0x01 }, 4463452d642SJianwei Zheng .pipe_phy_status = { 0x48034, 6, 6, 0x01, 0x00 }, 4473452d642SJianwei Zheng .con0_for_pcie = { 0x48000, 15, 0, 0x00, 0x110 }, 4483452d642SJianwei Zheng .con1_for_pcie = { 0x48004, 15, 0, 0x00, 0x00 }, 4493452d642SJianwei Zheng .con2_for_pcie = { 0x48008, 15, 0, 0x00, 0x101 }, 4503452d642SJianwei Zheng .con3_for_pcie = { 0x4800c, 15, 0, 0x00, 0x0200 }, 4513452d642SJianwei Zheng /* pipe-grf */ 45214d5da7dSwilliam.wu .u3otg0_pipe_clk_sel = { 0x40044, 7, 7, 0x01, 0x00 }, 4533452d642SJianwei Zheng .u3otg0_port_en = { 0x40044, 15, 0, 0x0181, 0x1100 }, 4543452d642SJianwei Zheng }; 4553452d642SJianwei Zheng 4563452d642SJianwei Zheng static const struct rockchip_combphy_cfg rk3528_combphy_cfgs = { 4573452d642SJianwei Zheng .grfcfg = &rk3528_combphy_grfcfgs, 4583452d642SJianwei Zheng .combphy_cfg = rk3528_combphy_cfg, 4593452d642SJianwei Zheng }; 460fc22f2adSWilliam Wu #endif 4613452d642SJianwei Zheng 462fc22f2adSWilliam Wu #ifdef CONFIG_ROCKCHIP_RK3562 463885c5d5dSFrank Wang static int rk3562_combphy_cfg(struct rockchip_combphy_priv *priv) 464885c5d5dSFrank Wang { 465885c5d5dSFrank Wang const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; 466885c5d5dSFrank Wang u32 val; 467885c5d5dSFrank Wang 468885c5d5dSFrank Wang switch (priv->mode) { 469885c5d5dSFrank Wang case PHY_TYPE_PCIE: 470885c5d5dSFrank Wang /* Set SSC downward spread spectrum */ 471885c5d5dSFrank Wang val = readl(priv->mmio + (0x1f << 2)); 472885c5d5dSFrank Wang val &= ~GENMASK(5, 4); 473885c5d5dSFrank Wang val |= 0x01 << 4; 474885c5d5dSFrank Wang writel(val, priv->mmio + 0x7c); 475885c5d5dSFrank Wang 476885c5d5dSFrank Wang param_write(priv->phy_grf, &cfg->con0_for_pcie, true); 477885c5d5dSFrank Wang param_write(priv->phy_grf, &cfg->con1_for_pcie, true); 478885c5d5dSFrank Wang param_write(priv->phy_grf, &cfg->con2_for_pcie, true); 479885c5d5dSFrank Wang param_write(priv->phy_grf, &cfg->con3_for_pcie, true); 480885c5d5dSFrank Wang break; 481885c5d5dSFrank Wang case PHY_TYPE_USB3: 482885c5d5dSFrank Wang /* Set SSC downward spread spectrum */ 483885c5d5dSFrank Wang val = readl(priv->mmio + (0x1f << 2)); 484885c5d5dSFrank Wang val &= ~GENMASK(5, 4); 485885c5d5dSFrank Wang val |= 0x01 << 4; 486885c5d5dSFrank Wang writel(val, priv->mmio + 0x7c); 487885c5d5dSFrank Wang 488885c5d5dSFrank Wang /* Enable adaptive CTLE for USB3.0 Rx */ 489885c5d5dSFrank Wang val = readl(priv->mmio + (0x0e << 2)); 490885c5d5dSFrank Wang val &= ~GENMASK(0, 0); 491885c5d5dSFrank Wang val |= 0x01; 492885c5d5dSFrank Wang writel(val, priv->mmio + (0x0e << 2)); 493885c5d5dSFrank Wang 494885c5d5dSFrank Wang /* Set PLL KVCO fine tuning signals */ 495885c5d5dSFrank Wang val = readl(priv->mmio + (0x20 << 2)); 496885c5d5dSFrank Wang val &= ~(0x7 << 2); 497885c5d5dSFrank Wang val |= 0x2 << 2; 498885c5d5dSFrank Wang writel(val, priv->mmio + (0x20 << 2)); 499885c5d5dSFrank Wang 500885c5d5dSFrank Wang /* Set PLL LPF R1 to su_trim[10:7]=1001 */ 501885c5d5dSFrank Wang writel(0x4, priv->mmio + (0xb << 2)); 502885c5d5dSFrank Wang 503885c5d5dSFrank Wang /* Set PLL input clock divider 1/2 */ 504885c5d5dSFrank Wang val = readl(priv->mmio + (0x5 << 2)); 505885c5d5dSFrank Wang val &= ~(0x3 << 6); 506885c5d5dSFrank Wang val |= 0x1 << 6; 507885c5d5dSFrank Wang writel(val, priv->mmio + (0x5 << 2)); 508885c5d5dSFrank Wang 509885c5d5dSFrank Wang /* Set PLL loop divider */ 510885c5d5dSFrank Wang writel(0x32, priv->mmio + (0x11 << 2)); 511885c5d5dSFrank Wang 512885c5d5dSFrank Wang /* Set PLL KVCO to min and set PLL charge pump current to max */ 513885c5d5dSFrank Wang writel(0xf0, priv->mmio + (0xa << 2)); 514885c5d5dSFrank Wang 515fc3847fcSWilliam Wu /* Set Rx squelch input filler bandwidth */ 516fc3847fcSWilliam Wu writel(0x0e, priv->mmio + (0x14 << 2)); 517fc3847fcSWilliam Wu 518885c5d5dSFrank Wang param_write(priv->phy_grf, &cfg->pipe_sel_usb, true); 519885c5d5dSFrank Wang param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false); 520885c5d5dSFrank Wang param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false); 521885c5d5dSFrank Wang param_write(priv->phy_grf, &cfg->usb_mode_set, true); 522885c5d5dSFrank Wang break; 523885c5d5dSFrank Wang default: 524885c5d5dSFrank Wang pr_err("%s, phy-type %d\n", __func__, priv->mode); 525885c5d5dSFrank Wang return -EINVAL; 526885c5d5dSFrank Wang } 527885c5d5dSFrank Wang 528885c5d5dSFrank Wang clk_set_rate(&priv->ref_clk, 100000000); 529885c5d5dSFrank Wang param_write(priv->phy_grf, &cfg->pipe_clk_100m, true); 530885c5d5dSFrank Wang 531cc9876f4SJon Lin if (priv->mode == PHY_TYPE_PCIE) { 532cc9876f4SJon Lin /* PLL KVCO tuning fine */ 533cc9876f4SJon Lin val = readl(priv->mmio + (0x20 << 2)); 534cc9876f4SJon Lin val &= ~(0x7 << 2); 535cc9876f4SJon Lin val |= 0x2 << 2; 536cc9876f4SJon Lin writel(val, priv->mmio + (0x20 << 2)); 537cc9876f4SJon Lin 538cc9876f4SJon Lin /* Enable controlling random jitter, aka RMJ */ 539cc9876f4SJon Lin writel(0x4, priv->mmio + (0xb << 2)); 540cc9876f4SJon Lin 541cc9876f4SJon Lin val = readl(priv->mmio + (0x5 << 2)); 542cc9876f4SJon Lin val &= ~(0x3 << 6); 543cc9876f4SJon Lin val |= 0x1 << 6; 544cc9876f4SJon Lin writel(val, priv->mmio + (0x5 << 2)); 545cc9876f4SJon Lin 546cc9876f4SJon Lin writel(0x32, priv->mmio + (0x11 << 2)); 547cc9876f4SJon Lin writel(0xf0, priv->mmio + (0xa << 2)); 548cc9876f4SJon Lin } 549cc9876f4SJon Lin 550885c5d5dSFrank Wang if (dev_read_bool(priv->dev, "rockchip,enable-ssc")) { 551885c5d5dSFrank Wang val = readl(priv->mmio + (0x7 << 2)); 552885c5d5dSFrank Wang val |= BIT(4); 553885c5d5dSFrank Wang writel(val, priv->mmio + (0x7 << 2)); 554885c5d5dSFrank Wang } 555885c5d5dSFrank Wang 556885c5d5dSFrank Wang return 0; 557885c5d5dSFrank Wang } 558885c5d5dSFrank Wang 559885c5d5dSFrank Wang static const struct rockchip_combphy_grfcfg rk3562_combphy_grfcfgs = { 560885c5d5dSFrank Wang /* pipe-phy-grf */ 561885c5d5dSFrank Wang .pcie_mode_set = { 0x0000, 5, 0, 0x00, 0x11 }, 562885c5d5dSFrank Wang .usb_mode_set = { 0x0000, 5, 0, 0x00, 0x04 }, 563885c5d5dSFrank Wang .pipe_rxterm_set = { 0x0000, 12, 12, 0x00, 0x01 }, 564885c5d5dSFrank Wang .pipe_txelec_set = { 0x0004, 1, 1, 0x00, 0x01 }, 565885c5d5dSFrank Wang .pipe_txcomp_set = { 0x0004, 4, 4, 0x00, 0x01 }, 566885c5d5dSFrank Wang .pipe_clk_25m = { 0x0004, 14, 13, 0x00, 0x01 }, 567885c5d5dSFrank Wang .pipe_clk_100m = { 0x0004, 14, 13, 0x00, 0x02 }, 568885c5d5dSFrank Wang .pipe_phymode_sel = { 0x0008, 1, 1, 0x00, 0x01 }, 569885c5d5dSFrank Wang .pipe_rate_sel = { 0x0008, 2, 2, 0x00, 0x01 }, 570885c5d5dSFrank Wang .pipe_rxterm_sel = { 0x0008, 8, 8, 0x00, 0x01 }, 571885c5d5dSFrank Wang .pipe_txelec_sel = { 0x0008, 12, 12, 0x00, 0x01 }, 572885c5d5dSFrank Wang .pipe_txcomp_sel = { 0x0008, 15, 15, 0x00, 0x01 }, 573885c5d5dSFrank Wang .pipe_clk_ext = { 0x000c, 9, 8, 0x02, 0x01 }, 574885c5d5dSFrank Wang .pipe_sel_usb = { 0x000c, 14, 13, 0x00, 0x01 }, 575885c5d5dSFrank Wang .pipe_phy_status = { 0x0034, 6, 6, 0x01, 0x00 }, 576885c5d5dSFrank Wang .con0_for_pcie = { 0x0000, 15, 0, 0x00, 0x1000 }, 577885c5d5dSFrank Wang .con1_for_pcie = { 0x0004, 15, 0, 0x00, 0x0000 }, 578885c5d5dSFrank Wang .con2_for_pcie = { 0x0008, 15, 0, 0x00, 0x0101 }, 579885c5d5dSFrank Wang .con3_for_pcie = { 0x000c, 15, 0, 0x00, 0x0200 }, 58086b316b4SFrank Wang .pipe_phy_grf_reset = { 0x0014, 1, 0, 0x3, 0x1 }, 581885c5d5dSFrank Wang /* pipe-grf */ 582885c5d5dSFrank Wang .u3otg0_port_en = { 0x0094, 15, 0, 0x0181, 0x1100 }, 583885c5d5dSFrank Wang }; 584885c5d5dSFrank Wang 585885c5d5dSFrank Wang static const struct rockchip_combphy_cfg rk3562_combphy_cfgs = { 586885c5d5dSFrank Wang .grfcfg = &rk3562_combphy_grfcfgs, 587885c5d5dSFrank Wang .combphy_cfg = rk3562_combphy_cfg, 588885c5d5dSFrank Wang }; 589fc22f2adSWilliam Wu #endif 590885c5d5dSFrank Wang 591fc22f2adSWilliam Wu #ifdef CONFIG_ROCKCHIP_RK3568 592925c5749SYifeng Zhao static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv) 593925c5749SYifeng Zhao { 594925c5749SYifeng Zhao const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; 595925c5749SYifeng Zhao u32 val; 596925c5749SYifeng Zhao 597925c5749SYifeng Zhao switch (priv->mode) { 598925c5749SYifeng Zhao case PHY_TYPE_PCIE: 599925c5749SYifeng Zhao /* Set SSC downward spread spectrum */ 600925c5749SYifeng Zhao val = readl(priv->mmio + (0x1f << 2)); 601925c5749SYifeng Zhao val &= ~GENMASK(5, 4); 602925c5749SYifeng Zhao val |= 0x01 << 4; 603925c5749SYifeng Zhao writel(val, priv->mmio + 0x7c); 604925c5749SYifeng Zhao 605925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->con0_for_pcie, true); 606925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->con1_for_pcie, true); 607925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->con2_for_pcie, true); 608925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->con3_for_pcie, true); 609925c5749SYifeng Zhao break; 610925c5749SYifeng Zhao case PHY_TYPE_USB3: 611925c5749SYifeng Zhao /* Set SSC downward spread spectrum */ 612925c5749SYifeng Zhao val = readl(priv->mmio + (0x1f << 2)); 613925c5749SYifeng Zhao val &= ~GENMASK(5, 4); 614925c5749SYifeng Zhao val |= 0x01 << 4; 615925c5749SYifeng Zhao writel(val, priv->mmio + 0x7c); 616925c5749SYifeng Zhao 617925c5749SYifeng Zhao /* Enable adaptive CTLE for USB3.0 Rx */ 618925c5749SYifeng Zhao val = readl(priv->mmio + (0x0e << 2)); 619925c5749SYifeng Zhao val &= ~GENMASK(0, 0); 620925c5749SYifeng Zhao val |= 0x01; 621925c5749SYifeng Zhao writel(val, priv->mmio + (0x0e << 2)); 622925c5749SYifeng Zhao 623a0d03578SWilliam Wu /* Set PLL KVCO fine tuning signals */ 624a0d03578SWilliam Wu val = readl(priv->mmio + (0x20 << 2)); 625a0d03578SWilliam Wu val &= ~(0x7 << 2); 626a0d03578SWilliam Wu val |= 0x2 << 2; 627a0d03578SWilliam Wu writel(val, priv->mmio + (0x20 << 2)); 628a0d03578SWilliam Wu 629a0d03578SWilliam Wu /* Set PLL LPF R1 to su_trim[10:7]=1001 */ 630a0d03578SWilliam Wu writel(0x4, priv->mmio + (0xb << 2)); 631a0d03578SWilliam Wu 632a0d03578SWilliam Wu /* Set PLL input clock divider 1/2 */ 633a0d03578SWilliam Wu val = readl(priv->mmio + (0x5 << 2)); 634a0d03578SWilliam Wu val &= ~(0x3 << 6); 635a0d03578SWilliam Wu val |= 0x1 << 6; 636a0d03578SWilliam Wu writel(val, priv->mmio + (0x5 << 2)); 637a0d03578SWilliam Wu 638a0d03578SWilliam Wu /* Set PLL loop divider */ 639a0d03578SWilliam Wu writel(0x32, priv->mmio + (0x11 << 2)); 640a0d03578SWilliam Wu 641a0d03578SWilliam Wu /* Set PLL KVCO to min and set PLL charge pump current to max */ 642a0d03578SWilliam Wu writel(0xf0, priv->mmio + (0xa << 2)); 643a0d03578SWilliam Wu 644fc3847fcSWilliam Wu /* Set Rx squelch input filler bandwidth */ 645fc3847fcSWilliam Wu writel(0x0e, priv->mmio + (0x14 << 2)); 646fc3847fcSWilliam Wu 647925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->pipe_sel_usb, true); 648925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false); 649925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false); 650925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->usb_mode_set, true); 651925c5749SYifeng Zhao break; 652925c5749SYifeng Zhao case PHY_TYPE_SATA: 653925c5749SYifeng Zhao writel(0x41, priv->mmio + 0x38); 654925c5749SYifeng Zhao writel(0x8F, priv->mmio + 0x18); 655925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->con0_for_sata, true); 656925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->con1_for_sata, true); 657925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->con2_for_sata, true); 658925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->con3_for_sata, true); 659925c5749SYifeng Zhao param_write(priv->pipe_grf, &cfg->pipe_con0_for_sata, true); 660925c5749SYifeng Zhao break; 661925c5749SYifeng Zhao case PHY_TYPE_SGMII: 662925c5749SYifeng Zhao param_write(priv->pipe_grf, &cfg->pipe_xpcs_phy_ready, true); 663925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->pipe_phymode_sel, true); 664925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->pipe_sel_qsgmii, true); 665925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->sgmii_mode_set, true); 666925c5749SYifeng Zhao break; 667925c5749SYifeng Zhao case PHY_TYPE_QSGMII: 668925c5749SYifeng Zhao param_write(priv->pipe_grf, &cfg->pipe_xpcs_phy_ready, true); 669925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->pipe_phymode_sel, true); 670925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->pipe_rate_sel, true); 671925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->pipe_sel_qsgmii, true); 672925c5749SYifeng Zhao param_write(priv->phy_grf, &cfg->qsgmii_mode_set, true); 673925c5749SYifeng Zhao break; 674925c5749SYifeng Zhao default: 675925c5749SYifeng Zhao pr_err("%s, phy-type %d\n", __func__, priv->mode); 676925c5749SYifeng Zhao return -EINVAL; 677925c5749SYifeng Zhao } 678925c5749SYifeng Zhao 679dbf89912SRen Jianing /* The default ref clock is 25Mhz */ 680dbf89912SRen Jianing param_write(priv->phy_grf, &cfg->pipe_clk_25m, true); 681925c5749SYifeng Zhao 682925c5749SYifeng Zhao if (dev_read_bool(priv->dev, "rockchip,enable-ssc")) { 683925c5749SYifeng Zhao val = readl(priv->mmio + (0x7 << 2)); 684925c5749SYifeng Zhao val |= BIT(4); 685925c5749SYifeng Zhao writel(val, priv->mmio + (0x7 << 2)); 686925c5749SYifeng Zhao } 687925c5749SYifeng Zhao 688925c5749SYifeng Zhao return 0; 689925c5749SYifeng Zhao } 690925c5749SYifeng Zhao 691925c5749SYifeng Zhao static const struct rockchip_combphy_grfcfg rk3568_combphy_grfcfgs = { 692925c5749SYifeng Zhao /* pipe-phy-grf */ 693925c5749SYifeng Zhao .pcie_mode_set = { 0x0000, 5, 0, 0x00, 0x11 }, 694925c5749SYifeng Zhao .usb_mode_set = { 0x0000, 5, 0, 0x00, 0x04 }, 695925c5749SYifeng Zhao .sgmii_mode_set = { 0x0000, 5, 0, 0x00, 0x01 }, 696925c5749SYifeng Zhao .qsgmii_mode_set = { 0x0000, 5, 0, 0x00, 0x21 }, 697925c5749SYifeng Zhao .pipe_rxterm_set = { 0x0000, 12, 12, 0x00, 0x01 }, 698925c5749SYifeng Zhao .pipe_txelec_set = { 0x0004, 1, 1, 0x00, 0x01 }, 699925c5749SYifeng Zhao .pipe_txcomp_set = { 0x0004, 4, 4, 0x00, 0x01 }, 700925c5749SYifeng Zhao .pipe_clk_25m = { 0x0004, 14, 13, 0x00, 0x01 }, 701925c5749SYifeng Zhao .pipe_clk_100m = { 0x0004, 14, 13, 0x00, 0x02 }, 702925c5749SYifeng Zhao .pipe_phymode_sel = { 0x0008, 1, 1, 0x00, 0x01 }, 703925c5749SYifeng Zhao .pipe_rate_sel = { 0x0008, 2, 2, 0x00, 0x01 }, 704925c5749SYifeng Zhao .pipe_rxterm_sel = { 0x0008, 8, 8, 0x00, 0x01 }, 705925c5749SYifeng Zhao .pipe_txelec_sel = { 0x0008, 12, 12, 0x00, 0x01 }, 706925c5749SYifeng Zhao .pipe_txcomp_sel = { 0x0008, 15, 15, 0x00, 0x01 }, 707925c5749SYifeng Zhao .pipe_clk_ext = { 0x000c, 9, 8, 0x02, 0x01 }, 708925c5749SYifeng Zhao .pipe_sel_usb = { 0x000c, 14, 13, 0x00, 0x01 }, 709925c5749SYifeng Zhao .pipe_sel_qsgmii = { 0x000c, 15, 13, 0x00, 0x07 }, 710925c5749SYifeng Zhao .pipe_phy_status = { 0x0034, 6, 6, 0x01, 0x00 }, 711925c5749SYifeng Zhao .con0_for_pcie = { 0x0000, 15, 0, 0x00, 0x1000 }, 712925c5749SYifeng Zhao .con1_for_pcie = { 0x0004, 15, 0, 0x00, 0x0000 }, 713925c5749SYifeng Zhao .con2_for_pcie = { 0x0008, 15, 0, 0x00, 0x0101 }, 714925c5749SYifeng Zhao .con3_for_pcie = { 0x000c, 15, 0, 0x00, 0x0200 }, 715925c5749SYifeng Zhao .con0_for_sata = { 0x0000, 15, 0, 0x00, 0x0119 }, 716925c5749SYifeng Zhao .con1_for_sata = { 0x0004, 15, 0, 0x00, 0x0040 }, 717925c5749SYifeng Zhao .con2_for_sata = { 0x0008, 15, 0, 0x00, 0x80c3 }, 718925c5749SYifeng Zhao .con3_for_sata = { 0x000c, 15, 0, 0x00, 0x4407 }, 719925c5749SYifeng Zhao /* pipe-grf */ 720925c5749SYifeng Zhao .pipe_con0_for_sata = { 0x0000, 15, 0, 0x00, 0x2220 }, 721925c5749SYifeng Zhao .pipe_sgmii_mac_sel = { 0x0040, 1, 1, 0x00, 0x01 }, 722925c5749SYifeng Zhao .pipe_xpcs_phy_ready = { 0x0040, 2, 2, 0x00, 0x01 }, 723925c5749SYifeng Zhao .u3otg0_port_en = { 0x0104, 15, 0, 0x0181, 0x1100 }, 724925c5749SYifeng Zhao .u3otg1_port_en = { 0x0144, 15, 0, 0x0181, 0x1100 }, 725925c5749SYifeng Zhao }; 726925c5749SYifeng Zhao 727925c5749SYifeng Zhao static const struct rockchip_combphy_cfg rk3568_combphy_cfgs = { 728925c5749SYifeng Zhao .grfcfg = &rk3568_combphy_grfcfgs, 729925c5749SYifeng Zhao .combphy_cfg = rk3568_combphy_cfg, 730925c5749SYifeng Zhao }; 731fc22f2adSWilliam Wu #endif 732925c5749SYifeng Zhao 733fc22f2adSWilliam Wu #ifdef CONFIG_ROCKCHIP_RK3588 734cf3c44cbSJon Lin static int rk3588_combphy_cfg(struct rockchip_combphy_priv *priv) 735cf3c44cbSJon Lin { 736cf3c44cbSJon Lin const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; 737d8968f57SWilliam Wu u32 val; 738cf3c44cbSJon Lin 739cf3c44cbSJon Lin switch (priv->mode) { 740cf3c44cbSJon Lin case PHY_TYPE_PCIE: 741cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->con0_for_pcie, true); 742cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->con1_for_pcie, true); 743cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->con2_for_pcie, true); 744cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->con3_for_pcie, true); 745cf3c44cbSJon Lin break; 746cf3c44cbSJon Lin case PHY_TYPE_USB3: 747d8968f57SWilliam Wu /* Set SSC downward spread spectrum */ 748d8968f57SWilliam Wu val = readl(priv->mmio + (0x1f << 2)); 749d8968f57SWilliam Wu val &= ~GENMASK(5, 4); 750d8968f57SWilliam Wu val |= 0x01 << 4; 751d8968f57SWilliam Wu writel(val, priv->mmio + 0x7c); 752d8968f57SWilliam Wu 753d8968f57SWilliam Wu /* Enable adaptive CTLE for USB3.0 Rx */ 754d8968f57SWilliam Wu val = readl(priv->mmio + (0x0e << 2)); 755d8968f57SWilliam Wu val &= ~GENMASK(0, 0); 756d8968f57SWilliam Wu val |= 0x01; 757d8968f57SWilliam Wu writel(val, priv->mmio + (0x0e << 2)); 758d8968f57SWilliam Wu 759d8968f57SWilliam Wu /* Set PLL KVCO fine tuning signals */ 760d8968f57SWilliam Wu val = readl(priv->mmio + (0x20 << 2)); 761d8968f57SWilliam Wu val &= ~(0x7 << 2); 762d8968f57SWilliam Wu val |= 0x2 << 2; 763d8968f57SWilliam Wu writel(val, priv->mmio + (0x20 << 2)); 764d8968f57SWilliam Wu 765d8968f57SWilliam Wu /* Set PLL LPF R1 to su_trim[10:7]=1001 */ 766d8968f57SWilliam Wu writel(0x4, priv->mmio + (0xb << 2)); 767d8968f57SWilliam Wu 768d8968f57SWilliam Wu /* Set PLL input clock divider 1/2 */ 769d8968f57SWilliam Wu val = readl(priv->mmio + (0x5 << 2)); 770d8968f57SWilliam Wu val &= ~(0x3 << 6); 771d8968f57SWilliam Wu val |= 0x1 << 6; 772d8968f57SWilliam Wu writel(val, priv->mmio + (0x5 << 2)); 773d8968f57SWilliam Wu 774d8968f57SWilliam Wu /* Set PLL loop divider */ 775d8968f57SWilliam Wu writel(0x32, priv->mmio + (0x11 << 2)); 776d8968f57SWilliam Wu 777d8968f57SWilliam Wu /* Set PLL KVCO to min and set PLL charge pump current to max */ 778d8968f57SWilliam Wu writel(0xf0, priv->mmio + (0xa << 2)); 779d8968f57SWilliam Wu 78087bfcd06SWilliam Wu /* Set Rx squelch input filler bandwidth */ 78187bfcd06SWilliam Wu writel(0x0d, priv->mmio + (0x14 << 2)); 78287bfcd06SWilliam Wu 783cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false); 784cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false); 785cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->usb_mode_set, true); 786cf3c44cbSJon Lin break; 787cf3c44cbSJon Lin case PHY_TYPE_SATA: 788418dd88dSYifeng Zhao /* Enable adaptive CTLE for SATA Rx */ 789418dd88dSYifeng Zhao val = readl(priv->mmio + (0x0e << 2)); 790418dd88dSYifeng Zhao val &= ~GENMASK(0, 0); 791418dd88dSYifeng Zhao val |= 0x01; 792418dd88dSYifeng Zhao writel(val, priv->mmio + (0x0e << 2)); 793418dd88dSYifeng Zhao /* Set tx_rterm = 50 ohm and rx_rterm = 43.5 ohm */ 794418dd88dSYifeng Zhao writel(0x8F, priv->mmio + (0x06 << 2)); 795418dd88dSYifeng Zhao 796cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->con0_for_sata, true); 797cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->con1_for_sata, true); 798cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->con2_for_sata, true); 799cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->con3_for_sata, true); 800cf3c44cbSJon Lin param_write(priv->pipe_grf, &cfg->pipe_con0_for_sata, true); 801cf3c44cbSJon Lin param_write(priv->pipe_grf, &cfg->pipe_con1_for_sata, true); 802cf3c44cbSJon Lin break; 803cf3c44cbSJon Lin case PHY_TYPE_SGMII: 804cf3c44cbSJon Lin case PHY_TYPE_QSGMII: 805cf3c44cbSJon Lin default: 806cf3c44cbSJon Lin dev_err(priv->dev, "incompatible PHY type\n"); 807cf3c44cbSJon Lin return -EINVAL; 808cf3c44cbSJon Lin } 809cf3c44cbSJon Lin 810c72d402cSJon Lin /* 100MHz refclock signal is good */ 811c72d402cSJon Lin clk_set_rate(&priv->ref_clk, 100000000); 812cf3c44cbSJon Lin param_write(priv->phy_grf, &cfg->pipe_clk_100m, true); 813e278c201SKever Yang if (priv->mode == PHY_TYPE_PCIE) { 814e278c201SKever Yang /* PLL KVCO tuning fine */ 815e278c201SKever Yang val = readl(priv->mmio + (0x20 << 2)); 816e278c201SKever Yang val &= ~GENMASK(4, 2); 817e278c201SKever Yang val |= 0x4 << 2; 818e278c201SKever Yang writel(val, priv->mmio + (0x20 << 2)); 819e278c201SKever Yang 820e278c201SKever Yang /* Set up rx_trim: PLL LPF C1 85pf R1 1.25kohm */ 821e278c201SKever Yang val = 0x4c; 822e278c201SKever Yang writel(val, priv->mmio + (0x1b << 2)); 823e278c201SKever Yang 824e278c201SKever Yang /* Set up su_trim: T3 */ 825e278c201SKever Yang val = 0xb0; 826e278c201SKever Yang writel(val, priv->mmio + (0xa << 2)); 827e278c201SKever Yang val = 0x47; 828e278c201SKever Yang writel(val, priv->mmio + (0xb << 2)); 829e278c201SKever Yang val = 0x57; 830e278c201SKever Yang writel(val, priv->mmio + (0xd << 2)); 831e278c201SKever Yang } 832cf3c44cbSJon Lin 833cf3c44cbSJon Lin return 0; 834cf3c44cbSJon Lin } 835cf3c44cbSJon Lin 836cf3c44cbSJon Lin static const struct rockchip_combphy_grfcfg rk3588_combphy_grfcfgs = { 837cf3c44cbSJon Lin /* pipe-phy-grf */ 838cf3c44cbSJon Lin .pcie_mode_set = { 0x0000, 5, 0, 0x00, 0x11 }, 839cf3c44cbSJon Lin .usb_mode_set = { 0x0000, 5, 0, 0x00, 0x04 }, 840cf3c44cbSJon Lin .pipe_rxterm_set = { 0x0000, 12, 12, 0x00, 0x01 }, 841cf3c44cbSJon Lin .pipe_txelec_set = { 0x0004, 1, 1, 0x00, 0x01 }, 842cf3c44cbSJon Lin .pipe_txcomp_set = { 0x0004, 4, 4, 0x00, 0x01 }, 843cf3c44cbSJon Lin .pipe_clk_25m = { 0x0004, 14, 13, 0x00, 0x01 }, 844cf3c44cbSJon Lin .pipe_clk_100m = { 0x0004, 14, 13, 0x00, 0x02 }, 845cf3c44cbSJon Lin .pipe_rxterm_sel = { 0x0008, 8, 8, 0x00, 0x01 }, 846cf3c44cbSJon Lin .pipe_txelec_sel = { 0x0008, 12, 12, 0x00, 0x01 }, 847cf3c44cbSJon Lin .pipe_txcomp_sel = { 0x0008, 15, 15, 0x00, 0x01 }, 848cf3c44cbSJon Lin .pipe_clk_ext = { 0x000c, 9, 8, 0x02, 0x01 }, 849cf3c44cbSJon Lin .pipe_phy_status = { 0x0034, 6, 6, 0x01, 0x00 }, 850cf3c44cbSJon Lin .con0_for_pcie = { 0x0000, 15, 0, 0x00, 0x1000 }, 851cf3c44cbSJon Lin .con1_for_pcie = { 0x0004, 15, 0, 0x00, 0x0000 }, 852cf3c44cbSJon Lin .con2_for_pcie = { 0x0008, 15, 0, 0x00, 0x0101 }, 853cf3c44cbSJon Lin .con3_for_pcie = { 0x000c, 15, 0, 0x00, 0x0200 }, 854cf3c44cbSJon Lin .con0_for_sata = { 0x0000, 15, 0, 0x00, 0x0129 }, 855418dd88dSYifeng Zhao .con1_for_sata = { 0x0004, 15, 0, 0x00, 0x0000 }, 856cf3c44cbSJon Lin .con2_for_sata = { 0x0008, 15, 0, 0x00, 0x80c1 }, 857cf3c44cbSJon Lin .con3_for_sata = { 0x000c, 15, 0, 0x00, 0x0407 }, 858cf3c44cbSJon Lin /* pipe-grf */ 859cf3c44cbSJon Lin .pipe_con0_for_sata = { 0x0000, 11, 5, 0x00, 0x22 }, 860cf3c44cbSJon Lin .pipe_con1_for_sata = { 0x0000, 2, 0, 0x00, 0x2 }, 861cf3c44cbSJon Lin }; 862cf3c44cbSJon Lin 863cf3c44cbSJon Lin static const struct rockchip_combphy_cfg rk3588_combphy_cfgs = { 864cf3c44cbSJon Lin .grfcfg = &rk3588_combphy_grfcfgs, 865cf3c44cbSJon Lin .combphy_cfg = rk3588_combphy_cfg, 866cf3c44cbSJon Lin }; 867fc22f2adSWilliam Wu #endif 868cf3c44cbSJon Lin 869*3f21b61aSJon Lin 870*3f21b61aSJon Lin #ifdef CONFIG_ROCKCHIP_RK3576 871*3f21b61aSJon Lin static int rk3576_combphy_cfg(struct rockchip_combphy_priv *priv) 872*3f21b61aSJon Lin { 873*3f21b61aSJon Lin const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg; 874*3f21b61aSJon Lin u32 val; 875*3f21b61aSJon Lin 876*3f21b61aSJon Lin switch (priv->mode) { 877*3f21b61aSJon Lin case PHY_TYPE_PCIE: 878*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->con0_for_pcie, true); 879*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->con1_for_pcie, true); 880*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->con2_for_pcie, true); 881*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->con3_for_pcie, true); 882*3f21b61aSJon Lin break; 883*3f21b61aSJon Lin case PHY_TYPE_USB3: 884*3f21b61aSJon Lin /* Set SSC downward spread spectrum */ 885*3f21b61aSJon Lin val = readl(priv->mmio + (0x1f << 2)); 886*3f21b61aSJon Lin val &= ~GENMASK(5, 4); 887*3f21b61aSJon Lin val |= 0x01 << 4; 888*3f21b61aSJon Lin writel(val, priv->mmio + 0x7c); 889*3f21b61aSJon Lin 890*3f21b61aSJon Lin /* Enable adaptive CTLE for USB3.0 Rx */ 891*3f21b61aSJon Lin val = readl(priv->mmio + (0x0e << 2)); 892*3f21b61aSJon Lin val &= ~GENMASK(0, 0); 893*3f21b61aSJon Lin val |= 0x01; 894*3f21b61aSJon Lin writel(val, priv->mmio + (0x0e << 2)); 895*3f21b61aSJon Lin 896*3f21b61aSJon Lin /* Set PLL KVCO fine tuning signals */ 897*3f21b61aSJon Lin val = readl(priv->mmio + (0x20 << 2)); 898*3f21b61aSJon Lin val &= ~(0x7 << 2); 899*3f21b61aSJon Lin val |= 0x2 << 2; 900*3f21b61aSJon Lin writel(val, priv->mmio + (0x20 << 2)); 901*3f21b61aSJon Lin 902*3f21b61aSJon Lin /* Set PLL LPF R1 to su_trim[10:7]=1001 */ 903*3f21b61aSJon Lin writel(0x4, priv->mmio + (0xb << 2)); 904*3f21b61aSJon Lin 905*3f21b61aSJon Lin /* Set PLL input clock divider 1/2 */ 906*3f21b61aSJon Lin val = readl(priv->mmio + (0x5 << 2)); 907*3f21b61aSJon Lin val &= ~(0x3 << 6); 908*3f21b61aSJon Lin val |= 0x1 << 6; 909*3f21b61aSJon Lin writel(val, priv->mmio + (0x5 << 2)); 910*3f21b61aSJon Lin 911*3f21b61aSJon Lin /* Set PLL loop divider */ 912*3f21b61aSJon Lin writel(0x32, priv->mmio + (0x11 << 2)); 913*3f21b61aSJon Lin 914*3f21b61aSJon Lin /* Set PLL KVCO to min and set PLL charge pump current to max */ 915*3f21b61aSJon Lin writel(0xf0, priv->mmio + (0xa << 2)); 916*3f21b61aSJon Lin 917*3f21b61aSJon Lin /* Set Rx squelch input filler bandwidth */ 918*3f21b61aSJon Lin writel(0x0d, priv->mmio + (0x14 << 2)); 919*3f21b61aSJon Lin 920*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false); 921*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false); 922*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->usb_mode_set, true); 923*3f21b61aSJon Lin break; 924*3f21b61aSJon Lin case PHY_TYPE_SATA: 925*3f21b61aSJon Lin /* Enable adaptive CTLE for SATA Rx */ 926*3f21b61aSJon Lin val = readl(priv->mmio + (0x0e << 2)); 927*3f21b61aSJon Lin val &= ~GENMASK(0, 0); 928*3f21b61aSJon Lin val |= 0x01; 929*3f21b61aSJon Lin writel(val, priv->mmio + (0x0e << 2)); 930*3f21b61aSJon Lin /* Set tx_rterm = 50 ohm and rx_rterm = 43.5 ohm */ 931*3f21b61aSJon Lin writel(0x8F, priv->mmio + (0x06 << 2)); 932*3f21b61aSJon Lin 933*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->con0_for_sata, true); 934*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->con1_for_sata, true); 935*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->con2_for_sata, true); 936*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->con3_for_sata, true); 937*3f21b61aSJon Lin param_write(priv->pipe_grf, &cfg->pipe_con0_for_sata, true); 938*3f21b61aSJon Lin param_write(priv->pipe_grf, &cfg->pipe_con1_for_sata, true); 939*3f21b61aSJon Lin break; 940*3f21b61aSJon Lin case PHY_TYPE_SGMII: 941*3f21b61aSJon Lin case PHY_TYPE_QSGMII: 942*3f21b61aSJon Lin default: 943*3f21b61aSJon Lin dev_err(priv->dev, "incompatible PHY type\n"); 944*3f21b61aSJon Lin return -EINVAL; 945*3f21b61aSJon Lin } 946*3f21b61aSJon Lin 947*3f21b61aSJon Lin /* 100MHz refclock signal is good */ 948*3f21b61aSJon Lin clk_set_rate(&priv->ref_clk, 100000000); 949*3f21b61aSJon Lin param_write(priv->phy_grf, &cfg->pipe_clk_100m, true); 950*3f21b61aSJon Lin if (priv->mode == PHY_TYPE_PCIE) { 951*3f21b61aSJon Lin /* gate_tx_pck_sel length select work for L1SS */ 952*3f21b61aSJon Lin writel(0xc0, priv->mmio + 0x74); 953*3f21b61aSJon Lin 954*3f21b61aSJon Lin /* PLL KVCO tuning fine */ 955*3f21b61aSJon Lin val = readl(priv->mmio + (0x20 << 2)); 956*3f21b61aSJon Lin val &= ~(0x7 << 2); 957*3f21b61aSJon Lin val |= 0x2 << 2; 958*3f21b61aSJon Lin writel(val, priv->mmio + (0x20 << 2)); 959*3f21b61aSJon Lin 960*3f21b61aSJon Lin /* Set up rx_trim: PLL LPF C1 85pf R1 1.25kohm */ 961*3f21b61aSJon Lin writel(0x4c, priv->mmio + (0x1b << 2)); 962*3f21b61aSJon Lin 963*3f21b61aSJon Lin /* Set up su_trim: T3_P1 650mv */ 964*3f21b61aSJon Lin writel(0x90, priv->mmio + (0xa << 2)); 965*3f21b61aSJon Lin writel(0x43, priv->mmio + (0xb << 2)); 966*3f21b61aSJon Lin writel(0x88, priv->mmio + (0xc << 2)); 967*3f21b61aSJon Lin writel(0x56, priv->mmio + (0xd << 2)); 968*3f21b61aSJon Lin } 969*3f21b61aSJon Lin 970*3f21b61aSJon Lin return 0; 971*3f21b61aSJon Lin } 972*3f21b61aSJon Lin 973*3f21b61aSJon Lin static const struct rockchip_combphy_grfcfg rk3576_combphy_grfcfgs = { 974*3f21b61aSJon Lin /* pipe-phy-grf */ 975*3f21b61aSJon Lin .pcie_mode_set = { 0x0000, 5, 0, 0x00, 0x11 }, 976*3f21b61aSJon Lin .usb_mode_set = { 0x0000, 5, 0, 0x00, 0x04 }, 977*3f21b61aSJon Lin .pipe_rxterm_set = { 0x0000, 12, 12, 0x00, 0x01 }, 978*3f21b61aSJon Lin .pipe_txelec_set = { 0x0004, 1, 1, 0x00, 0x01 }, 979*3f21b61aSJon Lin .pipe_txcomp_set = { 0x0004, 4, 4, 0x00, 0x01 }, 980*3f21b61aSJon Lin .pipe_clk_24m = { 0x0004, 14, 13, 0x00, 0x00 }, 981*3f21b61aSJon Lin .pipe_clk_25m = { 0x0004, 14, 13, 0x00, 0x01 }, 982*3f21b61aSJon Lin .pipe_clk_100m = { 0x0004, 14, 13, 0x00, 0x02 }, 983*3f21b61aSJon Lin .pipe_phymode_sel = { 0x0008, 1, 1, 0x00, 0x01 }, 984*3f21b61aSJon Lin .pipe_rate_sel = { 0x0008, 2, 2, 0x00, 0x01 }, 985*3f21b61aSJon Lin .pipe_rxterm_sel = { 0x0008, 8, 8, 0x00, 0x01 }, 986*3f21b61aSJon Lin .pipe_txelec_sel = { 0x0008, 12, 12, 0x00, 0x01 }, 987*3f21b61aSJon Lin .pipe_txcomp_sel = { 0x0008, 15, 15, 0x00, 0x01 }, 988*3f21b61aSJon Lin .pipe_clk_ext = { 0x000c, 9, 8, 0x02, 0x01 }, 989*3f21b61aSJon Lin .pipe_phy_status = { 0x0034, 6, 6, 0x01, 0x00 }, 990*3f21b61aSJon Lin .con0_for_pcie = { 0x0000, 15, 0, 0x00, 0x1000 }, 991*3f21b61aSJon Lin .con1_for_pcie = { 0x0004, 15, 0, 0x00, 0x0000 }, 992*3f21b61aSJon Lin .con2_for_pcie = { 0x0008, 15, 0, 0x00, 0x0101 }, 993*3f21b61aSJon Lin .con3_for_pcie = { 0x000c, 15, 0, 0x00, 0x0200 }, 994*3f21b61aSJon Lin .con0_for_sata = { 0x0000, 15, 0, 0x00, 0x0129 }, 995*3f21b61aSJon Lin .con1_for_sata = { 0x0004, 15, 0, 0x00, 0x0000 }, 996*3f21b61aSJon Lin .con2_for_sata = { 0x0008, 15, 0, 0x00, 0x80c1 }, 997*3f21b61aSJon Lin .con3_for_sata = { 0x000c, 15, 0, 0x00, 0x0407 }, 998*3f21b61aSJon Lin .pipe_phy_grf_reset = { 0x0014, 1, 0, 0x3, 0x1 }, 999*3f21b61aSJon Lin /* php-grf */ 1000*3f21b61aSJon Lin .pipe_con0_for_sata = { 0x001C, 2, 0, 0x00, 0x2 }, 1001*3f21b61aSJon Lin .pipe_con1_for_sata = { 0x0020, 2, 0, 0x00, 0x2 }, 1002*3f21b61aSJon Lin .u3otg1_port_en = { 0x0038, 15, 0, 0x0181, 0x1100 }, 1003*3f21b61aSJon Lin }; 1004*3f21b61aSJon Lin 1005*3f21b61aSJon Lin static const struct rockchip_combphy_cfg rk3576_combphy_cfgs = { 1006*3f21b61aSJon Lin .grfcfg = &rk3576_combphy_grfcfgs, 1007*3f21b61aSJon Lin .combphy_cfg = rk3576_combphy_cfg, 1008*3f21b61aSJon Lin }; 1009*3f21b61aSJon Lin #endif 1010*3f21b61aSJon Lin 1011925c5749SYifeng Zhao static const struct udevice_id rockchip_combphy_ids[] = { 1012fc22f2adSWilliam Wu #ifdef CONFIG_ROCKCHIP_RK3528 1013925c5749SYifeng Zhao { 10143452d642SJianwei Zheng .compatible = "rockchip,rk3528-naneng-combphy", 10153452d642SJianwei Zheng .data = (ulong)&rk3528_combphy_cfgs 10163452d642SJianwei Zheng }, 1017fc22f2adSWilliam Wu #endif 1018fc22f2adSWilliam Wu #ifdef CONFIG_ROCKCHIP_RK3562 10193452d642SJianwei Zheng { 1020885c5d5dSFrank Wang .compatible = "rockchip,rk3562-naneng-combphy", 1021885c5d5dSFrank Wang .data = (ulong)&rk3562_combphy_cfgs 1022885c5d5dSFrank Wang }, 1023fc22f2adSWilliam Wu #endif 1024fc22f2adSWilliam Wu #ifdef CONFIG_ROCKCHIP_RK3568 1025885c5d5dSFrank Wang { 1026925c5749SYifeng Zhao .compatible = "rockchip,rk3568-naneng-combphy", 1027925c5749SYifeng Zhao .data = (ulong)&rk3568_combphy_cfgs 1028925c5749SYifeng Zhao }, 1029fc22f2adSWilliam Wu #endif 1030fc22f2adSWilliam Wu #ifdef CONFIG_ROCKCHIP_RK3588 1031cf3c44cbSJon Lin { 1032cf3c44cbSJon Lin .compatible = "rockchip,rk3588-naneng-combphy", 1033cf3c44cbSJon Lin .data = (ulong)&rk3588_combphy_cfgs 1034cf3c44cbSJon Lin }, 1035fc22f2adSWilliam Wu #endif 1036*3f21b61aSJon Lin #ifdef CONFIG_ROCKCHIP_RK3576 1037*3f21b61aSJon Lin { 1038*3f21b61aSJon Lin .compatible = "rockchip,rk3576-naneng-combphy", 1039*3f21b61aSJon Lin .data = (ulong)&rk3576_combphy_cfgs 1040*3f21b61aSJon Lin }, 1041*3f21b61aSJon Lin #endif 1042925c5749SYifeng Zhao { } 1043925c5749SYifeng Zhao }; 1044925c5749SYifeng Zhao 1045925c5749SYifeng Zhao U_BOOT_DRIVER(rockchip_naneng_combphy) = { 1046925c5749SYifeng Zhao .name = "naneng-combphy", 1047925c5749SYifeng Zhao .id = UCLASS_PHY, 1048925c5749SYifeng Zhao .of_match = rockchip_combphy_ids, 1049925c5749SYifeng Zhao .ops = &rochchip_combphy_ops, 1050925c5749SYifeng Zhao .probe = rockchip_combphy_probe, 1051925c5749SYifeng Zhao .priv_auto_alloc_size = sizeof(struct rockchip_combphy_priv), 1052925c5749SYifeng Zhao }; 1053