Commit fddf86fc authored by Andy Fleming's avatar Andy Fleming Committed by David S. Miller

phylib: Modify Vitesse RGMII skew settings

The Vitesse driver was using the RGMII_ID interface type to determine if
skew was necessary.  However, we want to move away from using that
interface type, as it's really a property of the board's PHY connection.
However, some boards depend on it, so we want to support it, while
allowing new boards to use the more flexible "fixups" approach.  To do
this, we extract the code which adds skew into its own function, and
call that function when RGMII_ID has been selected.

Another side-effect of this change is that if your PHY has skew set
already, it doesn't clear it.  This way, the fixup code can modify the
register without config_init then clearing it.
Signed-off-by: default avatarAndy Fleming <afleming@freescale.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3d153a7c
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Author: Kriston Carson * Author: Kriston Carson
* *
* Copyright (c) 2005 Freescale Semiconductor, Inc. * Copyright (c) 2005, 2009 Freescale Semiconductor, Inc.
* *
* This program is free software; you can redistribute it and/or modify it * This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
...@@ -61,32 +61,42 @@ MODULE_DESCRIPTION("Vitesse PHY driver"); ...@@ -61,32 +61,42 @@ MODULE_DESCRIPTION("Vitesse PHY driver");
MODULE_AUTHOR("Kriston Carson"); MODULE_AUTHOR("Kriston Carson");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static int vsc824x_config_init(struct phy_device *phydev) int vsc824x_add_skew(struct phy_device *phydev)
{ {
int extcon;
int err; int err;
int extcon;
err = phy_write(phydev, MII_VSC8244_AUX_CONSTAT,
MII_VSC8244_AUXCONSTAT_INIT);
if (err < 0)
return err;
extcon = phy_read(phydev, MII_VSC8244_EXT_CON1); extcon = phy_read(phydev, MII_VSC8244_EXT_CON1);
if (extcon < 0) if (extcon < 0)
return err; return extcon;
extcon &= ~(MII_VSC8244_EXTCON1_TX_SKEW_MASK | extcon &= ~(MII_VSC8244_EXTCON1_TX_SKEW_MASK |
MII_VSC8244_EXTCON1_RX_SKEW_MASK); MII_VSC8244_EXTCON1_RX_SKEW_MASK);
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) extcon |= (MII_VSC8244_EXTCON1_TX_SKEW |
extcon |= (MII_VSC8244_EXTCON1_TX_SKEW | MII_VSC8244_EXTCON1_RX_SKEW);
MII_VSC8244_EXTCON1_RX_SKEW);
err = phy_write(phydev, MII_VSC8244_EXT_CON1, extcon); err = phy_write(phydev, MII_VSC8244_EXT_CON1, extcon);
return err; return err;
} }
EXPORT_SYMBOL(vsc824x_add_skew);
static int vsc824x_config_init(struct phy_device *phydev)
{
int err;
err = phy_write(phydev, MII_VSC8244_AUX_CONSTAT,
MII_VSC8244_AUXCONSTAT_INIT);
if (err < 0)
return err;
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
err = vsc824x_add_skew(phydev);
return err;
}
static int vsc824x_ack_interrupt(struct phy_device *phydev) static int vsc824x_ack_interrupt(struct phy_device *phydev)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment