Lines Matching full:phydev

289 	struct phy_device *phydev;  member
311 struct phy_device *phydev; member
403 static int kszphy_extended_write(struct phy_device *phydev, in kszphy_extended_write() argument
406 phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum); in kszphy_extended_write()
407 return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val); in kszphy_extended_write()
410 static int kszphy_extended_read(struct phy_device *phydev, in kszphy_extended_read() argument
413 phy_write(phydev, MII_KSZPHY_EXTREG, regnum); in kszphy_extended_read()
414 return phy_read(phydev, MII_KSZPHY_EXTREG_READ); in kszphy_extended_read()
417 static int kszphy_ack_interrupt(struct phy_device *phydev) in kszphy_ack_interrupt() argument
422 rc = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_ack_interrupt()
427 static int kszphy_config_intr(struct phy_device *phydev) in kszphy_config_intr() argument
429 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
439 temp = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_config_intr()
443 phy_write(phydev, MII_KSZPHY_CTRL, temp); in kszphy_config_intr()
446 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in kszphy_config_intr()
447 err = kszphy_ack_interrupt(phydev); in kszphy_config_intr()
451 err = phy_write(phydev, MII_KSZPHY_INTCS, KSZPHY_INTCS_ALL); in kszphy_config_intr()
453 err = phy_write(phydev, MII_KSZPHY_INTCS, 0); in kszphy_config_intr()
457 err = kszphy_ack_interrupt(phydev); in kszphy_config_intr()
463 static irqreturn_t kszphy_handle_interrupt(struct phy_device *phydev) in kszphy_handle_interrupt() argument
467 irq_status = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_handle_interrupt()
469 phy_error(phydev); in kszphy_handle_interrupt()
476 phy_trigger_machine(phydev); in kszphy_handle_interrupt()
481 static int kszphy_rmii_clk_sel(struct phy_device *phydev, bool val) in kszphy_rmii_clk_sel() argument
485 ctrl = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_rmii_clk_sel()
494 return phy_write(phydev, MII_KSZPHY_CTRL, ctrl); in kszphy_rmii_clk_sel()
497 static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val) in kszphy_setup_led() argument
512 temp = phy_read(phydev, reg); in kszphy_setup_led()
520 rc = phy_write(phydev, reg, temp); in kszphy_setup_led()
523 phydev_err(phydev, "failed to set led mode\n"); in kszphy_setup_led()
531 static int kszphy_broadcast_disable(struct phy_device *phydev) in kszphy_broadcast_disable() argument
535 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_broadcast_disable()
539 ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF); in kszphy_broadcast_disable()
542 phydev_err(phydev, "failed to disable broadcast address\n"); in kszphy_broadcast_disable()
547 static int kszphy_nand_tree_disable(struct phy_device *phydev) in kszphy_nand_tree_disable() argument
551 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_nand_tree_disable()
558 ret = phy_write(phydev, MII_KSZPHY_OMSO, in kszphy_nand_tree_disable()
562 phydev_err(phydev, "failed to disable NAND tree mode\n"); in kszphy_nand_tree_disable()
568 static int kszphy_config_reset(struct phy_device *phydev) in kszphy_config_reset() argument
570 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
574 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
576 phydev_err(phydev, in kszphy_config_reset()
583 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
588 static int kszphy_config_init(struct phy_device *phydev) in kszphy_config_init() argument
590 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
599 kszphy_broadcast_disable(phydev); in kszphy_config_init()
602 kszphy_nand_tree_disable(phydev); in kszphy_config_init()
604 return kszphy_config_reset(phydev); in kszphy_config_init()
607 static int ksz8041_fiber_mode(struct phy_device *phydev) in ksz8041_fiber_mode() argument
609 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_fiber_mode()
614 static int ksz8041_config_init(struct phy_device *phydev) in ksz8041_config_init() argument
619 if (ksz8041_fiber_mode(phydev)) { in ksz8041_config_init()
620 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
624 linkmode_and(phydev->supported, phydev->supported, mask); in ksz8041_config_init()
626 phydev->supported); in ksz8041_config_init()
627 linkmode_and(phydev->advertising, phydev->advertising, mask); in ksz8041_config_init()
629 phydev->advertising); in ksz8041_config_init()
630 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
633 return kszphy_config_init(phydev); in ksz8041_config_init()
636 static int ksz8041_config_aneg(struct phy_device *phydev) in ksz8041_config_aneg() argument
639 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
640 phydev->speed = SPEED_100; in ksz8041_config_aneg()
644 return genphy_config_aneg(phydev); in ksz8041_config_aneg()
647 static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, in ksz8051_ksz8795_match_phy_device() argument
652 if (!phy_id_compare(phydev->phy_id, PHY_ID_KSZ8051, MICREL_PHY_ID_MASK)) in ksz8051_ksz8795_match_phy_device()
655 ret = phy_read(phydev, MII_BMSR); in ksz8051_ksz8795_match_phy_device()
671 static int ksz8051_match_phy_device(struct phy_device *phydev) in ksz8051_match_phy_device() argument
673 return ksz8051_ksz8795_match_phy_device(phydev, true); in ksz8051_match_phy_device()
676 static int ksz8081_config_init(struct phy_device *phydev) in ksz8081_config_init() argument
683 phy_clear_bits(phydev, MII_KSZPHY_OMSO, KSZPHY_OMSO_FACTORY_TEST); in ksz8081_config_init()
685 return kszphy_config_init(phydev); in ksz8081_config_init()
688 static int ksz8081_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz8081_config_mdix() argument
707 return phy_modify(phydev, MII_KSZPHY_CTRL_2, in ksz8081_config_mdix()
714 static int ksz8081_config_aneg(struct phy_device *phydev) in ksz8081_config_aneg() argument
718 ret = genphy_config_aneg(phydev); in ksz8081_config_aneg()
726 return ksz8081_config_mdix(phydev, phydev->mdix_ctrl); in ksz8081_config_aneg()
729 static int ksz8081_mdix_update(struct phy_device *phydev) in ksz8081_mdix_update() argument
733 ret = phy_read(phydev, MII_KSZPHY_CTRL_2); in ksz8081_mdix_update()
739 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz8081_mdix_update()
741 phydev->mdix_ctrl = ETH_TP_MDI; in ksz8081_mdix_update()
743 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz8081_mdix_update()
746 ret = phy_read(phydev, MII_KSZPHY_CTRL_1); in ksz8081_mdix_update()
751 phydev->mdix = ETH_TP_MDI; in ksz8081_mdix_update()
753 phydev->mdix = ETH_TP_MDI_X; in ksz8081_mdix_update()
758 static int ksz8081_read_status(struct phy_device *phydev) in ksz8081_read_status() argument
762 ret = ksz8081_mdix_update(phydev); in ksz8081_read_status()
766 return genphy_read_status(phydev); in ksz8081_read_status()
769 static int ksz8061_config_init(struct phy_device *phydev) in ksz8061_config_init() argument
773 ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); in ksz8061_config_init()
777 return kszphy_config_init(phydev); in ksz8061_config_init()
780 static int ksz8795_match_phy_device(struct phy_device *phydev) in ksz8795_match_phy_device() argument
782 return ksz8051_ksz8795_match_phy_device(phydev, false); in ksz8795_match_phy_device()
785 static int ksz9021_load_values_from_of(struct phy_device *phydev, in ksz9021_load_values_from_of() argument
814 newval = kszphy_extended_read(phydev, reg); in ksz9021_load_values_from_of()
830 return kszphy_extended_write(phydev, reg, newval); in ksz9021_load_values_from_of()
833 static int ksz9021_config_init(struct phy_device *phydev) in ksz9021_config_init() argument
842 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
850 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
854 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
858 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
924 static int ksz9031_of_load_skew_values(struct phy_device *phydev, in ksz9031_of_load_skew_values() argument
947 newval = phy_read_mmd(phydev, 2, reg); in ksz9031_of_load_skew_values()
961 return phy_write_mmd(phydev, 2, reg, newval); in ksz9031_of_load_skew_values()
965 static int ksz9031_center_flp_timing(struct phy_device *phydev) in ksz9031_center_flp_timing() argument
969 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_HI, in ksz9031_center_flp_timing()
974 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_LO, in ksz9031_center_flp_timing()
979 return genphy_restart_aneg(phydev); in ksz9031_center_flp_timing()
983 static int ksz9031_enable_edpd(struct phy_device *phydev) in ksz9031_enable_edpd() argument
987 reg = phy_read_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD); in ksz9031_enable_edpd()
990 return phy_write_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD, in ksz9031_enable_edpd()
994 static int ksz9031_config_rgmii_delay(struct phy_device *phydev) in ksz9031_config_rgmii_delay() argument
999 switch (phydev->interface) { in ksz9031_config_rgmii_delay()
1028 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_CONTROL_PAD_SKEW, in ksz9031_config_rgmii_delay()
1034 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_RX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
1042 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_TX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
1050 return phy_write_mmd(phydev, 2, MII_KSZ9031RN_CLK_PAD_SKEW, in ksz9031_config_rgmii_delay()
1055 static int ksz9031_config_init(struct phy_device *phydev) in ksz9031_config_init() argument
1071 result = ksz9031_enable_edpd(phydev); in ksz9031_config_init()
1079 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
1088 if (phy_interface_is_rgmii(phydev)) { in ksz9031_config_init()
1089 result = ksz9031_config_rgmii_delay(phydev); in ksz9031_config_init()
1094 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1098 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1102 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1106 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1110 if (update && !phy_interface_is_rgmii(phydev)) in ksz9031_config_init()
1111 phydev_warn(phydev, in ksz9031_config_init()
1130 result = phy_read(phydev, MII_CTRL1000); in ksz9031_config_init()
1136 result = phy_write(phydev, MII_CTRL1000, result); in ksz9031_config_init()
1142 return ksz9031_center_flp_timing(phydev); in ksz9031_config_init()
1145 phydev_err(phydev, "failed to force the phy to master mode\n"); in ksz9031_config_init()
1154 static int ksz9131_of_load_skew_values(struct phy_device *phydev, in ksz9131_of_load_skew_values() argument
1189 newval = phy_read_mmd(phydev, 2, reg); in ksz9131_of_load_skew_values()
1203 return phy_write_mmd(phydev, 2, reg, newval); in ksz9131_of_load_skew_values()
1211 static int ksz9131_config_rgmii_delay(struct phy_device *phydev) in ksz9131_config_rgmii_delay() argument
1213 const struct kszphy_type *type = phydev->drv->driver_data; in ksz9131_config_rgmii_delay()
1217 switch (phydev->interface) { in ksz9131_config_rgmii_delay()
1238 ret = phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
1244 return phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
1255 static int ksz9131_led_errata(struct phy_device *phydev) in ksz9131_led_errata() argument
1259 reg = phy_read_mmd(phydev, 2, 0); in ksz9131_led_errata()
1266 return phy_set_bits(phydev, 0x1e, BIT(9)); in ksz9131_led_errata()
1269 static int ksz9131_config_init(struct phy_device *phydev) in ksz9131_config_init() argument
1285 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
1294 if (phy_interface_is_rgmii(phydev)) { in ksz9131_config_init()
1295 ret = ksz9131_config_rgmii_delay(phydev); in ksz9131_config_init()
1300 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1306 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1312 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1318 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1324 ret = ksz9131_led_errata(phydev); in ksz9131_config_init()
1335 static int ksz9131_mdix_update(struct phy_device *phydev) in ksz9131_mdix_update() argument
1339 ret = phy_read(phydev, MII_KSZ9131_AUTO_MDIX); in ksz9131_mdix_update()
1345 phydev->mdix_ctrl = ETH_TP_MDI; in ksz9131_mdix_update()
1347 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz9131_mdix_update()
1349 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz9131_mdix_update()
1353 phydev->mdix = ETH_TP_MDI; in ksz9131_mdix_update()
1355 phydev->mdix = ETH_TP_MDI_X; in ksz9131_mdix_update()
1360 static int ksz9131_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz9131_config_mdix() argument
1379 return phy_modify(phydev, MII_KSZ9131_AUTO_MDIX, in ksz9131_config_mdix()
1384 static int ksz9131_read_status(struct phy_device *phydev) in ksz9131_read_status() argument
1388 ret = ksz9131_mdix_update(phydev); in ksz9131_read_status()
1392 return genphy_read_status(phydev); in ksz9131_read_status()
1395 static int ksz9131_config_aneg(struct phy_device *phydev) in ksz9131_config_aneg() argument
1399 ret = ksz9131_config_mdix(phydev, phydev->mdix_ctrl); in ksz9131_config_aneg()
1403 return genphy_config_aneg(phydev); in ksz9131_config_aneg()
1406 static int ksz9477_get_features(struct phy_device *phydev) in ksz9477_get_features() argument
1410 ret = genphy_read_abilities(phydev); in ksz9477_get_features()
1420 linkmode_and(phydev->supported_eee, phydev->supported, in ksz9477_get_features()
1429 static int ksz8873mll_read_status(struct phy_device *phydev) in ksz8873mll_read_status() argument
1434 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
1436 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
1439 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
1441 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
1444 phydev->speed = SPEED_10; in ksz8873mll_read_status()
1446 phydev->speed = SPEED_100; in ksz8873mll_read_status()
1448 phydev->link = 1; in ksz8873mll_read_status()
1449 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
1454 static int ksz9031_get_features(struct phy_device *phydev) in ksz9031_get_features() argument
1458 ret = genphy_read_abilities(phydev); in ksz9031_get_features()
1471 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
1476 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
1481 static int ksz9031_read_status(struct phy_device *phydev) in ksz9031_read_status() argument
1486 err = genphy_read_status(phydev); in ksz9031_read_status()
1493 regval = phy_read(phydev, MII_STAT1000); in ksz9031_read_status()
1495 phy_init_hw(phydev); in ksz9031_read_status()
1496 phydev->link = 0; in ksz9031_read_status()
1497 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
1498 phydev->drv->config_intr(phydev); in ksz9031_read_status()
1499 return genphy_config_aneg(phydev); in ksz9031_read_status()
1505 static int ksz9x31_cable_test_start(struct phy_device *phydev) in ksz9x31_cable_test_start() argument
1507 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_start()
1515 ret = phy_modify(phydev, MII_BMCR, in ksz9x31_cable_test_start()
1527 ret = phy_read(phydev, MII_CTRL1000); in ksz9x31_cable_test_start()
1536 return phy_write(phydev, MII_CTRL1000, ret); in ksz9x31_cable_test_start()
1573 static int ksz9x31_cable_test_fault_length(struct phy_device *phydev, u16 stat) in ksz9x31_cable_test_fault_length() argument
1581 if (phydev_id_compare(phydev, PHY_ID_KSZ9131)) in ksz9x31_cable_test_fault_length()
1587 static int ksz9x31_cable_test_wait_for_completion(struct phy_device *phydev) in ksz9x31_cable_test_wait_for_completion() argument
1591 ret = phy_read_poll_timeout(phydev, KSZ9x31_LMD, val, in ksz9x31_cable_test_wait_for_completion()
1610 static int ksz9x31_cable_test_one_pair(struct phy_device *phydev, int pair) in ksz9x31_cable_test_one_pair() argument
1621 ret = phy_write(phydev, KSZ9x31_LMD, in ksz9x31_cable_test_one_pair()
1626 ret = ksz9x31_cable_test_wait_for_completion(phydev); in ksz9x31_cable_test_one_pair()
1630 val = phy_read(phydev, KSZ9x31_LMD); in ksz9x31_cable_test_one_pair()
1637 ret = ethnl_cable_test_result(phydev, in ksz9x31_cable_test_one_pair()
1646 return ethnl_cable_test_fault_length(phydev, in ksz9x31_cable_test_one_pair()
1648 ksz9x31_cable_test_fault_length(phydev, val)); in ksz9x31_cable_test_one_pair()
1651 static int ksz9x31_cable_test_get_status(struct phy_device *phydev, in ksz9x31_cable_test_get_status() argument
1654 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_get_status()
1664 ret = ksz9x31_cable_test_one_pair(phydev, pair); in ksz9x31_cable_test_get_status()
1681 ret = ethnl_cable_test_result(phydev, in ksz9x31_cable_test_get_status()
1689 rv = phy_modify(phydev, MII_CTRL1000, in ksz9x31_cable_test_get_status()
1698 static int ksz8873mll_config_aneg(struct phy_device *phydev) in ksz8873mll_config_aneg() argument
1703 static int ksz886x_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz886x_config_mdix() argument
1727 return phy_modify(phydev, MII_BMCR, in ksz886x_config_mdix()
1733 static int ksz886x_config_aneg(struct phy_device *phydev) in ksz886x_config_aneg() argument
1737 ret = genphy_config_aneg(phydev); in ksz886x_config_aneg()
1741 if (phydev->autoneg != AUTONEG_ENABLE) { in ksz886x_config_aneg()
1748 ret = phy_set_bits(phydev, MII_KSZPHY_CTRL, in ksz886x_config_aneg()
1757 ret = phy_clear_bits(phydev, MII_KSZPHY_CTRL, in ksz886x_config_aneg()
1767 return ksz886x_config_mdix(phydev, phydev->mdix_ctrl); in ksz886x_config_aneg()
1770 static int ksz886x_mdix_update(struct phy_device *phydev) in ksz886x_mdix_update() argument
1774 ret = phy_read(phydev, MII_BMCR); in ksz886x_mdix_update()
1780 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz886x_mdix_update()
1782 phydev->mdix_ctrl = ETH_TP_MDI; in ksz886x_mdix_update()
1784 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz886x_mdix_update()
1787 ret = phy_read(phydev, MII_KSZPHY_CTRL); in ksz886x_mdix_update()
1793 phydev->mdix = ETH_TP_MDI_X; in ksz886x_mdix_update()
1795 phydev->mdix = ETH_TP_MDI; in ksz886x_mdix_update()
1800 static int ksz886x_read_status(struct phy_device *phydev) in ksz886x_read_status() argument
1804 ret = ksz886x_mdix_update(phydev); in ksz886x_read_status()
1808 return genphy_read_status(phydev); in ksz886x_read_status()
1846 static int ksz9477_config_init(struct phy_device *phydev) in ksz9477_config_init() argument
1862 err = phy_write(phydev, MII_BMCR, BMCR_SPEED100 | BMCR_FULLDPLX); in ksz9477_config_init()
1869 err = phy_write_mmd(phydev, errata->dev_addr, errata->reg_addr, errata->val); in ksz9477_config_init()
1877 if (phydev->dev_flags & MICREL_NO_EEE) in ksz9477_config_init()
1878 phydev->eee_broken_modes = -1; in ksz9477_config_init()
1880 err = genphy_restart_aneg(phydev); in ksz9477_config_init()
1884 return kszphy_config_init(phydev); in ksz9477_config_init()
1887 static int kszphy_get_sset_count(struct phy_device *phydev) in kszphy_get_sset_count() argument
1892 static void kszphy_get_strings(struct phy_device *phydev, u8 *data) in kszphy_get_strings() argument
1902 static u64 kszphy_get_stat(struct phy_device *phydev, int i) in kszphy_get_stat() argument
1905 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
1909 val = phy_read(phydev, stat.reg); in kszphy_get_stat()
1921 static void kszphy_get_stats(struct phy_device *phydev, in kszphy_get_stats() argument
1927 data[i] = kszphy_get_stat(phydev, i); in kszphy_get_stats()
1930 static int kszphy_suspend(struct phy_device *phydev) in kszphy_suspend() argument
1933 if (phy_interrupt_is_valid(phydev)) { in kszphy_suspend()
1934 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
1935 if (phydev->drv->config_intr) in kszphy_suspend()
1936 phydev->drv->config_intr(phydev); in kszphy_suspend()
1939 return genphy_suspend(phydev); in kszphy_suspend()
1942 static void kszphy_parse_led_mode(struct phy_device *phydev) in kszphy_parse_led_mode() argument
1944 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_parse_led_mode()
1945 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_parse_led_mode()
1946 struct kszphy_priv *priv = phydev->priv; in kszphy_parse_led_mode()
1957 phydev_err(phydev, "invalid led mode: 0x%02x\n", in kszphy_parse_led_mode()
1966 static int kszphy_resume(struct phy_device *phydev) in kszphy_resume() argument
1970 genphy_resume(phydev); in kszphy_resume()
1978 ret = kszphy_config_reset(phydev); in kszphy_resume()
1983 if (phy_interrupt_is_valid(phydev)) { in kszphy_resume()
1984 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
1985 if (phydev->drv->config_intr) in kszphy_resume()
1986 phydev->drv->config_intr(phydev); in kszphy_resume()
1992 static int kszphy_probe(struct phy_device *phydev) in kszphy_probe() argument
1994 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
1995 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
1999 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
2003 phydev->priv = priv; in kszphy_probe()
2007 kszphy_parse_led_mode(phydev); in kszphy_probe()
2009 clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
2025 phydev_err(phydev, "Clock rate out of range: %ld\n", in kszphy_probe()
2031 clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, NULL); in kszphy_probe()
2036 if (ksz8041_fiber_mode(phydev)) in kszphy_probe()
2037 phydev->port = PORT_FIBRE; in kszphy_probe()
2040 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()
2048 static int lan8814_cable_test_start(struct phy_device *phydev) in lan8814_cable_test_start() argument
2055 return phy_modify(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100, in lan8814_cable_test_start()
2059 static int ksz886x_cable_test_start(struct phy_device *phydev) in ksz886x_cable_test_start() argument
2061 if (phydev->dev_flags & MICREL_KSZ8_P1_ERRATA) in ksz886x_cable_test_start()
2069 return phy_clear_bits(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100); in ksz886x_cable_test_start()
2105 static __always_inline int ksz886x_cable_test_fault_length(struct phy_device *phydev, in ksz886x_cable_test_fault_length() argument
2116 if (phydev_id_compare(phydev, PHY_ID_LAN8814)) in ksz886x_cable_test_fault_length()
2122 static int ksz886x_cable_test_wait_for_completion(struct phy_device *phydev) in ksz886x_cable_test_wait_for_completion() argument
2124 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_wait_for_completion()
2127 ret = phy_read_poll_timeout(phydev, type->cable_diag_reg, val, in ksz886x_cable_test_wait_for_completion()
2134 static int lan8814_cable_test_one_pair(struct phy_device *phydev, int pair) in lan8814_cable_test_one_pair() argument
2148 ret = phy_write(phydev, LAN8814_CABLE_DIAG, val); in lan8814_cable_test_one_pair()
2152 ret = ksz886x_cable_test_wait_for_completion(phydev); in lan8814_cable_test_one_pair()
2156 val = phy_read(phydev, LAN8814_CABLE_DIAG); in lan8814_cable_test_one_pair()
2163 ret = ethnl_cable_test_result(phydev, ethtool_pair[pair], in lan8814_cable_test_one_pair()
2173 fault_length = ksz886x_cable_test_fault_length(phydev, val, in lan8814_cable_test_one_pair()
2176 return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], fault_length); in lan8814_cable_test_one_pair()
2179 static int ksz886x_cable_test_one_pair(struct phy_device *phydev, int pair) in ksz886x_cable_test_one_pair() argument
2196 switch (phydev->phy_id & MICREL_PHY_ID_MASK) { in ksz886x_cable_test_one_pair()
2198 ret = ksz8081_config_mdix(phydev, mdix); in ksz886x_cable_test_one_pair()
2201 ret = ksz886x_config_mdix(phydev, mdix); in ksz886x_cable_test_one_pair()
2213 ret = phy_write(phydev, KSZ8081_LMD, KSZ8081_LMD_ENABLE_TEST); in ksz886x_cable_test_one_pair()
2217 ret = ksz886x_cable_test_wait_for_completion(phydev); in ksz886x_cable_test_one_pair()
2221 val = phy_read(phydev, KSZ8081_LMD); in ksz886x_cable_test_one_pair()
2228 ret = ethnl_cable_test_result(phydev, ethtool_pair[pair], in ksz886x_cable_test_one_pair()
2236 fault_length = ksz886x_cable_test_fault_length(phydev, val, KSZ8081_LMD_DELTA_TIME_MASK); in ksz886x_cable_test_one_pair()
2238 return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], fault_length); in ksz886x_cable_test_one_pair()
2241 static int ksz886x_cable_test_get_status(struct phy_device *phydev, in ksz886x_cable_test_get_status() argument
2244 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_get_status()
2256 ret = lan8814_cable_test_one_pair(phydev, pair); in ksz886x_cable_test_get_status()
2258 ret = ksz886x_cable_test_one_pair(phydev, pair); in ksz886x_cable_test_get_status()
2296 static int lanphy_read_page_reg(struct phy_device *phydev, int page, u32 addr) in lanphy_read_page_reg() argument
2300 phy_lock_mdio_bus(phydev); in lanphy_read_page_reg()
2301 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page); in lanphy_read_page_reg()
2302 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr); in lanphy_read_page_reg()
2303 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, in lanphy_read_page_reg()
2305 data = __phy_read(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA); in lanphy_read_page_reg()
2306 phy_unlock_mdio_bus(phydev); in lanphy_read_page_reg()
2311 static int lanphy_write_page_reg(struct phy_device *phydev, int page, u16 addr, in lanphy_write_page_reg() argument
2314 phy_lock_mdio_bus(phydev); in lanphy_write_page_reg()
2315 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page); in lanphy_write_page_reg()
2316 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr); in lanphy_write_page_reg()
2317 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, in lanphy_write_page_reg()
2320 val = __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, val); in lanphy_write_page_reg()
2322 phydev_err(phydev, "Error: phy_write has returned error %d\n", in lanphy_write_page_reg()
2324 phy_unlock_mdio_bus(phydev); in lanphy_write_page_reg()
2328 static int lan8814_config_ts_intr(struct phy_device *phydev, bool enable) in lan8814_config_ts_intr() argument
2338 return lanphy_write_page_reg(phydev, 5, PTP_TSU_INT_EN, val); in lan8814_config_ts_intr()
2341 static void lan8814_ptp_rx_ts_get(struct phy_device *phydev, in lan8814_ptp_rx_ts_get() argument
2344 *seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_HI); in lan8814_ptp_rx_ts_get()
2346 lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_LO); in lan8814_ptp_rx_ts_get()
2348 *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_HI); in lan8814_ptp_rx_ts_get()
2350 lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_LO); in lan8814_ptp_rx_ts_get()
2352 *seq_id = lanphy_read_page_reg(phydev, 5, PTP_RX_MSG_HEADER2); in lan8814_ptp_rx_ts_get()
2355 static void lan8814_ptp_tx_ts_get(struct phy_device *phydev, in lan8814_ptp_tx_ts_get() argument
2358 *seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_HI); in lan8814_ptp_tx_ts_get()
2360 lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_LO); in lan8814_ptp_tx_ts_get()
2362 *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_HI); in lan8814_ptp_tx_ts_get()
2364 lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_LO); in lan8814_ptp_tx_ts_get()
2366 *seq_id = lanphy_read_page_reg(phydev, 5, PTP_TX_MSG_HEADER2); in lan8814_ptp_tx_ts_get()
2372 struct phy_device *phydev = ptp_priv->phydev; in lan8814_ts_info() local
2373 struct lan8814_shared_priv *shared = phydev->shared->priv; in lan8814_ts_info()
2396 static void lan8814_flush_fifo(struct phy_device *phydev, bool egress) in lan8814_flush_fifo() argument
2401 lanphy_read_page_reg(phydev, 5, in lan8814_flush_fifo()
2405 lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS); in lan8814_flush_fifo()
2414 struct phy_device *phydev = ptp_priv->phydev; in lan8814_hwtstamp() local
2415 struct lan8814_shared_priv *shared = phydev->shared->priv; in lan8814_hwtstamp()
2457 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_PARSE_CONFIG, rxcfg); in lan8814_hwtstamp()
2458 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_PARSE_CONFIG, txcfg); in lan8814_hwtstamp()
2462 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_TIMESTAMP_EN, pkt_ts_enable); in lan8814_hwtstamp()
2463 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_TIMESTAMP_EN, pkt_ts_enable); in lan8814_hwtstamp()
2466 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD, in lan8814_hwtstamp()
2470 lan8814_config_ts_intr(ptp_priv->phydev, true); in lan8814_hwtstamp()
2472 lan8814_config_ts_intr(ptp_priv->phydev, false); in lan8814_hwtstamp()
2481 lanphy_write_page_reg(ptp_priv->phydev, 4, PTP_CMD_CTL, in lan8814_hwtstamp()
2484 lanphy_write_page_reg(ptp_priv->phydev, 4, PTP_CMD_CTL, in lan8814_hwtstamp()
2496 lan8814_flush_fifo(ptp_priv->phydev, false); in lan8814_hwtstamp()
2497 lan8814_flush_fifo(ptp_priv->phydev, true); in lan8814_hwtstamp()
2594 static void lan8814_ptp_clock_set(struct phy_device *phydev, in lan8814_ptp_clock_set() argument
2604 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_LO, sec_low); in lan8814_ptp_clock_set()
2605 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_MID, sec_high); in lan8814_ptp_clock_set()
2606 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_LO, nsec_low); in lan8814_ptp_clock_set()
2607 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_HI, nsec_high); in lan8814_ptp_clock_set()
2609 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_LOAD_); in lan8814_ptp_clock_set()
2612 static void lan8814_ptp_clock_get(struct phy_device *phydev, in lan8814_ptp_clock_get() argument
2615 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_READ_); in lan8814_ptp_clock_get()
2617 *seconds = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_MID); in lan8814_ptp_clock_get()
2619 lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_LO); in lan8814_ptp_clock_get()
2621 *nano_seconds = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_HI); in lan8814_ptp_clock_get()
2623 lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_LO); in lan8814_ptp_clock_get()
2631 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_gettime64() local
2636 lan8814_ptp_clock_get(phydev, &seconds, &nano_seconds); in lan8814_ptpci_gettime64()
2649 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_settime64() local
2652 lan8814_ptp_clock_set(phydev, ts->tv_sec, ts->tv_nsec); in lan8814_ptpci_settime64()
2658 static void lan8814_ptp_clock_step(struct phy_device *phydev, in lan8814_ptp_clock_step() argument
2670 lan8814_ptp_clock_get(phydev, &unsigned_seconds, &nano_seconds); in lan8814_ptp_clock_step()
2678 lan8814_ptp_clock_set(phydev, unsigned_seconds, nano_seconds); in lan8814_ptp_clock_step()
2684 lan8814_ptp_clock_get(phydev, &unsigned_seconds, &nano_seconds); in lan8814_ptp_clock_step()
2693 lan8814_ptp_clock_set(phydev, unsigned_seconds, in lan8814_ptp_clock_step()
2741 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
2743 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
2757 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
2759 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
2763 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, in lan8814_ptp_clock_step()
2773 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
2775 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
2778 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, in lan8814_ptp_clock_step()
2787 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjtime() local
2790 lan8814_ptp_clock_step(phydev, delta); in lan8814_ptpci_adjtime()
2800 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjfine() local
2820 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_HI, kszphy_rate_adj_hi); in lan8814_ptpci_adjfine()
2821 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_LO, kszphy_rate_adj_lo); in lan8814_ptpci_adjfine()
2869 struct phy_device *phydev = ptp_priv->phydev; in lan8814_dequeue_tx_skb() local
2873 lan8814_ptp_tx_ts_get(phydev, &seconds, &nsec, &seq_id); in lan8814_dequeue_tx_skb()
2879 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_tx_ts() local
2888 reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO); in lan8814_get_tx_ts()
2944 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_rx_ts() local
2953 lan8814_ptp_rx_ts_get(phydev, &rx_ts->seconds, &rx_ts->nsec, in lan8814_get_rx_ts()
2960 reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO); in lan8814_get_rx_ts()
2964 static void lan8814_handle_ptp_interrupt(struct phy_device *phydev, u16 status) in lan8814_handle_ptp_interrupt() argument
2966 struct kszphy_priv *priv = phydev->priv; in lan8814_handle_ptp_interrupt()
2976 lan8814_flush_fifo(phydev, true); in lan8814_handle_ptp_interrupt()
2981 lan8814_flush_fifo(phydev, false); in lan8814_handle_ptp_interrupt()
2986 static int lan8804_config_init(struct phy_device *phydev) in lan8804_config_init() argument
2991 val = lanphy_read_page_reg(phydev, 2, LAN8804_ALIGN_SWAP); in lan8804_config_init()
2994 lanphy_write_page_reg(phydev, 2, LAN8804_ALIGN_SWAP, val); in lan8804_config_init()
2999 lanphy_write_page_reg(phydev, 31, LAN8814_CLOCK_MANAGEMENT, 0x27e); in lan8804_config_init()
3000 lanphy_read_page_reg(phydev, 1, LAN8814_LINK_QUALITY); in lan8804_config_init()
3005 static irqreturn_t lan8804_handle_interrupt(struct phy_device *phydev) in lan8804_handle_interrupt() argument
3009 status = phy_read(phydev, LAN8814_INTS); in lan8804_handle_interrupt()
3011 phy_error(phydev); in lan8804_handle_interrupt()
3016 phy_trigger_machine(phydev); in lan8804_handle_interrupt()
3026 static int lan8804_config_intr(struct phy_device *phydev) in lan8804_config_intr() argument
3035 phy_write(phydev, LAN8804_CONTROL, LAN8804_CONTROL_INTR_POLARITY); in lan8804_config_intr()
3041 phy_write(phydev, LAN8804_OUTPUT_CONTROL, in lan8804_config_intr()
3044 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8804_config_intr()
3045 err = phy_read(phydev, LAN8814_INTS); in lan8804_config_intr()
3049 err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK); in lan8804_config_intr()
3053 err = phy_write(phydev, LAN8814_INTC, 0); in lan8804_config_intr()
3057 err = phy_read(phydev, LAN8814_INTS); in lan8804_config_intr()
3065 static irqreturn_t lan8814_handle_interrupt(struct phy_device *phydev) in lan8814_handle_interrupt() argument
3070 irq_status = phy_read(phydev, LAN8814_INTS); in lan8814_handle_interrupt()
3072 phy_error(phydev); in lan8814_handle_interrupt()
3077 phy_trigger_machine(phydev); in lan8814_handle_interrupt()
3082 irq_status = lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS); in lan8814_handle_interrupt()
3086 lan8814_handle_ptp_interrupt(phydev, irq_status); in lan8814_handle_interrupt()
3093 static int lan8814_ack_interrupt(struct phy_device *phydev) in lan8814_ack_interrupt() argument
3098 rc = phy_read(phydev, LAN8814_INTS); in lan8814_ack_interrupt()
3103 static int lan8814_config_intr(struct phy_device *phydev) in lan8814_config_intr() argument
3107 lanphy_write_page_reg(phydev, 4, LAN8814_INTR_CTRL_REG, in lan8814_config_intr()
3112 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8814_config_intr()
3113 err = lan8814_ack_interrupt(phydev); in lan8814_config_intr()
3117 err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK); in lan8814_config_intr()
3119 err = phy_write(phydev, LAN8814_INTC, 0); in lan8814_config_intr()
3123 err = lan8814_ack_interrupt(phydev); in lan8814_config_intr()
3129 static void lan8814_ptp_init(struct phy_device *phydev) in lan8814_ptp_init() argument
3131 struct kszphy_priv *priv = phydev->priv; in lan8814_ptp_init()
3139 lanphy_write_page_reg(phydev, 5, TSU_HARD_RESET, TSU_HARD_RESET_); in lan8814_ptp_init()
3141 temp = lanphy_read_page_reg(phydev, 5, PTP_TX_MOD); in lan8814_ptp_init()
3143 lanphy_write_page_reg(phydev, 5, PTP_TX_MOD, temp); in lan8814_ptp_init()
3145 temp = lanphy_read_page_reg(phydev, 5, PTP_RX_MOD); in lan8814_ptp_init()
3147 lanphy_write_page_reg(phydev, 5, PTP_RX_MOD, temp); in lan8814_ptp_init()
3149 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_CONFIG, 0); in lan8814_ptp_init()
3150 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_CONFIG, 0); in lan8814_ptp_init()
3153 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_L2_ADDR_EN, 0); in lan8814_ptp_init()
3154 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_L2_ADDR_EN, 0); in lan8814_ptp_init()
3155 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_IP_ADDR_EN, 0); in lan8814_ptp_init()
3156 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_IP_ADDR_EN, 0); in lan8814_ptp_init()
3159 lanphy_write_page_reg(phydev, 5, PTP_RX_VERSION, in lan8814_ptp_init()
3161 lanphy_write_page_reg(phydev, 5, PTP_TX_VERSION, in lan8814_ptp_init()
3169 ptp_priv->phydev = phydev; in lan8814_ptp_init()
3176 phydev->mii_ts = &ptp_priv->mii_ts; in lan8814_ptp_init()
3179 static int lan8814_ptp_probe_once(struct phy_device *phydev) in lan8814_ptp_probe_once() argument
3181 struct lan8814_shared_priv *shared = phydev->shared->priv; in lan8814_ptp_probe_once()
3187 snprintf(shared->ptp_clock_info.name, 30, "%s", phydev->drv->name); in lan8814_ptp_probe_once()
3201 &phydev->mdio.dev); in lan8814_ptp_probe_once()
3203 phydev_err(phydev, "ptp_clock_register failed %lu\n", in lan8814_ptp_probe_once()
3212 phydev_dbg(phydev, "successfully registered ptp clock\n"); in lan8814_ptp_probe_once()
3214 shared->phydev = phydev; in lan8814_ptp_probe_once()
3219 lanphy_write_page_reg(phydev, 4, LTC_HARD_RESET, LTC_HARD_RESET_); in lan8814_ptp_probe_once()
3220 lanphy_write_page_reg(phydev, 4, PTP_OPERATING_MODE, in lan8814_ptp_probe_once()
3226 static void lan8814_setup_led(struct phy_device *phydev, int val) in lan8814_setup_led() argument
3230 temp = lanphy_read_page_reg(phydev, 5, LAN8814_LED_CTRL_1); in lan8814_setup_led()
3237 lanphy_write_page_reg(phydev, 5, LAN8814_LED_CTRL_1, temp); in lan8814_setup_led()
3240 static int lan8814_config_init(struct phy_device *phydev) in lan8814_config_init() argument
3242 struct kszphy_priv *lan8814 = phydev->priv; in lan8814_config_init()
3246 val = lanphy_read_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET); in lan8814_config_init()
3248 lanphy_write_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET, val); in lan8814_config_init()
3251 val = lanphy_read_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG); in lan8814_config_init()
3253 lanphy_write_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG, val); in lan8814_config_init()
3256 val = lanphy_read_page_reg(phydev, 2, LAN8814_ALIGN_SWAP); in lan8814_config_init()
3259 lanphy_write_page_reg(phydev, 2, LAN8814_ALIGN_SWAP, val); in lan8814_config_init()
3262 lan8814_setup_led(phydev, lan8814->led_mode); in lan8814_config_init()
3272 static int lan8814_release_coma_mode(struct phy_device *phydev) in lan8814_release_coma_mode() argument
3276 gpiod = devm_gpiod_get_optional(&phydev->mdio.dev, "coma-mode", in lan8814_release_coma_mode()
3288 static int lan8814_probe(struct phy_device *phydev) in lan8814_probe() argument
3290 const struct kszphy_type *type = phydev->drv->driver_data; in lan8814_probe()
3295 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in lan8814_probe()
3299 phydev->priv = priv; in lan8814_probe()
3303 kszphy_parse_led_mode(phydev); in lan8814_probe()
3308 addr = lanphy_read_page_reg(phydev, 4, 0) & 0x1F; in lan8814_probe()
3309 devm_phy_package_join(&phydev->mdio.dev, phydev, in lan8814_probe()
3312 if (phy_package_init_once(phydev)) { in lan8814_probe()
3313 err = lan8814_release_coma_mode(phydev); in lan8814_probe()
3317 err = lan8814_ptp_probe_once(phydev); in lan8814_probe()
3322 lan8814_ptp_init(phydev); in lan8814_probe()
3366 static int lan8841_config_init(struct phy_device *phydev) in lan8841_config_init() argument
3370 ret = ksz9131_config_init(phydev); in lan8841_config_init()
3375 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3380 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3386 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3388 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3390 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3392 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3394 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3396 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3400 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3402 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3406 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
3409 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
3416 ret = phy_read_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
3419 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
3422 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
3433 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
3438 phy_write_mmd(phydev, MDIO_MMD_PMAPMD, in lan8841_config_init()
3440 phy_write_mmd(phydev, LAN8841_MMD_TIMER_REG, in lan8841_config_init()
3452 static int lan8841_config_intr(struct phy_device *phydev) in lan8841_config_intr() argument
3456 phy_modify(phydev, LAN8841_OUTPUT_CTRL, in lan8841_config_intr()
3459 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8841_config_intr()
3460 err = phy_read(phydev, LAN8814_INTS); in lan8841_config_intr()
3469 err = phy_write(phydev, LAN8814_INTC, in lan8841_config_intr()
3472 err = phy_write(phydev, LAN8814_INTC, 0); in lan8841_config_intr()
3476 err = phy_read(phydev, LAN8814_INTS); in lan8841_config_intr()
3492 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_get_tx_ts() local
3494 *nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_NS_HI); in lan8841_ptp_get_tx_ts()
3499 *nsec = *nsec | phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_NS_LO); in lan8841_ptp_get_tx_ts()
3501 *sec = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_SEC_HI); in lan8841_ptp_get_tx_ts()
3503 *sec = *sec | phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_SEC_LO); in lan8841_ptp_get_tx_ts()
3505 *seq = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_MSG_HEADER2); in lan8841_ptp_get_tx_ts()
3526 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_flush_fifo() local
3530 phy_read_mmd(phydev, 2, LAN8841_PTP_TX_MSG_HEADER2); in lan8841_ptp_flush_fifo()
3532 phy_read_mmd(phydev, 2, LAN8841_PTP_INT_STS); in lan8841_ptp_flush_fifo()
3549 struct phy_device *phydev = ptp_priv->phydev; in lan8841_gpio_process_cap() local
3558 tmp = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_STS); in lan8841_gpio_process_cap()
3562 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_SEL, in lan8841_gpio_process_cap()
3569 sec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_SEC_HI_CAP); in lan8841_gpio_process_cap()
3571 sec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_SEC_LO_CAP); in lan8841_gpio_process_cap()
3573 nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_NS_HI_CAP) & 0x3fff; in lan8841_gpio_process_cap()
3575 nsec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_NS_LO_CAP); in lan8841_gpio_process_cap()
3577 sec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_SEC_HI_CAP); in lan8841_gpio_process_cap()
3579 sec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_SEC_LO_CAP); in lan8841_gpio_process_cap()
3581 nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_NS_HI_CAP) & 0x3fff; in lan8841_gpio_process_cap()
3583 nsec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_NS_LO_CAP); in lan8841_gpio_process_cap()
3586 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_SEL, 0); in lan8841_gpio_process_cap()
3596 static void lan8841_handle_ptp_interrupt(struct phy_device *phydev) in lan8841_handle_ptp_interrupt() argument
3598 struct kszphy_priv *priv = phydev->priv; in lan8841_handle_ptp_interrupt()
3603 status = phy_read_mmd(phydev, 2, LAN8841_PTP_INT_STS); in lan8841_handle_ptp_interrupt()
3623 static irqreturn_t lan8841_handle_interrupt(struct phy_device *phydev) in lan8841_handle_interrupt() argument
3628 irq_status = phy_read(phydev, LAN8814_INTS); in lan8841_handle_interrupt()
3630 phy_error(phydev); in lan8841_handle_interrupt()
3635 phy_trigger_machine(phydev); in lan8841_handle_interrupt()
3640 lan8841_handle_ptp_interrupt(phydev); in lan8841_handle_interrupt()
3682 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_enable_processing() local
3686 phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_enable_processing()
3696 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_ptp_enable_processing()
3706 phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_enable_processing()
3711 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_ptp_enable_processing()
3729 struct phy_device *phydev = ptp_priv->phydev; in lan8841_hwtstamp() local
3774 phy_write_mmd(phydev, 2, LAN8841_PTP_RX_PARSE_CONFIG, rxcfg); in lan8841_hwtstamp()
3775 phy_write_mmd(phydev, 2, LAN8841_PTP_TX_PARSE_CONFIG, txcfg); in lan8841_hwtstamp()
3779 phy_write_mmd(phydev, 2, LAN8841_PTP_RX_TIMESTAMP_EN, pkt_ts_enable); in lan8841_hwtstamp()
3780 phy_write_mmd(phydev, 2, LAN8841_PTP_TX_TIMESTAMP_EN, pkt_ts_enable); in lan8841_hwtstamp()
3783 phy_modify_mmd(phydev, 2, LAN8841_PTP_TX_MOD, in lan8841_hwtstamp()
3854 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_set_target() local
3857 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_SEC_HI(event), in lan8841_ptp_set_target()
3862 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_SEC_LO(event), in lan8841_ptp_set_target()
3867 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_NS_HI(event) & 0x3fff, in lan8841_ptp_set_target()
3872 return phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_NS_LO(event), in lan8841_ptp_set_target()
3893 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_set_reload() local
3896 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_SEC_HI(event), in lan8841_ptp_set_reload()
3901 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_SEC_LO(event), in lan8841_ptp_set_reload()
3906 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_NS_HI(event) & 0x3fff, in lan8841_ptp_set_reload()
3911 return phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_NS_LO(event), in lan8841_ptp_set_reload()
3927 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_settime64() local
3933 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_LO, lower_16_bits(ts->tv_sec)); in lan8841_ptp_settime64()
3934 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_MID, upper_16_bits(ts->tv_sec)); in lan8841_ptp_settime64()
3935 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_HI, upper_32_bits(ts->tv_sec) & 0xffff); in lan8841_ptp_settime64()
3936 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_LO, lower_16_bits(ts->tv_nsec)); in lan8841_ptp_settime64()
3937 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_HI, upper_16_bits(ts->tv_nsec) & 0x3fff); in lan8841_ptp_settime64()
3940 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_settime64()
3964 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_gettime64() local
3970 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_gettime64()
3974 s = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_HI); in lan8841_ptp_gettime64()
3976 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_MID); in lan8841_ptp_gettime64()
3978 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_LO); in lan8841_ptp_gettime64()
3980 ns = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_NS_HI) & 0x3fff; in lan8841_ptp_gettime64()
3982 ns |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_NS_LO); in lan8841_ptp_gettime64()
3994 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_getseconds() local
3999 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_getseconds()
4003 s = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_HI); in lan8841_ptp_getseconds()
4005 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_MID); in lan8841_ptp_getseconds()
4007 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_LO); in lan8841_ptp_getseconds()
4023 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_adjtime() local
4075 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_LO, sec); in lan8841_ptp_adjtime()
4076 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_HI, in lan8841_ptp_adjtime()
4078 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_adjtime()
4083 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_LO, in lan8841_ptp_adjtime()
4085 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_HI, in lan8841_ptp_adjtime()
4087 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_adjtime()
4109 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_adjfine() local
4125 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_RATE_ADJ_HI, in lan8841_ptp_adjfine()
4128 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_RATE_ADJ_LO, lower_16_bits(rate)); in lan8841_ptp_adjfine()
4156 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout_off() local
4159 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_perout_off()
4163 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DIR, BIT(pin)); in lan8841_ptp_perout_off()
4167 return phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_perout_off()
4172 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout_on() local
4175 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_perout_on()
4179 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DIR, BIT(pin)); in lan8841_ptp_perout_on()
4183 return phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_perout_on()
4202 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_remove_event() local
4212 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL1, tmp); in lan8841_ptp_remove_event()
4215 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL2, tmp); in lan8841_ptp_remove_event()
4227 return phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, tmp); in lan8841_ptp_remove_event()
4233 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_enable_event() local
4239 ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GENERAL_CONFIG, in lan8841_ptp_enable_event()
4245 ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GENERAL_CONFIG, in lan8841_ptp_enable_event()
4263 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL1, in lan8841_ptp_enable_event()
4266 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL2, in lan8841_ptp_enable_event()
4292 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout() local
4324 phydev_name(phydev)); in lan8841_ptp_perout()
4330 phydev_name(phydev)); in lan8841_ptp_perout()
4379 phydev_name(phydev)); in lan8841_ptp_perout()
4416 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_extts_on() local
4421 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_extts_on()
4425 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_extts_on()
4434 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_EN, tmp); in lan8841_ptp_extts_on()
4439 return phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_extts_on()
4446 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_extts_off() local
4450 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_extts_off()
4454 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_extts_off()
4459 ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_EN, in lan8841_ptp_extts_off()
4467 return phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_extts_off()
4550 static int lan8841_probe(struct phy_device *phydev) in lan8841_probe() argument
4556 err = kszphy_probe(phydev); in lan8841_probe()
4560 if (phy_read_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_probe()
4563 phydev->interface = PHY_INTERFACE_MODE_RGMII_RXID; in lan8841_probe()
4569 priv = phydev->priv; in lan8841_probe()
4572 ptp_priv->pin_config = devm_kcalloc(&phydev->mdio.dev, in lan8841_probe()
4590 &phydev->mdio.dev); in lan8841_probe()
4592 phydev_err(phydev, "ptp_clock_register failed: %lu\n", in lan8841_probe()
4602 ptp_priv->phydev = phydev; in lan8841_probe()
4611 phydev->mii_ts = &ptp_priv->mii_ts; in lan8841_probe()
4616 static int lan8841_suspend(struct phy_device *phydev) in lan8841_suspend() argument
4618 struct kszphy_priv *priv = phydev->priv; in lan8841_suspend()
4623 return genphy_suspend(phydev); in lan8841_suspend()