|
@@ -89,6 +89,12 @@
|
|
|
|
|
|
#define MIIM_88E1149_PHY_PAGE 29
|
|
#define MIIM_88E1149_PHY_PAGE 29
|
|
|
|
|
|
|
|
+/* 88E1310 PHY defines */
|
|
|
|
+#define MIIM_88E1310_PHY_LED_CTRL 16
|
|
|
|
+#define MIIM_88E1310_PHY_IRQ_EN 18
|
|
|
|
+#define MIIM_88E1310_PHY_RGMII_CTRL 21
|
|
|
|
+#define MIIM_88E1310_PHY_PAGE 22
|
|
|
|
+
|
|
/* Marvell 88E1011S */
|
|
/* Marvell 88E1011S */
|
|
static int m88e1011s_config(struct phy_device *phydev)
|
|
static int m88e1011s_config(struct phy_device *phydev)
|
|
{
|
|
{
|
|
@@ -394,6 +400,37 @@ static int m88e1149_config(struct phy_device *phydev)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* Marvell 88E1310 */
|
|
|
|
+static int m88e1310_config(struct phy_device *phydev)
|
|
|
|
+{
|
|
|
|
+ u16 reg;
|
|
|
|
+
|
|
|
|
+ /* LED link and activity */
|
|
|
|
+ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0003);
|
|
|
|
+ reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_LED_CTRL);
|
|
|
|
+ reg = (reg & ~0xf) | 0x1;
|
|
|
|
+ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_LED_CTRL, reg);
|
|
|
|
+
|
|
|
|
+ /* Set LED2/INT to INT mode, low active */
|
|
|
|
+ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0003);
|
|
|
|
+ reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_IRQ_EN);
|
|
|
|
+ reg = (reg & 0x77ff) | 0x0880;
|
|
|
|
+ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_IRQ_EN, reg);
|
|
|
|
+
|
|
|
|
+ /* Set RGMII delay */
|
|
|
|
+ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0002);
|
|
|
|
+ reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_RGMII_CTRL);
|
|
|
|
+ reg |= 0x0030;
|
|
|
|
+ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_RGMII_CTRL, reg);
|
|
|
|
+
|
|
|
|
+ /* Ensure to return to page 0 */
|
|
|
|
+ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_88E1310_PHY_PAGE, 0x0000);
|
|
|
|
+
|
|
|
|
+ genphy_config_aneg(phydev);
|
|
|
|
+ phy_reset(phydev);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
|
|
static struct phy_driver M88E1011S_driver = {
|
|
static struct phy_driver M88E1011S_driver = {
|
|
.name = "Marvell 88E1011S",
|
|
.name = "Marvell 88E1011S",
|
|
@@ -475,8 +512,19 @@ static struct phy_driver M88E1518_driver = {
|
|
.shutdown = &genphy_shutdown,
|
|
.shutdown = &genphy_shutdown,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct phy_driver M88E1310_driver = {
|
|
|
|
+ .name = "Marvell 88E1310",
|
|
|
|
+ .uid = 0x01410e90,
|
|
|
|
+ .mask = 0xffffff0,
|
|
|
|
+ .features = PHY_GBIT_FEATURES,
|
|
|
|
+ .config = &m88e1310_config,
|
|
|
|
+ .startup = &m88e1011s_startup,
|
|
|
|
+ .shutdown = &genphy_shutdown,
|
|
|
|
+};
|
|
|
|
+
|
|
int phy_marvell_init(void)
|
|
int phy_marvell_init(void)
|
|
{
|
|
{
|
|
|
|
+ phy_register(&M88E1310_driver);
|
|
phy_register(&M88E1149S_driver);
|
|
phy_register(&M88E1149S_driver);
|
|
phy_register(&M88E1145_driver);
|
|
phy_register(&M88E1145_driver);
|
|
phy_register(&M88E1121R_driver);
|
|
phy_register(&M88E1121R_driver);
|