9
0
Fork 0

net: phy: Support Marvell 88EE1545 PHY

This commit adds support for Marvell's 88E1545 PHY chip. In particular, this
allows to support QSGMII interfaces.

Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Ezequiel Garcia 2014-11-10 15:19:45 -03:00 committed by Sascha Hauer
parent d2731007bb
commit 9a026a2efa
2 changed files with 59 additions and 0 deletions

View File

@ -35,6 +35,13 @@
#define MII_88E1121_PHY_MSCR_DELAY_MASK \
(MII_88E1121_PHY_MSCR_RX_DELAY | MII_88E1121_PHY_MSCR_TX_DELAY)
#define MII_88E1540_LED_PAGE 0x3
#define MII_88E1540_LED_CONTROL 0x10
#define MII_88E1540_QSGMII_PAGE 0x4
#define MII_88E1540_QSGMII_CONTROL 0x0
#define MII_88E1540_QSGMII_AUTONEG_EN BIT(12)
/*
* marvell_read_status
*
@ -123,6 +130,48 @@ static int marvell_read_status(struct phy_device *phydev)
return 0;
}
static int m88e1540_config_init(struct phy_device *phydev)
{
u16 reg;
int ret;
/* Configure QSGMII auto-negotiation */
if (phydev->interface == PHY_INTERFACE_MODE_QSGMII) {
ret = phy_write(phydev, MII_MARVELL_PHY_PAGE,
MII_88E1540_QSGMII_PAGE);
if (ret < 0)
return ret;
reg = phy_read(phydev, MII_88E1540_QSGMII_CONTROL);
ret = phy_write(phydev, MII_88E1540_QSGMII_CONTROL,
reg | MII_88E1540_QSGMII_AUTONEG_EN);
if (ret < 0)
return ret;
}
/* Configure LED as:
* Activity: Blink
* Link: On
* No Link: Off
*/
phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_88E1540_LED_PAGE);
phy_write(phydev, MII_88E1540_LED_CONTROL, 0x1111);
/* Power-up the PHY. When going from power down to normal operation,
* software reset and auto-negotiation restart are also performed.
*/
ret = phy_write(phydev, MII_MARVELL_PHY_PAGE,
MII_MARVELL_PHY_DEFAULT_PAGE);
if (ret < 0)
return ret;
ret = phy_write(phydev, MII_BMCR,
phy_read(phydev, MII_BMCR) & ~BMCR_PDOWN);
if (ret < 0)
return ret;
return 0;
}
static int m88e1121_config_init(struct phy_device *phydev)
{
u16 reg;
@ -175,6 +224,15 @@ static struct phy_driver marvell_phys[] = {
.config_aneg = genphy_config_aneg,
.read_status = marvell_read_status,
},
{
.phy_id = MARVELL_PHY_ID_88E1545,
.phy_id_mask = MARVELL_PHY_ID_MASK,
.drv.name = "Marvell 88E1545",
.features = PHY_GBIT_FEATURES,
.config_init = m88e1540_config_init,
.config_aneg = genphy_config_aneg,
.read_status = marvell_read_status,
},
};
static int __init marvell_phy_init(void)

View File

@ -27,6 +27,7 @@
#define MARVELL_PHY_ID_88E1318S 0x01410e90
#define MARVELL_PHY_ID_88E1116R 0x01410e40
#define MARVELL_PHY_ID_88E1510 0x01410dd0
#define MARVELL_PHY_ID_88E1545 0x01410eb0
/* Mask used for ID comparisons */
#define MARVELL_PHY_ID_MASK 0xfffffff0