net: phy: at803x: add QCA9561 support
authorDavid Bauer <mail@david-bauer.net>
Tue, 5 Oct 2021 22:54:01 +0000 (00:54 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 6 Oct 2021 01:14:43 +0000 (18:14 -0700)
Add support for the embedded fast-ethernet PHY found on the QCA9561
WiSoC platform. It supports the usual Atheros PHY featureset including
the cable tester.

Tested on a Xiaomi MiRouter 4Q (QCA9561)

Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David Bauer <mail@david-bauer.net>
Link: https://lore.kernel.org/r/20211005225401.10653-1-mail@david-bauer.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/at803x.c

index 3feee4d..ae7e1f1 100644 (file)
 #define QCA8327_A_PHY_ID                       0x004dd033
 #define QCA8327_B_PHY_ID                       0x004dd034
 #define QCA8337_PHY_ID                         0x004dd036
+#define QCA9561_PHY_ID                         0x004dd042
 #define QCA8K_PHY_ID_MASK                      0xffffffff
 
 #define QCA8K_DEVFLAGS_REVISION_MASK           GENMASK(2, 0)
@@ -1237,7 +1238,8 @@ static int at803x_cable_test_get_status(struct phy_device *phydev,
        int pair, ret;
 
        if (phydev->phy_id == ATH9331_PHY_ID ||
-           phydev->phy_id == ATH8032_PHY_ID)
+           phydev->phy_id == ATH8032_PHY_ID ||
+           phydev->phy_id == QCA9561_PHY_ID)
                pair_mask = 0x3;
        else
                pair_mask = 0xf;
@@ -1277,7 +1279,8 @@ static int at803x_cable_test_start(struct phy_device *phydev)
        phy_write(phydev, MII_BMCR, BMCR_ANENABLE);
        phy_write(phydev, MII_ADVERTISE, ADVERTISE_CSMA);
        if (phydev->phy_id != ATH9331_PHY_ID &&
-           phydev->phy_id != ATH8032_PHY_ID)
+           phydev->phy_id != ATH8032_PHY_ID &&
+           phydev->phy_id != QCA9561_PHY_ID)
                phy_write(phydev, MII_CTRL1000, 0);
 
        /* we do all the (time consuming) work later */
@@ -1409,6 +1412,21 @@ static struct phy_driver at803x_driver[] = {
        .soft_reset             = genphy_soft_reset,
        .config_aneg            = at803x_config_aneg,
 }, {
+       /* Qualcomm Atheros QCA9561 */
+       PHY_ID_MATCH_EXACT(QCA9561_PHY_ID),
+       .name                   = "Qualcomm Atheros QCA9561 built-in PHY",
+       .suspend                = at803x_suspend,
+       .resume                 = at803x_resume,
+       .flags                  = PHY_POLL_CABLE_TEST,
+       /* PHY_BASIC_FEATURES */
+       .config_intr            = &at803x_config_intr,
+       .handle_interrupt       = at803x_handle_interrupt,
+       .cable_test_start       = at803x_cable_test_start,
+       .cable_test_get_status  = at803x_cable_test_get_status,
+       .read_status            = at803x_read_status,
+       .soft_reset             = genphy_soft_reset,
+       .config_aneg            = at803x_config_aneg,
+}, {
        /* QCA8337 */
        .phy_id                 = QCA8337_PHY_ID,
        .phy_id_mask            = QCA8K_PHY_ID_MASK,
@@ -1466,6 +1484,7 @@ static struct mdio_device_id __maybe_unused atheros_tbl[] = {
        { PHY_ID_MATCH_EXACT(QCA8337_PHY_ID) },
        { PHY_ID_MATCH_EXACT(QCA8327_A_PHY_ID) },
        { PHY_ID_MATCH_EXACT(QCA8327_B_PHY_ID) },
+       { PHY_ID_MATCH_EXACT(QCA9561_PHY_ID) },
        { }
 };