| From horms@vergenet.net Wed Dec 10 18:29:25 2014 |
| From: Simon Horman <horms+renesas@verge.net.au> |
| Date: Thu, 11 Dec 2014 11:29:11 +0900 |
| Subject: [PATCH ltsi-3.14 1/2] phy: micrel: add of configuration for LED mode |
| To: ltsi-dev@lists.linuxfoundation.org |
| Cc: Greg KH <gregkh@linuxfoundation.org>, Magnus Damm <magnus.damm@gmail.com>, yoshihiro shimoda <yoshihiro.shimoda.uh@renesas.com> |
| Message-ID: <1418264952-27886-2-git-send-email-horms+renesas@verge.net.au> |
| |
| |
| From: Ben Dooks <ben.dooks@codethink.co.uk> |
| |
| Add support for the led-mode property for the following PHYs |
| which have a single LED mode configuration value. |
| |
| KSZ8001 and KSZ8041 which both use register 0x1e bits 15,14 and |
| KSZ8021, KSZ8031 and KSZ8051 which use register 0x1f bits 5,4 |
| to control the LED configuration. |
| |
| Signed-off-by: Ben Dooks <ben.dooks@codethink.co.uk> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| (cherry picked from commit 20d8435a1cffa04992f1db6b199a5f0ccec2ff06) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| Documentation/devicetree/bindings/net/micrel.txt | 18 ++++++++ |
| drivers/net/phy/micrel.c | 49 +++++++++++++++++++++-- |
| 2 files changed, 63 insertions(+), 4 deletions(-) |
| create mode 100644 Documentation/devicetree/bindings/net/micrel.txt |
| |
| --- /dev/null |
| +++ b/Documentation/devicetree/bindings/net/micrel.txt |
| @@ -0,0 +1,18 @@ |
| +Micrel PHY properties. |
| + |
| +These properties cover the base properties Micrel PHYs. |
| + |
| +Optional properties: |
| + |
| + - micrel,led-mode : LED mode value to set for PHYs with configurable LEDs. |
| + |
| + Configure the LED mode with single value. The list of PHYs and |
| + the bits that are currently supported: |
| + |
| + KSZ8001: register 0x1e, bits 15..14 |
| + KSZ8041: register 0x1e, bits 15..14 |
| + KSZ8021: register 0x1f, bits 5..4 |
| + KSZ8031: register 0x1f, bits 5..4 |
| + KSZ8051: register 0x1f, bits 5..4 |
| + |
| + See the respective PHY datasheet for the mode values. |
| --- a/drivers/net/phy/micrel.c |
| +++ b/drivers/net/phy/micrel.c |
| @@ -148,15 +148,52 @@ static int ks8737_config_intr(struct phy |
| return rc < 0 ? rc : 0; |
| } |
| |
| +static int kszphy_setup_led(struct phy_device *phydev, |
| + unsigned int reg, unsigned int shift) |
| +{ |
| + |
| + struct device *dev = &phydev->dev; |
| + struct device_node *of_node = dev->of_node; |
| + int rc, temp; |
| + u32 val; |
| + |
| + if (!of_node && dev->parent->of_node) |
| + of_node = dev->parent->of_node; |
| + |
| + if (of_property_read_u32(of_node, "micrel,led-mode", &val)) |
| + return 0; |
| + |
| + temp = phy_read(phydev, reg); |
| + if (temp < 0) |
| + return temp; |
| + |
| + temp &= 3 << shift; |
| + temp |= val << shift; |
| + rc = phy_write(phydev, reg, temp); |
| + |
| + return rc < 0 ? rc : 0; |
| +} |
| + |
| static int kszphy_config_init(struct phy_device *phydev) |
| { |
| return 0; |
| } |
| |
| +static int kszphy_config_init_led8041(struct phy_device *phydev) |
| +{ |
| + /* single led control, register 0x1e bits 15..14 */ |
| + return kszphy_setup_led(phydev, 0x1e, 14); |
| +} |
| + |
| static int ksz8021_config_init(struct phy_device *phydev) |
| { |
| - int rc; |
| const u16 val = KSZPHY_OMSO_B_CAST_OFF | KSZPHY_OMSO_RMII_OVERRIDE; |
| + int rc; |
| + |
| + rc = kszphy_setup_led(phydev, 0x1f, 4); |
| + if (rc) |
| + dev_err(&phydev->dev, "failed to set led mode\n"); |
| + |
| phy_write(phydev, MII_KSZPHY_OMSO, val); |
| rc = ksz_config_flags(phydev); |
| return rc < 0 ? rc : 0; |
| @@ -166,6 +203,10 @@ static int ks8051_config_init(struct phy |
| { |
| int rc; |
| |
| + rc = kszphy_setup_led(phydev, 0x1f, 4); |
| + if (rc) |
| + dev_err(&phydev->dev, "failed to set led mode\n"); |
| + |
| rc = ksz_config_flags(phydev); |
| return rc < 0 ? rc : 0; |
| } |
| @@ -327,7 +368,7 @@ static struct phy_driver ksphy_driver[] |
| .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause |
| | SUPPORTED_Asym_Pause), |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| - .config_init = kszphy_config_init, |
| + .config_init = kszphy_config_init_led8041, |
| .config_aneg = genphy_config_aneg, |
| .read_status = genphy_read_status, |
| .ack_interrupt = kszphy_ack_interrupt, |
| @@ -342,7 +383,7 @@ static struct phy_driver ksphy_driver[] |
| .features = PHY_BASIC_FEATURES | |
| SUPPORTED_Pause | SUPPORTED_Asym_Pause, |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| - .config_init = kszphy_config_init, |
| + .config_init = kszphy_config_init_led8041, |
| .config_aneg = genphy_config_aneg, |
| .read_status = genphy_read_status, |
| .ack_interrupt = kszphy_ack_interrupt, |
| @@ -371,7 +412,7 @@ static struct phy_driver ksphy_driver[] |
| .phy_id_mask = 0x00ffffff, |
| .features = (PHY_BASIC_FEATURES | SUPPORTED_Pause), |
| .flags = PHY_HAS_MAGICANEG | PHY_HAS_INTERRUPT, |
| - .config_init = kszphy_config_init, |
| + .config_init = kszphy_config_init_led8041, |
| .config_aneg = genphy_config_aneg, |
| .read_status = genphy_read_status, |
| .ack_interrupt = kszphy_ack_interrupt, |