Skip to content

Commit 1a21101

Browse files
Raju Lakkarajudavem330
authored andcommitted
net: phy: Add MAC-IF driver for Microsemi PHYs.
All the review comments updated and resending for review. This is MAC interface feature. Microsemi PHY can support RGMII, RMII or GMII/MII interface between MAC and PHY. MAC-IF function program the right value based on Device tree configuration. Tested on Beaglebone Black with VSC 8531 PHY. Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microsemi.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 1a9234e commit 1a21101

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

drivers/net/phy/mscc.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ enum rgmii_rx_clock_delay {
2323
RGMII_RX_CLK_DELAY_3_4_NS = 7
2424
};
2525

26+
/* Microsemi VSC85xx PHY registers */
27+
/* IEEE 802. Std Registers */
28+
#define MSCC_PHY_EXT_PHY_CNTL_1 23
29+
#define MAC_IF_SELECTION_MASK 0x1800
30+
#define MAC_IF_SELECTION_GMII 0
31+
#define MAC_IF_SELECTION_RMII 1
32+
#define MAC_IF_SELECTION_RGMII 2
33+
#define MAC_IF_SELECTION_POS 11
34+
#define FAR_END_LOOPBACK_MODE_MASK 0x0008
35+
2636
#define MII_VSC85XX_INT_MASK 25
2737
#define MII_VSC85XX_INT_MASK_MASK 0xa000
2838
#define MII_VSC85XX_INT_STATUS 26
@@ -48,6 +58,42 @@ static int vsc85xx_phy_page_set(struct phy_device *phydev, u8 page)
4858
return rc;
4959
}
5060

61+
static int vsc85xx_mac_if_set(struct phy_device *phydev,
62+
phy_interface_t interface)
63+
{
64+
int rc;
65+
u16 reg_val;
66+
67+
mutex_lock(&phydev->lock);
68+
reg_val = phy_read(phydev, MSCC_PHY_EXT_PHY_CNTL_1);
69+
reg_val &= ~(MAC_IF_SELECTION_MASK);
70+
switch (interface) {
71+
case PHY_INTERFACE_MODE_RGMII:
72+
reg_val |= (MAC_IF_SELECTION_RGMII << MAC_IF_SELECTION_POS);
73+
break;
74+
case PHY_INTERFACE_MODE_RMII:
75+
reg_val |= (MAC_IF_SELECTION_RMII << MAC_IF_SELECTION_POS);
76+
break;
77+
case PHY_INTERFACE_MODE_MII:
78+
case PHY_INTERFACE_MODE_GMII:
79+
reg_val |= (MAC_IF_SELECTION_GMII << MAC_IF_SELECTION_POS);
80+
break;
81+
default:
82+
rc = -EINVAL;
83+
goto out_unlock;
84+
}
85+
rc = phy_write(phydev, MSCC_PHY_EXT_PHY_CNTL_1, reg_val);
86+
if (rc != 0)
87+
goto out_unlock;
88+
89+
rc = genphy_soft_reset(phydev);
90+
91+
out_unlock:
92+
mutex_unlock(&phydev->lock);
93+
94+
return rc;
95+
}
96+
5197
static int vsc85xx_default_config(struct phy_device *phydev)
5298
{
5399
int rc;
@@ -77,6 +123,11 @@ static int vsc85xx_config_init(struct phy_device *phydev)
77123
rc = vsc85xx_default_config(phydev);
78124
if (rc)
79125
return rc;
126+
127+
rc = vsc85xx_mac_if_set(phydev, phydev->interface);
128+
if (rc)
129+
return rc;
130+
80131
rc = genphy_config_init(phydev);
81132

82133
return rc;

0 commit comments

Comments
 (0)