Lines Matching refs:phydev

26 #define BRCM_PHY_MODEL(phydev) \  argument
27 ((phydev)->drv->phy_id & (phydev)->drv->phy_id_mask)
29 #define BRCM_PHY_REV(phydev) \ argument
30 ((phydev)->drv->phy_id & ~((phydev)->drv->phy_id_mask))
66 static bool bcm54xx_phy_can_wakeup(struct phy_device *phydev) in bcm54xx_phy_can_wakeup() argument
68 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54xx_phy_can_wakeup()
70 return phy_interrupt_is_valid(phydev) || priv->wake_irq >= 0; in bcm54xx_phy_can_wakeup()
73 static int bcm54xx_config_clock_delay(struct phy_device *phydev) in bcm54xx_config_clock_delay() argument
78 val = bcm54xx_auxctl_read(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC); in bcm54xx_config_clock_delay()
80 if (phydev->interface == PHY_INTERFACE_MODE_RGMII || in bcm54xx_config_clock_delay()
81 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) { in bcm54xx_config_clock_delay()
85 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in bcm54xx_config_clock_delay()
86 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) { in bcm54xx_config_clock_delay()
90 rc = bcm54xx_auxctl_write(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC, in bcm54xx_config_clock_delay()
96 val = bcm_phy_read_shadow(phydev, BCM54810_SHD_CLK_CTL); in bcm54xx_config_clock_delay()
97 if (phydev->interface == PHY_INTERFACE_MODE_RGMII || in bcm54xx_config_clock_delay()
98 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) { in bcm54xx_config_clock_delay()
102 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in bcm54xx_config_clock_delay()
103 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) { in bcm54xx_config_clock_delay()
107 rc = bcm_phy_write_shadow(phydev, BCM54810_SHD_CLK_CTL, val); in bcm54xx_config_clock_delay()
114 static int bcm54210e_config_init(struct phy_device *phydev) in bcm54210e_config_init() argument
118 bcm54xx_config_clock_delay(phydev); in bcm54210e_config_init()
120 if (phydev->dev_flags & PHY_BRCM_EN_MASTER_MODE) { in bcm54210e_config_init()
121 val = phy_read(phydev, MII_CTRL1000); in bcm54210e_config_init()
123 phy_write(phydev, MII_CTRL1000, val); in bcm54210e_config_init()
129 static int bcm54612e_config_init(struct phy_device *phydev) in bcm54612e_config_init() argument
133 bcm54xx_config_clock_delay(phydev); in bcm54612e_config_init()
136 if (!(phydev->dev_flags & PHY_BRCM_RX_REFCLK_UNUSED)) { in bcm54612e_config_init()
139 reg = bcm_phy_read_exp(phydev, BCM54612E_EXP_SPARE0); in bcm54612e_config_init()
140 err = bcm_phy_write_exp(phydev, BCM54612E_EXP_SPARE0, in bcm54612e_config_init()
150 static int bcm54616s_config_init(struct phy_device *phydev) in bcm54616s_config_init() argument
154 if (phydev->interface != PHY_INTERFACE_MODE_SGMII && in bcm54616s_config_init()
155 phydev->interface != PHY_INTERFACE_MODE_1000BASEX) in bcm54616s_config_init()
160 val = bcm54xx_auxctl_read(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC); in bcm54616s_config_init()
165 rc = bcm54xx_auxctl_write(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC, in bcm54616s_config_init()
171 val = bcm_phy_read_shadow(phydev, BCM54XX_SHD_MODE); in bcm54616s_config_init()
175 rc = bcm_phy_write_shadow(phydev, BCM54XX_SHD_MODE, val); in bcm54616s_config_init()
180 rc = phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN); in bcm54616s_config_init()
186 val |= phydev->interface == PHY_INTERFACE_MODE_SGMII ? in bcm54616s_config_init()
189 rc = bcm_phy_write_shadow(phydev, BCM54XX_SHD_MODE, val); in bcm54616s_config_init()
194 rc = phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); in bcm54616s_config_init()
200 rc = bcm_phy_write_shadow(phydev, BCM54XX_SHD_MODE, val); in bcm54616s_config_init()
205 return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); in bcm54616s_config_init()
209 static int bcm50610_a0_workaround(struct phy_device *phydev) in bcm50610_a0_workaround() argument
213 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_AADJ1CH0, in bcm50610_a0_workaround()
219 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_AADJ1CH3, in bcm50610_a0_workaround()
224 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP75, in bcm50610_a0_workaround()
229 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP96, in bcm50610_a0_workaround()
234 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP97, in bcm50610_a0_workaround()
240 static int bcm54xx_phydsp_config(struct phy_device *phydev) in bcm54xx_phydsp_config() argument
245 err = bcm54xx_auxctl_write(phydev, in bcm54xx_phydsp_config()
252 if (BRCM_PHY_MODEL(phydev) == PHY_ID_BCM50610 || in bcm54xx_phydsp_config()
253 BRCM_PHY_MODEL(phydev) == PHY_ID_BCM50610M) { in bcm54xx_phydsp_config()
255 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP08, in bcm54xx_phydsp_config()
260 if (phydev->drv->phy_id == PHY_ID_BCM50610) { in bcm54xx_phydsp_config()
261 err = bcm50610_a0_workaround(phydev); in bcm54xx_phydsp_config()
267 if (BRCM_PHY_MODEL(phydev) == PHY_ID_BCM57780) { in bcm54xx_phydsp_config()
270 val = bcm_phy_read_exp(phydev, MII_BCM54XX_EXP_EXP75); in bcm54xx_phydsp_config()
275 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP75, val); in bcm54xx_phydsp_config()
280 err2 = bcm54xx_auxctl_write(phydev, in bcm54xx_phydsp_config()
288 static void bcm54xx_adjust_rxrefclk(struct phy_device *phydev) in bcm54xx_adjust_rxrefclk() argument
295 if (BRCM_PHY_MODEL(phydev) != PHY_ID_BCM57780 && in bcm54xx_adjust_rxrefclk()
296 BRCM_PHY_MODEL(phydev) != PHY_ID_BCM50610 && in bcm54xx_adjust_rxrefclk()
297 BRCM_PHY_MODEL(phydev) != PHY_ID_BCM50610M && in bcm54xx_adjust_rxrefclk()
298 BRCM_PHY_MODEL(phydev) != PHY_ID_BCM54210E && in bcm54xx_adjust_rxrefclk()
299 BRCM_PHY_MODEL(phydev) != PHY_ID_BCM54810 && in bcm54xx_adjust_rxrefclk()
300 BRCM_PHY_MODEL(phydev) != PHY_ID_BCM54811) in bcm54xx_adjust_rxrefclk()
303 val = bcm_phy_read_shadow(phydev, BCM54XX_SHD_SCR3); in bcm54xx_adjust_rxrefclk()
309 if ((BRCM_PHY_MODEL(phydev) == PHY_ID_BCM50610 || in bcm54xx_adjust_rxrefclk()
310 BRCM_PHY_MODEL(phydev) == PHY_ID_BCM50610M) && in bcm54xx_adjust_rxrefclk()
311 BRCM_PHY_REV(phydev) >= 0x3) { in bcm54xx_adjust_rxrefclk()
318 if (phydev->dev_flags & PHY_BRCM_RX_REFCLK_UNUSED) { in bcm54xx_adjust_rxrefclk()
319 if (BRCM_PHY_MODEL(phydev) != PHY_ID_BCM54811) { in bcm54xx_adjust_rxrefclk()
327 if (!clk125en || (phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE)) in bcm54xx_adjust_rxrefclk()
332 if (phydev->dev_flags & PHY_BRCM_DIS_TXCRXC_NOENRGY) { in bcm54xx_adjust_rxrefclk()
333 if (BRCM_PHY_MODEL(phydev) == PHY_ID_BCM54210E || in bcm54xx_adjust_rxrefclk()
334 BRCM_PHY_MODEL(phydev) == PHY_ID_BCM54810 || in bcm54xx_adjust_rxrefclk()
335 BRCM_PHY_MODEL(phydev) == PHY_ID_BCM54811) in bcm54xx_adjust_rxrefclk()
342 bcm_phy_write_shadow(phydev, BCM54XX_SHD_SCR3, val); in bcm54xx_adjust_rxrefclk()
344 val = bcm_phy_read_shadow(phydev, BCM54XX_SHD_APD); in bcm54xx_adjust_rxrefclk()
350 if (!clk125en || (phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE)) in bcm54xx_adjust_rxrefclk()
356 bcm_phy_write_shadow(phydev, BCM54XX_SHD_APD, val); in bcm54xx_adjust_rxrefclk()
359 static void bcm54xx_ptp_stop(struct phy_device *phydev) in bcm54xx_ptp_stop() argument
361 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54xx_ptp_stop()
367 static void bcm54xx_ptp_config_init(struct phy_device *phydev) in bcm54xx_ptp_config_init() argument
369 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54xx_ptp_config_init()
372 bcm_ptp_config_init(phydev); in bcm54xx_ptp_config_init()
375 static int bcm5481x_set_brrmode(struct phy_device *phydev, bool on) in bcm5481x_set_brrmode() argument
381 reg = bcm_phy_read_exp(phydev, BCM54810_EXP_BROADREACH_LRE_MISC_CTL); in bcm5481x_set_brrmode()
391 err = bcm_phy_write_exp(phydev, in bcm5481x_set_brrmode()
403 return bcm_phy_write_exp(phydev, in bcm5481x_set_brrmode()
407 static int bcm54811_config_init(struct phy_device *phydev) in bcm54811_config_init() argument
409 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54811_config_init()
413 if (!(phydev->dev_flags & PHY_BRCM_RX_REFCLK_UNUSED)) { in bcm54811_config_init()
414 reg = bcm_phy_read_exp(phydev, BCM54612E_EXP_SPARE0); in bcm54811_config_init()
417 err = bcm_phy_write_exp(phydev, BCM54612E_EXP_SPARE0, in bcm54811_config_init()
425 phydev->autoneg = 0; in bcm54811_config_init()
428 if (phydev->interface == PHY_INTERFACE_MODE_MIILITE) in bcm54811_config_init()
433 err = bcm_phy_modify_exp(phydev, BCM_EXP_SYNC_ETHERNET, in bcm54811_config_init()
439 return bcm5481x_set_brrmode(phydev, priv->brr_mode); in bcm54811_config_init()
442 static int bcm54xx_config_init(struct phy_device *phydev) in bcm54xx_config_init() argument
446 reg = phy_read(phydev, MII_BCM54XX_ECR); in bcm54xx_config_init()
452 err = phy_write(phydev, MII_BCM54XX_ECR, reg); in bcm54xx_config_init()
460 err = phy_write(phydev, MII_BCM54XX_IMR, reg); in bcm54xx_config_init()
464 if ((BRCM_PHY_MODEL(phydev) == PHY_ID_BCM50610 || in bcm54xx_config_init()
465 BRCM_PHY_MODEL(phydev) == PHY_ID_BCM50610M) && in bcm54xx_config_init()
466 (phydev->dev_flags & PHY_BRCM_CLEAR_RGMII_MODE)) in bcm54xx_config_init()
467 bcm_phy_write_shadow(phydev, BCM54XX_SHD_RGMII_MODE, 0); in bcm54xx_config_init()
469 bcm54xx_adjust_rxrefclk(phydev); in bcm54xx_config_init()
471 switch (BRCM_PHY_MODEL(phydev)) { in bcm54xx_config_init()
474 err = bcm54xx_config_clock_delay(phydev); in bcm54xx_config_init()
477 err = bcm54210e_config_init(phydev); in bcm54xx_config_init()
480 err = bcm54612e_config_init(phydev); in bcm54xx_config_init()
483 err = bcm54616s_config_init(phydev); in bcm54xx_config_init()
487 val = bcm_phy_read_exp(phydev, in bcm54xx_config_init()
490 err = bcm_phy_write_exp(phydev, in bcm54xx_config_init()
495 err = bcm54811_config_init(phydev); in bcm54xx_config_init()
501 bcm54xx_phydsp_config(phydev); in bcm54xx_config_init()
511 if (!phy_on_sfp(phydev)) { in bcm54xx_config_init()
514 bcm_phy_write_shadow(phydev, BCM54XX_SHD_LEDS1, val); in bcm54xx_config_init()
519 bcm_phy_write_exp(phydev, BCM_EXP_MULTICOLOR, val); in bcm54xx_config_init()
522 bcm54xx_ptp_config_init(phydev); in bcm54xx_config_init()
527 err = bcm_phy_read_exp(phydev, BCM54XX_WOL_INT_STATUS); in bcm54xx_config_init()
532 pm_wakeup_event(&phydev->mdio.dev, 0); in bcm54xx_config_init()
537 static int bcm54xx_iddq_set(struct phy_device *phydev, bool enable) in bcm54xx_iddq_set() argument
541 if (!(phydev->dev_flags & PHY_BRCM_IDDQ_SUSPEND)) in bcm54xx_iddq_set()
544 ret = bcm_phy_read_exp(phydev, BCM54XX_TOP_MISC_IDDQ_CTRL); in bcm54xx_iddq_set()
553 ret = bcm_phy_write_exp(phydev, BCM54XX_TOP_MISC_IDDQ_CTRL, ret); in bcm54xx_iddq_set()
558 static int bcm54xx_set_wakeup_irq(struct phy_device *phydev, bool state) in bcm54xx_set_wakeup_irq() argument
560 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54xx_set_wakeup_irq()
563 if (!bcm54xx_phy_can_wakeup(phydev)) in bcm54xx_set_wakeup_irq()
577 static int bcm54xx_suspend(struct phy_device *phydev) in bcm54xx_suspend() argument
581 bcm54xx_ptp_stop(phydev); in bcm54xx_suspend()
584 ret = bcm_phy_read_exp(phydev, BCM54XX_WOL_INT_STATUS); in bcm54xx_suspend()
588 if (phydev->wol_enabled) in bcm54xx_suspend()
589 return bcm54xx_set_wakeup_irq(phydev, true); in bcm54xx_suspend()
595 ret = phy_write(phydev, MII_BMCR, BMCR_PDOWN); in bcm54xx_suspend()
599 return bcm54xx_iddq_set(phydev, true); in bcm54xx_suspend()
602 static int bcm54xx_resume(struct phy_device *phydev) in bcm54xx_resume() argument
606 if (phydev->wol_enabled) { in bcm54xx_resume()
607 ret = bcm54xx_set_wakeup_irq(phydev, false); in bcm54xx_resume()
612 ret = bcm54xx_iddq_set(phydev, false); in bcm54xx_resume()
619 ret = genphy_resume(phydev); in bcm54xx_resume()
631 if (phydev->dev_flags & PHY_BRCM_IDDQ_SUSPEND) { in bcm54xx_resume()
632 ret = genphy_soft_reset(phydev); in bcm54xx_resume()
637 return bcm54xx_config_init(phydev); in bcm54xx_resume()
640 static int bcm54810_read_mmd(struct phy_device *phydev, int devnum, u16 regnum) in bcm54810_read_mmd() argument
645 static int bcm54810_write_mmd(struct phy_device *phydev, int devnum, u16 regnum, in bcm54810_write_mmd() argument
666 static int bcm5481x_read_abilities(struct phy_device *phydev) in bcm5481x_read_abilities() argument
668 struct device_node *np = phydev->mdio.dev.of_node; in bcm5481x_read_abilities()
669 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm5481x_read_abilities()
673 linkmode_clear_bit(bcm54811_linkmodes[i], phydev->supported); in bcm5481x_read_abilities()
678 err = bcm5481x_set_brrmode(phydev, priv->brr_mode); in bcm5481x_read_abilities()
685 phydev->supported); in bcm5481x_read_abilities()
687 val = phy_read(phydev, MII_BCM54XX_LRESR); in bcm5481x_read_abilities()
696 if (BRCM_PHY_MODEL(phydev) == PHY_ID_BCM54811) in bcm5481x_read_abilities()
702 phydev->supported, in bcm5481x_read_abilities()
705 phydev->supported, in bcm5481x_read_abilities()
708 phydev->supported, in bcm5481x_read_abilities()
713 return genphy_read_abilities(phydev); in bcm5481x_read_abilities()
716 static int bcm5481x_config_delay_swap(struct phy_device *phydev) in bcm5481x_config_delay_swap() argument
718 struct device_node *np = phydev->mdio.dev.of_node; in bcm5481x_config_delay_swap()
721 bcm54xx_config_clock_delay(phydev); in bcm5481x_config_delay_swap()
725 int ret = bcm_phy_write_exp(phydev, in bcm5481x_config_delay_swap()
735 static int bcm5481_config_aneg(struct phy_device *phydev) in bcm5481_config_aneg() argument
737 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm5481_config_aneg()
742 ret = bcm_config_lre_aneg(phydev, false); in bcm5481_config_aneg()
744 ret = genphy_config_aneg(phydev); in bcm5481_config_aneg()
750 return bcm5481x_config_delay_swap(phydev); in bcm5481_config_aneg()
753 static int bcm54811_config_aneg(struct phy_device *phydev) in bcm54811_config_aneg() argument
755 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54811_config_aneg()
766 ret = phy_modify(phydev, MII_BCM54XX_LRECR, LRECR_LDSEN, 0); in bcm54811_config_aneg()
769 ret = bcm_config_lre_aneg(phydev, false); in bcm54811_config_aneg()
771 ret = genphy_config_aneg(phydev); in bcm54811_config_aneg()
778 return bcm5481x_config_delay_swap(phydev); in bcm54811_config_aneg()
785 static int bcm54616s_probe(struct phy_device *phydev) in bcm54616s_probe() argument
790 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in bcm54616s_probe()
794 phydev->priv = priv; in bcm54616s_probe()
796 val = bcm_phy_read_shadow(phydev, BCM54XX_SHD_MODE); in bcm54616s_probe()
807 val = bcm_phy_read_shadow(phydev, BCM54616S_SHD_100FX_CTRL); in bcm54616s_probe()
819 phydev->port = PORT_FIBRE; in bcm54616s_probe()
825 static int bcm54616s_config_aneg(struct phy_device *phydev) in bcm54616s_config_aneg() argument
827 struct bcm54616s_phy_priv *priv = phydev->priv; in bcm54616s_config_aneg()
832 ret = genphy_c37_config_aneg(phydev); in bcm54616s_config_aneg()
834 ret = genphy_config_aneg(phydev); in bcm54616s_config_aneg()
837 bcm54xx_config_clock_delay(phydev); in bcm54616s_config_aneg()
842 static int bcm54616s_read_status(struct phy_device *phydev) in bcm54616s_read_status() argument
844 struct bcm54616s_phy_priv *priv = phydev->priv; in bcm54616s_read_status()
849 err = genphy_c37_read_status(phydev, &changed); in bcm54616s_read_status()
851 err = genphy_read_status(phydev); in bcm54616s_read_status()
856 static int brcm_fet_config_init(struct phy_device *phydev) in brcm_fet_config_init() argument
861 err = phy_write(phydev, MII_BMCR, BMCR_RESET); in brcm_fet_config_init()
881 err = phy_read(phydev, MII_BMCR); in brcm_fet_config_init()
886 reg = phy_read(phydev, MII_BRCM_FET_INTREG); in brcm_fet_config_init()
891 if (phydev->drv->phy_id == PHY_ID_BCM5221) in brcm_fet_config_init()
901 err = phy_write(phydev, MII_BRCM_FET_INTREG, reg); in brcm_fet_config_init()
906 brcmtest = phy_read(phydev, MII_BRCM_FET_BRCMTEST); in brcm_fet_config_init()
912 phy_lock_mdio_bus(phydev); in brcm_fet_config_init()
914 err = __phy_write(phydev, MII_BRCM_FET_BRCMTEST, reg); in brcm_fet_config_init()
916 phy_unlock_mdio_bus(phydev); in brcm_fet_config_init()
920 if (phydev->drv->phy_id != PHY_ID_BCM5221) { in brcm_fet_config_init()
922 reg = __phy_read(phydev, MII_BRCM_FET_SHDW_AUXMODE4); in brcm_fet_config_init()
928 err = __phy_modify(phydev, MII_BRCM_FET_SHDW_AUXMODE4, in brcm_fet_config_init()
935 err = __phy_set_bits(phydev, MII_BRCM_FET_SHDW_MISCCTRL, in brcm_fet_config_init()
941 if (phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE) { in brcm_fet_config_init()
943 err = __phy_set_bits(phydev, MII_BRCM_FET_SHDW_AUXSTAT2, in brcm_fet_config_init()
949 err2 = __phy_write(phydev, MII_BRCM_FET_BRCMTEST, brcmtest); in brcm_fet_config_init()
953 phy_unlock_mdio_bus(phydev); in brcm_fet_config_init()
958 static int brcm_fet_ack_interrupt(struct phy_device *phydev) in brcm_fet_ack_interrupt() argument
963 reg = phy_read(phydev, MII_BRCM_FET_INTREG); in brcm_fet_ack_interrupt()
970 static int brcm_fet_config_intr(struct phy_device *phydev) in brcm_fet_config_intr() argument
974 reg = phy_read(phydev, MII_BRCM_FET_INTREG); in brcm_fet_config_intr()
978 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in brcm_fet_config_intr()
979 err = brcm_fet_ack_interrupt(phydev); in brcm_fet_config_intr()
984 err = phy_write(phydev, MII_BRCM_FET_INTREG, reg); in brcm_fet_config_intr()
987 err = phy_write(phydev, MII_BRCM_FET_INTREG, reg); in brcm_fet_config_intr()
991 err = brcm_fet_ack_interrupt(phydev); in brcm_fet_config_intr()
997 static irqreturn_t brcm_fet_handle_interrupt(struct phy_device *phydev) in brcm_fet_handle_interrupt() argument
1001 irq_status = phy_read(phydev, MII_BRCM_FET_INTREG); in brcm_fet_handle_interrupt()
1003 phy_error(phydev); in brcm_fet_handle_interrupt()
1010 phy_trigger_machine(phydev); in brcm_fet_handle_interrupt()
1015 static int brcm_fet_suspend(struct phy_device *phydev) in brcm_fet_suspend() argument
1022 err = phy_write(phydev, MII_BMCR, BMCR_PDOWN); in brcm_fet_suspend()
1027 brcmtest = phy_read(phydev, MII_BRCM_FET_BRCMTEST); in brcm_fet_suspend()
1033 phy_lock_mdio_bus(phydev); in brcm_fet_suspend()
1035 err = __phy_write(phydev, MII_BRCM_FET_BRCMTEST, reg); in brcm_fet_suspend()
1037 phy_unlock_mdio_bus(phydev); in brcm_fet_suspend()
1041 if (phydev->drv->phy_id == PHY_ID_BCM5221) in brcm_fet_suspend()
1048 err = __phy_set_bits(phydev, MII_BRCM_FET_SHDW_AUXMODE4, reg); in brcm_fet_suspend()
1051 err2 = __phy_write(phydev, MII_BRCM_FET_BRCMTEST, brcmtest); in brcm_fet_suspend()
1055 phy_unlock_mdio_bus(phydev); in brcm_fet_suspend()
1060 static int bcm5221_config_aneg(struct phy_device *phydev) in bcm5221_config_aneg() argument
1064 ret = genphy_config_aneg(phydev); in bcm5221_config_aneg()
1068 switch (phydev->mdix_ctrl) { in bcm5221_config_aneg()
1082 return phy_modify(phydev, BCM5221_AEGSR, BCM5221_AEGSR_MDIX_MAN_SWAP | in bcm5221_config_aneg()
1087 static int bcm5221_read_status(struct phy_device *phydev) in bcm5221_read_status() argument
1092 ret = phy_read(phydev, BCM5221_AEGSR); in bcm5221_read_status()
1098 phydev->mdix_ctrl = ETH_TP_MDI_X; in bcm5221_read_status()
1100 phydev->mdix_ctrl = ETH_TP_MDI; in bcm5221_read_status()
1102 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in bcm5221_read_status()
1106 phydev->mdix = ETH_TP_MDI_X; in bcm5221_read_status()
1108 phydev->mdix = ETH_TP_MDI; in bcm5221_read_status()
1110 return genphy_read_status(phydev); in bcm5221_read_status()
1113 static void bcm54xx_phy_get_wol(struct phy_device *phydev, in bcm54xx_phy_get_wol() argument
1121 if (!bcm54xx_phy_can_wakeup(phydev)) { in bcm54xx_phy_get_wol()
1126 bcm_phy_get_wol(phydev, wol); in bcm54xx_phy_get_wol()
1129 static int bcm54xx_phy_set_wol(struct phy_device *phydev, in bcm54xx_phy_set_wol() argument
1139 if (!bcm54xx_phy_can_wakeup(phydev)) in bcm54xx_phy_set_wol()
1142 ret = bcm_phy_set_wol(phydev, wol); in bcm54xx_phy_set_wol()
1149 static int bcm54xx_phy_probe(struct phy_device *phydev) in bcm54xx_phy_probe() argument
1155 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in bcm54xx_phy_probe()
1161 phydev->priv = priv; in bcm54xx_phy_probe()
1163 priv->stats = devm_kcalloc(&phydev->mdio.dev, in bcm54xx_phy_probe()
1164 bcm_phy_get_sset_count(phydev), sizeof(u64), in bcm54xx_phy_probe()
1169 priv->ptp = bcm_ptp_probe(phydev); in bcm54xx_phy_probe()
1177 wakeup_gpio = devm_gpiod_get(&phydev->mdio.dev, "wakeup", GPIOD_IN); in bcm54xx_phy_probe()
1187 ret = devm_request_irq(&phydev->mdio.dev, priv->wake_irq, in bcm54xx_phy_probe()
1190 dev_name(&phydev->mdio.dev), phydev); in bcm54xx_phy_probe()
1198 if (!bcm54xx_phy_can_wakeup(phydev)) in bcm54xx_phy_probe()
1201 return device_init_wakeup(&phydev->mdio.dev, true); in bcm54xx_phy_probe()
1204 static void bcm54xx_get_stats(struct phy_device *phydev, in bcm54xx_get_stats() argument
1207 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54xx_get_stats()
1209 bcm_phy_get_stats(phydev, priv->stats, stats, data); in bcm54xx_get_stats()
1212 static void bcm54xx_link_change_notify(struct phy_device *phydev) in bcm54xx_link_change_notify() argument
1218 if (phydev->state != PHY_RUNNING) in bcm54xx_link_change_notify()
1224 if (!(phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE)) in bcm54xx_link_change_notify()
1227 ret = bcm_phy_read_exp(phydev, MII_BCM54XX_EXP_EXP08); in bcm54xx_link_change_notify()
1235 if (phydev->speed == SPEED_10) in bcm54xx_link_change_notify()
1239 bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP08, ret); in bcm54xx_link_change_notify()
1242 static int lre_read_master_slave(struct phy_device *phydev) in lre_read_master_slave() argument
1250 phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN; in lre_read_master_slave()
1251 phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN; in lre_read_master_slave()
1253 val = phy_read(phydev, MII_BCM54XX_LRECR); in lre_read_master_slave()
1264 val = phy_read(phydev, MII_BCM54XX_LRELDSE); in lre_read_master_slave()
1273 phydev->master_slave_get = cfg; in lre_read_master_slave()
1274 phydev->master_slave_state = state; in lre_read_master_slave()
1280 static int lre_read_lpa(struct phy_device *phydev) in lre_read_lpa() argument
1284 if (phydev->autoneg != AUTONEG_ENABLE) { in lre_read_lpa()
1285 if (!phydev->autoneg_complete) { in lre_read_lpa()
1289 phydev->lp_advertising); in lre_read_lpa()
1295 lrelpa = phy_read(phydev, MII_BCM54XX_LRELPA); in lre_read_lpa()
1300 phydev->lp_advertising, in lre_read_lpa()
1303 phydev->lp_advertising, in lre_read_lpa()
1306 phydev->lp_advertising, in lre_read_lpa()
1309 phydev->lp_advertising, in lre_read_lpa()
1312 linkmode_zero(phydev->lp_advertising); in lre_read_lpa()
1318 static int lre_read_status_fixed(struct phy_device *phydev) in lre_read_status_fixed() argument
1320 int lrecr = phy_read(phydev, MII_BCM54XX_LRECR); in lre_read_status_fixed()
1325 phydev->duplex = DUPLEX_FULL; in lre_read_status_fixed()
1328 phydev->speed = SPEED_100; in lre_read_status_fixed()
1330 phydev->speed = SPEED_10; in lre_read_status_fixed()
1346 static int lre_update_link(struct phy_device *phydev) in lre_update_link() argument
1350 lrecr = phy_read(phydev, MII_BCM54XX_LRECR); in lre_update_link()
1365 if (!phy_polling_mode(phydev) || !phydev->link) { in lre_update_link()
1366 status = phy_read(phydev, MII_BCM54XX_LRESR); in lre_update_link()
1374 status = phy_read(phydev, MII_BCM54XX_LRESR); in lre_update_link()
1378 phydev->link = status & LRESR_LSTATUS ? 1 : 0; in lre_update_link()
1379 phydev->autoneg_complete = status & LRESR_LDSCOMPLETE ? 1 : 0; in lre_update_link()
1384 if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete) in lre_update_link()
1385 phydev->link = 0; in lre_update_link()
1393 static int bcm54811_lre_read_status(struct phy_device *phydev) in bcm54811_lre_read_status() argument
1395 int err, old_link = phydev->link; in bcm54811_lre_read_status()
1398 err = lre_update_link(phydev); in bcm54811_lre_read_status()
1403 if (phydev->autoneg == in bcm54811_lre_read_status()
1404 AUTONEG_ENABLE && old_link && phydev->link) in bcm54811_lre_read_status()
1407 phydev->speed = SPEED_UNKNOWN; in bcm54811_lre_read_status()
1408 phydev->duplex = DUPLEX_UNKNOWN; in bcm54811_lre_read_status()
1409 phydev->pause = 0; in bcm54811_lre_read_status()
1410 phydev->asym_pause = 0; in bcm54811_lre_read_status()
1412 err = lre_read_master_slave(phydev); in bcm54811_lre_read_status()
1417 err = lre_read_lpa(phydev); in bcm54811_lre_read_status()
1421 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) in bcm54811_lre_read_status()
1422 phy_resolve_aneg_linkmode(phydev); in bcm54811_lre_read_status()
1423 else if (phydev->autoneg == AUTONEG_DISABLE) in bcm54811_lre_read_status()
1424 err = lre_read_status_fixed(phydev); in bcm54811_lre_read_status()
1429 static int bcm54811_read_status(struct phy_device *phydev) in bcm54811_read_status() argument
1431 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54811_read_status()
1434 return bcm54811_lre_read_status(phydev); in bcm54811_read_status()
1436 return genphy_read_status(phydev); in bcm54811_read_status()