Lines Matching refs:phydev

85 static int rtl821x_read_page(struct phy_device *phydev)  in rtl821x_read_page()  argument
87 return __phy_read(phydev, RTL821x_PAGE_SELECT); in rtl821x_read_page()
90 static int rtl821x_write_page(struct phy_device *phydev, int page) in rtl821x_write_page() argument
92 return __phy_write(phydev, RTL821x_PAGE_SELECT, page); in rtl821x_write_page()
95 static int rtl821x_probe(struct phy_device *phydev) in rtl821x_probe() argument
97 struct device *dev = &phydev->mdio.dev; in rtl821x_probe()
99 u32 phy_id = phydev->drv->phy_id; in rtl821x_probe()
106 ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR1); in rtl821x_probe()
116 ret = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2); in rtl821x_probe()
125 phydev->priv = priv; in rtl821x_probe()
130 static int rtl8201_ack_interrupt(struct phy_device *phydev) in rtl8201_ack_interrupt() argument
134 err = phy_read(phydev, RTL8201F_ISR); in rtl8201_ack_interrupt()
139 static int rtl821x_ack_interrupt(struct phy_device *phydev) in rtl821x_ack_interrupt() argument
143 err = phy_read(phydev, RTL821x_INSR); in rtl821x_ack_interrupt()
148 static int rtl8211f_ack_interrupt(struct phy_device *phydev) in rtl8211f_ack_interrupt() argument
152 err = phy_read_paged(phydev, 0xa43, RTL8211F_INSR); in rtl8211f_ack_interrupt()
157 static int rtl8201_config_intr(struct phy_device *phydev) in rtl8201_config_intr() argument
162 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in rtl8201_config_intr()
163 err = rtl8201_ack_interrupt(phydev); in rtl8201_config_intr()
168 err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val); in rtl8201_config_intr()
171 err = phy_write_paged(phydev, 0x7, RTL8201F_IER, val); in rtl8201_config_intr()
175 err = rtl8201_ack_interrupt(phydev); in rtl8201_config_intr()
181 static int rtl8211b_config_intr(struct phy_device *phydev) in rtl8211b_config_intr() argument
185 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in rtl8211b_config_intr()
186 err = rtl821x_ack_interrupt(phydev); in rtl8211b_config_intr()
190 err = phy_write(phydev, RTL821x_INER, in rtl8211b_config_intr()
193 err = phy_write(phydev, RTL821x_INER, 0); in rtl8211b_config_intr()
197 err = rtl821x_ack_interrupt(phydev); in rtl8211b_config_intr()
203 static int rtl8211e_config_intr(struct phy_device *phydev) in rtl8211e_config_intr() argument
207 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in rtl8211e_config_intr()
208 err = rtl821x_ack_interrupt(phydev); in rtl8211e_config_intr()
212 err = phy_write(phydev, RTL821x_INER, in rtl8211e_config_intr()
215 err = phy_write(phydev, RTL821x_INER, 0); in rtl8211e_config_intr()
219 err = rtl821x_ack_interrupt(phydev); in rtl8211e_config_intr()
225 static int rtl8211f_config_intr(struct phy_device *phydev) in rtl8211f_config_intr() argument
230 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in rtl8211f_config_intr()
231 err = rtl8211f_ack_interrupt(phydev); in rtl8211f_config_intr()
236 err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val); in rtl8211f_config_intr()
239 err = phy_write_paged(phydev, 0xa42, RTL821x_INER, val); in rtl8211f_config_intr()
243 err = rtl8211f_ack_interrupt(phydev); in rtl8211f_config_intr()
249 static irqreturn_t rtl8201_handle_interrupt(struct phy_device *phydev) in rtl8201_handle_interrupt() argument
253 irq_status = phy_read(phydev, RTL8201F_ISR); in rtl8201_handle_interrupt()
255 phy_error(phydev); in rtl8201_handle_interrupt()
262 phy_trigger_machine(phydev); in rtl8201_handle_interrupt()
267 static irqreturn_t rtl821x_handle_interrupt(struct phy_device *phydev) in rtl821x_handle_interrupt() argument
271 irq_status = phy_read(phydev, RTL821x_INSR); in rtl821x_handle_interrupt()
273 phy_error(phydev); in rtl821x_handle_interrupt()
277 irq_enabled = phy_read(phydev, RTL821x_INER); in rtl821x_handle_interrupt()
279 phy_error(phydev); in rtl821x_handle_interrupt()
286 phy_trigger_machine(phydev); in rtl821x_handle_interrupt()
291 static irqreturn_t rtl8211f_handle_interrupt(struct phy_device *phydev) in rtl8211f_handle_interrupt() argument
295 irq_status = phy_read_paged(phydev, 0xa43, RTL8211F_INSR); in rtl8211f_handle_interrupt()
297 phy_error(phydev); in rtl8211f_handle_interrupt()
304 phy_trigger_machine(phydev); in rtl8211f_handle_interrupt()
309 static int rtl8211_config_aneg(struct phy_device *phydev) in rtl8211_config_aneg() argument
313 ret = genphy_config_aneg(phydev); in rtl8211_config_aneg()
320 if (phydev->speed == SPEED_100 && phydev->autoneg == AUTONEG_DISABLE) { in rtl8211_config_aneg()
321 phy_write(phydev, 0x17, 0x2138); in rtl8211_config_aneg()
322 phy_write(phydev, 0x0e, 0x0260); in rtl8211_config_aneg()
324 phy_write(phydev, 0x17, 0x2108); in rtl8211_config_aneg()
325 phy_write(phydev, 0x0e, 0x0000); in rtl8211_config_aneg()
331 static int rtl8211c_config_init(struct phy_device *phydev) in rtl8211c_config_init() argument
334 return phy_set_bits(phydev, MII_CTRL1000, in rtl8211c_config_init()
338 static int rtl8211f_config_init(struct phy_device *phydev) in rtl8211f_config_init() argument
340 struct rtl821x_priv *priv = phydev->priv; in rtl8211f_config_init()
341 struct device *dev = &phydev->mdio.dev; in rtl8211f_config_init()
345 ret = phy_modify_paged_changed(phydev, 0xa43, RTL8211F_PHYCR1, in rtl8211f_config_init()
354 switch (phydev->interface) { in rtl8211f_config_init()
379 ret = phy_modify_paged_changed(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY, in rtl8211f_config_init()
394 ret = phy_modify_paged_changed(phydev, 0xd08, 0x15, RTL8211F_RX_DELAY, in rtl8211f_config_init()
410 ret = phy_modify_paged(phydev, 0xa43, RTL8211F_PHYCR2, in rtl8211f_config_init()
419 return genphy_soft_reset(phydev); in rtl8211f_config_init()
422 static int rtl821x_resume(struct phy_device *phydev) in rtl821x_resume() argument
426 ret = genphy_resume(phydev); in rtl821x_resume()
435 static int rtl8211e_config_init(struct phy_device *phydev) in rtl8211e_config_init() argument
441 switch (phydev->interface) { in rtl8211e_config_init()
467 oldpage = phy_select_page(phydev, 0x7); in rtl8211e_config_init()
471 ret = __phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4); in rtl8211e_config_init()
475 ret = __phy_modify(phydev, 0x1c, RTL8211E_CTRL_DELAY in rtl8211e_config_init()
480 return phy_restore_page(phydev, oldpage, ret); in rtl8211e_config_init()
483 static int rtl8211b_suspend(struct phy_device *phydev) in rtl8211b_suspend() argument
485 phy_write(phydev, MII_MMD_DATA, BIT(9)); in rtl8211b_suspend()
487 return genphy_suspend(phydev); in rtl8211b_suspend()
490 static int rtl8211b_resume(struct phy_device *phydev) in rtl8211b_resume() argument
492 phy_write(phydev, MII_MMD_DATA, 0); in rtl8211b_resume()
494 return genphy_resume(phydev); in rtl8211b_resume()
497 static int rtl8366rb_config_init(struct phy_device *phydev) in rtl8366rb_config_init() argument
501 ret = phy_set_bits(phydev, RTL8366RB_POWER_SAVE, in rtl8366rb_config_init()
504 dev_err(&phydev->mdio.dev, in rtl8366rb_config_init()
512 static int rtlgen_get_speed(struct phy_device *phydev) in rtlgen_get_speed() argument
516 if (!phydev->link) in rtlgen_get_speed()
519 val = phy_read_paged(phydev, 0xa43, 0x12); in rtlgen_get_speed()
525 phydev->speed = SPEED_10; in rtlgen_get_speed()
528 phydev->speed = SPEED_100; in rtlgen_get_speed()
531 phydev->speed = SPEED_1000; in rtlgen_get_speed()
534 phydev->speed = SPEED_10000; in rtlgen_get_speed()
537 phydev->speed = SPEED_2500; in rtlgen_get_speed()
540 phydev->speed = SPEED_5000; in rtlgen_get_speed()
549 static int rtlgen_read_status(struct phy_device *phydev) in rtlgen_read_status() argument
553 ret = genphy_read_status(phydev); in rtlgen_read_status()
557 return rtlgen_get_speed(phydev); in rtlgen_read_status()
560 static int rtlgen_read_mmd(struct phy_device *phydev, int devnum, u16 regnum) in rtlgen_read_mmd() argument
565 rtl821x_write_page(phydev, 0xa5c); in rtlgen_read_mmd()
566 ret = __phy_read(phydev, 0x12); in rtlgen_read_mmd()
567 rtl821x_write_page(phydev, 0); in rtlgen_read_mmd()
569 rtl821x_write_page(phydev, 0xa5d); in rtlgen_read_mmd()
570 ret = __phy_read(phydev, 0x10); in rtlgen_read_mmd()
571 rtl821x_write_page(phydev, 0); in rtlgen_read_mmd()
573 rtl821x_write_page(phydev, 0xa5d); in rtlgen_read_mmd()
574 ret = __phy_read(phydev, 0x11); in rtlgen_read_mmd()
575 rtl821x_write_page(phydev, 0); in rtlgen_read_mmd()
583 static int rtlgen_write_mmd(struct phy_device *phydev, int devnum, u16 regnum, in rtlgen_write_mmd() argument
589 rtl821x_write_page(phydev, 0xa5d); in rtlgen_write_mmd()
590 ret = __phy_write(phydev, 0x10, val); in rtlgen_write_mmd()
591 rtl821x_write_page(phydev, 0); in rtlgen_write_mmd()
599 static int rtl822x_read_mmd(struct phy_device *phydev, int devnum, u16 regnum) in rtl822x_read_mmd() argument
601 int ret = rtlgen_read_mmd(phydev, devnum, regnum); in rtl822x_read_mmd()
607 rtl821x_write_page(phydev, 0xa6e); in rtl822x_read_mmd()
608 ret = __phy_read(phydev, 0x16); in rtl822x_read_mmd()
609 rtl821x_write_page(phydev, 0); in rtl822x_read_mmd()
611 rtl821x_write_page(phydev, 0xa6d); in rtl822x_read_mmd()
612 ret = __phy_read(phydev, 0x12); in rtl822x_read_mmd()
613 rtl821x_write_page(phydev, 0); in rtl822x_read_mmd()
615 rtl821x_write_page(phydev, 0xa6d); in rtl822x_read_mmd()
616 ret = __phy_read(phydev, 0x10); in rtl822x_read_mmd()
617 rtl821x_write_page(phydev, 0); in rtl822x_read_mmd()
623 static int rtl822x_write_mmd(struct phy_device *phydev, int devnum, u16 regnum, in rtl822x_write_mmd() argument
626 int ret = rtlgen_write_mmd(phydev, devnum, regnum, val); in rtl822x_write_mmd()
632 rtl821x_write_page(phydev, 0xa6d); in rtl822x_write_mmd()
633 ret = __phy_write(phydev, 0x12, val); in rtl822x_write_mmd()
634 rtl821x_write_page(phydev, 0); in rtl822x_write_mmd()
640 static int rtl822x_get_features(struct phy_device *phydev) in rtl822x_get_features() argument
644 val = phy_read_paged(phydev, 0xa61, 0x13); in rtl822x_get_features()
649 phydev->supported, val & RTL_SUPPORTS_2500FULL); in rtl822x_get_features()
651 phydev->supported, val & RTL_SUPPORTS_5000FULL); in rtl822x_get_features()
653 phydev->supported, val & RTL_SUPPORTS_10000FULL); in rtl822x_get_features()
655 return genphy_read_abilities(phydev); in rtl822x_get_features()
658 static int rtl822x_config_aneg(struct phy_device *phydev) in rtl822x_config_aneg() argument
662 if (phydev->autoneg == AUTONEG_ENABLE) { in rtl822x_config_aneg()
666 phydev->advertising)) in rtl822x_config_aneg()
669 ret = phy_modify_paged_changed(phydev, 0xa5d, 0x12, in rtl822x_config_aneg()
675 return __genphy_config_aneg(phydev, ret); in rtl822x_config_aneg()
678 static int rtl822x_read_status(struct phy_device *phydev) in rtl822x_read_status() argument
682 if (phydev->autoneg == AUTONEG_ENABLE) { in rtl822x_read_status()
683 int lpadv = phy_read_paged(phydev, 0xa5d, 0x13); in rtl822x_read_status()
689 phydev->lp_advertising, lpadv & RTL_LPADV_10000FULL); in rtl822x_read_status()
691 phydev->lp_advertising, lpadv & RTL_LPADV_5000FULL); in rtl822x_read_status()
693 phydev->lp_advertising, lpadv & RTL_LPADV_2500FULL); in rtl822x_read_status()
696 ret = genphy_read_status(phydev); in rtl822x_read_status()
700 return rtlgen_get_speed(phydev); in rtl822x_read_status()
703 static bool rtlgen_supports_2_5gbps(struct phy_device *phydev) in rtlgen_supports_2_5gbps() argument
707 phy_write(phydev, RTL821x_PAGE_SELECT, 0xa61); in rtlgen_supports_2_5gbps()
708 val = phy_read(phydev, 0x13); in rtlgen_supports_2_5gbps()
709 phy_write(phydev, RTL821x_PAGE_SELECT, 0); in rtlgen_supports_2_5gbps()
714 static int rtlgen_match_phy_device(struct phy_device *phydev) in rtlgen_match_phy_device() argument
716 return phydev->phy_id == RTL_GENERIC_PHYID && in rtlgen_match_phy_device()
717 !rtlgen_supports_2_5gbps(phydev); in rtlgen_match_phy_device()
720 static int rtl8226_match_phy_device(struct phy_device *phydev) in rtl8226_match_phy_device() argument
722 return phydev->phy_id == RTL_GENERIC_PHYID && in rtl8226_match_phy_device()
723 rtlgen_supports_2_5gbps(phydev); in rtl8226_match_phy_device()
726 static int rtlgen_resume(struct phy_device *phydev) in rtlgen_resume() argument
728 int ret = genphy_resume(phydev); in rtlgen_resume()
736 static int rtl9000a_config_init(struct phy_device *phydev) in rtl9000a_config_init() argument
738 phydev->autoneg = AUTONEG_DISABLE; in rtl9000a_config_init()
739 phydev->speed = SPEED_100; in rtl9000a_config_init()
740 phydev->duplex = DUPLEX_FULL; in rtl9000a_config_init()
745 static int rtl9000a_config_aneg(struct phy_device *phydev) in rtl9000a_config_aneg() argument
750 switch (phydev->master_slave_set) { in rtl9000a_config_aneg()
760 phydev_warn(phydev, "Unsupported Master/Slave mode\n"); in rtl9000a_config_aneg()
764 ret = phy_modify_changed(phydev, MII_CTRL1000, CTL1000_AS_MASTER, ctl); in rtl9000a_config_aneg()
766 ret = genphy_soft_reset(phydev); in rtl9000a_config_aneg()
771 static int rtl9000a_read_status(struct phy_device *phydev) in rtl9000a_read_status() argument
775 phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN; in rtl9000a_read_status()
776 phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN; in rtl9000a_read_status()
778 ret = genphy_update_link(phydev); in rtl9000a_read_status()
782 ret = phy_read(phydev, MII_CTRL1000); in rtl9000a_read_status()
786 phydev->master_slave_get = MASTER_SLAVE_CFG_MASTER_FORCE; in rtl9000a_read_status()
788 phydev->master_slave_get = MASTER_SLAVE_CFG_SLAVE_FORCE; in rtl9000a_read_status()
790 ret = phy_read(phydev, MII_STAT1000); in rtl9000a_read_status()
794 phydev->master_slave_state = MASTER_SLAVE_STATE_MASTER; in rtl9000a_read_status()
796 phydev->master_slave_state = MASTER_SLAVE_STATE_SLAVE; in rtl9000a_read_status()
801 static int rtl9000a_ack_interrupt(struct phy_device *phydev) in rtl9000a_ack_interrupt() argument
805 err = phy_read(phydev, RTL8211F_INSR); in rtl9000a_ack_interrupt()
810 static int rtl9000a_config_intr(struct phy_device *phydev) in rtl9000a_config_intr() argument
815 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in rtl9000a_config_intr()
816 err = rtl9000a_ack_interrupt(phydev); in rtl9000a_config_intr()
821 err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val); in rtl9000a_config_intr()
824 err = phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val); in rtl9000a_config_intr()
828 err = rtl9000a_ack_interrupt(phydev); in rtl9000a_config_intr()
831 return phy_write_paged(phydev, 0xa42, RTL9000A_GINMR, val); in rtl9000a_config_intr()
834 static irqreturn_t rtl9000a_handle_interrupt(struct phy_device *phydev) in rtl9000a_handle_interrupt() argument
838 irq_status = phy_read(phydev, RTL8211F_INSR); in rtl9000a_handle_interrupt()
840 phy_error(phydev); in rtl9000a_handle_interrupt()
847 phy_trigger_machine(phydev); in rtl9000a_handle_interrupt()