net: phy: realtek: add support for RTL8211F(D)(I)-VD-CG
authorClark Wang <xiaoning.wang@nxp.com>
Wed, 17 Aug 2022 01:36:18 +0000 (09:36 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 22 Aug 2022 11:47:18 +0000 (12:47 +0100)
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 <xiaoning.wang@nxp.com>
Signed-off-by: Wei Fang <wei.fang@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/realtek.c

index a5671ab..3d99fd6 100644 (file)
@@ -70,6 +70,7 @@
 #define RTLGEN_SPEED_MASK                      0x0630
 
 #define RTL_GENERIC_PHYID                      0x001cc800
+#define RTL_8211FVD_PHYID                      0x001cc878
 
 MODULE_DESCRIPTION("Realtek PHY driver");
 MODULE_AUTHOR("Johnson Leung");
@@ -78,6 +79,7 @@ MODULE_LICENSE("GPL");
 struct rtl821x_priv {
        u16 phycr1;
        u16 phycr2;
+       bool has_phycr2;
 };
 
 static int rtl821x_read_page(struct phy_device *phydev)
@@ -94,6 +96,7 @@ static int rtl821x_probe(struct phy_device *phydev)
 {
        struct device *dev = &phydev->mdio.dev;
        struct rtl821x_priv *priv;
+       u32 phy_id = phydev->drv->phy_id;
        int ret;
 
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -108,13 +111,16 @@ static int rtl821x_probe(struct phy_device *phydev)
        if (of_property_read_bool(dev->of_node, "realtek,aldps-enable"))
                priv->phycr1 |= RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF;
 
-       ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2);
-       if (ret < 0)
-               return ret;
+       priv->has_phycr2 = !(phy_id == RTL_8211FVD_PHYID);
+       if (priv->has_phycr2) {
+               ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2);
+               if (ret < 0)
+                       return ret;
 
-       priv->phycr2 = ret & RTL8211F_CLKOUT_EN;
-       if (of_property_read_bool(dev->of_node, "realtek,clkout-disable"))
-               priv->phycr2 &= ~RTL8211F_CLKOUT_EN;
+               priv->phycr2 = ret & RTL8211F_CLKOUT_EN;
+               if (of_property_read_bool(dev->of_node, "realtek,clkout-disable"))
+                       priv->phycr2 &= ~RTL8211F_CLKOUT_EN;
+       }
 
        phydev->priv = priv;
 
@@ -400,12 +406,14 @@ static int rtl8211f_config_init(struct phy_device *phydev)
                        val_rxdly ? "enabled" : "disabled");
        }
 
-       ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2,
-                              RTL8211F_CLKOUT_EN, priv->phycr2);
-       if (ret < 0) {
-               dev_err(dev, "clkout configuration failed: %pe\n",
-                       ERR_PTR(ret));
-               return ret;
+       if (priv->has_phycr2) {
+               ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2,
+                                      RTL8211F_CLKOUT_EN, priv->phycr2);
+               if (ret < 0) {
+                       dev_err(dev, "clkout configuration failed: %pe\n",
+                               ERR_PTR(ret));
+                       return ret;
+               }
        }
 
        return genphy_soft_reset(phydev);
@@ -924,6 +932,18 @@ static struct phy_driver realtek_drvs[] = {
                .read_page      = rtl821x_read_page,
                .write_page     = rtl821x_write_page,
        }, {
+               PHY_ID_MATCH_EXACT(RTL_8211FVD_PHYID),
+               .name           = "RTL8211F-VD Gigabit Ethernet",
+               .probe          = rtl821x_probe,
+               .config_init    = &rtl8211f_config_init,
+               .read_status    = rtlgen_read_status,
+               .config_intr    = &rtl8211f_config_intr,
+               .handle_interrupt = rtl8211f_handle_interrupt,
+               .suspend        = genphy_suspend,
+               .resume         = rtl821x_resume,
+               .read_page      = rtl821x_read_page,
+               .write_page     = rtl821x_write_page,
+       }, {
                .name           = "Generic FE-GE Realtek PHY",
                .match_phy_device = rtlgen_match_phy_device,
                .read_status    = rtlgen_read_status,