Lines Matching defs:phydev

299  * @phydev: a pointer to a &struct phy_device
306 static int ytphy_read_ext(struct phy_device *phydev, u16 regnum)
310 ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
314 return __phy_read(phydev, YTPHY_PAGE_DATA);
319 * @phydev: a pointer to a &struct phy_device
324 static int ytphy_read_ext_with_lock(struct phy_device *phydev, u16 regnum)
328 phy_lock_mdio_bus(phydev);
329 ret = ytphy_read_ext(phydev, regnum);
330 phy_unlock_mdio_bus(phydev);
337 * @phydev: a pointer to a &struct phy_device
345 static int ytphy_write_ext(struct phy_device *phydev, u16 regnum, u16 val)
349 ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
353 return __phy_write(phydev, YTPHY_PAGE_DATA, val);
358 * @phydev: a pointer to a &struct phy_device
364 static int ytphy_write_ext_with_lock(struct phy_device *phydev, u16 regnum,
369 phy_lock_mdio_bus(phydev);
370 ret = ytphy_write_ext(phydev, regnum, val);
371 phy_unlock_mdio_bus(phydev);
378 * @phydev: a pointer to a &struct phy_device
389 static int ytphy_modify_ext(struct phy_device *phydev, u16 regnum, u16 mask,
394 ret = __phy_write(phydev, YTPHY_PAGE_SELECT, regnum);
398 return __phy_modify(phydev, YTPHY_PAGE_DATA, mask, set);
403 * @phydev: a pointer to a &struct phy_device
413 static int ytphy_modify_ext_with_lock(struct phy_device *phydev, u16 regnum,
418 phy_lock_mdio_bus(phydev);
419 ret = ytphy_modify_ext(phydev, regnum, mask, set);
420 phy_unlock_mdio_bus(phydev);
427 * @phydev: a pointer to a &struct phy_device
432 static void ytphy_get_wol(struct phy_device *phydev,
440 wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
450 * @phydev: a pointer to a &struct phy_device
459 static int ytphy_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol)
475 p_attached_dev = phydev->attached_dev;
484 old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
490 ret = ytphy_write_ext(phydev, mac_addr_reg[i],
501 ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, val);
506 ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0,
512 old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
518 ret = ytphy_modify_ext(phydev, YTPHY_WOL_CONFIG_REG, mask, 0);
521 ret = __phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG,
528 return phy_restore_page(phydev, old_page, ret);
531 static int yt8531_set_wol(struct phy_device *phydev,
545 mac_addr = phydev->attached_dev->dev_addr;
549 ret = ytphy_write_ext_with_lock(phydev, mac_addr_reg[i],
560 ret = ytphy_modify_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG,
566 ret = phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG, 0,
573 ret = ytphy_modify_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG,
577 ret = phy_modify(phydev, YTPHY_INTERRUPT_ENABLE_REG,
586 static int yt8511_read_page(struct phy_device *phydev)
588 return __phy_read(phydev, YT8511_PAGE_SELECT);
591 static int yt8511_write_page(struct phy_device *phydev, int page)
593 return __phy_write(phydev, YT8511_PAGE_SELECT, page);
596 static int yt8511_config_init(struct phy_device *phydev)
601 oldpage = phy_select_page(phydev, YT8511_EXT_CLK_GATE);
606 switch (phydev->interface) {
628 ret = __phy_modify(phydev, YT8511_PAGE, (YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN), ge);
633 ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_CLK_125M);
638 ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_DELAY_DRIVE);
642 ret = __phy_modify(phydev, YT8511_PAGE, YT8511_DELAY_FE_TX_EN, fe);
647 ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_SLEEP_CTRL);
651 ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_PLLON_SLP);
656 return phy_restore_page(phydev, oldpage, ret);
661 * @phydev: a pointer to a &struct phy_device
666 static int yt8521_read_page(struct phy_device *phydev)
670 old_page = ytphy_read_ext(phydev, YT8521_REG_SPACE_SELECT_REG);
682 * @phydev: a pointer to a &struct phy_device
687 static int yt8521_write_page(struct phy_device *phydev, int page)
697 return ytphy_modify_ext(phydev, YT8521_REG_SPACE_SELECT_REG, mask, set);
748 static u32 ytphy_get_delay_reg_value(struct phy_device *phydev,
755 struct device_node *node = phydev->mdio.dev.of_node;
777 phydev_warn(phydev, "Unsupported value %d for %s using default (%u)\n",
791 static int ytphy_rgmii_clk_delay_config(struct phy_device *phydev)
799 rx_reg = ytphy_get_delay_reg_value(phydev, "rx-internal-delay-ps",
803 tx_reg = ytphy_get_delay_reg_value(phydev, "tx-internal-delay-ps",
807 switch (phydev->interface) {
826 ret = ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
833 return ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, mask, val);
836 static int ytphy_rgmii_clk_delay_config_with_lock(struct phy_device *phydev)
840 phy_lock_mdio_bus(phydev);
841 ret = ytphy_rgmii_clk_delay_config(phydev);
842 phy_unlock_mdio_bus(phydev);
878 static u32 yt8531_get_ldo_vol(struct phy_device *phydev)
882 val = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
888 static int yt8531_get_ds_map(struct phy_device *phydev, u32 cur)
893 vol = yt8531_get_ldo_vol(phydev);
902 static int yt8531_set_ds(struct phy_device *phydev)
904 struct device_node *node = phydev->mdio.dev.of_node;
910 ds = yt8531_get_ds_map(phydev, val);
912 return dev_err_probe(&phydev->mdio.dev, ds,
918 ret = ytphy_modify_ext_with_lock(phydev,
927 ds = yt8531_get_ds_map(phydev, val);
929 return dev_err_probe(&phydev->mdio.dev, ds,
941 ret = ytphy_modify_ext_with_lock(phydev,
953 * @phydev: a pointer to a &struct phy_device
957 static int yt8521_probe(struct phy_device *phydev)
959 struct device_node *node = phydev->mdio.dev.of_node;
960 struct device *dev = &phydev->mdio.dev;
971 phydev->priv = priv;
973 chip_config = ytphy_read_ext_with_lock(phydev, YT8521_CHIP_CONFIG_REG);
984 phydev->port = PORT_FIBRE;
991 phydev->port = PORT_NONE;
997 phydev->port = PORT_TP;
1002 ret = ytphy_write_ext_with_lock(phydev,
1012 if (phydev->drv->phy_id == PHY_ID_YT8521) {
1036 phydev_warn(phydev, "Freq err:%u\n", freq);
1039 } else if (phydev->drv->phy_id == PHY_ID_YT8531S) {
1063 phydev_warn(phydev, "Freq err:%u\n", freq);
1067 phydev_warn(phydev, "PHY id err\n");
1071 return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask,
1075 static int yt8531_probe(struct phy_device *phydev)
1077 struct device_node *node = phydev->mdio.dev.of_node;
1104 phydev_warn(phydev, "Freq err:%u\n", freq);
1108 return ytphy_modify_ext_with_lock(phydev, YTPHY_SYNCE_CFG_REG, mask,
1114 * @phydev: a pointer to a &struct phy_device
1120 static int ytphy_utp_read_lpa(struct phy_device *phydev)
1124 if (phydev->autoneg == AUTONEG_ENABLE) {
1125 if (!phydev->autoneg_complete) {
1126 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
1128 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, 0);
1132 if (phydev->is_gigabit_capable) {
1133 lpagb = __phy_read(phydev, MII_STAT1000);
1138 int adv = __phy_read(phydev, MII_CTRL1000);
1144 phydev_err(phydev, "Master/Slave resolution failed, maybe conflicting manual settings?\n");
1146 phydev_err(phydev, "Master/Slave resolution failed\n");
1150 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising,
1154 lpa = __phy_read(phydev, MII_LPA);
1158 mii_lpa_mod_linkmode_lpa_t(phydev->lp_advertising, lpa);
1160 linkmode_zero(phydev->lp_advertising);
1167 * yt8521_adjust_status() - update speed and duplex to phydev. when in fiber
1169 * @phydev: a pointer to a &struct phy_device
1177 static int yt8521_adjust_status(struct phy_device *phydev, int status,
1214 phydev->speed = speed;
1215 phydev->duplex = duplex;
1218 err = ytphy_utp_read_lpa(phydev);
1222 phy_resolve_aneg_pause(phydev);
1224 lpa = __phy_read(phydev, MII_LPA);
1230 phydev->lp_advertising, lpa & LPA_1000XFULL);
1233 phydev->pause = 0;
1234 phydev->asym_pause = 0;
1236 phydev->pause = 1;
1237 phydev->asym_pause = 1;
1239 phydev->pause = 1;
1240 phydev->asym_pause = 0;
1249 * @phydev: a pointer to a &struct phy_device
1255 static int yt8521_read_status_paged(struct phy_device *phydev, int page)
1264 linkmode_zero(phydev->lp_advertising);
1265 phydev->duplex = DUPLEX_UNKNOWN;
1266 phydev->speed = SPEED_UNKNOWN;
1267 phydev->asym_pause = 0;
1268 phydev->pause = 0;
1278 old_page = phy_select_page(phydev, page);
1285 ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
1297 ret = __phy_read(phydev, MII_BMSR);
1302 ret = __phy_read(phydev, MII_BMSR);
1309 phydev_info(phydev,
1315 ret = __phy_read(phydev, MII_BMSR);
1319 phydev->autoneg_complete = ret & BMSR_ANEGCOMPLETE ? 1 : 0;
1324 yt8521_adjust_status(phydev, status, true);
1326 yt8521_adjust_status(phydev, status, false);
1328 return phy_restore_page(phydev, old_page, link);
1331 return phy_restore_page(phydev, old_page, ret);
1336 * @phydev: a pointer to a &struct phy_device
1340 static int yt8521_read_status(struct phy_device *phydev)
1342 struct yt8521_priv *priv = phydev->priv;
1349 link = yt8521_read_status_paged(phydev, priv->reg_page);
1357 link_utp = yt8521_read_status_paged(phydev,
1363 link_fiber = yt8521_read_status_paged(phydev,
1373 if (phydev->link == 0) {
1383 ret = ytphy_write_ext_with_lock(phydev,
1389 phydev->port = link_fiber ? PORT_FIBRE : PORT_TP;
1391 phydev_info(phydev, "%s, link up, media: %s\n",
1393 (phydev->port == PORT_TP) ?
1397 phydev->link = 1;
1399 if (phydev->link == 1) {
1400 phydev_info(phydev, "%s, link down, media: %s\n",
1401 __func__, (phydev->port == PORT_TP) ?
1409 phydev->port = PORT_NONE;
1413 phydev->link = 0;
1421 * @phydev: the phy_device struct
1434 static int yt8521_modify_bmcr_paged(struct phy_device *phydev, int page,
1441 old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK);
1445 ret = __phy_modify(phydev, MII_BMCR, mask, set);
1453 ret = __phy_read(phydev, MII_BMCR);
1458 return phy_restore_page(phydev, old_page, 0);
1463 return phy_restore_page(phydev, old_page, ret);
1468 * @phydev: the phy_device struct
1479 static int yt8521_modify_utp_fiber_bmcr(struct phy_device *phydev, u16 mask,
1482 struct yt8521_priv *priv = phydev->priv;
1486 ret = yt8521_modify_bmcr_paged(phydev, priv->reg_page, mask,
1491 ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_UTP_SPACE,
1496 ret = yt8521_modify_bmcr_paged(phydev, YT8521_RSSR_FIBER_SPACE,
1506 * @phydev: a pointer to a &struct phy_device
1510 static int yt8521_soft_reset(struct phy_device *phydev)
1512 return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_RESET);
1517 * @phydev: a pointer to a &struct phy_device
1521 static int yt8521_suspend(struct phy_device *phydev)
1526 wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
1534 return yt8521_modify_utp_fiber_bmcr(phydev, 0, BMCR_PDOWN);
1539 * @phydev: a pointer to a &struct phy_device
1543 static int yt8521_resume(struct phy_device *phydev)
1549 ret = ytphy_modify_ext_with_lock(phydev,
1555 wol_config = ytphy_read_ext_with_lock(phydev, YTPHY_WOL_CONFIG_REG);
1563 return yt8521_modify_utp_fiber_bmcr(phydev, BMCR_PDOWN, 0);
1568 * @phydev: a pointer to a &struct phy_device
1572 static int yt8521_config_init(struct phy_device *phydev)
1574 struct device_node *node = phydev->mdio.dev.of_node;
1578 old_page = phy_select_page(phydev, YT8521_RSSR_UTP_SPACE);
1583 if (phydev->interface != PHY_INTERFACE_MODE_SGMII) {
1584 ret = ytphy_rgmii_clk_delay_config(phydev);
1591 ret = ytphy_modify_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1_REG,
1599 ret = ytphy_modify_ext(phydev, YT8521_CLOCK_GATING_REG,
1605 return phy_restore_page(phydev, old_page, ret);
1608 static int yt8531_config_init(struct phy_device *phydev)
1610 struct device_node *node = phydev->mdio.dev.of_node;
1613 ret = ytphy_rgmii_clk_delay_config_with_lock(phydev);
1619 ret = ytphy_modify_ext_with_lock(phydev,
1628 ret = ytphy_modify_ext_with_lock(phydev,
1635 ret = yt8531_set_ds(phydev);
1645 * @phydev: a pointer to a &struct phy_device
1651 static void yt8531_link_change_notify(struct phy_device *phydev)
1653 struct device_node *node = phydev->mdio.dev.of_node;
1674 if (phydev->speed < 0)
1677 switch (phydev->speed) {
1694 ret = ytphy_modify_ext_with_lock(phydev, YT8521_RGMII_CONFIG1_REG,
1697 phydev_warn(phydev, "Modify TX_CLK_SEL err:%d\n", ret);
1703 * @phydev: a pointer to a &struct phy_device
1706 static void yt8521_prepare_fiber_features(struct phy_device *phydev,
1716 * yt8521_fiber_setup_forced - configures/forces speed from @phydev
1717 * @phydev: target phy_device struct
1723 static int yt8521_fiber_setup_forced(struct phy_device *phydev)
1728 if (phydev->speed == SPEED_1000)
1730 else if (phydev->speed == SPEED_100)
1735 ret = __phy_modify(phydev, MII_BMCR, BMCR_ANENABLE, 0);
1740 ret = ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG,
1745 ret = ytphy_modify_ext(phydev, YTPHY_MISC_CONFIG_REG,
1750 return ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
1756 * @phydev: target phy_device struct
1763 static int ytphy_check_and_restart_aneg(struct phy_device *phydev, bool restart)
1771 ret = __phy_read(phydev, MII_BMCR);
1782 return __phy_modify(phydev, MII_BMCR, BMCR_ISOLATE,
1791 * @phydev: target phy_device struct
1797 static int yt8521_fiber_config_aneg(struct phy_device *phydev)
1803 if (phydev->autoneg != AUTONEG_ENABLE)
1804 return yt8521_fiber_setup_forced(phydev);
1807 err = ytphy_modify_ext(phydev, YT8521_LINK_TIMER_CFG2_REG,
1812 err = ytphy_modify_ext(phydev, YT8521_CHIP_CONFIG_REG,
1817 bmcr = __phy_read(phydev, MII_BMCR);
1825 __phy_modify(phydev, MII_BMCR, 0, BMCR_PDOWN);
1827 __phy_modify(phydev, MII_BMCR, BMCR_PDOWN, 0);
1830 adv = linkmode_adv_to_mii_adv_x(phydev->advertising,
1834 err = __phy_modify_changed(phydev, MII_ADVERTISE,
1845 return ytphy_check_and_restart_aneg(phydev, changed);
1850 * @phydev: target phy_device struct
1856 static int ytphy_setup_master_slave(struct phy_device *phydev)
1860 if (!phydev->is_gigabit_capable)
1863 switch (phydev->master_slave_set) {
1879 phydev_warn(phydev, "Unsupported Master/Slave mode\n");
1883 return __phy_modify_changed(phydev, MII_CTRL1000,
1890 * @phydev: target phy_device struct
1900 static int ytphy_utp_config_advert(struct phy_device *phydev)
1906 linkmode_and(phydev->advertising, phydev->advertising,
1907 phydev->supported);
1909 adv = linkmode_adv_to_mii_adv_t(phydev->advertising);
1912 err = __phy_modify_changed(phydev, MII_ADVERTISE,
1921 bmsr = __phy_read(phydev, MII_BMSR);
1932 adv = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising);
1934 err = __phy_modify_changed(phydev, MII_CTRL1000,
1947 * @phydev: target phy_device struct
1957 static int ytphy_utp_config_aneg(struct phy_device *phydev, bool changed)
1962 err = ytphy_setup_master_slave(phydev);
1968 if (phydev->autoneg != AUTONEG_ENABLE) {
1969 /* configures/forces speed/duplex from @phydev */
1971 ctl = mii_bmcr_encode_fixed(phydev->speed, phydev->duplex);
1973 return __phy_modify(phydev, MII_BMCR, ~(BMCR_LOOPBACK |
1977 err = ytphy_utp_config_advert(phydev);
1983 return ytphy_check_and_restart_aneg(phydev, changed);
1989 * @phydev: a pointer to a &struct phy_device
1995 static int yt8521_config_aneg_paged(struct phy_device *phydev, int page)
1998 struct yt8521_priv *priv = phydev->priv;
2004 old_page = phy_select_page(phydev, page);
2009 * phydev->advertising should be updated.
2013 yt8521_prepare_fiber_features(phydev, fiber_supported);
2021 linkmode_and(phydev->advertising,
2027 linkmode_andnot(phydev->advertising,
2034 ret = yt8521_fiber_config_aneg(phydev);
2036 ret = ytphy_utp_config_aneg(phydev, false);
2039 return phy_restore_page(phydev, old_page, ret);
2044 * @phydev: a pointer to a &struct phy_device
2048 static int yt8521_config_aneg(struct phy_device *phydev)
2050 struct yt8521_priv *priv = phydev->priv;
2054 ret = yt8521_config_aneg_paged(phydev, priv->reg_page);
2059 * phydev->advertising need to be saved at first run.
2065 phydev->advertising);
2068 ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_UTP_SPACE);
2072 ret = yt8521_config_aneg_paged(phydev, YT8521_RSSR_FIBER_SPACE);
2077 * phydev->advertising as default value.
2079 linkmode_copy(phydev->advertising, priv->combo_advertising);
2087 * @phydev: a pointer to a &struct phy_device
2093 static int yt8521_aneg_done_paged(struct phy_device *phydev, int page)
2099 old_page = phy_select_page(phydev, page & YT8521_RSSR_SPACE_MASK);
2103 ret = __phy_read(phydev, YTPHY_SPECIFIC_STATUS_REG);
2111 return phy_restore_page(phydev, old_page, ret);
2116 * @phydev: a pointer to a &struct phy_device
2120 static int yt8521_aneg_done(struct phy_device *phydev)
2122 struct yt8521_priv *priv = phydev->priv;
2128 link = yt8521_aneg_done_paged(phydev, priv->reg_page);
2130 link_utp = yt8521_aneg_done_paged(phydev,
2136 link_fiber = yt8521_aneg_done_paged(phydev,
2142 phydev_info(phydev, "%s, link_fiber: %d, link_utp: %d\n",
2151 * @phydev: target phy_device struct
2154 * phydev->supported accordingly.
2159 static int ytphy_utp_read_abilities(struct phy_device *phydev)
2165 phydev->supported);
2167 val = __phy_read(phydev, MII_BMSR);
2171 linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported,
2174 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, phydev->supported,
2176 linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, phydev->supported,
2178 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, phydev->supported,
2180 linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, phydev->supported,
2184 val = __phy_read(phydev, MII_ESTATUS);
2189 phydev->supported, val & ESTATUS_1000_TFULL);
2191 phydev->supported, val & ESTATUS_1000_THALF);
2193 phydev->supported, val & ESTATUS_1000_XFULL);
2201 * @phydev: a pointer to a &struct phy_device
2207 static int yt8521_get_features_paged(struct phy_device *phydev, int page)
2213 old_page = phy_select_page(phydev, page);
2218 linkmode_zero(phydev->supported);
2219 yt8521_prepare_fiber_features(phydev, phydev->supported);
2221 ret = ytphy_utp_read_abilities(phydev);
2227 return phy_restore_page(phydev, old_page, ret);
2232 * @phydev: target phy_device struct
2236 static int yt8521_get_features(struct phy_device *phydev)
2238 struct yt8521_priv *priv = phydev->priv;
2242 ret = yt8521_get_features_paged(phydev, priv->reg_page);
2244 ret = yt8521_get_features_paged(phydev,
2249 /* add fiber's features to phydev->supported */
2250 yt8521_prepare_fiber_features(phydev, phydev->supported);