aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMurali Karicheri <m-karicheri2@ti.com>2017-07-04 06:53:24 -0400
committerDavid S. Miller <davem@davemloft.net>2017-07-05 04:23:53 -0400
commit371444764b9882d754d1e67dd212c932359a2293 (patch)
tree481610b7bace6165ba28cfe1c54eeb9151d8133b
parent908a7733250a2ebcacfafb2ebe0f25c853ac7fdc (diff)
net: phy: dp83867: add workaround for incorrect RX_CTRL pin strap
The data manual for DP83867IR/CR, SNLS484E[1], revised march 2017, advises that strapping RX_DV/RX_CTRL pin in mode 1 and 2 is not supported (see note below Table 5 (4-Level Strap Pins)). There are some boards which have the pin strapped this way and need software workaround suggested by the data manual. Bit[7] of Configuration Register 4 (address 0x0031) must be cleared to 0. This ensures proper operation of the PHY. Implement driver support for device-tree property meant to advertise the wrong strapping. [1] http://www.ti.com/lit/ds/snls484e/snls484e.pdf Signed-off-by: Murali Karicheri <m-karicheri2@ti.com> [nsekhar@ti.com: rebase to mainline, code simplification] Signed-off-by: Sekhar Nori <nsekhar@ti.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/phy/dp83867.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c
index b57f20e552ba..c1ab976cc800 100644
--- a/drivers/net/phy/dp83867.c
+++ b/drivers/net/phy/dp83867.c
@@ -91,6 +91,7 @@ struct dp83867_private {
91 int fifo_depth; 91 int fifo_depth;
92 int io_impedance; 92 int io_impedance;
93 int port_mirroring; 93 int port_mirroring;
94 bool rxctrl_strap_quirk;
94}; 95};
95 96
96static int dp83867_ack_interrupt(struct phy_device *phydev) 97static int dp83867_ack_interrupt(struct phy_device *phydev)
@@ -164,6 +165,9 @@ static int dp83867_of_init(struct phy_device *phydev)
164 else if (of_property_read_bool(of_node, "ti,min-output-impedance")) 165 else if (of_property_read_bool(of_node, "ti,min-output-impedance"))
165 dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN; 166 dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN;
166 167
168 dp83867->rxctrl_strap_quirk = of_property_read_bool(of_node,
169 "ti,dp83867-rxctrl-strap-quirk");
170
167 ret = of_property_read_u32(of_node, "ti,rx-internal-delay", 171 ret = of_property_read_u32(of_node, "ti,rx-internal-delay",
168 &dp83867->rx_id_delay); 172 &dp83867->rx_id_delay);
169 if (ret && 173 if (ret &&
@@ -214,6 +218,13 @@ static int dp83867_config_init(struct phy_device *phydev)
214 dp83867 = (struct dp83867_private *)phydev->priv; 218 dp83867 = (struct dp83867_private *)phydev->priv;
215 } 219 }
216 220
221 /* RX_DV/RX_CTRL strapped in mode 1 or mode 2 workaround */
222 if (dp83867->rxctrl_strap_quirk) {
223 val = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4);
224 val &= ~BIT(7);
225 phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_CFG4, val);
226 }
227
217 if (phy_interface_is_rgmii(phydev)) { 228 if (phy_interface_is_rgmii(phydev)) {
218 val = phy_read(phydev, MII_DP83867_PHYCTRL); 229 val = phy_read(phydev, MII_DP83867_PHYCTRL);
219 if (val < 0) 230 if (val < 0)