phy: marvell: Add support for 88E3016 FastEthernet PHY
Marvell 88E3016 is a FastEthernet PHY that also can be found in Marvell Berlin SoCs as integrated PHY. Tested-by: Antoine Ténart <antoine.tenart@free-electrons.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d4c3363e84
commit
6b358aedce
@ -118,6 +118,9 @@
|
|||||||
|
|
||||||
#define MII_M1116R_CONTROL_REG_MAC 21
|
#define MII_M1116R_CONTROL_REG_MAC 21
|
||||||
|
|
||||||
|
#define MII_88E3016_PHY_SPEC_CTRL 0x10
|
||||||
|
#define MII_88E3016_DISABLE_SCRAMBLER 0x0200
|
||||||
|
#define MII_88E3016_AUTO_MDIX_CROSSOVER 0x0030
|
||||||
|
|
||||||
MODULE_DESCRIPTION("Marvell PHY driver");
|
MODULE_DESCRIPTION("Marvell PHY driver");
|
||||||
MODULE_AUTHOR("Andy Fleming");
|
MODULE_AUTHOR("Andy Fleming");
|
||||||
@ -434,6 +437,25 @@ static int m88e1116r_config_init(struct phy_device *phydev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int m88e3016_config_init(struct phy_device *phydev)
|
||||||
|
{
|
||||||
|
int reg;
|
||||||
|
|
||||||
|
/* Enable Scrambler and Auto-Crossover */
|
||||||
|
reg = phy_read(phydev, MII_88E3016_PHY_SPEC_CTRL);
|
||||||
|
if (reg < 0)
|
||||||
|
return reg;
|
||||||
|
|
||||||
|
reg &= ~MII_88E3016_DISABLE_SCRAMBLER;
|
||||||
|
reg |= MII_88E3016_AUTO_MDIX_CROSSOVER;
|
||||||
|
|
||||||
|
reg = phy_write(phydev, MII_88E3016_PHY_SPEC_CTRL, reg);
|
||||||
|
if (reg < 0)
|
||||||
|
return reg;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int m88e1111_config_init(struct phy_device *phydev)
|
static int m88e1111_config_init(struct phy_device *phydev)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
@ -770,6 +792,12 @@ static int marvell_read_status(struct phy_device *phydev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int marvell_aneg_done(struct phy_device *phydev)
|
||||||
|
{
|
||||||
|
int retval = phy_read(phydev, MII_M1011_PHY_STATUS);
|
||||||
|
return (retval < 0) ? retval : (retval & MII_M1011_PHY_STATUS_RESOLVED);
|
||||||
|
}
|
||||||
|
|
||||||
static int m88e1121_did_interrupt(struct phy_device *phydev)
|
static int m88e1121_did_interrupt(struct phy_device *phydev)
|
||||||
{
|
{
|
||||||
int imask;
|
int imask;
|
||||||
@ -1050,6 +1078,23 @@ static struct phy_driver marvell_drivers[] = {
|
|||||||
.suspend = &genphy_suspend,
|
.suspend = &genphy_suspend,
|
||||||
.driver = { .owner = THIS_MODULE },
|
.driver = { .owner = THIS_MODULE },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.phy_id = MARVELL_PHY_ID_88E3016,
|
||||||
|
.phy_id_mask = MARVELL_PHY_ID_MASK,
|
||||||
|
.name = "Marvell 88E3016",
|
||||||
|
.features = PHY_BASIC_FEATURES,
|
||||||
|
.flags = PHY_HAS_INTERRUPT,
|
||||||
|
.config_aneg = &genphy_config_aneg,
|
||||||
|
.config_init = &m88e3016_config_init,
|
||||||
|
.aneg_done = &marvell_aneg_done,
|
||||||
|
.read_status = &marvell_read_status,
|
||||||
|
.ack_interrupt = &marvell_ack_interrupt,
|
||||||
|
.config_intr = &marvell_config_intr,
|
||||||
|
.did_interrupt = &m88e1121_did_interrupt,
|
||||||
|
.resume = &genphy_resume,
|
||||||
|
.suspend = &genphy_suspend,
|
||||||
|
.driver = { .owner = THIS_MODULE },
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init marvell_init(void)
|
static int __init marvell_init(void)
|
||||||
@ -1079,6 +1124,7 @@ static struct mdio_device_id __maybe_unused marvell_tbl[] = {
|
|||||||
{ MARVELL_PHY_ID_88E1318S, MARVELL_PHY_ID_MASK },
|
{ MARVELL_PHY_ID_88E1318S, MARVELL_PHY_ID_MASK },
|
||||||
{ MARVELL_PHY_ID_88E1116R, MARVELL_PHY_ID_MASK },
|
{ MARVELL_PHY_ID_88E1116R, MARVELL_PHY_ID_MASK },
|
||||||
{ MARVELL_PHY_ID_88E1510, MARVELL_PHY_ID_MASK },
|
{ MARVELL_PHY_ID_88E1510, MARVELL_PHY_ID_MASK },
|
||||||
|
{ MARVELL_PHY_ID_88E3016, MARVELL_PHY_ID_MASK },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#define MARVELL_PHY_ID_88E1318S 0x01410e90
|
#define MARVELL_PHY_ID_88E1318S 0x01410e90
|
||||||
#define MARVELL_PHY_ID_88E1116R 0x01410e40
|
#define MARVELL_PHY_ID_88E1116R 0x01410e40
|
||||||
#define MARVELL_PHY_ID_88E1510 0x01410dd0
|
#define MARVELL_PHY_ID_88E1510 0x01410dd0
|
||||||
|
#define MARVELL_PHY_ID_88E3016 0x01410e60
|
||||||
|
|
||||||
/* struct phy_device dev_flags definitions */
|
/* struct phy_device dev_flags definitions */
|
||||||
#define MARVELL_PHY_M1145_FLAGS_RESISTANCE 0x00000001
|
#define MARVELL_PHY_M1145_FLAGS_RESISTANCE 0x00000001
|
||||||
|
Loading…
Reference in New Issue
Block a user