staticint rockchip_close_tstmode(struct phy_device *phydev)
{ /* Back to basic register bank */ return phy_write(phydev, SMI_ADDR_TSTCNTL, TSTMODE_DISABLE);
}
staticint rockchip_integrated_phy_analog_init(struct phy_device *phydev)
{ int ret;
ret = rockchip_init_tstmode(phydev); if (ret) return ret;
/* * Adjust tx amplitude to make sginal better, * the default value is 0x8.
*/
ret = phy_write(phydev, SMI_ADDR_TSTWRITE, 0xB); if (ret) return ret;
ret = phy_write(phydev, SMI_ADDR_TSTCNTL, TSTCNTL_WR | WR_ADDR_A7CFG); if (ret) return ret;
return rockchip_close_tstmode(phydev);
}
staticint rockchip_integrated_phy_config_init(struct phy_device *phydev)
{ int val, ret;
/* * The auto MIDX has linked problem on some board, * workround to disable auto MDIX.
*/
val = phy_read(phydev, MII_INTERNAL_CTRL_STATUS); if (val < 0) return val;
val &= ~MII_AUTO_MDIX_EN;
ret = phy_write(phydev, MII_INTERNAL_CTRL_STATUS, val); if (ret) return ret;
staticvoid rockchip_link_change_notify(struct phy_device *phydev)
{ /* * If mode switch happens from 10BT to 100BT, all DSP/AFE * registers are set to default values. So any AFE/DSP * registers have to be re-initialized in this case.
*/ if (phydev->state == PHY_RUNNING && phydev->speed == SPEED_100) { int ret = rockchip_integrated_phy_analog_init(phydev);
if (ret)
phydev_err(phydev, "rockchip_integrated_phy_analog_init err: %d.\n",
ret);
}
}
staticint rockchip_set_polarity(struct phy_device *phydev, int polarity)
{ int reg, err, val;
/* get the current settings */
reg = phy_read(phydev, MII_INTERNAL_CTRL_STATUS); if (reg < 0) return reg;
reg &= ~MII_AUTO_MDIX_EN;
val = reg; switch (polarity) { case ETH_TP_MDI:
val &= ~MII_MDIX_EN; break; case ETH_TP_MDI_X:
val |= MII_MDIX_EN; break; case ETH_TP_MDI_AUTO: case ETH_TP_MDI_INVALID: default: return 0;
}
if (val != reg) { /* Set the new polarity value in the register */
err = phy_write(phydev, MII_INTERNAL_CTRL_STATUS, val); if (err) return err;
}
return 0;
}
staticint rockchip_config_aneg(struct phy_device *phydev)
{ int err;
err = rockchip_set_polarity(phydev, phydev->mdix); if (err < 0) return err;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.