diff options
author | Troy Kisky <troy.kisky@boundarydevices.com> | 2013-04-05 17:12:42 -0700 |
---|---|---|
committer | Robert Winkler <robert.winkler@boundarydevices.com> | 2013-06-17 12:08:12 -0700 |
commit | e4b8da1df372fcf753ee1af6174e797893966196 (patch) | |
tree | 387389b3329a2a7ddb6af7e72a2500d08b9c4cc8 | |
parent | b53dc07e79138ed949c895adc7e7bce060ac1e1f (diff) |
net: phy: micrel: add ksz9031 support
-rw-r--r-- | drivers/net/phy/micrel.c | 46 | ||||
-rw-r--r-- | include/micrel.h | 1 |
2 files changed, 47 insertions, 0 deletions
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 30f32648974..a07b00bab80 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 25e8a4624b7..a1c35763fa8 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 |