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

net: phy: microchip_t1: add lan87xx_config_rgmii_delay for lan87xx phy

Add a function to initialize phy rgmii delay according to phydev->interface.

Signed-off-by: Yuiko Oshino <yuiko.oshino@microchip.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://lore.kernel.org/r/20211101162119.29275-1-yuiko.oshino@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Yuiko Oshino and committed by
Jakub Kicinski
26499499 cc0356d6

+43 -1
+43 -1
drivers/net/phy/microchip_t1.c
··· 28 28 #define LAN87XX_MASK_LINK_UP (0x0004) 29 29 #define LAN87XX_MASK_LINK_DOWN (0x0002) 30 30 31 + /* MISC Control 1 Register */ 32 + #define LAN87XX_CTRL_1 (0x11) 33 + #define LAN87XX_MASK_RGMII_TXC_DLY_EN (0x4000) 34 + #define LAN87XX_MASK_RGMII_RXC_DLY_EN (0x2000) 35 + 31 36 /* phyaccess nested types */ 32 37 #define PHYACC_ATTR_MODE_READ 0 33 38 #define PHYACC_ATTR_MODE_WRITE 1 ··· 117 112 return rc; 118 113 } 119 114 115 + static int lan87xx_config_rgmii_delay(struct phy_device *phydev) 116 + { 117 + int rc; 118 + 119 + if (!phy_interface_is_rgmii(phydev)) 120 + return 0; 121 + 122 + rc = access_ereg(phydev, PHYACC_ATTR_MODE_READ, 123 + PHYACC_ATTR_BANK_MISC, LAN87XX_CTRL_1, 0); 124 + if (rc < 0) 125 + return rc; 126 + 127 + switch (phydev->interface) { 128 + case PHY_INTERFACE_MODE_RGMII: 129 + rc &= ~LAN87XX_MASK_RGMII_TXC_DLY_EN; 130 + rc &= ~LAN87XX_MASK_RGMII_RXC_DLY_EN; 131 + break; 132 + case PHY_INTERFACE_MODE_RGMII_ID: 133 + rc |= LAN87XX_MASK_RGMII_TXC_DLY_EN; 134 + rc |= LAN87XX_MASK_RGMII_RXC_DLY_EN; 135 + break; 136 + case PHY_INTERFACE_MODE_RGMII_RXID: 137 + rc &= ~LAN87XX_MASK_RGMII_TXC_DLY_EN; 138 + rc |= LAN87XX_MASK_RGMII_RXC_DLY_EN; 139 + break; 140 + case PHY_INTERFACE_MODE_RGMII_TXID: 141 + rc |= LAN87XX_MASK_RGMII_TXC_DLY_EN; 142 + rc &= ~LAN87XX_MASK_RGMII_RXC_DLY_EN; 143 + break; 144 + default: 145 + return 0; 146 + } 147 + 148 + return access_ereg(phydev, PHYACC_ATTR_MODE_WRITE, 149 + PHYACC_ATTR_BANK_MISC, LAN87XX_CTRL_1, rc); 150 + } 151 + 120 152 static int lan87xx_phy_init(struct phy_device *phydev) 121 153 { 122 154 static const struct access_ereg_val init[] = { ··· 227 185 return rc; 228 186 } 229 187 230 - return 0; 188 + return lan87xx_config_rgmii_delay(phydev); 231 189 } 232 190 233 191 static int lan87xx_phy_config_intr(struct phy_device *phydev)