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:
parent
d2731007bb
commit
9a026a2efa
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue