summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilippe Schenker <philippe.schenker@toradex.com>2020-02-27 16:31:46 +0100
committerPhilippe Schenker <philippe.schenker@toradex.com>2020-03-04 16:07:24 +0100
commitcc96ed419f7585db15855dd53046562aadece3fb (patch)
tree06196f449f2fed2b0a9a297d23c28c41156176ed
parent28491c802d36accbb4d8562114ce8085ca53e1b0 (diff)
drivers: net: phy: micrel_ksz90x1.c: Add basic support for KSZ9131
This adds basic support for the new Micrel KSZ9131 phy. Related-to: ELB-1299 Signed-off-by: Philippe Schenker <philippe.schenker@toradex.com>
-rw-r--r--drivers/net/phy/micrel_ksz90x1.c62
-rw-r--r--include/micrel.h2
2 files changed, 64 insertions, 0 deletions
diff --git a/drivers/net/phy/micrel_ksz90x1.c b/drivers/net/phy/micrel_ksz90x1.c
index 03269418fa..b115e0d723 100644
--- a/drivers/net/phy/micrel_ksz90x1.c
+++ b/drivers/net/phy/micrel_ksz90x1.c
@@ -392,9 +392,71 @@ static struct phy_driver ksz9031_driver = {
.readext = &ksz9031_phy_extread,
};
+/*
+ * KSZ9131
+ */
+static int ksz9131_config(struct phy_device *phydev)
+{
+ int ret;
+
+ ret = ksz9031_of_config(phydev);
+ if (ret)
+ return ret;
+
+ /* add an option to disable the gigabit feature of this PHY */
+ if (env_get("disable_giga")) {
+ unsigned features;
+ unsigned bmcr;
+
+ /* disable speed 1000 in features supported by the PHY */
+ features = phydev->drv->features;
+ features &= ~(SUPPORTED_1000baseT_Half |
+ SUPPORTED_1000baseT_Full);
+ phydev->advertising = phydev->supported = features;
+
+ /* disable speed 1000 in Basic Control Register */
+ bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
+ bmcr &= ~(1 << 6);
+ phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr);
+
+ /* disable speed 1000 in 1000Base-T Control Register */
+ phy_write(phydev, MDIO_DEVAD_NONE, MII_CTRL1000, 0);
+
+ /* start autoneg */
+ genphy_config_aneg(phydev);
+ genphy_restart_aneg(phydev);
+
+ return 0;
+ }
+
+ return genphy_config(phydev);
+}
+
+static struct phy_driver ksz9131_driver = {
+ .name = "Micrel ksz9031",
+ .uid = PHY_ID_KSZ9131,
+ .mask = MII_KSZ9x31_SILICON_REV_MASK,
+ .features = PHY_GBIT_FEATURES,
+ .config = &ksz9131_config,
+ .startup = &ksz90xx_startup,
+ .shutdown = &genphy_shutdown,
+ .writeext = &ksz9031_phy_extwrite,
+ .readext = &ksz9031_phy_extread,
+};
+
+int ksz9xx1_phy_get_id(struct phy_device *phydev)
+{
+ unsigned int phyid;
+
+ get_phy_id(phydev->bus, phydev->addr, MDIO_DEVAD_NONE, &phyid);
+
+ return phyid;
+}
+
int phy_micrel_ksz90x1_init(void)
{
phy_register(&ksz9021_driver);
phy_register(&ksz9031_driver);
+ phy_register(&ksz9131_driver);
return 0;
}
diff --git a/include/micrel.h b/include/micrel.h
index 1d121c2825..f5126f2992 100644
--- a/include/micrel.h
+++ b/include/micrel.h
@@ -26,6 +26,7 @@
#define MII_KSZ9x31_SILICON_REV_MASK 0xfffff0
#define PHY_ID_KSZ9031 0x00221620
+#define PHY_ID_KSZ9131 0x00221640
/* Registers */
@@ -40,5 +41,6 @@ int ksz9031_phy_extended_write(struct phy_device *phydev, int devaddr,
int regnum, u16 mode, u16 val);
int ksz9031_phy_extended_read(struct phy_device *phydev, int devaddr,
int regnum, u16 mode);
+int ksz9xx1_phy_get_id(struct phy_device *phydev);
#endif