Lines Matching full:phydev

134 static int kszphy_extended_write(struct phy_device *phydev,  in kszphy_extended_write()  argument
137 phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum); in kszphy_extended_write()
138 return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val); in kszphy_extended_write()
141 static int kszphy_extended_read(struct phy_device *phydev, in kszphy_extended_read() argument
144 phy_write(phydev, MII_KSZPHY_EXTREG, regnum); in kszphy_extended_read()
145 return phy_read(phydev, MII_KSZPHY_EXTREG_READ); in kszphy_extended_read()
148 static int kszphy_ack_interrupt(struct phy_device *phydev) in kszphy_ack_interrupt() argument
153 rc = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_ack_interrupt()
158 static int kszphy_config_intr(struct phy_device *phydev) in kszphy_config_intr() argument
160 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
170 temp = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_config_intr()
174 phy_write(phydev, MII_KSZPHY_CTRL, temp); in kszphy_config_intr()
177 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) in kszphy_config_intr()
182 return phy_write(phydev, MII_KSZPHY_INTCS, temp); in kszphy_config_intr()
185 static int kszphy_rmii_clk_sel(struct phy_device *phydev, bool val) in kszphy_rmii_clk_sel() argument
189 ctrl = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_rmii_clk_sel()
198 return phy_write(phydev, MII_KSZPHY_CTRL, ctrl); in kszphy_rmii_clk_sel()
201 static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val) in kszphy_setup_led() argument
216 temp = phy_read(phydev, reg); in kszphy_setup_led()
224 rc = phy_write(phydev, reg, temp); in kszphy_setup_led()
227 phydev_err(phydev, "failed to set led mode\n"); in kszphy_setup_led()
235 static int kszphy_broadcast_disable(struct phy_device *phydev) in kszphy_broadcast_disable() argument
239 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_broadcast_disable()
243 ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF); in kszphy_broadcast_disable()
246 phydev_err(phydev, "failed to disable broadcast address\n"); in kszphy_broadcast_disable()
251 static int kszphy_nand_tree_disable(struct phy_device *phydev) in kszphy_nand_tree_disable() argument
255 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_nand_tree_disable()
262 ret = phy_write(phydev, MII_KSZPHY_OMSO, in kszphy_nand_tree_disable()
266 phydev_err(phydev, "failed to disable NAND tree mode\n"); in kszphy_nand_tree_disable()
272 static int kszphy_config_reset(struct phy_device *phydev) in kszphy_config_reset() argument
274 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
278 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
280 phydev_err(phydev, in kszphy_config_reset()
287 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
292 static int kszphy_config_init(struct phy_device *phydev) in kszphy_config_init() argument
294 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
303 kszphy_broadcast_disable(phydev); in kszphy_config_init()
306 kszphy_nand_tree_disable(phydev); in kszphy_config_init()
308 return kszphy_config_reset(phydev); in kszphy_config_init()
311 static int ksz8041_config_init(struct phy_device *phydev) in ksz8041_config_init() argument
315 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_config_init()
319 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
323 linkmode_and(phydev->supported, phydev->supported, mask); in ksz8041_config_init()
325 phydev->supported); in ksz8041_config_init()
326 linkmode_and(phydev->advertising, phydev->advertising, mask); in ksz8041_config_init()
328 phydev->advertising); in ksz8041_config_init()
329 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
332 return kszphy_config_init(phydev); in ksz8041_config_init()
335 static int ksz8041_config_aneg(struct phy_device *phydev) in ksz8041_config_aneg() argument
338 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
339 phydev->speed = SPEED_100; in ksz8041_config_aneg()
343 return genphy_config_aneg(phydev); in ksz8041_config_aneg()
346 static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, in ksz8051_ksz8795_match_phy_device() argument
351 if ((phydev->phy_id & MICREL_PHY_ID_MASK) != ksz_phy_id) in ksz8051_ksz8795_match_phy_device()
354 ret = phy_read(phydev, MII_BMSR); in ksz8051_ksz8795_match_phy_device()
370 static int ksz8051_match_phy_device(struct phy_device *phydev) in ksz8051_match_phy_device() argument
372 return ksz8051_ksz8795_match_phy_device(phydev, PHY_ID_KSZ8051); in ksz8051_match_phy_device()
375 static int ksz8081_config_init(struct phy_device *phydev) in ksz8081_config_init() argument
382 phy_clear_bits(phydev, MII_KSZPHY_OMSO, KSZPHY_OMSO_FACTORY_TEST); in ksz8081_config_init()
384 return kszphy_config_init(phydev); in ksz8081_config_init()
387 static int ksz8061_config_init(struct phy_device *phydev) in ksz8061_config_init() argument
391 ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); in ksz8061_config_init()
395 return kszphy_config_init(phydev); in ksz8061_config_init()
398 static int ksz8795_match_phy_device(struct phy_device *phydev) in ksz8795_match_phy_device() argument
400 return ksz8051_ksz8795_match_phy_device(phydev, PHY_ID_KSZ87XX); in ksz8795_match_phy_device()
403 static int ksz9021_load_values_from_of(struct phy_device *phydev, in ksz9021_load_values_from_of() argument
432 newval = kszphy_extended_read(phydev, reg); in ksz9021_load_values_from_of()
448 return kszphy_extended_write(phydev, reg, newval); in ksz9021_load_values_from_of()
451 static int ksz9021_config_init(struct phy_device *phydev) in ksz9021_config_init() argument
453 const struct device *dev = &phydev->mdio.dev; in ksz9021_config_init()
461 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
469 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
473 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
477 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
543 static int ksz9031_of_load_skew_values(struct phy_device *phydev, in ksz9031_of_load_skew_values() argument
566 newval = phy_read_mmd(phydev, 2, reg); in ksz9031_of_load_skew_values()
580 return phy_write_mmd(phydev, 2, reg, newval); in ksz9031_of_load_skew_values()
584 static int ksz9031_center_flp_timing(struct phy_device *phydev) in ksz9031_center_flp_timing() argument
588 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_HI, in ksz9031_center_flp_timing()
593 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_LO, in ksz9031_center_flp_timing()
598 return genphy_restart_aneg(phydev); in ksz9031_center_flp_timing()
602 static int ksz9031_enable_edpd(struct phy_device *phydev) in ksz9031_enable_edpd() argument
606 reg = phy_read_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD); in ksz9031_enable_edpd()
609 return phy_write_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD, in ksz9031_enable_edpd()
613 static int ksz9031_config_rgmii_delay(struct phy_device *phydev) in ksz9031_config_rgmii_delay() argument
618 switch (phydev->interface) { in ksz9031_config_rgmii_delay()
647 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_CONTROL_PAD_SKEW, in ksz9031_config_rgmii_delay()
653 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_RX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
661 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_TX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
669 return phy_write_mmd(phydev, 2, MII_KSZ9031RN_CLK_PAD_SKEW, in ksz9031_config_rgmii_delay()
674 static int ksz9031_config_init(struct phy_device *phydev) in ksz9031_config_init() argument
676 const struct device *dev = &phydev->mdio.dev; in ksz9031_config_init()
691 result = ksz9031_enable_edpd(phydev); in ksz9031_config_init()
699 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
708 if (phy_interface_is_rgmii(phydev)) { in ksz9031_config_init()
709 result = ksz9031_config_rgmii_delay(phydev); in ksz9031_config_init()
714 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
718 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
722 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
726 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
730 if (update && phydev->interface != PHY_INTERFACE_MODE_RGMII) in ksz9031_config_init()
731 phydev_warn(phydev, in ksz9031_config_init()
750 result = phy_read(phydev, MII_CTRL1000); in ksz9031_config_init()
756 result = phy_write(phydev, MII_CTRL1000, result); in ksz9031_config_init()
762 return ksz9031_center_flp_timing(phydev); in ksz9031_config_init()
765 phydev_err(phydev, "failed to force the phy to master mode\n"); in ksz9031_config_init()
774 static int ksz9131_of_load_skew_values(struct phy_device *phydev, in ksz9131_of_load_skew_values() argument
809 newval = phy_read_mmd(phydev, 2, reg); in ksz9131_of_load_skew_values()
823 return phy_write_mmd(phydev, 2, reg, newval); in ksz9131_of_load_skew_values()
833 static int ksz9131_config_rgmii_delay(struct phy_device *phydev) in ksz9131_config_rgmii_delay() argument
838 switch (phydev->interface) { in ksz9131_config_rgmii_delay()
859 ret = phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
865 return phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
870 static int ksz9131_config_init(struct phy_device *phydev) in ksz9131_config_init() argument
872 const struct device *dev = &phydev->mdio.dev; in ksz9131_config_init()
887 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
896 if (phy_interface_is_rgmii(phydev)) { in ksz9131_config_init()
897 ret = ksz9131_config_rgmii_delay(phydev); in ksz9131_config_init()
902 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
908 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
914 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
920 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
932 static int ksz8873mll_read_status(struct phy_device *phydev) in ksz8873mll_read_status() argument
937 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
939 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
942 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
944 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
947 phydev->speed = SPEED_10; in ksz8873mll_read_status()
949 phydev->speed = SPEED_100; in ksz8873mll_read_status()
951 phydev->link = 1; in ksz8873mll_read_status()
952 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
957 static int ksz9031_get_features(struct phy_device *phydev) in ksz9031_get_features() argument
961 ret = genphy_read_abilities(phydev); in ksz9031_get_features()
974 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
979 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
984 static int ksz9031_read_status(struct phy_device *phydev) in ksz9031_read_status() argument
989 err = genphy_read_status(phydev); in ksz9031_read_status()
996 regval = phy_read(phydev, MII_STAT1000); in ksz9031_read_status()
998 phy_init_hw(phydev); in ksz9031_read_status()
999 phydev->link = 0; in ksz9031_read_status()
1000 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
1001 phydev->drv->config_intr(phydev); in ksz9031_read_status()
1002 return genphy_config_aneg(phydev); in ksz9031_read_status()
1008 static int ksz8873mll_config_aneg(struct phy_device *phydev) in ksz8873mll_config_aneg() argument
1013 static int kszphy_get_sset_count(struct phy_device *phydev) in kszphy_get_sset_count() argument
1018 static void kszphy_get_strings(struct phy_device *phydev, u8 *data) in kszphy_get_strings() argument
1028 static u64 kszphy_get_stat(struct phy_device *phydev, int i) in kszphy_get_stat() argument
1031 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
1035 val = phy_read(phydev, stat.reg); in kszphy_get_stat()
1047 static void kszphy_get_stats(struct phy_device *phydev, in kszphy_get_stats() argument
1053 data[i] = kszphy_get_stat(phydev, i); in kszphy_get_stats()
1056 static int kszphy_suspend(struct phy_device *phydev) in kszphy_suspend() argument
1059 if (phy_interrupt_is_valid(phydev)) { in kszphy_suspend()
1060 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
1061 if (phydev->drv->config_intr) in kszphy_suspend()
1062 phydev->drv->config_intr(phydev); in kszphy_suspend()
1065 return genphy_suspend(phydev); in kszphy_suspend()
1068 static int kszphy_resume(struct phy_device *phydev) in kszphy_resume() argument
1072 genphy_resume(phydev); in kszphy_resume()
1080 ret = kszphy_config_reset(phydev); in kszphy_resume()
1085 if (phy_interrupt_is_valid(phydev)) { in kszphy_resume()
1086 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
1087 if (phydev->drv->config_intr) in kszphy_resume()
1088 phydev->drv->config_intr(phydev); in kszphy_resume()
1094 static int kszphy_probe(struct phy_device *phydev) in kszphy_probe() argument
1096 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
1097 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
1102 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
1106 phydev->priv = priv; in kszphy_probe()
1117 phydev_err(phydev, "invalid led mode: 0x%02x\n", in kszphy_probe()
1125 clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
1140 phydev_err(phydev, "Clock rate out of range: %ld\n", in kszphy_probe()
1147 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()