net: ti: am65-cpsw-nuss: Enable MDIO manual mode
authorRavi Gunasekaran <r-gunasekaran@ti.com>
Thu, 22 Sep 2022 09:51:24 +0000 (15:21 +0530)
committerTom Rini <trini@konsulko.com>
Fri, 7 Oct 2022 01:05:17 +0000 (21:05 -0400)
For the TI SoCs affected by errata i2329, enable MDIO manual
mode by default

Signed-off-by: Ravi Gunasekaran <r-gunasekaran@ti.com>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
drivers/net/ti/am65-cpsw-nuss.c

index 3d0a329..f674b0b 100644 (file)
@@ -21,6 +21,7 @@
 #include <net.h>
 #include <phy.h>
 #include <power-domain.h>
+#include <soc.h>
 #include <linux/bitops.h>
 #include <linux/soc/ti/ti-udma.h>
 
@@ -127,6 +128,8 @@ struct am65_cpsw_priv {
        bool                    has_phy;
        ofnode                  phy_node;
        u32                     phy_addr;
+
+       bool                    mdio_manual_mode;
 };
 
 #ifdef PKTSIZE_ALIGN
@@ -541,6 +544,20 @@ static const struct eth_ops am65_cpsw_ops = {
        .read_rom_hwaddr = am65_cpsw_read_rom_hwaddr,
 };
 
+static const struct soc_attr k3_mdio_soc_data[] = {
+       { .family = "AM62X", .revision = "SR1.0" },
+       { .family = "AM64X", .revision = "SR1.0" },
+       { .family = "AM64X", .revision = "SR2.0" },
+       { .family = "AM65X", .revision = "SR1.0" },
+       { .family = "AM65X", .revision = "SR2.0" },
+       { .family = "J7200", .revision = "SR1.0" },
+       { .family = "J7200", .revision = "SR2.0" },
+       { .family = "J721E", .revision = "SR1.0" },
+       { .family = "J721E", .revision = "SR1.1" },
+       { .family = "J721S2", .revision = "SR1.0" },
+       { /* sentinel */ },
+};
+
 static int am65_cpsw_mdio_init(struct udevice *dev)
 {
        struct am65_cpsw_priv *priv = dev_get_priv(dev);
@@ -553,7 +570,7 @@ static int am65_cpsw_mdio_init(struct udevice *dev)
                                          cpsw_common->mdio_base,
                                          cpsw_common->bus_freq,
                                          clk_get_rate(&cpsw_common->fclk),
-                                         false);
+                                         priv->mdio_manual_mode);
        if (!cpsw_common->bus)
                return -EFAULT;
 
@@ -658,6 +675,10 @@ static int am65_cpsw_port_probe(struct udevice *dev)
        sprintf(portname, "%s%s", dev->parent->name, dev->name);
        device_set_name(dev, portname);
 
+       priv->mdio_manual_mode = false;
+       if (soc_device_match(k3_mdio_soc_data))
+               priv->mdio_manual_mode = true;
+
        ret = am65_cpsw_ofdata_parse_phy(dev);
        if (ret)
                goto out;