summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTroy Kisky <troy.kisky@boundarydevices.com>2013-04-05 17:12:42 -0700
committerRobert Winkler <robert.winkler@boundarydevices.com>2013-06-17 12:08:12 -0700
commite4b8da1df372fcf753ee1af6174e797893966196 (patch)
tree387389b3329a2a7ddb6af7e72a2500d08b9c4cc8
parentb53dc07e79138ed949c895adc7e7bce060ac1e1f (diff)
net: phy: micrel: add ksz9031 support
-rw-r--r--drivers/net/phy/micrel.c46
-rw-r--r--include/micrel.h1
2 files changed, 47 insertions, 0 deletions
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c
index 30f3264897..a07b00bab8 100644
--- a/drivers/net/phy/micrel.c
+++ b/drivers/net/phy/micrel.c
@@ -135,6 +135,51 @@ static struct phy_driver ksz9021_driver = {
.startup = &ksz9021_startup,
.shutdown = &genphy_shutdown,
};
+
+int ksz9031_send_phy_cmds(struct phy_device *phydev, unsigned short* p)
+{
+ for (;;) {
+ unsigned reg = *p++;
+ unsigned val = *p++;
+ if (reg == 0 && val == 0)
+ break;
+ if (reg < 32) {
+ phy_write(phydev, MDIO_DEVAD_NONE, reg, val);
+ } else {
+ unsigned dev_addr = (reg >> 8) & 0x7f;
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x0d, dev_addr);
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x0e,
+ reg & 0xff);
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x0d,
+ dev_addr | 0x8000);
+ phy_write(phydev, MDIO_DEVAD_NONE, 0x0e, val);
+ }
+ }
+ return 0;
+}
+
+/* Micrel ksz9031 */
+static int ksz9031_config(struct phy_device *phydev)
+{
+ unsigned features = phydev->drv->features;
+
+ if (getenv("disable_giga"))
+ features &= ~(SUPPORTED_1000baseT_Half |
+ SUPPORTED_1000baseT_Full);
+ phydev->advertising = phydev->supported = features;
+ genphy_config_aneg(phydev);
+ return 0;
+}
+
+static struct phy_driver ksz9031_driver = {
+ .name = "Micrel ksz9031",
+ .uid = 0x221620,
+ .mask = 0xfffff0,
+ .features = PHY_GBIT_FEATURES,
+ .config = &ksz9031_config,
+ .startup = &ksz9021_startup,
+ .shutdown = &genphy_shutdown,
+};
#endif
int phy_micrel_init(void)
@@ -142,6 +187,7 @@ int phy_micrel_init(void)
phy_register(&KSZ804_driver);
#ifdef CONFIG_PHY_MICREL_KSZ9021
phy_register(&ksz9021_driver);
+ phy_register(&ksz9031_driver);
#else
phy_register(&KS8721_driver);
#endif
diff --git a/include/micrel.h b/include/micrel.h
index 25e8a4624b..a1c35763fa 100644
--- a/include/micrel.h
+++ b/include/micrel.h
@@ -12,5 +12,6 @@
struct phy_device;
int ksz9021_phy_extended_write(struct phy_device *phydev, int regnum, u16 val);
int ksz9021_phy_extended_read(struct phy_device *phydev, int regnum);
+int ksz9031_send_phy_cmds(struct phy_device *phydev, unsigned short* p);
#endif