[U-Boot] [PATCH 03/17] net: phy: Support Marvell 88E1680
Joe Hershberger
joe.hershberger at gmail.com
Wed Nov 30 00:00:37 CET 2016
On Wed, Nov 23, 2016 at 9:12 AM, Mario Six <mario.six at gdsys.cc> wrote:
> From: Dirk Eibach <dirk.eibach at gdsys.cc>
>
> Add support for Marvell 88E1680 Integrated Octal
> 10/100/1000 Mbps Energy Efficient Ethernet Transceiver.
>
> Signed-off-by: Dirk Eibach <dirk.eibach at gdsys.cc>
> ---
> drivers/net/phy/marvell.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 51 insertions(+)
>
> diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
> index 4eeb0f6..72f3f92 100644
> --- a/drivers/net/phy/marvell.c
> +++ b/drivers/net/phy/marvell.c
> @@ -480,6 +480,46 @@ static int m88e1310_config(struct phy_device *phydev)
> return genphy_config_aneg(phydev);
> }
>
> +static int m88e1680_config(struct phy_device *phydev)
> +{
> + /*
> + * As per Marvell Release Notes - Alaska V 88E1680 Rev A2
> + * Errata Section 4.1
> + */
> + u16 reg;
> +
> + /* Matrix LED mode (not neede if single LED mode is used */
> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x0004);
I realize the 88e151* driver went in without my ack (35fa0dda: "net:
phy: marvell: add errata w/a for 88E151* chips"), and is loaded with
magic numbers, but let's not proliferate the problem. Please define
register offsets or use already-defined register offsets. If
reasonable, use defined field values to build values from defines and
something like bitfield_replace() from bitfield.h or clrsetbits_le32()
from asm/io.h. When it is a constant that represents an encoded
physical value that will never be used elsewhere, it's ok to just keep
the hard-coded number in the write, but it should be preceeded with a
comment that describes the actual meaning in engineering units and
prefereably the equation used to come up with the constant. If you
have the information to improve the 151* implementation as well, that
would be very welcome.
> + reg = phy_read(phydev, MDIO_DEVAD_NONE, 27);
> + reg |= (1 << 5);
> + phy_write(phydev, MDIO_DEVAD_NONE, 27, reg);
> +
> + /* QSGMII TX amplitude change */
> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x00fd);
> + phy_write(phydev, MDIO_DEVAD_NONE, 8, 0x0b53);
> + phy_write(phydev, MDIO_DEVAD_NONE, 7, 0x200d);
> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x0000);
> +
> + /* EEE initialization */
> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x00ff);
> + phy_write(phydev, MDIO_DEVAD_NONE, 17, 0xb030);
> + phy_write(phydev, MDIO_DEVAD_NONE, 16, 0x215c);
> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x00fc);
> + phy_write(phydev, MDIO_DEVAD_NONE, 24, 0x888c);
> + phy_write(phydev, MDIO_DEVAD_NONE, 25, 0x888c);
> + phy_write(phydev, MDIO_DEVAD_NONE, 22, 0x0000);
> + phy_write(phydev, MDIO_DEVAD_NONE, 0, 0x9140);
> +
> + genphy_config_aneg(phydev);
This should check the return code and return it if negative.
> +
> + /* soft reset */
> + reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
> + reg |= BMCR_RESET;
> + phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, reg);
> +
> + return 0;
> +}
Thanks,
-Joe
More information about the U-Boot
mailing list