]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: phy: motorcomm: Add YT8522 100M RMII PHY support
authorMinda Chen <minda.chen@starfivetech.com>
Fri, 5 Jun 2026 06:02:12 +0000 (14:02 +0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 10 Jun 2026 00:31:20 +0000 (17:31 -0700)
Add YT8522 100M RMII ethernet PHY base driver support, including
PHY ID and base config init function.

Signed-off-by: Minda Chen <minda.chen@starfivetech.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20260605060212.41895-4-minda.chen@starfivetech.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/motorcomm.c

index dcba50007451042b800c55ddc332c1c8a137e006..5071605a1a117a859c989701e5688eb632bff02a 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- * Motorcomm 8511/8521/8531/8531S/8821 PHY driver.
+ * Motorcomm 8511/8521/8522/8531/8531S/8821 PHY driver.
  *
  * Author: Peter Geis <pgwipeout@gmail.com>
  * Author: Frank <Frank.Sae@motor-comm.com>
@@ -14,6 +14,7 @@
 
 #define PHY_ID_YT8511          0x0000010a
 #define PHY_ID_YT8521          0x0000011a
+#define PHY_ID_YT8522          0x4f51e928
 #define PHY_ID_YT8531          0x4f51e91b
 #define PHY_ID_YT8531S         0x4f51e91a
 #define PHY_ID_YT8821          0x4f51ea19
 #define YT8521_LED_100_ON_EN                   BIT(5)
 #define YT8521_LED_10_ON_EN                    BIT(4)
 
+#define YT8522_EXTREG_SLEEP_CONTROL            0x2027
+#define YT8522_EN_SLEEP_SW                     BIT(15)
+
+#define YT8522_EXTENDED_COMBO_CTRL             0x4000
+#define YT8522_RXDV_SEL                                BIT(4)
+#define YT8522_RMII_EN                         BIT(1)
+
 #define YTPHY_MISC_CONFIG_REG                  0xA006
 #define YTPHY_MCR_FIBER_SPEED_MASK             BIT(0)
 #define YTPHY_MCR_FIBER_1000BX                 (0x1 << 0)
@@ -1842,6 +1850,36 @@ static int yt8531_config_init(struct phy_device *phydev)
        return 0;
 }
 
+static int yt8522_config_init(struct phy_device *phydev)
+{
+       struct device *dev = &phydev->mdio.dev;
+       int ret, val;
+
+       val = ytphy_read_ext_with_lock(phydev, YT8522_EXTENDED_COMBO_CTRL);
+       if (val < 0)
+               return val;
+
+       if (val & YT8522_RMII_EN) {
+               val |= YT8522_RXDV_SEL;
+               ret = ytphy_write_ext_with_lock(phydev,
+                                               YT8522_EXTENDED_COMBO_CTRL,
+                                               val);
+               if (ret < 0)
+                       return ret;
+       }
+
+       if (device_property_read_bool(dev, "motorcomm,auto-sleep-disabled")) {
+               /* disable auto sleep */
+               ret = ytphy_modify_ext_with_lock(phydev,
+                                                YT8522_EXTREG_SLEEP_CONTROL,
+                                                YT8522_EN_SLEEP_SW, 0);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return 0;
+}
+
 /**
  * yt8531_link_change_notify() - Adjust the tx clock direction according to
  * the current speed and dts config.
@@ -3051,6 +3089,14 @@ static struct phy_driver motorcomm_phy_drvs[] = {
                .led_hw_control_set = yt8521_led_hw_control_set,
                .led_hw_control_get = yt8521_led_hw_control_get,
        },
+       {
+               PHY_ID_MATCH_EXACT(PHY_ID_YT8522),
+               .name           = "YT8522 100 Megabit Ethernet",
+               .config_aneg    = genphy_config_aneg,
+               .config_init    = yt8522_config_init,
+               .suspend        = genphy_suspend,
+               .resume         = genphy_resume,
+       },
        {
                PHY_ID_MATCH_EXACT(PHY_ID_YT8531),
                .name           = "YT8531 Gigabit Ethernet",
@@ -3111,6 +3157,7 @@ MODULE_LICENSE("GPL");
 static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = {
        { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) },
        { PHY_ID_MATCH_EXACT(PHY_ID_YT8521) },
+       { PHY_ID_MATCH_EXACT(PHY_ID_YT8522) },
        { PHY_ID_MATCH_EXACT(PHY_ID_YT8531) },
        { PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) },
        { PHY_ID_MATCH_EXACT(PHY_ID_YT8821) },