Lines Matching full:phydev
87 static int rtl821x_read_page(struct phy_device *phydev) in rtl821x_read_page() argument
89 return __phy_read(phydev, RTL821x_PAGE_SELECT); in rtl821x_read_page()
92 static int rtl821x_write_page(struct phy_device *phydev, int page) in rtl821x_write_page() argument
94 return __phy_write(phydev, RTL821x_PAGE_SELECT, page); in rtl821x_write_page()
97 static int rtl821x_probe(struct phy_device *phydev) in rtl821x_probe() argument
99 struct device *dev = &phydev->mdio.dev; in rtl821x_probe()
101 u32 phy_id = phydev->drv->phy_id; in rtl821x_probe()
113 ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR1); in rtl821x_probe()
123 ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2); in rtl821x_probe()
132 phydev->priv = priv; in rtl821x_probe()
137 static int rtl8201_ack_interrupt(struct phy_device *phydev) in rtl8201_ack_interrupt() argument
141 err = phy_read(phydev, RTL8201F_ISR); in rtl8201_ack_interrupt()
146 static int rtl821x_ack_interrupt(struct phy_device *phydev) in rtl821x_ack_interrupt() argument
150 err = phy_read(phydev, RTL821x_INSR); in rtl821x_ack_interrupt()
155 static int rtl8211f_ack_interrupt(struct phy_device *phydev) in rtl8211f_ack_interrupt() argument
159 err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR); in rtl8211f_ack_interrupt()
164 static int rtl8201_config_intr(struct phy_device *phydev) in rtl8201_config_intr() argument
169 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in rtl8201_config_intr()
170 err = rtl8201_ack_interrupt(phydev); in rtl8201_config_intr()
175 err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val); in rtl8201_config_intr()
178 err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val); in rtl8201_config_intr()
182 err = rtl8201_ack_interrupt(phydev); in rtl8201_config_intr()
188 static int rtl8211b_config_intr(struct phy_device *phydev) in rtl8211b_config_intr() argument
192 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in rtl8211b_config_intr()
193 err = rtl821x_ack_interrupt(phydev); in rtl8211b_config_intr()
197 err = phy_write(phydev, RTL821x_INER, in rtl8211b_config_intr()
200 err = phy_write(phydev, RTL821x_INER, 0); in rtl8211b_config_intr()
204 err = rtl821x_ack_interrupt(phydev); in rtl8211b_config_intr()
210 static int rtl8211e_config_intr(struct phy_device *phydev) in rtl8211e_config_intr() argument
214 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in rtl8211e_config_intr()
215 err = rtl821x_ack_interrupt(phydev); in rtl8211e_config_intr()
219 err = phy_write(phydev, RTL821x_INER, in rtl8211e_config_intr()
222 err = phy_write(phydev, RTL821x_INER, 0); in rtl8211e_config_intr()
226 err = rtl821x_ack_interrupt(phydev); in rtl8211e_config_intr()
232 static int rtl8211f_config_intr(struct phy_device *phydev) in rtl8211f_config_intr() argument
237 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in rtl8211f_config_intr()
238 err = rtl8211f_ack_interrupt(phydev); in rtl8211f_config_intr()
243 err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val); in rtl8211f_config_intr()
246 err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val); in rtl8211f_config_intr()
250 err = rtl8211f_ack_interrupt(phydev); in rtl8211f_config_intr()
256 static irqreturn_t rtl8201_handle_interrupt(struct phy_device *phydev) in rtl8201_handle_interrupt() argument
260 irq_status = phy_read(phydev, RTL8201F_ISR); in rtl8201_handle_interrupt()
262 phy_error(phydev); in rtl8201_handle_interrupt()
269 phy_trigger_machine(phydev); in rtl8201_handle_interrupt()
274 static irqreturn_t rtl821x_handle_interrupt(struct phy_device *phydev) in rtl821x_handle_interrupt() argument
278 irq_status = phy_read(phydev, RTL821x_INSR); in rtl821x_handle_interrupt()
280 phy_error(phydev); in rtl821x_handle_interrupt()
284 irq_enabled = phy_read(phydev, RTL821x_INER); in rtl821x_handle_interrupt()
286 phy_error(phydev); in rtl821x_handle_interrupt()
293 phy_trigger_machine(phydev); in rtl821x_handle_interrupt()
298 static irqreturn_t rtl8211f_handle_interrupt(struct phy_device *phydev) in rtl8211f_handle_interrupt() argument
302 irq_status = phy_read_paged(phydev, 0xa43, RTL8211F_INSR); in rtl8211f_handle_interrupt()
304 phy_error(phydev); in rtl8211f_handle_interrupt()
311 phy_trigger_machine(phydev); in rtl8211f_handle_interrupt()
316 static int rtl8211_config_aneg(struct phy_device *phydev) in rtl8211_config_aneg() argument
320 ret = genphy_config_aneg(phydev); in rtl8211_config_aneg()
327 if (phydev->speed == SPEED_100 && phydev->autoneg == AUTONEG_DISABLE) { in rtl8211_config_aneg()
328 phy_write(phydev, 0x17, 0x2138); in rtl8211_config_aneg()
329 phy_write(phydev, 0x0e, 0x0260); in rtl8211_config_aneg()
331 phy_write(phydev, 0x17, 0x2108); in rtl8211_config_aneg()
332 phy_write(phydev, 0x0e, 0x0000); in rtl8211_config_aneg()
338 static int rtl8211c_config_init(struct phy_device *phydev) in rtl8211c_config_init() argument
341 return phy_set_bits(phydev, MII_CTRL1000, in rtl8211c_config_init()
345 static int rtl8211f_config_init(struct phy_device *phydev) in rtl8211f_config_init() argument
347 struct rtl821x_priv *priv = phydev->priv; in rtl8211f_config_init()
348 struct device *dev = &phydev->mdio.dev; in rtl8211f_config_init()
352 ret = phy_modify_paged_changed(phydev, 0xa43, RTL8211F_PHYCR1, in rtl8211f_config_init()
361 switch (phydev->interface) { in rtl8211f_config_init()
386 ret = phy_modify_paged_changed(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY, in rtl8211f_config_init()
401 ret = phy_modify_paged_changed(phydev, 0xd08, 0x15, RTL8211F_RX_DELAY, in rtl8211f_config_init()
417 ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2, in rtl8211f_config_init()
425 return genphy_soft_reset(phydev); in rtl8211f_config_init()
431 static int rtl821x_suspend(struct phy_device *phydev) in rtl821x_suspend() argument
433 struct rtl821x_priv *priv = phydev->priv; in rtl821x_suspend()
436 if (!phydev->wol_enabled) { in rtl821x_suspend()
437 ret = genphy_suspend(phydev); in rtl821x_suspend()
448 static int rtl821x_resume(struct phy_device *phydev) in rtl821x_resume() argument
450 struct rtl821x_priv *priv = phydev->priv; in rtl821x_resume()
453 if (!phydev->wol_enabled) in rtl821x_resume()
456 ret = genphy_resume(phydev); in rtl821x_resume()
465 static int rtl8211e_config_init(struct phy_device *phydev) in rtl8211e_config_init() argument
471 switch (phydev->interface) { in rtl8211e_config_init()
497 oldpage = phy_select_page(phydev, 0x7); in rtl8211e_config_init()
501 ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4); in rtl8211e_config_init()
505 ret = __phy_modify(phydev, 0x1c, RTL8211E_CTRL_DELAY in rtl8211e_config_init()
510 return phy_restore_page(phydev, oldpage, ret); in rtl8211e_config_init()
513 static int rtl8211b_suspend(struct phy_device *phydev) in rtl8211b_suspend() argument
515 phy_write(phydev, MII_MMD_DATA, BIT(9)); in rtl8211b_suspend()
517 return genphy_suspend(phydev); in rtl8211b_suspend()
520 static int rtl8211b_resume(struct phy_device *phydev) in rtl8211b_resume() argument
522 phy_write(phydev, MII_MMD_DATA, 0); in rtl8211b_resume()
524 return genphy_resume(phydev); in rtl8211b_resume()
527 static int rtl8366rb_config_init(struct phy_device *phydev) in rtl8366rb_config_init() argument
531 ret = phy_set_bits(phydev, RTL8366RB_POWER_SAVE, in rtl8366rb_config_init()
534 dev_err(&phydev->mdio.dev, in rtl8366rb_config_init()
542 static int rtlgen_get_speed(struct phy_device *phydev) in rtlgen_get_speed() argument
546 if (!phydev->link) in rtlgen_get_speed()
549 val = phy_read_paged(phydev, 0xa43, 0x12); in rtlgen_get_speed()
555 phydev->speed = SPEED_10; in rtlgen_get_speed()
558 phydev->speed = SPEED_100; in rtlgen_get_speed()
561 phydev->speed = SPEED_1000; in rtlgen_get_speed()
564 phydev->speed = SPEED_10000; in rtlgen_get_speed()
567 phydev->speed = SPEED_2500; in rtlgen_get_speed()
570 phydev->speed = SPEED_5000; in rtlgen_get_speed()
579 static int rtlgen_read_status(struct phy_device *phydev) in rtlgen_read_status() argument
583 ret = genphy_read_status(phydev); in rtlgen_read_status()
587 return rtlgen_get_speed(phydev); in rtlgen_read_status()
590 static int rtlgen_read_mmd(struct phy_device *phydev, int devnum, u16 regnum) in rtlgen_read_mmd() argument
595 rtl821x_write_page(phydev, 0xa5c); in rtlgen_read_mmd()
596 ret = __phy_read(phydev, 0x12); in rtlgen_read_mmd()
597 rtl821x_write_page(phydev, 0); in rtlgen_read_mmd()
599 rtl821x_write_page(phydev, 0xa5d); in rtlgen_read_mmd()
600 ret = __phy_read(phydev, 0x10); in rtlgen_read_mmd()
601 rtl821x_write_page(phydev, 0); in rtlgen_read_mmd()
603 rtl821x_write_page(phydev, 0xa5d); in rtlgen_read_mmd()
604 ret = __phy_read(phydev, 0x11); in rtlgen_read_mmd()
605 rtl821x_write_page(phydev, 0); in rtlgen_read_mmd()
613 static int rtlgen_write_mmd(struct phy_device *phydev, int devnum, u16 regnum, in rtlgen_write_mmd() argument
619 rtl821x_write_page(phydev, 0xa5d); in rtlgen_write_mmd()
620 ret = __phy_write(phydev, 0x10, val); in rtlgen_write_mmd()
621 rtl821x_write_page(phydev, 0); in rtlgen_write_mmd()
629 static int rtl822x_read_mmd(struct phy_device *phydev, int devnum, u16 regnum) in rtl822x_read_mmd() argument
631 int ret = rtlgen_read_mmd(phydev, devnum, regnum); in rtl822x_read_mmd()
637 rtl821x_write_page(phydev, 0xa6e); in rtl822x_read_mmd()
638 ret = __phy_read(phydev, 0x16); in rtl822x_read_mmd()
639 rtl821x_write_page(phydev, 0); in rtl822x_read_mmd()
641 rtl821x_write_page(phydev, 0xa6d); in rtl822x_read_mmd()
642 ret = __phy_read(phydev, 0x12); in rtl822x_read_mmd()
643 rtl821x_write_page(phydev, 0); in rtl822x_read_mmd()
645 rtl821x_write_page(phydev, 0xa6d); in rtl822x_read_mmd()
646 ret = __phy_read(phydev, 0x10); in rtl822x_read_mmd()
647 rtl821x_write_page(phydev, 0); in rtl822x_read_mmd()
653 static int rtl822x_write_mmd(struct phy_device *phydev, int devnum, u16 regnum, in rtl822x_write_mmd() argument
656 int ret = rtlgen_write_mmd(phydev, devnum, regnum, val); in rtl822x_write_mmd()
662 rtl821x_write_page(phydev, 0xa6d); in rtl822x_write_mmd()
663 ret = __phy_write(phydev, 0x12, val); in rtl822x_write_mmd()
664 rtl821x_write_page(phydev, 0); in rtl822x_write_mmd()
670 static int rtl822x_get_features(struct phy_device *phydev) in rtl822x_get_features() argument
674 val = phy_read_paged(phydev, 0xa61, 0x13); in rtl822x_get_features()
679 phydev->supported, val & RTL_SUPPORTS_2500FULL); in rtl822x_get_features()
681 phydev->supported, val & RTL_SUPPORTS_5000FULL); in rtl822x_get_features()
683 phydev->supported, val & RTL_SUPPORTS_10000FULL); in rtl822x_get_features()
685 return genphy_read_abilities(phydev); in rtl822x_get_features()
688 static int rtl822x_config_aneg(struct phy_device *phydev) in rtl822x_config_aneg() argument
692 if (phydev->autoneg == AUTONEG_ENABLE) { in rtl822x_config_aneg()
696 phydev->advertising)) in rtl822x_config_aneg()
699 ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12, in rtl822x_config_aneg()
705 return __genphy_config_aneg(phydev, ret); in rtl822x_config_aneg()
708 static int rtl822x_read_status(struct phy_device *phydev) in rtl822x_read_status() argument
712 if (phydev->autoneg == AUTONEG_ENABLE) { in rtl822x_read_status()
713 int lpadv = phy_read_paged(phydev, 0xa5d, 0x13); in rtl822x_read_status()
719 phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL); in rtl822x_read_status()
721 phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL); in rtl822x_read_status()
723 phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL); in rtl822x_read_status()
726 ret = genphy_read_status(phydev); in rtl822x_read_status()
730 return rtlgen_get_speed(phydev); in rtl822x_read_status()
733 static bool rtlgen_supports_2_5gbps(struct phy_device *phydev) in rtlgen_supports_2_5gbps() argument
737 phy_write(phydev, RTL821x_PAGE_SELECT, 0xa61); in rtlgen_supports_2_5gbps()
738 val = phy_read(phydev, 0x13); in rtlgen_supports_2_5gbps()
739 phy_write(phydev, RTL821x_PAGE_SELECT, 0); in rtlgen_supports_2_5gbps()
744 static int rtlgen_match_phy_device(struct phy_device *phydev) in rtlgen_match_phy_device() argument
746 return phydev->phy_id == RTL_GENERIC_PHYID && in rtlgen_match_phy_device()
747 !rtlgen_supports_2_5gbps(phydev); in rtlgen_match_phy_device()
750 static int rtl8226_match_phy_device(struct phy_device *phydev) in rtl8226_match_phy_device() argument
752 return phydev->phy_id == RTL_GENERIC_PHYID && in rtl8226_match_phy_device()
753 rtlgen_supports_2_5gbps(phydev); in rtl8226_match_phy_device()
756 static int rtlgen_resume(struct phy_device *phydev) in rtlgen_resume() argument
758 int ret = genphy_resume(phydev); in rtlgen_resume()
766 static int rtl9000a_config_init(struct phy_device *phydev) in rtl9000a_config_init() argument
768 phydev->autoneg = AUTONEG_DISABLE; in rtl9000a_config_init()
769 phydev->speed = SPEED_100; in rtl9000a_config_init()
770 phydev->duplex = DUPLEX_FULL; in rtl9000a_config_init()
775 static int rtl9000a_config_aneg(struct phy_device *phydev) in rtl9000a_config_aneg() argument
780 switch (phydev->master_slave_set) { in rtl9000a_config_aneg()
790 phydev_warn(phydev, "Unsupported Master/Slave mode\n"); in rtl9000a_config_aneg()
794 ret = phy_modify_changed(phydev, MII_CTRL1000, CTL1000_AS_MASTER, ctl); in rtl9000a_config_aneg()
796 ret = genphy_soft_reset(phydev); in rtl9000a_config_aneg()
801 static int rtl9000a_read_status(struct phy_device *phydev) in rtl9000a_read_status() argument
805 phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN; in rtl9000a_read_status()
806 phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN; in rtl9000a_read_status()
808 ret = genphy_update_link(phydev); in rtl9000a_read_status()
812 ret = phy_read(phydev, MII_CTRL1000); in rtl9000a_read_status()
816 phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE; in rtl9000a_read_status()
818 phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE; in rtl9000a_read_status()
820 ret = phy_read(phydev, MII_STAT1000); in rtl9000a_read_status()
824 phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER; in rtl9000a_read_status()
826 phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE; in rtl9000a_read_status()
831 static int rtl9000a_ack_interrupt(struct phy_device *phydev) in rtl9000a_ack_interrupt() argument
835 err = phy_read(phydev, RTL8211F_INSR); in rtl9000a_ack_interrupt()
840 static int rtl9000a_config_intr(struct phy_device *phydev) in rtl9000a_config_intr() argument
845 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in rtl9000a_config_intr()
846 err = rtl9000a_ack_interrupt(phydev); in rtl9000a_config_intr()
851 err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val); in rtl9000a_config_intr()
854 err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val); in rtl9000a_config_intr()
858 err = rtl9000a_ack_interrupt(phydev); in rtl9000a_config_intr()
861 return phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val); in rtl9000a_config_intr()
864 static irqreturn_t rtl9000a_handle_interrupt(struct phy_device *phydev) in rtl9000a_handle_interrupt() argument
868 irq_status = phy_read(phydev, RTL8211F_INSR); in rtl9000a_handle_interrupt()
870 phy_error(phydev); in rtl9000a_handle_interrupt()
877 phy_trigger_machine(phydev); in rtl9000a_handle_interrupt()