Lines Matching refs:phydev
26 #define BRCM_PHY_REV(phydev) \ argument
27 ((phydev)->drv->phy_id & ~((phydev)->drv->phy_id_mask))
63 static bool bcm54xx_phy_can_wakeup(struct phy_device *phydev) in bcm54xx_phy_can_wakeup() argument
65 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54xx_phy_can_wakeup()
67 return phy_interrupt_is_valid(phydev) || priv->wake_irq >= 0; in bcm54xx_phy_can_wakeup()
70 static int bcm54xx_config_clock_delay(struct phy_device *phydev) in bcm54xx_config_clock_delay() argument
75 val = bcm54xx_auxctl_read(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC); in bcm54xx_config_clock_delay()
77 if (phydev->interface == PHY_INTERFACE_MODE_RGMII || in bcm54xx_config_clock_delay()
78 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) { in bcm54xx_config_clock_delay()
82 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in bcm54xx_config_clock_delay()
83 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) { in bcm54xx_config_clock_delay()
87 rc = bcm54xx_auxctl_write(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC, in bcm54xx_config_clock_delay()
93 val = bcm_phy_read_shadow(phydev, BCM54810_SHD_CLK_CTL); in bcm54xx_config_clock_delay()
94 if (phydev->interface == PHY_INTERFACE_MODE_RGMII || in bcm54xx_config_clock_delay()
95 phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) { in bcm54xx_config_clock_delay()
99 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID || in bcm54xx_config_clock_delay()
100 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) { in bcm54xx_config_clock_delay()
104 rc = bcm_phy_write_shadow(phydev, BCM54810_SHD_CLK_CTL, val); in bcm54xx_config_clock_delay()
111 static int bcm54210e_config_init(struct phy_device *phydev) in bcm54210e_config_init() argument
115 bcm54xx_config_clock_delay(phydev); in bcm54210e_config_init()
117 if (phydev->dev_flags & PHY_BRCM_EN_MASTER_MODE) { in bcm54210e_config_init()
118 val = phy_read(phydev, MII_CTRL1000); in bcm54210e_config_init()
120 phy_write(phydev, MII_CTRL1000, val); in bcm54210e_config_init()
126 static int bcm54612e_config_init(struct phy_device *phydev) in bcm54612e_config_init() argument
130 bcm54xx_config_clock_delay(phydev); in bcm54612e_config_init()
133 if (!(phydev->dev_flags & PHY_BRCM_RX_REFCLK_UNUSED)) { in bcm54612e_config_init()
136 reg = bcm_phy_read_exp(phydev, BCM54612E_EXP_SPARE0); in bcm54612e_config_init()
137 err = bcm_phy_write_exp(phydev, BCM54612E_EXP_SPARE0, in bcm54612e_config_init()
147 static int bcm54616s_config_init(struct phy_device *phydev) in bcm54616s_config_init() argument
151 if (phydev->interface != PHY_INTERFACE_MODE_SGMII && in bcm54616s_config_init()
152 phydev->interface != PHY_INTERFACE_MODE_1000BASEX) in bcm54616s_config_init()
157 val = bcm54xx_auxctl_read(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC); in bcm54616s_config_init()
162 rc = bcm54xx_auxctl_write(phydev, MII_BCM54XX_AUXCTL_SHDWSEL_MISC, in bcm54616s_config_init()
168 val = bcm_phy_read_shadow(phydev, BCM54XX_SHD_MODE); in bcm54616s_config_init()
172 rc = bcm_phy_write_shadow(phydev, BCM54XX_SHD_MODE, val); in bcm54616s_config_init()
177 rc = phy_set_bits(phydev, MII_BMCR, BMCR_PDOWN); in bcm54616s_config_init()
183 val |= phydev->interface == PHY_INTERFACE_MODE_SGMII ? in bcm54616s_config_init()
186 rc = bcm_phy_write_shadow(phydev, BCM54XX_SHD_MODE, val); in bcm54616s_config_init()
191 rc = phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); in bcm54616s_config_init()
197 rc = bcm_phy_write_shadow(phydev, BCM54XX_SHD_MODE, val); in bcm54616s_config_init()
202 return phy_clear_bits(phydev, MII_BMCR, BMCR_PDOWN); in bcm54616s_config_init()
206 static int bcm50610_a0_workaround(struct phy_device *phydev) in bcm50610_a0_workaround() argument
210 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_AADJ1CH0, in bcm50610_a0_workaround()
216 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_AADJ1CH3, in bcm50610_a0_workaround()
221 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP75, in bcm50610_a0_workaround()
226 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP96, in bcm50610_a0_workaround()
231 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP97, in bcm50610_a0_workaround()
237 static int bcm54xx_phydsp_config(struct phy_device *phydev) in bcm54xx_phydsp_config() argument
242 err = bcm54xx_auxctl_write(phydev, in bcm54xx_phydsp_config()
249 if (phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM50610) || in bcm54xx_phydsp_config()
250 phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM50610M)) { in bcm54xx_phydsp_config()
252 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP08, in bcm54xx_phydsp_config()
257 if (phydev->drv->phy_id == PHY_ID_BCM50610) { in bcm54xx_phydsp_config()
258 err = bcm50610_a0_workaround(phydev); in bcm54xx_phydsp_config()
264 if (phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM57780)) { in bcm54xx_phydsp_config()
267 val = bcm_phy_read_exp(phydev, MII_BCM54XX_EXP_EXP75); in bcm54xx_phydsp_config()
272 err = bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP75, val); in bcm54xx_phydsp_config()
277 err2 = bcm54xx_auxctl_write(phydev, in bcm54xx_phydsp_config()
285 static void bcm54xx_adjust_rxrefclk(struct phy_device *phydev) in bcm54xx_adjust_rxrefclk() argument
292 if (!(phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM57780) || in bcm54xx_adjust_rxrefclk()
293 phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM50610) || in bcm54xx_adjust_rxrefclk()
294 phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM50610M) || in bcm54xx_adjust_rxrefclk()
295 phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM54210E) || in bcm54xx_adjust_rxrefclk()
296 phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM54810) || in bcm54xx_adjust_rxrefclk()
297 phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM54811))) in bcm54xx_adjust_rxrefclk()
300 val = bcm_phy_read_shadow(phydev, BCM54XX_SHD_SCR3); in bcm54xx_adjust_rxrefclk()
306 if ((phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM50610) || in bcm54xx_adjust_rxrefclk()
307 phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM50610M)) && in bcm54xx_adjust_rxrefclk()
308 BRCM_PHY_REV(phydev) >= 0x3) { in bcm54xx_adjust_rxrefclk()
315 if (phydev->dev_flags & PHY_BRCM_RX_REFCLK_UNUSED) { in bcm54xx_adjust_rxrefclk()
316 if (!phy_id_compare_model(phydev->drv->phy_id, in bcm54xx_adjust_rxrefclk()
325 if (!clk125en || (phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE)) in bcm54xx_adjust_rxrefclk()
330 if (phydev->dev_flags & PHY_BRCM_DIS_TXCRXC_NOENRGY) { in bcm54xx_adjust_rxrefclk()
331 if (phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM54210E) || in bcm54xx_adjust_rxrefclk()
332 phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM54810) || in bcm54xx_adjust_rxrefclk()
333 phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM54811)) in bcm54xx_adjust_rxrefclk()
340 bcm_phy_write_shadow(phydev, BCM54XX_SHD_SCR3, val); in bcm54xx_adjust_rxrefclk()
342 val = bcm_phy_read_shadow(phydev, BCM54XX_SHD_APD); in bcm54xx_adjust_rxrefclk()
348 if (!clk125en || (phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE)) in bcm54xx_adjust_rxrefclk()
354 bcm_phy_write_shadow(phydev, BCM54XX_SHD_APD, val); in bcm54xx_adjust_rxrefclk()
357 static void bcm54xx_ptp_stop(struct phy_device *phydev) in bcm54xx_ptp_stop() argument
359 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54xx_ptp_stop()
365 static void bcm54xx_ptp_config_init(struct phy_device *phydev) in bcm54xx_ptp_config_init() argument
367 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54xx_ptp_config_init()
370 bcm_ptp_config_init(phydev); in bcm54xx_ptp_config_init()
373 static int bcm5481x_set_brrmode(struct phy_device *phydev, bool on) in bcm5481x_set_brrmode() argument
379 reg = bcm_phy_read_exp(phydev, BCM54810_EXP_BROADREACH_LRE_MISC_CTL); in bcm5481x_set_brrmode()
389 err = bcm_phy_write_exp(phydev, in bcm5481x_set_brrmode()
401 return bcm_phy_write_exp(phydev, in bcm5481x_set_brrmode()
405 static int bcm54811_config_init(struct phy_device *phydev) in bcm54811_config_init() argument
407 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54811_config_init()
411 if (!(phydev->dev_flags & PHY_BRCM_RX_REFCLK_UNUSED)) { in bcm54811_config_init()
412 reg = bcm_phy_read_exp(phydev, BCM54612E_EXP_SPARE0); in bcm54811_config_init()
415 err = bcm_phy_write_exp(phydev, BCM54612E_EXP_SPARE0, in bcm54811_config_init()
423 phydev->autoneg = 0; in bcm54811_config_init()
426 if (phydev->interface == PHY_INTERFACE_MODE_MIILITE) in bcm54811_config_init()
431 err = bcm_phy_modify_exp(phydev, BCM_EXP_SYNC_ETHERNET, in bcm54811_config_init()
438 if (phy_interface_is_rgmii(phydev)) in bcm54811_config_init()
447 err = bcm54xx_auxctl_write(phydev, in bcm54811_config_init()
455 return bcm5481x_set_brrmode(phydev, priv->brr_mode); in bcm54811_config_init()
458 static int bcm54xx_config_init(struct phy_device *phydev) in bcm54xx_config_init() argument
462 reg = phy_read(phydev, MII_BCM54XX_ECR); in bcm54xx_config_init()
468 err = phy_write(phydev, MII_BCM54XX_ECR, reg); in bcm54xx_config_init()
476 err = phy_write(phydev, MII_BCM54XX_IMR, reg); in bcm54xx_config_init()
480 if ((phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM50610) || in bcm54xx_config_init()
481 phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM50610M)) && in bcm54xx_config_init()
482 (phydev->dev_flags & PHY_BRCM_CLEAR_RGMII_MODE)) in bcm54xx_config_init()
483 bcm_phy_write_shadow(phydev, BCM54XX_SHD_RGMII_MODE, 0); in bcm54xx_config_init()
485 bcm54xx_adjust_rxrefclk(phydev); in bcm54xx_config_init()
487 switch (phydev->drv->phy_id & PHY_ID_MATCH_MODEL_MASK) { in bcm54xx_config_init()
490 err = bcm54xx_config_clock_delay(phydev); in bcm54xx_config_init()
493 err = bcm54210e_config_init(phydev); in bcm54xx_config_init()
496 err = bcm54612e_config_init(phydev); in bcm54xx_config_init()
499 err = bcm54616s_config_init(phydev); in bcm54xx_config_init()
503 val = bcm_phy_read_exp(phydev, in bcm54xx_config_init()
506 err = bcm_phy_write_exp(phydev, in bcm54xx_config_init()
511 err = bcm54811_config_init(phydev); in bcm54xx_config_init()
517 bcm54xx_phydsp_config(phydev); in bcm54xx_config_init()
527 if (!phy_on_sfp(phydev)) { in bcm54xx_config_init()
530 bcm_phy_write_shadow(phydev, BCM54XX_SHD_LEDS1, val); in bcm54xx_config_init()
535 bcm_phy_write_exp(phydev, BCM_EXP_MULTICOLOR, val); in bcm54xx_config_init()
538 bcm54xx_ptp_config_init(phydev); in bcm54xx_config_init()
543 err = bcm_phy_read_exp(phydev, BCM54XX_WOL_INT_STATUS); in bcm54xx_config_init()
548 pm_wakeup_event(&phydev->mdio.dev, 0); in bcm54xx_config_init()
553 static int bcm54xx_iddq_set(struct phy_device *phydev, bool enable) in bcm54xx_iddq_set() argument
557 if (!(phydev->dev_flags & PHY_BRCM_IDDQ_SUSPEND)) in bcm54xx_iddq_set()
560 ret = bcm_phy_read_exp(phydev, BCM54XX_TOP_MISC_IDDQ_CTRL); in bcm54xx_iddq_set()
569 ret = bcm_phy_write_exp(phydev, BCM54XX_TOP_MISC_IDDQ_CTRL, ret); in bcm54xx_iddq_set()
574 static int bcm54xx_set_wakeup_irq(struct phy_device *phydev, bool state) in bcm54xx_set_wakeup_irq() argument
576 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54xx_set_wakeup_irq()
579 if (!bcm54xx_phy_can_wakeup(phydev)) in bcm54xx_set_wakeup_irq()
593 static int bcm54xx_suspend(struct phy_device *phydev) in bcm54xx_suspend() argument
597 bcm54xx_ptp_stop(phydev); in bcm54xx_suspend()
600 ret = bcm_phy_read_exp(phydev, BCM54XX_WOL_INT_STATUS); in bcm54xx_suspend()
604 if (phydev->wol_enabled) in bcm54xx_suspend()
605 return bcm54xx_set_wakeup_irq(phydev, true); in bcm54xx_suspend()
611 ret = phy_write(phydev, MII_BMCR, BMCR_PDOWN); in bcm54xx_suspend()
615 return bcm54xx_iddq_set(phydev, true); in bcm54xx_suspend()
618 static int bcm54xx_resume(struct phy_device *phydev) in bcm54xx_resume() argument
622 if (phydev->wol_enabled) { in bcm54xx_resume()
623 ret = bcm54xx_set_wakeup_irq(phydev, false); in bcm54xx_resume()
628 ret = bcm54xx_iddq_set(phydev, false); in bcm54xx_resume()
635 ret = genphy_resume(phydev); in bcm54xx_resume()
647 if (phydev->dev_flags & PHY_BRCM_IDDQ_SUSPEND) { in bcm54xx_resume()
648 ret = genphy_soft_reset(phydev); in bcm54xx_resume()
653 return bcm54xx_config_init(phydev); in bcm54xx_resume()
656 static int bcm54810_read_mmd(struct phy_device *phydev, int devnum, u16 regnum) in bcm54810_read_mmd() argument
661 static int bcm54810_write_mmd(struct phy_device *phydev, int devnum, u16 regnum, in bcm54810_write_mmd() argument
682 static int bcm5481x_read_abilities(struct phy_device *phydev) in bcm5481x_read_abilities() argument
684 struct device_node *np = phydev->mdio.dev.of_node; in bcm5481x_read_abilities()
685 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm5481x_read_abilities()
689 linkmode_clear_bit(bcm54811_linkmodes[i], phydev->supported); in bcm5481x_read_abilities()
694 err = bcm5481x_set_brrmode(phydev, priv->brr_mode); in bcm5481x_read_abilities()
701 phydev->supported); in bcm5481x_read_abilities()
703 val = phy_read(phydev, MII_BCM54XX_LRESR); in bcm5481x_read_abilities()
712 if (phy_id_compare_model(phydev->drv->phy_id, PHY_ID_BCM54811)) in bcm5481x_read_abilities()
718 phydev->supported, in bcm5481x_read_abilities()
721 phydev->supported, in bcm5481x_read_abilities()
724 phydev->supported, in bcm5481x_read_abilities()
729 return genphy_read_abilities(phydev); in bcm5481x_read_abilities()
732 static int bcm5481x_config_delay_swap(struct phy_device *phydev) in bcm5481x_config_delay_swap() argument
734 struct device_node *np = phydev->mdio.dev.of_node; in bcm5481x_config_delay_swap()
737 bcm54xx_config_clock_delay(phydev); in bcm5481x_config_delay_swap()
741 int ret = bcm_phy_write_exp(phydev, in bcm5481x_config_delay_swap()
751 static int bcm5481_config_aneg(struct phy_device *phydev) in bcm5481_config_aneg() argument
753 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm5481_config_aneg()
758 ret = bcm_config_lre_aneg(phydev, false); in bcm5481_config_aneg()
760 ret = genphy_config_aneg(phydev); in bcm5481_config_aneg()
766 return bcm5481x_config_delay_swap(phydev); in bcm5481_config_aneg()
769 static int bcm54811_config_aneg(struct phy_device *phydev) in bcm54811_config_aneg() argument
771 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54811_config_aneg()
782 ret = phy_modify(phydev, MII_BCM54XX_LRECR, LRECR_LDSEN, 0); in bcm54811_config_aneg()
785 ret = bcm_config_lre_aneg(phydev, false); in bcm54811_config_aneg()
787 ret = genphy_config_aneg(phydev); in bcm54811_config_aneg()
794 return bcm5481x_config_delay_swap(phydev); in bcm54811_config_aneg()
801 static int bcm54616s_probe(struct phy_device *phydev) in bcm54616s_probe() argument
806 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in bcm54616s_probe()
810 phydev->priv = priv; in bcm54616s_probe()
812 val = bcm_phy_read_shadow(phydev, BCM54XX_SHD_MODE); in bcm54616s_probe()
823 val = bcm_phy_read_shadow(phydev, BCM54616S_SHD_100FX_CTRL); in bcm54616s_probe()
835 phydev->port = PORT_FIBRE; in bcm54616s_probe()
841 static int bcm54616s_config_aneg(struct phy_device *phydev) in bcm54616s_config_aneg() argument
843 struct bcm54616s_phy_priv *priv = phydev->priv; in bcm54616s_config_aneg()
848 ret = genphy_c37_config_aneg(phydev); in bcm54616s_config_aneg()
850 ret = genphy_config_aneg(phydev); in bcm54616s_config_aneg()
853 bcm54xx_config_clock_delay(phydev); in bcm54616s_config_aneg()
858 static int bcm54616s_read_status(struct phy_device *phydev) in bcm54616s_read_status() argument
860 struct bcm54616s_phy_priv *priv = phydev->priv; in bcm54616s_read_status()
865 err = genphy_c37_read_status(phydev, &changed); in bcm54616s_read_status()
867 err = genphy_read_status(phydev); in bcm54616s_read_status()
872 static int brcm_fet_config_init(struct phy_device *phydev) in brcm_fet_config_init() argument
877 err = phy_write(phydev, MII_BMCR, BMCR_RESET); in brcm_fet_config_init()
897 err = phy_read(phydev, MII_BMCR); in brcm_fet_config_init()
902 reg = phy_read(phydev, MII_BRCM_FET_INTREG); in brcm_fet_config_init()
907 if (phydev->drv->phy_id == PHY_ID_BCM5221) in brcm_fet_config_init()
917 err = phy_write(phydev, MII_BRCM_FET_INTREG, reg); in brcm_fet_config_init()
922 brcmtest = phy_read(phydev, MII_BRCM_FET_BRCMTEST); in brcm_fet_config_init()
928 phy_lock_mdio_bus(phydev); in brcm_fet_config_init()
930 err = __phy_write(phydev, MII_BRCM_FET_BRCMTEST, reg); in brcm_fet_config_init()
932 phy_unlock_mdio_bus(phydev); in brcm_fet_config_init()
936 if (phydev->drv->phy_id != PHY_ID_BCM5221) { in brcm_fet_config_init()
938 reg = __phy_read(phydev, MII_BRCM_FET_SHDW_AUXMODE4); in brcm_fet_config_init()
944 err = __phy_modify(phydev, MII_BRCM_FET_SHDW_AUXMODE4, in brcm_fet_config_init()
951 err = __phy_set_bits(phydev, MII_BRCM_FET_SHDW_MISCCTRL, in brcm_fet_config_init()
957 if (phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE) { in brcm_fet_config_init()
959 err = __phy_set_bits(phydev, MII_BRCM_FET_SHDW_AUXSTAT2, in brcm_fet_config_init()
965 err2 = __phy_write(phydev, MII_BRCM_FET_BRCMTEST, brcmtest); in brcm_fet_config_init()
969 phy_unlock_mdio_bus(phydev); in brcm_fet_config_init()
974 static int brcm_fet_ack_interrupt(struct phy_device *phydev) in brcm_fet_ack_interrupt() argument
979 reg = phy_read(phydev, MII_BRCM_FET_INTREG); in brcm_fet_ack_interrupt()
986 static int brcm_fet_config_intr(struct phy_device *phydev) in brcm_fet_config_intr() argument
990 reg = phy_read(phydev, MII_BRCM_FET_INTREG); in brcm_fet_config_intr()
994 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in brcm_fet_config_intr()
995 err = brcm_fet_ack_interrupt(phydev); in brcm_fet_config_intr()
1000 err = phy_write(phydev, MII_BRCM_FET_INTREG, reg); in brcm_fet_config_intr()
1003 err = phy_write(phydev, MII_BRCM_FET_INTREG, reg); in brcm_fet_config_intr()
1007 err = brcm_fet_ack_interrupt(phydev); in brcm_fet_config_intr()
1013 static irqreturn_t brcm_fet_handle_interrupt(struct phy_device *phydev) in brcm_fet_handle_interrupt() argument
1017 irq_status = phy_read(phydev, MII_BRCM_FET_INTREG); in brcm_fet_handle_interrupt()
1019 phy_error(phydev); in brcm_fet_handle_interrupt()
1026 phy_trigger_machine(phydev); in brcm_fet_handle_interrupt()
1031 static int brcm_fet_suspend(struct phy_device *phydev) in brcm_fet_suspend() argument
1038 err = phy_write(phydev, MII_BMCR, BMCR_PDOWN); in brcm_fet_suspend()
1043 brcmtest = phy_read(phydev, MII_BRCM_FET_BRCMTEST); in brcm_fet_suspend()
1049 phy_lock_mdio_bus(phydev); in brcm_fet_suspend()
1051 err = __phy_write(phydev, MII_BRCM_FET_BRCMTEST, reg); in brcm_fet_suspend()
1053 phy_unlock_mdio_bus(phydev); in brcm_fet_suspend()
1057 if (phydev->drv->phy_id == PHY_ID_BCM5221) in brcm_fet_suspend()
1064 err = __phy_set_bits(phydev, MII_BRCM_FET_SHDW_AUXMODE4, reg); in brcm_fet_suspend()
1067 err2 = __phy_write(phydev, MII_BRCM_FET_BRCMTEST, brcmtest); in brcm_fet_suspend()
1071 phy_unlock_mdio_bus(phydev); in brcm_fet_suspend()
1076 static int bcm5221_config_aneg(struct phy_device *phydev) in bcm5221_config_aneg() argument
1080 ret = genphy_config_aneg(phydev); in bcm5221_config_aneg()
1084 switch (phydev->mdix_ctrl) { in bcm5221_config_aneg()
1098 return phy_modify(phydev, BCM5221_AEGSR, BCM5221_AEGSR_MDIX_MAN_SWAP | in bcm5221_config_aneg()
1103 static int bcm5221_read_status(struct phy_device *phydev) in bcm5221_read_status() argument
1108 ret = phy_read(phydev, BCM5221_AEGSR); in bcm5221_read_status()
1114 phydev->mdix_ctrl = ETH_TP_MDI_X; in bcm5221_read_status()
1116 phydev->mdix_ctrl = ETH_TP_MDI; in bcm5221_read_status()
1118 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in bcm5221_read_status()
1122 phydev->mdix = ETH_TP_MDI_X; in bcm5221_read_status()
1124 phydev->mdix = ETH_TP_MDI; in bcm5221_read_status()
1126 return genphy_read_status(phydev); in bcm5221_read_status()
1129 static void bcm54xx_phy_get_wol(struct phy_device *phydev, in bcm54xx_phy_get_wol() argument
1137 if (!bcm54xx_phy_can_wakeup(phydev)) { in bcm54xx_phy_get_wol()
1142 bcm_phy_get_wol(phydev, wol); in bcm54xx_phy_get_wol()
1145 static int bcm54xx_phy_set_wol(struct phy_device *phydev, in bcm54xx_phy_set_wol() argument
1155 if (!bcm54xx_phy_can_wakeup(phydev)) in bcm54xx_phy_set_wol()
1158 ret = bcm_phy_set_wol(phydev, wol); in bcm54xx_phy_set_wol()
1165 static int bcm54xx_phy_probe(struct phy_device *phydev) in bcm54xx_phy_probe() argument
1171 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in bcm54xx_phy_probe()
1177 phydev->priv = priv; in bcm54xx_phy_probe()
1179 priv->stats = devm_kcalloc(&phydev->mdio.dev, in bcm54xx_phy_probe()
1180 bcm_phy_get_sset_count(phydev), sizeof(u64), in bcm54xx_phy_probe()
1185 priv->ptp = bcm_ptp_probe(phydev); in bcm54xx_phy_probe()
1193 wakeup_gpio = devm_gpiod_get(&phydev->mdio.dev, "wakeup", GPIOD_IN); in bcm54xx_phy_probe()
1203 ret = devm_request_irq(&phydev->mdio.dev, priv->wake_irq, in bcm54xx_phy_probe()
1206 dev_name(&phydev->mdio.dev), phydev); in bcm54xx_phy_probe()
1214 if (!bcm54xx_phy_can_wakeup(phydev)) in bcm54xx_phy_probe()
1217 return device_init_wakeup(&phydev->mdio.dev, true); in bcm54xx_phy_probe()
1220 static void bcm54xx_get_stats(struct phy_device *phydev, in bcm54xx_get_stats() argument
1223 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54xx_get_stats()
1225 bcm_phy_get_stats(phydev, priv->stats, stats, data); in bcm54xx_get_stats()
1228 static void bcm54xx_link_change_notify(struct phy_device *phydev) in bcm54xx_link_change_notify() argument
1234 if (phydev->state != PHY_RUNNING) in bcm54xx_link_change_notify()
1240 if (!(phydev->dev_flags & PHY_BRCM_AUTO_PWRDWN_ENABLE)) in bcm54xx_link_change_notify()
1243 ret = bcm_phy_read_exp(phydev, MII_BCM54XX_EXP_EXP08); in bcm54xx_link_change_notify()
1251 if (phydev->speed == SPEED_10) in bcm54xx_link_change_notify()
1255 bcm_phy_write_exp(phydev, MII_BCM54XX_EXP_EXP08, ret); in bcm54xx_link_change_notify()
1258 static int lre_read_master_slave(struct phy_device *phydev) in lre_read_master_slave() argument
1266 phydev->master_slave_get = MASTER_SLAVE_CFG_UNKNOWN; in lre_read_master_slave()
1267 phydev->master_slave_state = MASTER_SLAVE_STATE_UNKNOWN; in lre_read_master_slave()
1269 val = phy_read(phydev, MII_BCM54XX_LRECR); in lre_read_master_slave()
1280 val = phy_read(phydev, MII_BCM54XX_LRELDSE); in lre_read_master_slave()
1289 phydev->master_slave_get = cfg; in lre_read_master_slave()
1290 phydev->master_slave_state = state; in lre_read_master_slave()
1296 static int lre_read_lpa(struct phy_device *phydev) in lre_read_lpa() argument
1300 if (phydev->autoneg != AUTONEG_ENABLE) { in lre_read_lpa()
1301 if (!phydev->autoneg_complete) { in lre_read_lpa()
1305 phydev->lp_advertising); in lre_read_lpa()
1311 lrelpa = phy_read(phydev, MII_BCM54XX_LRELPA); in lre_read_lpa()
1316 phydev->lp_advertising, in lre_read_lpa()
1319 phydev->lp_advertising, in lre_read_lpa()
1322 phydev->lp_advertising, in lre_read_lpa()
1325 phydev->lp_advertising, in lre_read_lpa()
1328 linkmode_zero(phydev->lp_advertising); in lre_read_lpa()
1334 static int lre_read_status_fixed(struct phy_device *phydev) in lre_read_status_fixed() argument
1336 int lrecr = phy_read(phydev, MII_BCM54XX_LRECR); in lre_read_status_fixed()
1341 phydev->duplex = DUPLEX_FULL; in lre_read_status_fixed()
1344 phydev->speed = SPEED_100; in lre_read_status_fixed()
1346 phydev->speed = SPEED_10; in lre_read_status_fixed()
1362 static int lre_update_link(struct phy_device *phydev) in lre_update_link() argument
1366 lrecr = phy_read(phydev, MII_BCM54XX_LRECR); in lre_update_link()
1381 if (!phy_polling_mode(phydev) || !phydev->link) { in lre_update_link()
1382 status = phy_read(phydev, MII_BCM54XX_LRESR); in lre_update_link()
1390 status = phy_read(phydev, MII_BCM54XX_LRESR); in lre_update_link()
1394 phydev->link = status & LRESR_LSTATUS ? 1 : 0; in lre_update_link()
1395 phydev->autoneg_complete = status & LRESR_LDSCOMPLETE ? 1 : 0; in lre_update_link()
1400 if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete) in lre_update_link()
1401 phydev->link = 0; in lre_update_link()
1409 static int bcm54811_lre_read_status(struct phy_device *phydev) in bcm54811_lre_read_status() argument
1411 int err, old_link = phydev->link; in bcm54811_lre_read_status()
1414 err = lre_update_link(phydev); in bcm54811_lre_read_status()
1419 if (phydev->autoneg == in bcm54811_lre_read_status()
1420 AUTONEG_ENABLE && old_link && phydev->link) in bcm54811_lre_read_status()
1423 phydev->speed = SPEED_UNKNOWN; in bcm54811_lre_read_status()
1424 phydev->duplex = DUPLEX_UNKNOWN; in bcm54811_lre_read_status()
1425 phydev->pause = 0; in bcm54811_lre_read_status()
1426 phydev->asym_pause = 0; in bcm54811_lre_read_status()
1428 err = lre_read_master_slave(phydev); in bcm54811_lre_read_status()
1433 err = lre_read_lpa(phydev); in bcm54811_lre_read_status()
1437 if (phydev->autoneg == AUTONEG_ENABLE && phydev->autoneg_complete) in bcm54811_lre_read_status()
1438 phy_resolve_aneg_linkmode(phydev); in bcm54811_lre_read_status()
1439 else if (phydev->autoneg == AUTONEG_DISABLE) in bcm54811_lre_read_status()
1440 err = lre_read_status_fixed(phydev); in bcm54811_lre_read_status()
1445 static int bcm54811_read_status(struct phy_device *phydev) in bcm54811_read_status() argument
1447 struct bcm54xx_phy_priv *priv = phydev->priv; in bcm54811_read_status()
1450 return bcm54811_lre_read_status(phydev); in bcm54811_read_status()
1452 return genphy_read_status(phydev); in bcm54811_read_status()