Lines Matching refs:phydev
157 static int kszphy_extended_write(struct phy_device *phydev, in kszphy_extended_write() argument
160 phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum); in kszphy_extended_write()
161 return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val); in kszphy_extended_write()
164 static int kszphy_extended_read(struct phy_device *phydev, in kszphy_extended_read() argument
167 phy_write(phydev, MII_KSZPHY_EXTREG, regnum); in kszphy_extended_read()
168 return phy_read(phydev, MII_KSZPHY_EXTREG_READ); in kszphy_extended_read()
171 static int kszphy_ack_interrupt(struct phy_device *phydev) in kszphy_ack_interrupt() argument
176 rc = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_ack_interrupt()
181 static int kszphy_config_intr(struct phy_device *phydev) in kszphy_config_intr() argument
183 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
193 temp = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_config_intr()
197 phy_write(phydev, MII_KSZPHY_CTRL, temp); in kszphy_config_intr()
200 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in kszphy_config_intr()
201 err = kszphy_ack_interrupt(phydev); in kszphy_config_intr()
206 err = phy_write(phydev, MII_KSZPHY_INTCS, temp); in kszphy_config_intr()
209 err = phy_write(phydev, MII_KSZPHY_INTCS, temp); in kszphy_config_intr()
213 err = kszphy_ack_interrupt(phydev); in kszphy_config_intr()
219 static irqreturn_t kszphy_handle_interrupt(struct phy_device *phydev) in kszphy_handle_interrupt() argument
223 irq_status = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_handle_interrupt()
225 phy_error(phydev); in kszphy_handle_interrupt()
232 phy_trigger_machine(phydev); in kszphy_handle_interrupt()
237 static int kszphy_rmii_clk_sel(struct phy_device *phydev, bool val) in kszphy_rmii_clk_sel() argument
241 ctrl = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_rmii_clk_sel()
250 return phy_write(phydev, MII_KSZPHY_CTRL, ctrl); in kszphy_rmii_clk_sel()
253 static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val) in kszphy_setup_led() argument
268 temp = phy_read(phydev, reg); in kszphy_setup_led()
276 rc = phy_write(phydev, reg, temp); in kszphy_setup_led()
279 phydev_err(phydev, "failed to set led mode\n"); in kszphy_setup_led()
287 static int kszphy_broadcast_disable(struct phy_device *phydev) in kszphy_broadcast_disable() argument
291 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_broadcast_disable()
295 ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF); in kszphy_broadcast_disable()
298 phydev_err(phydev, "failed to disable broadcast address\n"); in kszphy_broadcast_disable()
303 static int kszphy_nand_tree_disable(struct phy_device *phydev) in kszphy_nand_tree_disable() argument
307 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_nand_tree_disable()
314 ret = phy_write(phydev, MII_KSZPHY_OMSO, in kszphy_nand_tree_disable()
318 phydev_err(phydev, "failed to disable NAND tree mode\n"); in kszphy_nand_tree_disable()
324 static int kszphy_config_reset(struct phy_device *phydev) in kszphy_config_reset() argument
326 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
330 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
332 phydev_err(phydev, in kszphy_config_reset()
339 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
344 static int kszphy_config_init(struct phy_device *phydev) in kszphy_config_init() argument
346 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
355 kszphy_broadcast_disable(phydev); in kszphy_config_init()
358 kszphy_nand_tree_disable(phydev); in kszphy_config_init()
360 return kszphy_config_reset(phydev); in kszphy_config_init()
363 static int ksz8041_fiber_mode(struct phy_device *phydev) in ksz8041_fiber_mode() argument
365 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_fiber_mode()
370 static int ksz8041_config_init(struct phy_device *phydev) in ksz8041_config_init() argument
375 if (ksz8041_fiber_mode(phydev)) { in ksz8041_config_init()
376 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
380 linkmode_and(phydev->supported, phydev->supported, mask); in ksz8041_config_init()
382 phydev->supported); in ksz8041_config_init()
383 linkmode_and(phydev->advertising, phydev->advertising, mask); in ksz8041_config_init()
385 phydev->advertising); in ksz8041_config_init()
386 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
389 return kszphy_config_init(phydev); in ksz8041_config_init()
392 static int ksz8041_config_aneg(struct phy_device *phydev) in ksz8041_config_aneg() argument
395 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
396 phydev->speed = SPEED_100; in ksz8041_config_aneg()
400 return genphy_config_aneg(phydev); in ksz8041_config_aneg()
403 static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, in ksz8051_ksz8795_match_phy_device() argument
408 if ((phydev->phy_id & MICREL_PHY_ID_MASK) != PHY_ID_KSZ8051) in ksz8051_ksz8795_match_phy_device()
411 ret = phy_read(phydev, MII_BMSR); in ksz8051_ksz8795_match_phy_device()
427 static int ksz8051_match_phy_device(struct phy_device *phydev) in ksz8051_match_phy_device() argument
429 return ksz8051_ksz8795_match_phy_device(phydev, true); in ksz8051_match_phy_device()
432 static int ksz8081_config_init(struct phy_device *phydev) in ksz8081_config_init() argument
439 phy_clear_bits(phydev, MII_KSZPHY_OMSO, KSZPHY_OMSO_FACTORY_TEST); in ksz8081_config_init()
441 return kszphy_config_init(phydev); in ksz8081_config_init()
444 static int ksz8081_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz8081_config_mdix() argument
463 return phy_modify(phydev, MII_KSZPHY_CTRL_2, in ksz8081_config_mdix()
470 static int ksz8081_config_aneg(struct phy_device *phydev) in ksz8081_config_aneg() argument
474 ret = genphy_config_aneg(phydev); in ksz8081_config_aneg()
482 return ksz8081_config_mdix(phydev, phydev->mdix_ctrl); in ksz8081_config_aneg()
485 static int ksz8081_mdix_update(struct phy_device *phydev) in ksz8081_mdix_update() argument
489 ret = phy_read(phydev, MII_KSZPHY_CTRL_2); in ksz8081_mdix_update()
495 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz8081_mdix_update()
497 phydev->mdix_ctrl = ETH_TP_MDI; in ksz8081_mdix_update()
499 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz8081_mdix_update()
502 ret = phy_read(phydev, MII_KSZPHY_CTRL_1); in ksz8081_mdix_update()
507 phydev->mdix = ETH_TP_MDI; in ksz8081_mdix_update()
509 phydev->mdix = ETH_TP_MDI_X; in ksz8081_mdix_update()
514 static int ksz8081_read_status(struct phy_device *phydev) in ksz8081_read_status() argument
518 ret = ksz8081_mdix_update(phydev); in ksz8081_read_status()
522 return genphy_read_status(phydev); in ksz8081_read_status()
525 static int ksz8061_config_init(struct phy_device *phydev) in ksz8061_config_init() argument
529 ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); in ksz8061_config_init()
533 return kszphy_config_init(phydev); in ksz8061_config_init()
536 static int ksz8795_match_phy_device(struct phy_device *phydev) in ksz8795_match_phy_device() argument
538 return ksz8051_ksz8795_match_phy_device(phydev, false); in ksz8795_match_phy_device()
541 static int ksz9021_load_values_from_of(struct phy_device *phydev, in ksz9021_load_values_from_of() argument
570 newval = kszphy_extended_read(phydev, reg); in ksz9021_load_values_from_of()
586 return kszphy_extended_write(phydev, reg, newval); in ksz9021_load_values_from_of()
589 static int ksz9021_config_init(struct phy_device *phydev) in ksz9021_config_init() argument
598 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
606 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
610 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
614 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
680 static int ksz9031_of_load_skew_values(struct phy_device *phydev, in ksz9031_of_load_skew_values() argument
703 newval = phy_read_mmd(phydev, 2, reg); in ksz9031_of_load_skew_values()
717 return phy_write_mmd(phydev, 2, reg, newval); in ksz9031_of_load_skew_values()
721 static int ksz9031_center_flp_timing(struct phy_device *phydev) in ksz9031_center_flp_timing() argument
725 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_HI, in ksz9031_center_flp_timing()
730 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_LO, in ksz9031_center_flp_timing()
735 return genphy_restart_aneg(phydev); in ksz9031_center_flp_timing()
739 static int ksz9031_enable_edpd(struct phy_device *phydev) in ksz9031_enable_edpd() argument
743 reg = phy_read_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD); in ksz9031_enable_edpd()
746 return phy_write_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD, in ksz9031_enable_edpd()
750 static int ksz9031_config_rgmii_delay(struct phy_device *phydev) in ksz9031_config_rgmii_delay() argument
755 switch (phydev->interface) { in ksz9031_config_rgmii_delay()
784 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_CONTROL_PAD_SKEW, in ksz9031_config_rgmii_delay()
790 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_RX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
798 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_TX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
806 return phy_write_mmd(phydev, 2, MII_KSZ9031RN_CLK_PAD_SKEW, in ksz9031_config_rgmii_delay()
811 static int ksz9031_config_init(struct phy_device *phydev) in ksz9031_config_init() argument
827 result = ksz9031_enable_edpd(phydev); in ksz9031_config_init()
835 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
844 if (phy_interface_is_rgmii(phydev)) { in ksz9031_config_init()
845 result = ksz9031_config_rgmii_delay(phydev); in ksz9031_config_init()
850 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
854 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
858 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
862 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
866 if (update && phydev->interface != PHY_INTERFACE_MODE_RGMII) in ksz9031_config_init()
867 phydev_warn(phydev, in ksz9031_config_init()
886 result = phy_read(phydev, MII_CTRL1000); in ksz9031_config_init()
892 result = phy_write(phydev, MII_CTRL1000, result); in ksz9031_config_init()
898 return ksz9031_center_flp_timing(phydev); in ksz9031_config_init()
901 phydev_err(phydev, "failed to force the phy to master mode\n"); in ksz9031_config_init()
910 static int ksz9131_of_load_skew_values(struct phy_device *phydev, in ksz9131_of_load_skew_values() argument
945 newval = phy_read_mmd(phydev, 2, reg); in ksz9131_of_load_skew_values()
959 return phy_write_mmd(phydev, 2, reg, newval); in ksz9131_of_load_skew_values()
969 static int ksz9131_config_rgmii_delay(struct phy_device *phydev) in ksz9131_config_rgmii_delay() argument
974 switch (phydev->interface) { in ksz9131_config_rgmii_delay()
995 ret = phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
1001 return phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
1006 static int ksz9131_config_init(struct phy_device *phydev) in ksz9131_config_init() argument
1022 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
1031 if (phy_interface_is_rgmii(phydev)) { in ksz9131_config_init()
1032 ret = ksz9131_config_rgmii_delay(phydev); in ksz9131_config_init()
1037 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1043 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1049 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1055 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1067 static int ksz8873mll_read_status(struct phy_device *phydev) in ksz8873mll_read_status() argument
1072 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
1074 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
1077 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
1079 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
1082 phydev->speed = SPEED_10; in ksz8873mll_read_status()
1084 phydev->speed = SPEED_100; in ksz8873mll_read_status()
1086 phydev->link = 1; in ksz8873mll_read_status()
1087 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
1092 static int ksz9031_get_features(struct phy_device *phydev) in ksz9031_get_features() argument
1096 ret = genphy_read_abilities(phydev); in ksz9031_get_features()
1109 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
1114 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
1119 static int ksz9031_read_status(struct phy_device *phydev) in ksz9031_read_status() argument
1124 err = genphy_read_status(phydev); in ksz9031_read_status()
1131 regval = phy_read(phydev, MII_STAT1000); in ksz9031_read_status()
1133 phy_init_hw(phydev); in ksz9031_read_status()
1134 phydev->link = 0; in ksz9031_read_status()
1135 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
1136 phydev->drv->config_intr(phydev); in ksz9031_read_status()
1137 return genphy_config_aneg(phydev); in ksz9031_read_status()
1143 static int ksz8873mll_config_aneg(struct phy_device *phydev) in ksz8873mll_config_aneg() argument
1148 static int ksz886x_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz886x_config_mdix() argument
1172 return phy_modify(phydev, MII_BMCR, in ksz886x_config_mdix()
1178 static int ksz886x_config_aneg(struct phy_device *phydev) in ksz886x_config_aneg() argument
1182 ret = genphy_config_aneg(phydev); in ksz886x_config_aneg()
1190 return ksz886x_config_mdix(phydev, phydev->mdix_ctrl); in ksz886x_config_aneg()
1193 static int ksz886x_mdix_update(struct phy_device *phydev) in ksz886x_mdix_update() argument
1197 ret = phy_read(phydev, MII_BMCR); in ksz886x_mdix_update()
1203 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz886x_mdix_update()
1205 phydev->mdix_ctrl = ETH_TP_MDI; in ksz886x_mdix_update()
1207 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz886x_mdix_update()
1210 ret = phy_read(phydev, MII_KSZPHY_CTRL); in ksz886x_mdix_update()
1216 phydev->mdix = ETH_TP_MDI_X; in ksz886x_mdix_update()
1218 phydev->mdix = ETH_TP_MDI; in ksz886x_mdix_update()
1223 static int ksz886x_read_status(struct phy_device *phydev) in ksz886x_read_status() argument
1227 ret = ksz886x_mdix_update(phydev); in ksz886x_read_status()
1231 return genphy_read_status(phydev); in ksz886x_read_status()
1234 static int kszphy_get_sset_count(struct phy_device *phydev) in kszphy_get_sset_count() argument
1239 static void kszphy_get_strings(struct phy_device *phydev, u8 *data) in kszphy_get_strings() argument
1249 static u64 kszphy_get_stat(struct phy_device *phydev, int i) in kszphy_get_stat() argument
1252 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
1256 val = phy_read(phydev, stat.reg); in kszphy_get_stat()
1268 static void kszphy_get_stats(struct phy_device *phydev, in kszphy_get_stats() argument
1274 data[i] = kszphy_get_stat(phydev, i); in kszphy_get_stats()
1277 static int kszphy_suspend(struct phy_device *phydev) in kszphy_suspend() argument
1280 if (phy_interrupt_is_valid(phydev)) { in kszphy_suspend()
1281 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
1282 if (phydev->drv->config_intr) in kszphy_suspend()
1283 phydev->drv->config_intr(phydev); in kszphy_suspend()
1286 return genphy_suspend(phydev); in kszphy_suspend()
1289 static int kszphy_resume(struct phy_device *phydev) in kszphy_resume() argument
1293 genphy_resume(phydev); in kszphy_resume()
1301 ret = kszphy_config_reset(phydev); in kszphy_resume()
1306 if (phy_interrupt_is_valid(phydev)) { in kszphy_resume()
1307 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
1308 if (phydev->drv->config_intr) in kszphy_resume()
1309 phydev->drv->config_intr(phydev); in kszphy_resume()
1315 static int kszphy_probe(struct phy_device *phydev) in kszphy_probe() argument
1317 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
1318 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
1323 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
1327 phydev->priv = priv; in kszphy_probe()
1338 phydev_err(phydev, "invalid led mode: 0x%02x\n", in kszphy_probe()
1346 clk = devm_clk_get(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
1361 phydev_err(phydev, "Clock rate out of range: %ld\n", in kszphy_probe()
1367 if (ksz8041_fiber_mode(phydev)) in kszphy_probe()
1368 phydev->port = PORT_FIBRE; in kszphy_probe()
1371 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()
1379 static int ksz886x_cable_test_start(struct phy_device *phydev) in ksz886x_cable_test_start() argument
1381 if (phydev->dev_flags & MICREL_KSZ8_P1_ERRATA) in ksz886x_cable_test_start()
1389 return phy_clear_bits(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100); in ksz886x_cable_test_start()
1437 static int ksz886x_cable_test_wait_for_completion(struct phy_device *phydev) in ksz886x_cable_test_wait_for_completion() argument
1441 ret = phy_read_poll_timeout(phydev, KSZ8081_LMD, val, in ksz886x_cable_test_wait_for_completion()
1448 static int ksz886x_cable_test_one_pair(struct phy_device *phydev, int pair) in ksz886x_cable_test_one_pair() argument
1464 switch (phydev->phy_id & MICREL_PHY_ID_MASK) { in ksz886x_cable_test_one_pair()
1466 ret = ksz8081_config_mdix(phydev, mdix); in ksz886x_cable_test_one_pair()
1469 ret = ksz886x_config_mdix(phydev, mdix); in ksz886x_cable_test_one_pair()
1481 ret = phy_write(phydev, KSZ8081_LMD, KSZ8081_LMD_ENABLE_TEST); in ksz886x_cable_test_one_pair()
1485 ret = ksz886x_cable_test_wait_for_completion(phydev); in ksz886x_cable_test_one_pair()
1489 val = phy_read(phydev, KSZ8081_LMD); in ksz886x_cable_test_one_pair()
1496 ret = ethnl_cable_test_result(phydev, ethtool_pair[pair], in ksz886x_cable_test_one_pair()
1504 return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], in ksz886x_cable_test_one_pair()
1508 static int ksz886x_cable_test_get_status(struct phy_device *phydev, in ksz886x_cable_test_get_status() argument
1520 ret = ksz886x_cable_test_one_pair(phydev, pair); in ksz886x_cable_test_get_status()