Lines Matching refs:phydev
132 static int kszphy_extended_write(struct phy_device *phydev, in kszphy_extended_write() argument
135 phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum); in kszphy_extended_write()
136 return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val); in kszphy_extended_write()
139 static int kszphy_extended_read(struct phy_device *phydev, in kszphy_extended_read() argument
142 phy_write(phydev, MII_KSZPHY_EXTREG, regnum); in kszphy_extended_read()
143 return phy_read(phydev, MII_KSZPHY_EXTREG_READ); in kszphy_extended_read()
146 static int kszphy_ack_interrupt(struct phy_device *phydev) in kszphy_ack_interrupt() argument
151 rc = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_ack_interrupt()
156 static int kszphy_config_intr(struct phy_device *phydev) in kszphy_config_intr() argument
158 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
168 temp = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_config_intr()
172 phy_write(phydev, MII_KSZPHY_CTRL, temp); in kszphy_config_intr()
175 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) in kszphy_config_intr()
180 return phy_write(phydev, MII_KSZPHY_INTCS, temp); in kszphy_config_intr()
183 static int kszphy_rmii_clk_sel(struct phy_device *phydev, bool val) in kszphy_rmii_clk_sel() argument
187 ctrl = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_rmii_clk_sel()
196 return phy_write(phydev, MII_KSZPHY_CTRL, ctrl); in kszphy_rmii_clk_sel()
199 static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val) in kszphy_setup_led() argument
214 temp = phy_read(phydev, reg); in kszphy_setup_led()
222 rc = phy_write(phydev, reg, temp); in kszphy_setup_led()
225 phydev_err(phydev, "failed to set led mode\n"); in kszphy_setup_led()
233 static int kszphy_broadcast_disable(struct phy_device *phydev) in kszphy_broadcast_disable() argument
237 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_broadcast_disable()
241 ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF); in kszphy_broadcast_disable()
244 phydev_err(phydev, "failed to disable broadcast address\n"); in kszphy_broadcast_disable()
249 static int kszphy_nand_tree_disable(struct phy_device *phydev) in kszphy_nand_tree_disable() argument
253 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_nand_tree_disable()
260 ret = phy_write(phydev, MII_KSZPHY_OMSO, in kszphy_nand_tree_disable()
264 phydev_err(phydev, "failed to disable NAND tree mode\n"); in kszphy_nand_tree_disable()
270 static int kszphy_config_reset(struct phy_device *phydev) in kszphy_config_reset() argument
272 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
276 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
278 phydev_err(phydev, in kszphy_config_reset()
285 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
290 static int kszphy_config_init(struct phy_device *phydev) in kszphy_config_init() argument
292 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
301 kszphy_broadcast_disable(phydev); in kszphy_config_init()
304 kszphy_nand_tree_disable(phydev); in kszphy_config_init()
306 return kszphy_config_reset(phydev); in kszphy_config_init()
309 static int ksz8041_config_init(struct phy_device *phydev) in ksz8041_config_init() argument
313 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_config_init()
317 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
321 linkmode_and(phydev->supported, phydev->supported, mask); in ksz8041_config_init()
323 phydev->supported); in ksz8041_config_init()
324 linkmode_and(phydev->advertising, phydev->advertising, mask); in ksz8041_config_init()
326 phydev->advertising); in ksz8041_config_init()
327 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
330 return kszphy_config_init(phydev); in ksz8041_config_init()
333 static int ksz8041_config_aneg(struct phy_device *phydev) in ksz8041_config_aneg() argument
336 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
337 phydev->speed = SPEED_100; in ksz8041_config_aneg()
341 return genphy_config_aneg(phydev); in ksz8041_config_aneg()
344 static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, in ksz8051_ksz8795_match_phy_device() argument
349 if ((phydev->phy_id & MICREL_PHY_ID_MASK) != ksz_phy_id) in ksz8051_ksz8795_match_phy_device()
352 ret = phy_read(phydev, MII_BMSR); in ksz8051_ksz8795_match_phy_device()
368 static int ksz8051_match_phy_device(struct phy_device *phydev) in ksz8051_match_phy_device() argument
370 return ksz8051_ksz8795_match_phy_device(phydev, PHY_ID_KSZ8051); in ksz8051_match_phy_device()
373 static int ksz8081_config_init(struct phy_device *phydev) in ksz8081_config_init() argument
380 phy_clear_bits(phydev, MII_KSZPHY_OMSO, KSZPHY_OMSO_FACTORY_TEST); in ksz8081_config_init()
382 return kszphy_config_init(phydev); in ksz8081_config_init()
385 static int ksz8061_config_init(struct phy_device *phydev) in ksz8061_config_init() argument
389 ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); in ksz8061_config_init()
393 return kszphy_config_init(phydev); in ksz8061_config_init()
396 static int ksz8795_match_phy_device(struct phy_device *phydev) in ksz8795_match_phy_device() argument
398 return ksz8051_ksz8795_match_phy_device(phydev, PHY_ID_KSZ87XX); in ksz8795_match_phy_device()
401 static int ksz9021_load_values_from_of(struct phy_device *phydev, in ksz9021_load_values_from_of() argument
430 newval = kszphy_extended_read(phydev, reg); in ksz9021_load_values_from_of()
446 return kszphy_extended_write(phydev, reg, newval); in ksz9021_load_values_from_of()
449 static int ksz9021_config_init(struct phy_device *phydev) in ksz9021_config_init() argument
451 const struct device *dev = &phydev->mdio.dev; in ksz9021_config_init()
459 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
467 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
471 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
475 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
500 static int ksz9031_of_load_skew_values(struct phy_device *phydev, in ksz9031_of_load_skew_values() argument
520 newval = phy_read_mmd(phydev, 2, reg); in ksz9031_of_load_skew_values()
534 return phy_write_mmd(phydev, 2, reg, newval); in ksz9031_of_load_skew_values()
538 static int ksz9031_center_flp_timing(struct phy_device *phydev) in ksz9031_center_flp_timing() argument
542 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_HI, in ksz9031_center_flp_timing()
547 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_LO, in ksz9031_center_flp_timing()
552 return genphy_restart_aneg(phydev); in ksz9031_center_flp_timing()
556 static int ksz9031_enable_edpd(struct phy_device *phydev) in ksz9031_enable_edpd() argument
560 reg = phy_read_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD); in ksz9031_enable_edpd()
563 return phy_write_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD, in ksz9031_enable_edpd()
567 static int ksz9031_config_init(struct phy_device *phydev) in ksz9031_config_init() argument
569 const struct device *dev = &phydev->mdio.dev; in ksz9031_config_init()
584 result = ksz9031_enable_edpd(phydev); in ksz9031_config_init()
592 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
599 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
603 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
607 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
611 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
631 result = phy_read(phydev, MII_CTRL1000); in ksz9031_config_init()
637 result = phy_write(phydev, MII_CTRL1000, result); in ksz9031_config_init()
643 return ksz9031_center_flp_timing(phydev); in ksz9031_config_init()
646 phydev_err(phydev, "failed to force the phy to master mode\n"); in ksz9031_config_init()
655 static int ksz9131_of_load_skew_values(struct phy_device *phydev, in ksz9131_of_load_skew_values() argument
690 newval = phy_read_mmd(phydev, 2, reg); in ksz9131_of_load_skew_values()
704 return phy_write_mmd(phydev, 2, reg, newval); in ksz9131_of_load_skew_values()
707 static int ksz9131_config_init(struct phy_device *phydev) in ksz9131_config_init() argument
709 const struct device *dev = &phydev->mdio.dev; in ksz9131_config_init()
724 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
733 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
739 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
745 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
751 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
763 static int ksz8873mll_read_status(struct phy_device *phydev) in ksz8873mll_read_status() argument
768 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
770 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
773 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
775 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
778 phydev->speed = SPEED_10; in ksz8873mll_read_status()
780 phydev->speed = SPEED_100; in ksz8873mll_read_status()
782 phydev->link = 1; in ksz8873mll_read_status()
783 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
788 static int ksz9031_get_features(struct phy_device *phydev) in ksz9031_get_features() argument
792 ret = genphy_read_abilities(phydev); in ksz9031_get_features()
805 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
810 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
815 static int ksz9031_read_status(struct phy_device *phydev) in ksz9031_read_status() argument
820 err = genphy_read_status(phydev); in ksz9031_read_status()
827 regval = phy_read(phydev, MII_STAT1000); in ksz9031_read_status()
829 phy_init_hw(phydev); in ksz9031_read_status()
830 phydev->link = 0; in ksz9031_read_status()
831 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
832 phydev->drv->config_intr(phydev); in ksz9031_read_status()
833 return genphy_config_aneg(phydev); in ksz9031_read_status()
839 static int ksz8873mll_config_aneg(struct phy_device *phydev) in ksz8873mll_config_aneg() argument
844 static int kszphy_get_sset_count(struct phy_device *phydev) in kszphy_get_sset_count() argument
849 static void kszphy_get_strings(struct phy_device *phydev, u8 *data) in kszphy_get_strings() argument
859 static u64 kszphy_get_stat(struct phy_device *phydev, int i) in kszphy_get_stat() argument
862 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
866 val = phy_read(phydev, stat.reg); in kszphy_get_stat()
878 static void kszphy_get_stats(struct phy_device *phydev, in kszphy_get_stats() argument
884 data[i] = kszphy_get_stat(phydev, i); in kszphy_get_stats()
887 static int kszphy_suspend(struct phy_device *phydev) in kszphy_suspend() argument
890 if (phy_interrupt_is_valid(phydev)) { in kszphy_suspend()
891 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
892 if (phydev->drv->config_intr) in kszphy_suspend()
893 phydev->drv->config_intr(phydev); in kszphy_suspend()
896 return genphy_suspend(phydev); in kszphy_suspend()
899 static int kszphy_resume(struct phy_device *phydev) in kszphy_resume() argument
903 genphy_resume(phydev); in kszphy_resume()
905 ret = kszphy_config_reset(phydev); in kszphy_resume()
910 if (phy_interrupt_is_valid(phydev)) { in kszphy_resume()
911 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
912 if (phydev->drv->config_intr) in kszphy_resume()
913 phydev->drv->config_intr(phydev); in kszphy_resume()
919 static int kszphy_probe(struct phy_device *phydev) in kszphy_probe() argument
921 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
922 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
927 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
931 phydev->priv = priv; in kszphy_probe()
942 phydev_err(phydev, "invalid led mode: 0x%02x\n", in kszphy_probe()
950 clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
965 phydev_err(phydev, "Clock rate out of range: %ld\n", in kszphy_probe()
972 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()