|
@@ -19,6 +19,11 @@
|
|
|
|
|
|
#define PHY_ID_BCM50610 0x0143bd60
|
|
|
#define PHY_ID_BCM50610M 0x0143bd70
|
|
|
+#define PHY_ID_BCM57780 0x03625d90
|
|
|
+
|
|
|
+#define BRCM_PHY_MODEL(phydev) \
|
|
|
+ ((phydev)->drv->phy_id & (phydev)->drv->phy_id_mask)
|
|
|
+
|
|
|
|
|
|
#define MII_BCM54XX_ECR 0x10 /* BCM54xx extended control register */
|
|
|
#define MII_BCM54XX_ECR_IM 0x1000 /* Interrupt mask */
|
|
@@ -118,6 +123,7 @@
|
|
|
#define MII_BCM54XX_EXP_EXP08_EARLY_DAC_WAKE 0x0200
|
|
|
#define MII_BCM54XX_EXP_EXP75 0x0f75
|
|
|
#define MII_BCM54XX_EXP_EXP75_VDACCTRL 0x003c
|
|
|
+#define MII_BCM54XX_EXP_EXP75_CM_OSC 0x0001
|
|
|
#define MII_BCM54XX_EXP_EXP96 0x0f96
|
|
|
#define MII_BCM54XX_EXP_EXP96_MYST 0x0010
|
|
|
#define MII_BCM54XX_EXP_EXP97 0x0f97
|
|
@@ -194,7 +200,7 @@ static int bcm54xx_shadow_write(struct phy_device *phydev, u16 shadow, u16 val)
|
|
|
}
|
|
|
|
|
|
/* Indirect register access functions for the Expansion Registers */
|
|
|
-static int bcm54xx_exp_read(struct phy_device *phydev, u8 regnum)
|
|
|
+static int bcm54xx_exp_read(struct phy_device *phydev, u16 regnum)
|
|
|
{
|
|
|
int val;
|
|
|
|
|
@@ -308,6 +314,33 @@ static int bcm54xx_config_init(struct phy_device *phydev)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+ if (BRCM_PHY_MODEL(phydev) == PHY_ID_BCM57780) {
|
|
|
+ int err2;
|
|
|
+
|
|
|
+ err = bcm54xx_auxctl_write(phydev,
|
|
|
+ MII_BCM54XX_AUXCTL_SHDWSEL_AUXCTL,
|
|
|
+ MII_BCM54XX_AUXCTL_ACTL_SMDSP_ENA |
|
|
|
+ MII_BCM54XX_AUXCTL_ACTL_TX_6DB);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ reg = bcm54xx_exp_read(phydev, MII_BCM54XX_EXP_EXP75);
|
|
|
+ if (reg < 0)
|
|
|
+ goto error;
|
|
|
+
|
|
|
+ reg |= MII_BCM54XX_EXP_EXP75_CM_OSC;
|
|
|
+ err = bcm54xx_exp_write(phydev, MII_BCM54XX_EXP_EXP75, reg);
|
|
|
+
|
|
|
+error:
|
|
|
+ err2 = bcm54xx_auxctl_write(phydev,
|
|
|
+ MII_BCM54XX_AUXCTL_SHDWSEL_AUXCTL,
|
|
|
+ MII_BCM54XX_AUXCTL_ACTL_TX_6DB);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ if (err2)
|
|
|
+ return err2;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -694,7 +727,7 @@ static struct phy_driver bcm50610m_driver = {
|
|
|
};
|
|
|
|
|
|
static struct phy_driver bcm57780_driver = {
|
|
|
- .phy_id = 0x03625d90,
|
|
|
+ .phy_id = PHY_ID_BCM57780,
|
|
|
.phy_id_mask = 0xfffffff0,
|
|
|
.name = "Broadcom BCM57780",
|
|
|
.features = PHY_GBIT_FEATURES |
|