.. | .. |
---|
287 | 287 | return 0; |
---|
288 | 288 | } |
---|
289 | 289 | |
---|
| 290 | +static const char *rockchip_combphy_mode2str(enum phy_mode mode) |
---|
| 291 | +{ |
---|
| 292 | + switch (mode) { |
---|
| 293 | + case PHY_TYPE_SATA: |
---|
| 294 | + return "SATA"; |
---|
| 295 | + case PHY_TYPE_PCIE: |
---|
| 296 | + return "PCIe"; |
---|
| 297 | + case PHY_TYPE_USB3: |
---|
| 298 | + return "USB3"; |
---|
| 299 | + case PHY_TYPE_SGMII: |
---|
| 300 | + case PHY_TYPE_QSGMII: |
---|
| 301 | + return "GMII"; |
---|
| 302 | + default: |
---|
| 303 | + return "Unknown"; |
---|
| 304 | + } |
---|
| 305 | +} |
---|
| 306 | + |
---|
| 307 | +static int rockchip_combphy_validate(struct phy *phy, enum phy_mode mode, int submode, |
---|
| 308 | + union phy_configure_opts *opts) |
---|
| 309 | +{ |
---|
| 310 | + struct rockchip_combphy_priv *priv = phy_get_drvdata(phy); |
---|
| 311 | + |
---|
| 312 | + if (mode != priv->mode) { |
---|
| 313 | + dev_err(priv->dev, "expected mode is %s, but current mode is %s\n", |
---|
| 314 | + rockchip_combphy_mode2str(mode), |
---|
| 315 | + rockchip_combphy_mode2str(priv->mode)); |
---|
| 316 | + return -EINVAL; |
---|
| 317 | + } |
---|
| 318 | + |
---|
| 319 | + return 0; |
---|
| 320 | +} |
---|
| 321 | + |
---|
290 | 322 | static const struct phy_ops rochchip_combphy_ops = { |
---|
291 | 323 | .init = rockchip_combphy_init, |
---|
292 | 324 | .exit = rockchip_combphy_exit, |
---|
| 325 | + .validate = rockchip_combphy_validate, |
---|
293 | 326 | .owner = THIS_MODULE, |
---|
294 | 327 | }; |
---|
295 | 328 | |
---|
.. | .. |
---|
482 | 515 | val &= ~GENMASK(17, 17); |
---|
483 | 516 | val |= 0x01 << 17; |
---|
484 | 517 | writel(val, priv->mmio + 0x200); |
---|
| 518 | + |
---|
| 519 | + /* Set slow slew rate control for PI */ |
---|
| 520 | + val = readl(priv->mmio + 0x204); |
---|
| 521 | + val &= ~GENMASK(2, 0); |
---|
| 522 | + val |= 0x07; |
---|
| 523 | + writel(val, priv->mmio + 0x204); |
---|
| 524 | + |
---|
| 525 | + /* Set CDR phase path with 2x gain */ |
---|
| 526 | + val = readl(priv->mmio + 0x204); |
---|
| 527 | + val &= ~GENMASK(5, 5); |
---|
| 528 | + val |= 0x01 << 5; |
---|
| 529 | + writel(val, priv->mmio + 0x204); |
---|
485 | 530 | |
---|
486 | 531 | /* Set Rx squelch input filler bandwidth */ |
---|
487 | 532 | val = readl(priv->mmio + 0x20c); |
---|
.. | .. |
---|
697 | 742 | /* CKDRV output swing adjust to 650mv */ |
---|
698 | 743 | val = readl(priv->mmio + (0xd << 2)); |
---|
699 | 744 | val &= ~(0xf << 1); |
---|
700 | | - val |= 0xb; |
---|
| 745 | + val |= (0xb << 1); |
---|
701 | 746 | writel(val, priv->mmio + (0xd << 2)); |
---|
702 | 747 | } |
---|
703 | 748 | break; |
---|