Skip to content

Commit bb726b7

Browse files
wangxiaoningnxpdavem330
authored andcommitted
net: phy: realtek: add support for RTL8211F(D)(I)-VD-CG
RTL8211F(D)(I)-VD-CG is the pin-to-pin upgrade chip from RTL8211F(D)(I)-CG. Add new PHY ID for this chip. It does not support RTL8211F_PHYCR2 anymore, so remove the w/r operation of this register. Signed-off-by: Clark Wang <[email protected]> Signed-off-by: Wei Fang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent de43708 commit bb726b7

File tree

1 file changed

+32
-12
lines changed

1 file changed

+32
-12
lines changed

drivers/net/phy/realtek.c

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
#define RTLGEN_SPEED_MASK 0x0630
7171

7272
#define RTL_GENERIC_PHYID 0x001cc800
73+
#define RTL_8211FVD_PHYID 0x001cc878
7374

7475
MODULE_DESCRIPTION("Realtek PHY driver");
7576
MODULE_AUTHOR("Johnson Leung");
@@ -78,6 +79,7 @@ MODULE_LICENSE("GPL");
7879
struct rtl821x_priv {
7980
u16 phycr1;
8081
u16 phycr2;
82+
bool has_phycr2;
8183
};
8284

8385
static int rtl821x_read_page(struct phy_device *phydev)
@@ -94,6 +96,7 @@ static int rtl821x_probe(struct phy_device *phydev)
9496
{
9597
struct device *dev = &phydev->mdio.dev;
9698
struct rtl821x_priv *priv;
99+
u32 phy_id = phydev->drv->phy_id;
97100
int ret;
98101

99102
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -108,13 +111,16 @@ static int rtl821x_probe(struct phy_device *phydev)
108111
if (of_property_read_bool(dev->of_node, "realtek,aldps-enable"))
109112
priv->phycr1 |= RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF;
110113

111-
ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2);
112-
if (ret < 0)
113-
return ret;
114+
priv->has_phycr2 = !(phy_id == RTL_8211FVD_PHYID);
115+
if (priv->has_phycr2) {
116+
ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2);
117+
if (ret < 0)
118+
return ret;
114119

115-
priv->phycr2 = ret & RTL8211F_CLKOUT_EN;
116-
if (of_property_read_bool(dev->of_node, "realtek,clkout-disable"))
117-
priv->phycr2 &= ~RTL8211F_CLKOUT_EN;
120+
priv->phycr2 = ret & RTL8211F_CLKOUT_EN;
121+
if (of_property_read_bool(dev->of_node, "realtek,clkout-disable"))
122+
priv->phycr2 &= ~RTL8211F_CLKOUT_EN;
123+
}
118124

119125
phydev->priv = priv;
120126

@@ -400,12 +406,14 @@ static int rtl8211f_config_init(struct phy_device *phydev)
400406
val_rxdly ? "enabled" : "disabled");
401407
}
402408

403-
ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2,
404-
RTL8211F_CLKOUT_EN, priv->phycr2);
405-
if (ret < 0) {
406-
dev_err(dev, "clkout configuration failed: %pe\n",
407-
ERR_PTR(ret));
408-
return ret;
409+
if (priv->has_phycr2) {
410+
ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2,
411+
RTL8211F_CLKOUT_EN, priv->phycr2);
412+
if (ret < 0) {
413+
dev_err(dev, "clkout configuration failed: %pe\n",
414+
ERR_PTR(ret));
415+
return ret;
416+
}
409417
}
410418

411419
return genphy_soft_reset(phydev);
@@ -923,6 +931,18 @@ static struct phy_driver realtek_drvs[] = {
923931
.resume = rtl821x_resume,
924932
.read_page = rtl821x_read_page,
925933
.write_page = rtl821x_write_page,
934+
}, {
935+
PHY_ID_MATCH_EXACT(RTL_8211FVD_PHYID),
936+
.name = "RTL8211F-VD Gigabit Ethernet",
937+
.probe = rtl821x_probe,
938+
.config_init = &rtl8211f_config_init,
939+
.read_status = rtlgen_read_status,
940+
.config_intr = &rtl8211f_config_intr,
941+
.handle_interrupt = rtl8211f_handle_interrupt,
942+
.suspend = genphy_suspend,
943+
.resume = rtl821x_resume,
944+
.read_page = rtl821x_read_page,
945+
.write_page = rtl821x_write_page,
926946
}, {
927947
.name = "Generic FE-GE Realtek PHY",
928948
.match_phy_device = rtlgen_match_phy_device,

0 commit comments

Comments
 (0)