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_fiber_mode(struct phy_device *phydev) in ksz8041_fiber_mode() argument
313 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_fiber_mode()
318 static int ksz8041_config_init(struct phy_device *phydev) in ksz8041_config_init() argument
323 if (ksz8041_fiber_mode(phydev)) { in ksz8041_config_init()
324 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
328 linkmode_and(phydev->supported, phydev->supported, mask); in ksz8041_config_init()
330 phydev->supported); in ksz8041_config_init()
331 linkmode_and(phydev->advertising, phydev->advertising, mask); in ksz8041_config_init()
333 phydev->advertising); in ksz8041_config_init()
334 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
337 return kszphy_config_init(phydev); in ksz8041_config_init()
340 static int ksz8041_config_aneg(struct phy_device *phydev) in ksz8041_config_aneg() argument
343 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
344 phydev->speed = SPEED_100; in ksz8041_config_aneg()
348 return genphy_config_aneg(phydev); in ksz8041_config_aneg()
351 static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, in ksz8051_ksz8795_match_phy_device() argument
356 if ((phydev->phy_id & MICREL_PHY_ID_MASK) != PHY_ID_KSZ8051) in ksz8051_ksz8795_match_phy_device()
359 ret = phy_read(phydev, MII_BMSR); in ksz8051_ksz8795_match_phy_device()
375 static int ksz8051_match_phy_device(struct phy_device *phydev) in ksz8051_match_phy_device() argument
377 return ksz8051_ksz8795_match_phy_device(phydev, true); in ksz8051_match_phy_device()
380 static int ksz8081_config_init(struct phy_device *phydev) in ksz8081_config_init() argument
387 phy_clear_bits(phydev, MII_KSZPHY_OMSO, KSZPHY_OMSO_FACTORY_TEST); in ksz8081_config_init()
389 return kszphy_config_init(phydev); in ksz8081_config_init()
392 static int ksz8061_config_init(struct phy_device *phydev) in ksz8061_config_init() argument
396 ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); in ksz8061_config_init()
400 return kszphy_config_init(phydev); in ksz8061_config_init()
403 static int ksz8795_match_phy_device(struct phy_device *phydev) in ksz8795_match_phy_device() argument
405 return ksz8051_ksz8795_match_phy_device(phydev, false); in ksz8795_match_phy_device()
408 static int ksz9021_load_values_from_of(struct phy_device *phydev, in ksz9021_load_values_from_of() argument
437 newval = kszphy_extended_read(phydev, reg); in ksz9021_load_values_from_of()
453 return kszphy_extended_write(phydev, reg, newval); in ksz9021_load_values_from_of()
456 static int ksz9021_config_init(struct phy_device *phydev) in ksz9021_config_init() argument
458 const struct device *dev = &phydev->mdio.dev; in ksz9021_config_init()
466 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
474 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
478 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
482 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
548 static int ksz9031_of_load_skew_values(struct phy_device *phydev, in ksz9031_of_load_skew_values() argument
571 newval = phy_read_mmd(phydev, 2, reg); in ksz9031_of_load_skew_values()
585 return phy_write_mmd(phydev, 2, reg, newval); in ksz9031_of_load_skew_values()
589 static int ksz9031_center_flp_timing(struct phy_device *phydev) in ksz9031_center_flp_timing() argument
593 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_HI, in ksz9031_center_flp_timing()
598 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_LO, in ksz9031_center_flp_timing()
603 return genphy_restart_aneg(phydev); in ksz9031_center_flp_timing()
607 static int ksz9031_enable_edpd(struct phy_device *phydev) in ksz9031_enable_edpd() argument
611 reg = phy_read_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD); in ksz9031_enable_edpd()
614 return phy_write_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD, in ksz9031_enable_edpd()
618 static int ksz9031_config_rgmii_delay(struct phy_device *phydev) in ksz9031_config_rgmii_delay() argument
623 switch (phydev->interface) { in ksz9031_config_rgmii_delay()
652 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_CONTROL_PAD_SKEW, in ksz9031_config_rgmii_delay()
658 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_RX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
666 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_TX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
674 return phy_write_mmd(phydev, 2, MII_KSZ9031RN_CLK_PAD_SKEW, in ksz9031_config_rgmii_delay()
679 static int ksz9031_config_init(struct phy_device *phydev) in ksz9031_config_init() argument
681 const struct device *dev = &phydev->mdio.dev; in ksz9031_config_init()
696 result = ksz9031_enable_edpd(phydev); in ksz9031_config_init()
704 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
713 if (phy_interface_is_rgmii(phydev)) { in ksz9031_config_init()
714 result = ksz9031_config_rgmii_delay(phydev); in ksz9031_config_init()
719 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
723 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
727 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
731 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
735 if (update && !phy_interface_is_rgmii(phydev)) in ksz9031_config_init()
736 phydev_warn(phydev, in ksz9031_config_init()
755 result = phy_read(phydev, MII_CTRL1000); in ksz9031_config_init()
761 result = phy_write(phydev, MII_CTRL1000, result); in ksz9031_config_init()
767 return ksz9031_center_flp_timing(phydev); in ksz9031_config_init()
770 phydev_err(phydev, "failed to force the phy to master mode\n"); in ksz9031_config_init()
779 static int ksz9131_of_load_skew_values(struct phy_device *phydev, in ksz9131_of_load_skew_values() argument
814 newval = phy_read_mmd(phydev, 2, reg); in ksz9131_of_load_skew_values()
828 return phy_write_mmd(phydev, 2, reg, newval); in ksz9131_of_load_skew_values()
838 static int ksz9131_config_rgmii_delay(struct phy_device *phydev) in ksz9131_config_rgmii_delay() argument
843 switch (phydev->interface) { in ksz9131_config_rgmii_delay()
864 ret = phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
870 return phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
875 static int ksz9131_config_init(struct phy_device *phydev) in ksz9131_config_init() argument
877 const struct device *dev = &phydev->mdio.dev; in ksz9131_config_init()
892 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
901 if (phy_interface_is_rgmii(phydev)) { in ksz9131_config_init()
902 ret = ksz9131_config_rgmii_delay(phydev); in ksz9131_config_init()
907 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
913 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
919 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
925 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
937 static int ksz8873mll_read_status(struct phy_device *phydev) in ksz8873mll_read_status() argument
942 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
944 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
947 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
949 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
952 phydev->speed = SPEED_10; in ksz8873mll_read_status()
954 phydev->speed = SPEED_100; in ksz8873mll_read_status()
956 phydev->link = 1; in ksz8873mll_read_status()
957 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
962 static int ksz9031_get_features(struct phy_device *phydev) in ksz9031_get_features() argument
966 ret = genphy_read_abilities(phydev); in ksz9031_get_features()
979 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
984 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
989 static int ksz9031_read_status(struct phy_device *phydev) in ksz9031_read_status() argument
994 err = genphy_read_status(phydev); in ksz9031_read_status()
1001 regval = phy_read(phydev, MII_STAT1000); in ksz9031_read_status()
1003 phy_init_hw(phydev); in ksz9031_read_status()
1004 phydev->link = 0; in ksz9031_read_status()
1005 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
1006 phydev->drv->config_intr(phydev); in ksz9031_read_status()
1007 return genphy_config_aneg(phydev); in ksz9031_read_status()
1013 static int ksz8873mll_config_aneg(struct phy_device *phydev) in ksz8873mll_config_aneg() argument
1018 static int kszphy_get_sset_count(struct phy_device *phydev) in kszphy_get_sset_count() argument
1023 static void kszphy_get_strings(struct phy_device *phydev, u8 *data) in kszphy_get_strings() argument
1033 static u64 kszphy_get_stat(struct phy_device *phydev, int i) in kszphy_get_stat() argument
1036 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
1040 val = phy_read(phydev, stat.reg); in kszphy_get_stat()
1052 static void kszphy_get_stats(struct phy_device *phydev, in kszphy_get_stats() argument
1058 data[i] = kszphy_get_stat(phydev, i); in kszphy_get_stats()
1061 static int kszphy_suspend(struct phy_device *phydev) in kszphy_suspend() argument
1064 if (phy_interrupt_is_valid(phydev)) { in kszphy_suspend()
1065 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
1066 if (phydev->drv->config_intr) in kszphy_suspend()
1067 phydev->drv->config_intr(phydev); in kszphy_suspend()
1070 return genphy_suspend(phydev); in kszphy_suspend()
1073 static int kszphy_resume(struct phy_device *phydev) in kszphy_resume() argument
1077 genphy_resume(phydev); in kszphy_resume()
1085 ret = kszphy_config_reset(phydev); in kszphy_resume()
1090 if (phy_interrupt_is_valid(phydev)) { in kszphy_resume()
1091 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
1092 if (phydev->drv->config_intr) in kszphy_resume()
1093 phydev->drv->config_intr(phydev); in kszphy_resume()
1099 static int kszphy_probe(struct phy_device *phydev) in kszphy_probe() argument
1101 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
1102 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
1107 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
1111 phydev->priv = priv; in kszphy_probe()
1122 phydev_err(phydev, "invalid led mode: 0x%02x\n", in kszphy_probe()
1130 clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
1145 phydev_err(phydev, "Clock rate out of range: %ld\n", in kszphy_probe()
1151 if (ksz8041_fiber_mode(phydev)) in kszphy_probe()
1152 phydev->port = PORT_FIBRE; in kszphy_probe()
1155 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()