diff options
author | Mike Looijmans <mike.looijmans@topic.nl> | 2016-10-04 01:52:04 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-10-05 21:19:06 -0400 |
commit | af70c1f92d3567035d2f73f39079459d58c706dc (patch) | |
tree | 3c1e3afa5a3ce61dadb675f0e253e1b2ff6bd6bc | |
parent | a44c984f1ef16229cdfd92326ad10118b1940ff9 (diff) |
phy: micrel.c: Enable ksz9031 energy-detect power-down mode
Set bit 0 in register 1C.23 to enable the EDPD feature of the
KSZ9031 PHY. This reduces power consumption when the link is
down.
Signed-off-by: Mike Looijmans <mike.looijmans@topic.nl>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/phy/micrel.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index 885ac9cbab5a..081df68d2ce1 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c | |||
@@ -439,6 +439,10 @@ static int ksz9021_config_init(struct phy_device *phydev) | |||
439 | #define MII_KSZ9031RN_TX_DATA_PAD_SKEW 6 | 439 | #define MII_KSZ9031RN_TX_DATA_PAD_SKEW 6 |
440 | #define MII_KSZ9031RN_CLK_PAD_SKEW 8 | 440 | #define MII_KSZ9031RN_CLK_PAD_SKEW 8 |
441 | 441 | ||
442 | /* MMD Address 0x1C */ | ||
443 | #define MII_KSZ9031RN_EDPD 0x23 | ||
444 | #define MII_KSZ9031RN_EDPD_ENABLE BIT(0) | ||
445 | |||
442 | static int ksz9031_extended_write(struct phy_device *phydev, | 446 | static int ksz9031_extended_write(struct phy_device *phydev, |
443 | u8 mode, u32 dev_addr, u32 regnum, u16 val) | 447 | u8 mode, u32 dev_addr, u32 regnum, u16 val) |
444 | { | 448 | { |
@@ -510,6 +514,18 @@ static int ksz9031_center_flp_timing(struct phy_device *phydev) | |||
510 | return genphy_restart_aneg(phydev); | 514 | return genphy_restart_aneg(phydev); |
511 | } | 515 | } |
512 | 516 | ||
517 | /* Enable energy-detect power-down mode */ | ||
518 | static int ksz9031_enable_edpd(struct phy_device *phydev) | ||
519 | { | ||
520 | int reg; | ||
521 | |||
522 | reg = ksz9031_extended_read(phydev, OP_DATA, 0x1C, MII_KSZ9031RN_EDPD); | ||
523 | if (reg < 0) | ||
524 | return reg; | ||
525 | return ksz9031_extended_write(phydev, OP_DATA, 0x1C, MII_KSZ9031RN_EDPD, | ||
526 | reg | MII_KSZ9031RN_EDPD_ENABLE); | ||
527 | } | ||
528 | |||
513 | static int ksz9031_config_init(struct phy_device *phydev) | 529 | static int ksz9031_config_init(struct phy_device *phydev) |
514 | { | 530 | { |
515 | const struct device *dev = &phydev->mdio.dev; | 531 | const struct device *dev = &phydev->mdio.dev; |
@@ -525,6 +541,11 @@ static int ksz9031_config_init(struct phy_device *phydev) | |||
525 | }; | 541 | }; |
526 | static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"}; | 542 | static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"}; |
527 | const struct device *dev_walker; | 543 | const struct device *dev_walker; |
544 | int result; | ||
545 | |||
546 | result = ksz9031_enable_edpd(phydev); | ||
547 | if (result < 0) | ||
548 | return result; | ||
528 | 549 | ||
529 | /* The Micrel driver has a deprecated option to place phy OF | 550 | /* The Micrel driver has a deprecated option to place phy OF |
530 | * properties in the MAC node. Walk up the tree of devices to | 551 | * properties in the MAC node. Walk up the tree of devices to |