Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'add-support-for-vsc85xx-dt-rgmii-delays'

Harini Katakam says:

====================
Add support for VSC85xx DT RGMII delays

Provide an option to change RGMII delay value via devicetree.
====================

Link: https://lore.kernel.org/r/20230529122017.10620-1-harini.katakam@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+31 -21
+1
drivers/net/phy/mscc/mscc.h
··· 292 292 #define PHY_ID_VSC8575 0x000707d0 293 293 #define PHY_ID_VSC8582 0x000707b0 294 294 #define PHY_ID_VSC8584 0x000707c0 295 + #define PHY_VENDOR_MSCC 0x00070400 295 296 296 297 #define MSCC_VDDMAC_1500 1500 297 298 #define MSCC_VDDMAC_1800 1800
+30 -21
drivers/net/phy/mscc/mscc_main.c
··· 107 107 }; 108 108 #endif 109 109 110 + static const int vsc85xx_internal_delay[] = {200, 800, 1100, 1700, 2000, 2300, 111 + 2600, 3400}; 112 + 110 113 static int vsc85xx_phy_read_page(struct phy_device *phydev) 111 114 { 112 115 return __phy_read(phydev, MSCC_EXT_PAGE_ACCESS); ··· 528 525 { 529 526 u16 rgmii_rx_delay_pos = ffs(rgmii_rx_delay_mask) - 1; 530 527 u16 rgmii_tx_delay_pos = ffs(rgmii_tx_delay_mask) - 1; 528 + int delay_size = ARRAY_SIZE(vsc85xx_internal_delay); 529 + struct device *dev = &phydev->mdio.dev; 531 530 u16 reg_val = 0; 532 531 u16 mask = 0; 532 + s32 rx_delay; 533 + s32 tx_delay; 533 534 int rc = 0; 534 535 535 536 /* For traffic to pass, the VSC8502 family needs the RX_CLK disable bit ··· 548 541 if (phy_interface_is_rgmii(phydev)) 549 542 mask |= rgmii_rx_delay_mask | rgmii_tx_delay_mask; 550 543 551 - if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID || 552 - phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) 553 - reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_rx_delay_pos; 554 - if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID || 555 - phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) 556 - reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_tx_delay_pos; 544 + rx_delay = phy_get_internal_delay(phydev, dev, vsc85xx_internal_delay, 545 + delay_size, true); 546 + if (rx_delay < 0) { 547 + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID || 548 + phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) 549 + rx_delay = RGMII_CLK_DELAY_2_0_NS; 550 + else 551 + rx_delay = RGMII_CLK_DELAY_0_2_NS; 552 + } 553 + 554 + tx_delay = phy_get_internal_delay(phydev, dev, vsc85xx_internal_delay, 555 + delay_size, false); 556 + if (tx_delay < 0) { 557 + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID || 558 + phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) 559 + rx_delay = RGMII_CLK_DELAY_2_0_NS; 560 + else 561 + rx_delay = RGMII_CLK_DELAY_0_2_NS; 562 + } 563 + 564 + reg_val |= rx_delay << rgmii_rx_delay_pos; 565 + reg_val |= tx_delay << rgmii_tx_delay_pos; 557 566 558 567 if (mask) 559 568 rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED_2, ··· 2701 2678 module_phy_driver(vsc85xx_driver); 2702 2679 2703 2680 static struct mdio_device_id __maybe_unused vsc85xx_tbl[] = { 2704 - { PHY_ID_VSC8501, 0xfffffff0, }, 2705 - { PHY_ID_VSC8502, 0xfffffff0, }, 2706 - { PHY_ID_VSC8504, 0xfffffff0, }, 2707 - { PHY_ID_VSC8514, 0xfffffff0, }, 2708 - { PHY_ID_VSC8530, 0xfffffff0, }, 2709 - { PHY_ID_VSC8531, 0xfffffff0, }, 2710 - { PHY_ID_VSC8540, 0xfffffff0, }, 2711 - { PHY_ID_VSC8541, 0xfffffff0, }, 2712 - { PHY_ID_VSC8552, 0xfffffff0, }, 2713 - { PHY_ID_VSC856X, 0xfffffff0, }, 2714 - { PHY_ID_VSC8572, 0xfffffff0, }, 2715 - { PHY_ID_VSC8574, 0xfffffff0, }, 2716 - { PHY_ID_VSC8575, 0xfffffff0, }, 2717 - { PHY_ID_VSC8582, 0xfffffff0, }, 2718 - { PHY_ID_VSC8584, 0xfffffff0, }, 2681 + { PHY_ID_MATCH_VENDOR(PHY_VENDOR_MSCC) }, 2719 2682 { } 2720 2683 }; 2721 2684