Lines Matching refs:phydev

391 	struct phy_device *phydev;  member
409 struct phy_device *phydev; member
503 static int kszphy_extended_write(struct phy_device *phydev, in kszphy_extended_write() argument
506 phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum); in kszphy_extended_write()
507 return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val); in kszphy_extended_write()
510 static int kszphy_extended_read(struct phy_device *phydev, in kszphy_extended_read() argument
513 phy_write(phydev, MII_KSZPHY_EXTREG, regnum); in kszphy_extended_read()
514 return phy_read(phydev, MII_KSZPHY_EXTREG_READ); in kszphy_extended_read()
517 static int kszphy_ack_interrupt(struct phy_device *phydev) in kszphy_ack_interrupt() argument
522 rc = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_ack_interrupt()
527 static int kszphy_config_intr(struct phy_device *phydev) in kszphy_config_intr() argument
529 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
539 temp = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_config_intr()
543 phy_write(phydev, MII_KSZPHY_CTRL, temp); in kszphy_config_intr()
546 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in kszphy_config_intr()
547 err = kszphy_ack_interrupt(phydev); in kszphy_config_intr()
551 err = phy_write(phydev, MII_KSZPHY_INTCS, KSZPHY_INTCS_ALL); in kszphy_config_intr()
553 err = phy_write(phydev, MII_KSZPHY_INTCS, 0); in kszphy_config_intr()
557 err = kszphy_ack_interrupt(phydev); in kszphy_config_intr()
563 static irqreturn_t kszphy_handle_interrupt(struct phy_device *phydev) in kszphy_handle_interrupt() argument
567 irq_status = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_handle_interrupt()
569 phy_error(phydev); in kszphy_handle_interrupt()
576 phy_trigger_machine(phydev); in kszphy_handle_interrupt()
581 static int kszphy_rmii_clk_sel(struct phy_device *phydev, bool val) in kszphy_rmii_clk_sel() argument
585 ctrl = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_rmii_clk_sel()
594 return phy_write(phydev, MII_KSZPHY_CTRL, ctrl); in kszphy_rmii_clk_sel()
597 static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val) in kszphy_setup_led() argument
612 temp = phy_read(phydev, reg); in kszphy_setup_led()
620 rc = phy_write(phydev, reg, temp); in kszphy_setup_led()
623 phydev_err(phydev, "failed to set led mode\n"); in kszphy_setup_led()
631 static int kszphy_broadcast_disable(struct phy_device *phydev) in kszphy_broadcast_disable() argument
635 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_broadcast_disable()
639 ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF); in kszphy_broadcast_disable()
642 phydev_err(phydev, "failed to disable broadcast address\n"); in kszphy_broadcast_disable()
647 static int kszphy_nand_tree_disable(struct phy_device *phydev) in kszphy_nand_tree_disable() argument
651 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_nand_tree_disable()
658 ret = phy_write(phydev, MII_KSZPHY_OMSO, in kszphy_nand_tree_disable()
662 phydev_err(phydev, "failed to disable NAND tree mode\n"); in kszphy_nand_tree_disable()
668 static int kszphy_config_reset(struct phy_device *phydev) in kszphy_config_reset() argument
670 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
674 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
676 phydev_err(phydev, in kszphy_config_reset()
683 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
688 static int kszphy_config_init(struct phy_device *phydev) in kszphy_config_init() argument
690 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
699 kszphy_broadcast_disable(phydev); in kszphy_config_init()
702 kszphy_nand_tree_disable(phydev); in kszphy_config_init()
704 return kszphy_config_reset(phydev); in kszphy_config_init()
707 static int ksz8041_fiber_mode(struct phy_device *phydev) in ksz8041_fiber_mode() argument
709 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_fiber_mode()
714 static int ksz8041_config_init(struct phy_device *phydev) in ksz8041_config_init() argument
719 if (ksz8041_fiber_mode(phydev)) { in ksz8041_config_init()
720 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
724 linkmode_and(phydev->supported, phydev->supported, mask); in ksz8041_config_init()
726 phydev->supported); in ksz8041_config_init()
727 linkmode_and(phydev->advertising, phydev->advertising, mask); in ksz8041_config_init()
729 phydev->advertising); in ksz8041_config_init()
730 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
733 return kszphy_config_init(phydev); in ksz8041_config_init()
736 static int ksz8041_config_aneg(struct phy_device *phydev) in ksz8041_config_aneg() argument
739 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
740 phydev->speed = SPEED_100; in ksz8041_config_aneg()
744 return genphy_config_aneg(phydev); in ksz8041_config_aneg()
747 static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, in ksz8051_ksz8795_match_phy_device() argument
752 if (!phy_id_compare(phydev->phy_id, PHY_ID_KSZ8051, MICREL_PHY_ID_MASK)) in ksz8051_ksz8795_match_phy_device()
755 ret = phy_read(phydev, MII_BMSR); in ksz8051_ksz8795_match_phy_device()
771 static int ksz8051_match_phy_device(struct phy_device *phydev) in ksz8051_match_phy_device() argument
773 return ksz8051_ksz8795_match_phy_device(phydev, true); in ksz8051_match_phy_device()
776 static int ksz8081_config_init(struct phy_device *phydev) in ksz8081_config_init() argument
783 phy_clear_bits(phydev, MII_KSZPHY_OMSO, KSZPHY_OMSO_FACTORY_TEST); in ksz8081_config_init()
785 return kszphy_config_init(phydev); in ksz8081_config_init()
788 static int ksz8081_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz8081_config_mdix() argument
807 return phy_modify(phydev, MII_KSZPHY_CTRL_2, in ksz8081_config_mdix()
814 static int ksz8081_config_aneg(struct phy_device *phydev) in ksz8081_config_aneg() argument
818 ret = genphy_config_aneg(phydev); in ksz8081_config_aneg()
826 return ksz8081_config_mdix(phydev, phydev->mdix_ctrl); in ksz8081_config_aneg()
829 static int ksz8081_mdix_update(struct phy_device *phydev) in ksz8081_mdix_update() argument
833 ret = phy_read(phydev, MII_KSZPHY_CTRL_2); in ksz8081_mdix_update()
839 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz8081_mdix_update()
841 phydev->mdix_ctrl = ETH_TP_MDI; in ksz8081_mdix_update()
843 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz8081_mdix_update()
846 ret = phy_read(phydev, MII_KSZPHY_CTRL_1); in ksz8081_mdix_update()
851 phydev->mdix = ETH_TP_MDI; in ksz8081_mdix_update()
853 phydev->mdix = ETH_TP_MDI_X; in ksz8081_mdix_update()
858 static int ksz8081_read_status(struct phy_device *phydev) in ksz8081_read_status() argument
862 ret = ksz8081_mdix_update(phydev); in ksz8081_read_status()
866 return genphy_read_status(phydev); in ksz8081_read_status()
869 static int ksz8061_config_init(struct phy_device *phydev) in ksz8061_config_init() argument
874 ret = phy_read(phydev, MII_BMCR); in ksz8061_config_init()
878 ret = phy_write(phydev, MII_BMCR, ret & ~BMCR_PDOWN); in ksz8061_config_init()
884 ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); in ksz8061_config_init()
888 return kszphy_config_init(phydev); in ksz8061_config_init()
891 static int ksz8795_match_phy_device(struct phy_device *phydev) in ksz8795_match_phy_device() argument
893 return ksz8051_ksz8795_match_phy_device(phydev, false); in ksz8795_match_phy_device()
896 static int ksz9021_load_values_from_of(struct phy_device *phydev, in ksz9021_load_values_from_of() argument
925 newval = kszphy_extended_read(phydev, reg); in ksz9021_load_values_from_of()
941 return kszphy_extended_write(phydev, reg, newval); in ksz9021_load_values_from_of()
944 static int ksz9021_config_init(struct phy_device *phydev) in ksz9021_config_init() argument
953 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
961 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
965 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
969 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
1035 static int ksz9031_set_loopback(struct phy_device *phydev, bool enable, in ksz9031_set_loopback() argument
1042 return genphy_loopback(phydev, enable, 0); in ksz9031_set_loopback()
1045 phydev->speed = speed; in ksz9031_set_loopback()
1048 phydev->duplex = DUPLEX_FULL; in ksz9031_set_loopback()
1050 ctl |= mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); in ksz9031_set_loopback()
1052 phy_write(phydev, MII_BMCR, ctl); in ksz9031_set_loopback()
1054 return phy_read_poll_timeout(phydev, MII_BMSR, val, val & BMSR_LSTATUS, in ksz9031_set_loopback()
1058 static int ksz9031_of_load_skew_values(struct phy_device *phydev, in ksz9031_of_load_skew_values() argument
1081 newval = phy_read_mmd(phydev, 2, reg); in ksz9031_of_load_skew_values()
1095 return phy_write_mmd(phydev, 2, reg, newval); in ksz9031_of_load_skew_values()
1099 static int ksz9031_center_flp_timing(struct phy_device *phydev) in ksz9031_center_flp_timing() argument
1103 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_HI, in ksz9031_center_flp_timing()
1108 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_LO, in ksz9031_center_flp_timing()
1113 return genphy_restart_aneg(phydev); in ksz9031_center_flp_timing()
1117 static int ksz9031_enable_edpd(struct phy_device *phydev) in ksz9031_enable_edpd() argument
1121 reg = phy_read_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD); in ksz9031_enable_edpd()
1124 return phy_write_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD, in ksz9031_enable_edpd()
1128 static int ksz9031_config_rgmii_delay(struct phy_device *phydev) in ksz9031_config_rgmii_delay() argument
1133 switch (phydev->interface) { in ksz9031_config_rgmii_delay()
1162 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_CONTROL_PAD_SKEW, in ksz9031_config_rgmii_delay()
1168 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_RX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
1176 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_TX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
1184 return phy_write_mmd(phydev, 2, MII_KSZ9031RN_CLK_PAD_SKEW, in ksz9031_config_rgmii_delay()
1189 static int ksz9031_config_init(struct phy_device *phydev) in ksz9031_config_init() argument
1205 result = ksz9031_enable_edpd(phydev); in ksz9031_config_init()
1213 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
1222 if (phy_interface_is_rgmii(phydev)) { in ksz9031_config_init()
1223 result = ksz9031_config_rgmii_delay(phydev); in ksz9031_config_init()
1228 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1232 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1236 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1240 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1244 if (update && !phy_interface_is_rgmii(phydev)) in ksz9031_config_init()
1245 phydev_warn(phydev, in ksz9031_config_init()
1264 result = phy_read(phydev, MII_CTRL1000); in ksz9031_config_init()
1270 result = phy_write(phydev, MII_CTRL1000, result); in ksz9031_config_init()
1276 return ksz9031_center_flp_timing(phydev); in ksz9031_config_init()
1279 phydev_err(phydev, "failed to force the phy to master mode\n"); in ksz9031_config_init()
1288 static int ksz9131_of_load_skew_values(struct phy_device *phydev, in ksz9131_of_load_skew_values() argument
1323 newval = phy_read_mmd(phydev, 2, reg); in ksz9131_of_load_skew_values()
1337 return phy_write_mmd(phydev, 2, reg, newval); in ksz9131_of_load_skew_values()
1345 static int ksz9131_config_rgmii_delay(struct phy_device *phydev) in ksz9131_config_rgmii_delay() argument
1347 const struct kszphy_type *type = phydev->drv->driver_data; in ksz9131_config_rgmii_delay()
1351 switch (phydev->interface) { in ksz9131_config_rgmii_delay()
1372 ret = phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
1378 return phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
1389 static int ksz9131_led_errata(struct phy_device *phydev) in ksz9131_led_errata() argument
1393 reg = phy_read_mmd(phydev, 2, 0); in ksz9131_led_errata()
1400 return phy_set_bits(phydev, 0x1e, BIT(9)); in ksz9131_led_errata()
1403 static int ksz9131_config_init(struct phy_device *phydev) in ksz9131_config_init() argument
1419 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz9131_config_init()
1421 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
1430 if (phy_interface_is_rgmii(phydev)) { in ksz9131_config_init()
1431 ret = ksz9131_config_rgmii_delay(phydev); in ksz9131_config_init()
1436 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1442 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1448 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1454 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1460 ret = ksz9131_led_errata(phydev); in ksz9131_config_init()
1474 static int ksz9131_mdix_update(struct phy_device *phydev) in ksz9131_mdix_update() argument
1478 if (phydev->mdix_ctrl != ETH_TP_MDI_AUTO) { in ksz9131_mdix_update()
1479 phydev->mdix = phydev->mdix_ctrl; in ksz9131_mdix_update()
1481 ret = phy_read(phydev, MII_KSZ9131_DIG_AXAN_STS); in ksz9131_mdix_update()
1487 phydev->mdix = ETH_TP_MDI; in ksz9131_mdix_update()
1489 phydev->mdix = ETH_TP_MDI_X; in ksz9131_mdix_update()
1491 phydev->mdix = ETH_TP_MDI_INVALID; in ksz9131_mdix_update()
1498 static int ksz9131_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz9131_config_mdix() argument
1517 return phy_modify(phydev, MII_KSZ9131_AUTO_MDIX, in ksz9131_config_mdix()
1522 static int ksz9131_read_status(struct phy_device *phydev) in ksz9131_read_status() argument
1526 ret = ksz9131_mdix_update(phydev); in ksz9131_read_status()
1530 return genphy_read_status(phydev); in ksz9131_read_status()
1533 static int ksz9131_config_aneg(struct phy_device *phydev) in ksz9131_config_aneg() argument
1537 ret = ksz9131_config_mdix(phydev, phydev->mdix_ctrl); in ksz9131_config_aneg()
1541 return genphy_config_aneg(phydev); in ksz9131_config_aneg()
1544 static int ksz9477_get_features(struct phy_device *phydev) in ksz9477_get_features() argument
1548 ret = genphy_read_abilities(phydev); in ksz9477_get_features()
1558 linkmode_and(phydev->supported_eee, phydev->supported, in ksz9477_get_features()
1567 static int ksz8873mll_read_status(struct phy_device *phydev) in ksz8873mll_read_status() argument
1572 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
1574 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
1577 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
1579 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
1582 phydev->speed = SPEED_10; in ksz8873mll_read_status()
1584 phydev->speed = SPEED_100; in ksz8873mll_read_status()
1586 phydev->link = 1; in ksz8873mll_read_status()
1587 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
1592 static int ksz9031_get_features(struct phy_device *phydev) in ksz9031_get_features() argument
1596 ret = genphy_read_abilities(phydev); in ksz9031_get_features()
1609 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
1614 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
1619 static int ksz9031_read_status(struct phy_device *phydev) in ksz9031_read_status() argument
1624 err = genphy_read_status(phydev); in ksz9031_read_status()
1631 regval = phy_read(phydev, MII_STAT1000); in ksz9031_read_status()
1633 phy_init_hw(phydev); in ksz9031_read_status()
1634 phydev->link = 0; in ksz9031_read_status()
1635 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
1636 phydev->drv->config_intr(phydev); in ksz9031_read_status()
1637 return genphy_config_aneg(phydev); in ksz9031_read_status()
1643 static int ksz9x31_cable_test_start(struct phy_device *phydev) in ksz9x31_cable_test_start() argument
1645 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_start()
1653 ret = phy_modify(phydev, MII_BMCR, in ksz9x31_cable_test_start()
1665 ret = phy_read(phydev, MII_CTRL1000); in ksz9x31_cable_test_start()
1674 return phy_write(phydev, MII_CTRL1000, ret); in ksz9x31_cable_test_start()
1711 static int ksz9x31_cable_test_fault_length(struct phy_device *phydev, u16 stat) in ksz9x31_cable_test_fault_length() argument
1719 if (phydev_id_compare(phydev, PHY_ID_KSZ9131)) in ksz9x31_cable_test_fault_length()
1725 static int ksz9x31_cable_test_wait_for_completion(struct phy_device *phydev) in ksz9x31_cable_test_wait_for_completion() argument
1729 ret = phy_read_poll_timeout(phydev, KSZ9x31_LMD, val, in ksz9x31_cable_test_wait_for_completion()
1748 static int ksz9x31_cable_test_one_pair(struct phy_device *phydev, int pair) in ksz9x31_cable_test_one_pair() argument
1759 ret = phy_write(phydev, KSZ9x31_LMD, in ksz9x31_cable_test_one_pair()
1764 ret = ksz9x31_cable_test_wait_for_completion(phydev); in ksz9x31_cable_test_one_pair()
1768 val = phy_read(phydev, KSZ9x31_LMD); in ksz9x31_cable_test_one_pair()
1775 ret = ethnl_cable_test_result(phydev, in ksz9x31_cable_test_one_pair()
1784 return ethnl_cable_test_fault_length(phydev, in ksz9x31_cable_test_one_pair()
1786 ksz9x31_cable_test_fault_length(phydev, val)); in ksz9x31_cable_test_one_pair()
1789 static int ksz9x31_cable_test_get_status(struct phy_device *phydev, in ksz9x31_cable_test_get_status() argument
1792 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_get_status()
1802 ret = ksz9x31_cable_test_one_pair(phydev, pair); in ksz9x31_cable_test_get_status()
1819 ret = ethnl_cable_test_result(phydev, in ksz9x31_cable_test_get_status()
1827 rv = phy_modify(phydev, MII_CTRL1000, in ksz9x31_cable_test_get_status()
1836 static int ksz8873mll_config_aneg(struct phy_device *phydev) in ksz8873mll_config_aneg() argument
1841 static int ksz886x_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz886x_config_mdix() argument
1865 return phy_modify(phydev, MII_BMCR, in ksz886x_config_mdix()
1871 static int ksz886x_config_aneg(struct phy_device *phydev) in ksz886x_config_aneg() argument
1875 ret = genphy_config_aneg(phydev); in ksz886x_config_aneg()
1879 if (phydev->autoneg != AUTONEG_ENABLE) { in ksz886x_config_aneg()
1886 ret = phy_set_bits(phydev, MII_KSZPHY_CTRL, in ksz886x_config_aneg()
1895 ret = phy_clear_bits(phydev, MII_KSZPHY_CTRL, in ksz886x_config_aneg()
1905 return ksz886x_config_mdix(phydev, phydev->mdix_ctrl); in ksz886x_config_aneg()
1908 static int ksz886x_mdix_update(struct phy_device *phydev) in ksz886x_mdix_update() argument
1912 ret = phy_read(phydev, MII_BMCR); in ksz886x_mdix_update()
1918 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz886x_mdix_update()
1920 phydev->mdix_ctrl = ETH_TP_MDI; in ksz886x_mdix_update()
1922 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz886x_mdix_update()
1925 ret = phy_read(phydev, MII_KSZPHY_CTRL); in ksz886x_mdix_update()
1931 phydev->mdix = ETH_TP_MDI_X; in ksz886x_mdix_update()
1933 phydev->mdix = ETH_TP_MDI; in ksz886x_mdix_update()
1938 static int ksz886x_read_status(struct phy_device *phydev) in ksz886x_read_status() argument
1942 ret = ksz886x_mdix_update(phydev); in ksz886x_read_status()
1946 return genphy_read_status(phydev); in ksz886x_read_status()
1984 static int ksz9477_phy_errata(struct phy_device *phydev) in ksz9477_phy_errata() argument
2000 err = phy_write(phydev, MII_BMCR, BMCR_SPEED100 | BMCR_FULLDPLX); in ksz9477_phy_errata()
2007 err = phy_write_mmd(phydev, errata->dev_addr, errata->reg_addr, errata->val); in ksz9477_phy_errata()
2012 err = genphy_restart_aneg(phydev); in ksz9477_phy_errata()
2019 static int ksz9477_config_init(struct phy_device *phydev) in ksz9477_config_init() argument
2024 if ((phydev->phy_id & 0xf) == 1) { in ksz9477_config_init()
2025 err = ksz9477_phy_errata(phydev); in ksz9477_config_init()
2030 return kszphy_config_init(phydev); in ksz9477_config_init()
2033 static int kszphy_get_sset_count(struct phy_device *phydev) in kszphy_get_sset_count() argument
2038 static void kszphy_get_strings(struct phy_device *phydev, u8 *data) in kszphy_get_strings() argument
2046 static u64 kszphy_get_stat(struct phy_device *phydev, int i) in kszphy_get_stat() argument
2049 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
2053 val = phy_read(phydev, stat.reg); in kszphy_get_stat()
2065 static void kszphy_get_stats(struct phy_device *phydev, in kszphy_get_stats() argument
2071 data[i] = kszphy_get_stat(phydev, i); in kszphy_get_stats()
2074 static void kszphy_enable_clk(struct phy_device *phydev) in kszphy_enable_clk() argument
2076 struct kszphy_priv *priv = phydev->priv; in kszphy_enable_clk()
2084 static void kszphy_disable_clk(struct phy_device *phydev) in kszphy_disable_clk() argument
2086 struct kszphy_priv *priv = phydev->priv; in kszphy_disable_clk()
2094 static int kszphy_generic_resume(struct phy_device *phydev) in kszphy_generic_resume() argument
2096 kszphy_enable_clk(phydev); in kszphy_generic_resume()
2098 return genphy_resume(phydev); in kszphy_generic_resume()
2101 static int kszphy_generic_suspend(struct phy_device *phydev) in kszphy_generic_suspend() argument
2105 ret = genphy_suspend(phydev); in kszphy_generic_suspend()
2109 kszphy_disable_clk(phydev); in kszphy_generic_suspend()
2114 static int kszphy_suspend(struct phy_device *phydev) in kszphy_suspend() argument
2117 if (phy_interrupt_is_valid(phydev)) { in kszphy_suspend()
2118 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
2119 if (phydev->drv->config_intr) in kszphy_suspend()
2120 phydev->drv->config_intr(phydev); in kszphy_suspend()
2123 return kszphy_generic_suspend(phydev); in kszphy_suspend()
2126 static void kszphy_parse_led_mode(struct phy_device *phydev) in kszphy_parse_led_mode() argument
2128 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_parse_led_mode()
2129 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_parse_led_mode()
2130 struct kszphy_priv *priv = phydev->priv; in kszphy_parse_led_mode()
2141 phydev_err(phydev, "invalid led mode: 0x%02x\n", in kszphy_parse_led_mode()
2150 static int kszphy_resume(struct phy_device *phydev) in kszphy_resume() argument
2154 ret = kszphy_generic_resume(phydev); in kszphy_resume()
2164 ret = kszphy_config_reset(phydev); in kszphy_resume()
2169 if (phy_interrupt_is_valid(phydev)) { in kszphy_resume()
2170 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
2171 if (phydev->drv->config_intr) in kszphy_resume()
2172 phydev->drv->config_intr(phydev); in kszphy_resume()
2182 static int ksz8041_resume(struct phy_device *phydev) in ksz8041_resume() argument
2184 kszphy_enable_clk(phydev); in ksz8041_resume()
2189 static int ksz8041_suspend(struct phy_device *phydev) in ksz8041_suspend() argument
2191 kszphy_disable_clk(phydev); in ksz8041_suspend()
2196 static int ksz9477_resume(struct phy_device *phydev) in ksz9477_resume() argument
2201 ret = phy_read(phydev, MII_BMCR); in ksz9477_resume()
2207 genphy_resume(phydev); in ksz9477_resume()
2216 if ((phydev->phy_id & 0xf) == 1) { in ksz9477_resume()
2217 ret = ksz9477_phy_errata(phydev); in ksz9477_resume()
2223 if (phy_interrupt_is_valid(phydev)) { in ksz9477_resume()
2224 phydev->interrupts = PHY_INTERRUPT_ENABLED; in ksz9477_resume()
2225 if (phydev->drv->config_intr) in ksz9477_resume()
2226 phydev->drv->config_intr(phydev); in ksz9477_resume()
2232 static int ksz8061_resume(struct phy_device *phydev) in ksz8061_resume() argument
2237 ret = phy_read(phydev, MII_BMCR); in ksz8061_resume()
2243 ret = kszphy_generic_resume(phydev); in ksz8061_resume()
2250 ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); in ksz8061_resume()
2255 if (phy_interrupt_is_valid(phydev)) { in ksz8061_resume()
2256 phydev->interrupts = PHY_INTERRUPT_ENABLED; in ksz8061_resume()
2257 if (phydev->drv->config_intr) in ksz8061_resume()
2258 phydev->drv->config_intr(phydev); in ksz8061_resume()
2264 static int ksz8061_suspend(struct phy_device *phydev) in ksz8061_suspend() argument
2266 return kszphy_suspend(phydev); in ksz8061_suspend()
2269 static int kszphy_probe(struct phy_device *phydev) in kszphy_probe() argument
2271 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
2272 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
2276 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
2280 phydev->priv = priv; in kszphy_probe()
2284 kszphy_parse_led_mode(phydev); in kszphy_probe()
2286 clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
2302 phydev_err(phydev, "Clock rate out of range: %ld\n", in kszphy_probe()
2308 clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, NULL); in kszphy_probe()
2317 if (ksz8041_fiber_mode(phydev)) in kszphy_probe()
2318 phydev->port = PORT_FIBRE; in kszphy_probe()
2321 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()
2329 static int lan8814_cable_test_start(struct phy_device *phydev) in lan8814_cable_test_start() argument
2336 return phy_modify(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100, in lan8814_cable_test_start()
2340 static int ksz886x_cable_test_start(struct phy_device *phydev) in ksz886x_cable_test_start() argument
2342 if (phydev->dev_flags & MICREL_KSZ8_P1_ERRATA) in ksz886x_cable_test_start()
2350 return phy_clear_bits(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100); in ksz886x_cable_test_start()
2386 static __always_inline int ksz886x_cable_test_fault_length(struct phy_device *phydev, in ksz886x_cable_test_fault_length() argument
2397 if (phydev_id_compare(phydev, PHY_ID_LAN8814)) in ksz886x_cable_test_fault_length()
2403 static int ksz886x_cable_test_wait_for_completion(struct phy_device *phydev) in ksz886x_cable_test_wait_for_completion() argument
2405 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_wait_for_completion()
2408 ret = phy_read_poll_timeout(phydev, type->cable_diag_reg, val, in ksz886x_cable_test_wait_for_completion()
2415 static int lan8814_cable_test_one_pair(struct phy_device *phydev, int pair) in lan8814_cable_test_one_pair() argument
2429 ret = phy_write(phydev, LAN8814_CABLE_DIAG, val); in lan8814_cable_test_one_pair()
2433 ret = ksz886x_cable_test_wait_for_completion(phydev); in lan8814_cable_test_one_pair()
2437 val = phy_read(phydev, LAN8814_CABLE_DIAG); in lan8814_cable_test_one_pair()
2444 ret = ethnl_cable_test_result(phydev, ethtool_pair[pair], in lan8814_cable_test_one_pair()
2454 fault_length = ksz886x_cable_test_fault_length(phydev, val, in lan8814_cable_test_one_pair()
2457 return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], fault_length); in lan8814_cable_test_one_pair()
2460 static int ksz886x_cable_test_one_pair(struct phy_device *phydev, int pair) in ksz886x_cable_test_one_pair() argument
2477 switch (phydev->phy_id & MICREL_PHY_ID_MASK) { in ksz886x_cable_test_one_pair()
2479 ret = ksz8081_config_mdix(phydev, mdix); in ksz886x_cable_test_one_pair()
2482 ret = ksz886x_config_mdix(phydev, mdix); in ksz886x_cable_test_one_pair()
2494 ret = phy_write(phydev, KSZ8081_LMD, KSZ8081_LMD_ENABLE_TEST); in ksz886x_cable_test_one_pair()
2498 ret = ksz886x_cable_test_wait_for_completion(phydev); in ksz886x_cable_test_one_pair()
2502 val = phy_read(phydev, KSZ8081_LMD); in ksz886x_cable_test_one_pair()
2509 ret = ethnl_cable_test_result(phydev, ethtool_pair[pair], in ksz886x_cable_test_one_pair()
2517 fault_length = ksz886x_cable_test_fault_length(phydev, val, KSZ8081_LMD_DELTA_TIME_MASK); in ksz886x_cable_test_one_pair()
2519 return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], fault_length); in ksz886x_cable_test_one_pair()
2522 static int ksz886x_cable_test_get_status(struct phy_device *phydev, in ksz886x_cable_test_get_status() argument
2525 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_get_status()
2537 ret = lan8814_cable_test_one_pair(phydev, pair); in ksz886x_cable_test_get_status()
2539 ret = ksz886x_cable_test_one_pair(phydev, pair); in ksz886x_cable_test_get_status()
2577 static int lanphy_read_page_reg(struct phy_device *phydev, int page, u32 addr) in lanphy_read_page_reg() argument
2581 phy_lock_mdio_bus(phydev); in lanphy_read_page_reg()
2582 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page); in lanphy_read_page_reg()
2583 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr); in lanphy_read_page_reg()
2584 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, in lanphy_read_page_reg()
2586 data = __phy_read(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA); in lanphy_read_page_reg()
2587 phy_unlock_mdio_bus(phydev); in lanphy_read_page_reg()
2592 static int lanphy_write_page_reg(struct phy_device *phydev, int page, u16 addr, in lanphy_write_page_reg() argument
2595 phy_lock_mdio_bus(phydev); in lanphy_write_page_reg()
2596 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page); in lanphy_write_page_reg()
2597 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr); in lanphy_write_page_reg()
2598 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, in lanphy_write_page_reg()
2601 val = __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, val); in lanphy_write_page_reg()
2603 phydev_err(phydev, "Error: phy_write has returned error %d\n", in lanphy_write_page_reg()
2605 phy_unlock_mdio_bus(phydev); in lanphy_write_page_reg()
2609 static int lan8814_config_ts_intr(struct phy_device *phydev, bool enable) in lan8814_config_ts_intr() argument
2619 return lanphy_write_page_reg(phydev, 5, PTP_TSU_INT_EN, val); in lan8814_config_ts_intr()
2622 static void lan8814_ptp_rx_ts_get(struct phy_device *phydev, in lan8814_ptp_rx_ts_get() argument
2625 *seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_HI); in lan8814_ptp_rx_ts_get()
2627 lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_LO); in lan8814_ptp_rx_ts_get()
2629 *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_HI); in lan8814_ptp_rx_ts_get()
2631 lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_LO); in lan8814_ptp_rx_ts_get()
2633 *seq_id = lanphy_read_page_reg(phydev, 5, PTP_RX_MSG_HEADER2); in lan8814_ptp_rx_ts_get()
2636 static void lan8814_ptp_tx_ts_get(struct phy_device *phydev, in lan8814_ptp_tx_ts_get() argument
2639 *seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_HI); in lan8814_ptp_tx_ts_get()
2641 lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_LO); in lan8814_ptp_tx_ts_get()
2643 *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_HI); in lan8814_ptp_tx_ts_get()
2645 lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_LO); in lan8814_ptp_tx_ts_get()
2647 *seq_id = lanphy_read_page_reg(phydev, 5, PTP_TX_MSG_HEADER2); in lan8814_ptp_tx_ts_get()
2653 struct lan8814_shared_priv *shared = phy_package_get_priv(ptp_priv->phydev); in lan8814_ts_info()
2676 static void lan8814_flush_fifo(struct phy_device *phydev, bool egress) in lan8814_flush_fifo() argument
2681 lanphy_read_page_reg(phydev, 5, in lan8814_flush_fifo()
2685 lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS); in lan8814_flush_fifo()
2736 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_PARSE_CONFIG, rxcfg); in lan8814_hwtstamp()
2737 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_PARSE_CONFIG, txcfg); in lan8814_hwtstamp()
2741 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_TIMESTAMP_EN, pkt_ts_enable); in lan8814_hwtstamp()
2742 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_TIMESTAMP_EN, pkt_ts_enable); in lan8814_hwtstamp()
2744 tx_mod = lanphy_read_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD); in lan8814_hwtstamp()
2746 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD, in lan8814_hwtstamp()
2749 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD, in lan8814_hwtstamp()
2754 lan8814_config_ts_intr(ptp_priv->phydev, true); in lan8814_hwtstamp()
2756 lan8814_config_ts_intr(ptp_priv->phydev, false); in lan8814_hwtstamp()
2766 lan8814_flush_fifo(ptp_priv->phydev, false); in lan8814_hwtstamp()
2767 lan8814_flush_fifo(ptp_priv->phydev, true); in lan8814_hwtstamp()
2869 static void lan8814_ptp_clock_set(struct phy_device *phydev, in lan8814_ptp_clock_set() argument
2872 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_LO, lower_16_bits(sec)); in lan8814_ptp_clock_set()
2873 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_MID, upper_16_bits(sec)); in lan8814_ptp_clock_set()
2874 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_HI, upper_32_bits(sec)); in lan8814_ptp_clock_set()
2875 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_LO, lower_16_bits(nsec)); in lan8814_ptp_clock_set()
2876 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_HI, upper_16_bits(nsec)); in lan8814_ptp_clock_set()
2878 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_LOAD_); in lan8814_ptp_clock_set()
2881 static void lan8814_ptp_clock_get(struct phy_device *phydev, in lan8814_ptp_clock_get() argument
2884 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_READ_); in lan8814_ptp_clock_get()
2886 *sec = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_HI); in lan8814_ptp_clock_get()
2888 *sec |= lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_MID); in lan8814_ptp_clock_get()
2890 *sec |= lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_LO); in lan8814_ptp_clock_get()
2892 *nsec = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_HI); in lan8814_ptp_clock_get()
2894 *nsec |= lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_LO); in lan8814_ptp_clock_get()
2902 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_gettime64() local
2907 lan8814_ptp_clock_get(phydev, &seconds, &nano_seconds); in lan8814_ptpci_gettime64()
2920 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_settime64() local
2923 lan8814_ptp_clock_set(phydev, ts->tv_sec, ts->tv_nsec); in lan8814_ptpci_settime64()
2929 static void lan8814_ptp_set_target(struct phy_device *phydev, int event, in lan8814_ptp_set_target() argument
2933 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_SEC_LO(event), in lan8814_ptp_set_target()
2935 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_SEC_HI(event), in lan8814_ptp_set_target()
2938 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_NS_LO(event), in lan8814_ptp_set_target()
2940 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_NS_HI(event), in lan8814_ptp_set_target()
2944 static void lan8814_ptp_update_target(struct phy_device *phydev, time64_t sec) in lan8814_ptp_update_target() argument
2946 lan8814_ptp_set_target(phydev, LAN8814_EVENT_A, in lan8814_ptp_update_target()
2948 lan8814_ptp_set_target(phydev, LAN8814_EVENT_B, in lan8814_ptp_update_target()
2952 static void lan8814_ptp_clock_step(struct phy_device *phydev, in lan8814_ptp_clock_step() argument
2964 lan8814_ptp_clock_get(phydev, &set_seconds, &nano_seconds); in lan8814_ptp_clock_step()
2972 lan8814_ptp_clock_set(phydev, set_seconds, nano_seconds); in lan8814_ptp_clock_step()
2973 lan8814_ptp_update_target(phydev, set_seconds); in lan8814_ptp_clock_step()
2979 lan8814_ptp_clock_get(phydev, &set_seconds, &nano_seconds); in lan8814_ptp_clock_step()
2988 lan8814_ptp_clock_set(phydev, set_seconds, nano_seconds); in lan8814_ptp_clock_step()
2989 lan8814_ptp_update_target(phydev, set_seconds); in lan8814_ptp_clock_step()
3038 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
3040 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
3045 lan8814_ptp_clock_get(phydev, &set_seconds, &nsec); in lan8814_ptp_clock_step()
3047 lan8814_ptp_update_target(phydev, set_seconds); in lan8814_ptp_clock_step()
3058 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
3060 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
3064 lan8814_ptp_clock_get(phydev, &set_seconds, &nsec); in lan8814_ptp_clock_step()
3066 lan8814_ptp_update_target(phydev, set_seconds); in lan8814_ptp_clock_step()
3068 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, in lan8814_ptp_clock_step()
3078 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
3080 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
3083 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, in lan8814_ptp_clock_step()
3092 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjtime() local
3095 lan8814_ptp_clock_step(phydev, delta); in lan8814_ptpci_adjtime()
3105 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjfine() local
3125 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_HI, kszphy_rate_adj_hi); in lan8814_ptpci_adjfine()
3126 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_LO, kszphy_rate_adj_lo); in lan8814_ptpci_adjfine()
3132 static void lan8814_ptp_set_reload(struct phy_device *phydev, int event, in lan8814_ptp_set_reload() argument
3135 lanphy_write_page_reg(phydev, 4, in lan8814_ptp_set_reload()
3138 lanphy_write_page_reg(phydev, 4, in lan8814_ptp_set_reload()
3142 lanphy_write_page_reg(phydev, 4, in lan8814_ptp_set_reload()
3145 lanphy_write_page_reg(phydev, 4, in lan8814_ptp_set_reload()
3150 static void lan8814_ptp_enable_event(struct phy_device *phydev, int event, in lan8814_ptp_enable_event() argument
3155 val = lanphy_read_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG); in lan8814_ptp_enable_event()
3165 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG, val); in lan8814_ptp_enable_event()
3168 static void lan8814_ptp_disable_event(struct phy_device *phydev, int event) in lan8814_ptp_disable_event() argument
3173 lan8814_ptp_set_target(phydev, event, 0xFFFFFFFF, 0); in lan8814_ptp_disable_event()
3176 val = lanphy_read_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG); in lan8814_ptp_disable_event()
3178 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG, val); in lan8814_ptp_disable_event()
3181 static void lan8814_ptp_perout_off(struct phy_device *phydev, int pin) in lan8814_ptp_perout_off() argument
3189 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin)); in lan8814_ptp_perout_off()
3191 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin), val); in lan8814_ptp_perout_off()
3193 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); in lan8814_ptp_perout_off()
3195 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), val); in lan8814_ptp_perout_off()
3197 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin)); in lan8814_ptp_perout_off()
3199 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin), val); in lan8814_ptp_perout_off()
3202 static void lan8814_ptp_perout_on(struct phy_device *phydev, int pin) in lan8814_ptp_perout_on() argument
3207 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); in lan8814_ptp_perout_on()
3209 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), val); in lan8814_ptp_perout_on()
3212 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin)); in lan8814_ptp_perout_on()
3214 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin), val); in lan8814_ptp_perout_on()
3217 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin)); in lan8814_ptp_perout_on()
3219 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin), val); in lan8814_ptp_perout_on()
3227 struct phy_device *phydev = shared->phydev; in lan8814_ptp_perout() local
3246 lan8814_ptp_perout_off(phydev, pin); in lan8814_ptp_perout()
3247 lan8814_ptp_disable_event(phydev, event); in lan8814_ptp_perout()
3262 phydev_name(phydev)); in lan8814_ptp_perout()
3269 phydev_name(phydev)); in lan8814_ptp_perout()
3319 phydev_name(phydev)); in lan8814_ptp_perout()
3325 lan8814_ptp_enable_event(phydev, event, pulse_width); in lan8814_ptp_perout()
3326 lan8814_ptp_set_target(phydev, event, rq->perout.start.sec, in lan8814_ptp_perout()
3328 lan8814_ptp_set_reload(phydev, event, rq->perout.period.sec, in lan8814_ptp_perout()
3330 lan8814_ptp_perout_on(phydev, pin); in lan8814_ptp_perout()
3336 static void lan8814_ptp_extts_on(struct phy_device *phydev, int pin, u32 flags) in lan8814_ptp_extts_on() argument
3341 tmp = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); in lan8814_ptp_extts_on()
3343 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), tmp); in lan8814_ptp_extts_on()
3346 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO); in lan8814_ptp_extts_on()
3348 lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO, tmp); in lan8814_ptp_extts_on()
3351 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_EN); in lan8814_ptp_extts_on()
3356 lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_EN, tmp); in lan8814_ptp_extts_on()
3359 tmp = lanphy_read_page_reg(phydev, 4, PTP_COMMON_INT_ENA); in lan8814_ptp_extts_on()
3361 lanphy_write_page_reg(phydev, 4, PTP_COMMON_INT_ENA, tmp); in lan8814_ptp_extts_on()
3364 static void lan8814_ptp_extts_off(struct phy_device *phydev, int pin) in lan8814_ptp_extts_off() argument
3369 tmp = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); in lan8814_ptp_extts_off()
3371 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), tmp); in lan8814_ptp_extts_off()
3374 tmp = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin)); in lan8814_ptp_extts_off()
3376 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin), tmp); in lan8814_ptp_extts_off()
3379 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO); in lan8814_ptp_extts_off()
3381 lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO, tmp); in lan8814_ptp_extts_off()
3384 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_EN); in lan8814_ptp_extts_off()
3387 lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_EN, tmp); in lan8814_ptp_extts_off()
3390 tmp = lanphy_read_page_reg(phydev, 4, PTP_COMMON_INT_ENA); in lan8814_ptp_extts_off()
3392 lanphy_write_page_reg(phydev, 4, PTP_COMMON_INT_ENA, tmp); in lan8814_ptp_extts_off()
3400 struct phy_device *phydev = shared->phydev; in lan8814_ptp_extts() local
3415 lan8814_ptp_extts_on(phydev, pin, rq->extts.flags); in lan8814_ptp_extts()
3417 lan8814_ptp_extts_off(phydev, pin); in lan8814_ptp_extts()
3508 struct phy_device *phydev = ptp_priv->phydev; in lan8814_dequeue_tx_skb() local
3512 lan8814_ptp_tx_ts_get(phydev, &seconds, &nsec, &seq_id); in lan8814_dequeue_tx_skb()
3518 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_tx_ts() local
3527 reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO); in lan8814_get_tx_ts()
3584 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_rx_ts() local
3593 lan8814_ptp_rx_ts_get(phydev, &rx_ts->seconds, &rx_ts->nsec, in lan8814_get_rx_ts()
3600 reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO); in lan8814_get_rx_ts()
3604 static void lan8814_handle_ptp_interrupt(struct phy_device *phydev, u16 status) in lan8814_handle_ptp_interrupt() argument
3606 struct kszphy_priv *priv = phydev->priv; in lan8814_handle_ptp_interrupt()
3616 lan8814_flush_fifo(phydev, true); in lan8814_handle_ptp_interrupt()
3621 lan8814_flush_fifo(phydev, false); in lan8814_handle_ptp_interrupt()
3628 struct phy_device *phydev = shared->phydev; in lan8814_gpio_process_cap() local
3637 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_SEL); in lan8814_gpio_process_cap()
3639 lanphy_write_page_reg(phydev, 4, PTP_GPIO_SEL, tmp); in lan8814_gpio_process_cap()
3641 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_STS); in lan8814_gpio_process_cap()
3647 sec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_SEC_HI_CAP); in lan8814_gpio_process_cap()
3649 sec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_SEC_LO_CAP); in lan8814_gpio_process_cap()
3651 nsec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_NS_HI_CAP) & 0x3fff; in lan8814_gpio_process_cap()
3653 nsec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_NS_LO_CAP); in lan8814_gpio_process_cap()
3655 sec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_FE_LTC_SEC_HI_CAP); in lan8814_gpio_process_cap()
3657 sec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_FE_LTC_SEC_LO_CAP); in lan8814_gpio_process_cap()
3659 nsec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_FE_LTC_NS_HI_CAP) & 0x3fff; in lan8814_gpio_process_cap()
3661 nsec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_NS_LO_CAP); in lan8814_gpio_process_cap()
3672 static int lan8814_handle_gpio_interrupt(struct phy_device *phydev, u16 status) in lan8814_handle_gpio_interrupt() argument
3674 struct lan8814_shared_priv *shared = phy_package_get_priv(phydev); in lan8814_handle_gpio_interrupt()
3684 static int lan8804_config_init(struct phy_device *phydev) in lan8804_config_init() argument
3689 val = lanphy_read_page_reg(phydev, 2, LAN8804_ALIGN_SWAP); in lan8804_config_init()
3692 lanphy_write_page_reg(phydev, 2, LAN8804_ALIGN_SWAP, val); in lan8804_config_init()
3697 lanphy_write_page_reg(phydev, 31, LAN8814_CLOCK_MANAGEMENT, 0x27e); in lan8804_config_init()
3698 lanphy_read_page_reg(phydev, 1, LAN8814_LINK_QUALITY); in lan8804_config_init()
3703 static irqreturn_t lan8804_handle_interrupt(struct phy_device *phydev) in lan8804_handle_interrupt() argument
3707 status = phy_read(phydev, LAN8814_INTS); in lan8804_handle_interrupt()
3709 phy_error(phydev); in lan8804_handle_interrupt()
3714 phy_trigger_machine(phydev); in lan8804_handle_interrupt()
3724 static int lan8804_config_intr(struct phy_device *phydev) in lan8804_config_intr() argument
3733 phy_write(phydev, LAN8804_CONTROL, LAN8804_CONTROL_INTR_POLARITY); in lan8804_config_intr()
3739 phy_write(phydev, LAN8804_OUTPUT_CONTROL, in lan8804_config_intr()
3742 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8804_config_intr()
3743 err = phy_read(phydev, LAN8814_INTS); in lan8804_config_intr()
3747 err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK); in lan8804_config_intr()
3751 err = phy_write(phydev, LAN8814_INTC, 0); in lan8804_config_intr()
3755 err = phy_read(phydev, LAN8814_INTS); in lan8804_config_intr()
3763 static irqreturn_t lan8814_handle_interrupt(struct phy_device *phydev) in lan8814_handle_interrupt() argument
3768 irq_status = phy_read(phydev, LAN8814_INTS); in lan8814_handle_interrupt()
3770 phy_error(phydev); in lan8814_handle_interrupt()
3775 phy_trigger_machine(phydev); in lan8814_handle_interrupt()
3780 irq_status = lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS); in lan8814_handle_interrupt()
3784 lan8814_handle_ptp_interrupt(phydev, irq_status); in lan8814_handle_interrupt()
3788 if (!lan8814_handle_gpio_interrupt(phydev, irq_status)) in lan8814_handle_interrupt()
3794 static int lan8814_ack_interrupt(struct phy_device *phydev) in lan8814_ack_interrupt() argument
3799 rc = phy_read(phydev, LAN8814_INTS); in lan8814_ack_interrupt()
3804 static int lan8814_config_intr(struct phy_device *phydev) in lan8814_config_intr() argument
3808 lanphy_write_page_reg(phydev, 4, LAN8814_INTR_CTRL_REG, in lan8814_config_intr()
3813 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8814_config_intr()
3814 err = lan8814_ack_interrupt(phydev); in lan8814_config_intr()
3818 err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK); in lan8814_config_intr()
3820 err = phy_write(phydev, LAN8814_INTC, 0); in lan8814_config_intr()
3824 err = lan8814_ack_interrupt(phydev); in lan8814_config_intr()
3830 static void lan8814_ptp_init(struct phy_device *phydev) in lan8814_ptp_init() argument
3832 struct kszphy_priv *priv = phydev->priv; in lan8814_ptp_init()
3840 lanphy_write_page_reg(phydev, 5, TSU_HARD_RESET, TSU_HARD_RESET_); in lan8814_ptp_init()
3842 temp = lanphy_read_page_reg(phydev, 5, PTP_TX_MOD); in lan8814_ptp_init()
3844 lanphy_write_page_reg(phydev, 5, PTP_TX_MOD, temp); in lan8814_ptp_init()
3846 temp = lanphy_read_page_reg(phydev, 5, PTP_RX_MOD); in lan8814_ptp_init()
3848 lanphy_write_page_reg(phydev, 5, PTP_RX_MOD, temp); in lan8814_ptp_init()
3850 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_CONFIG, 0); in lan8814_ptp_init()
3851 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_CONFIG, 0); in lan8814_ptp_init()
3854 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_L2_ADDR_EN, 0); in lan8814_ptp_init()
3855 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_L2_ADDR_EN, 0); in lan8814_ptp_init()
3856 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_IP_ADDR_EN, 0); in lan8814_ptp_init()
3857 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_IP_ADDR_EN, 0); in lan8814_ptp_init()
3860 lanphy_write_page_reg(phydev, 5, PTP_RX_VERSION, in lan8814_ptp_init()
3862 lanphy_write_page_reg(phydev, 5, PTP_TX_VERSION, in lan8814_ptp_init()
3870 ptp_priv->phydev = phydev; in lan8814_ptp_init()
3877 phydev->mii_ts = &ptp_priv->mii_ts; in lan8814_ptp_init()
3880 phydev->default_timestamp = true; in lan8814_ptp_init()
3883 static int lan8814_ptp_probe_once(struct phy_device *phydev) in lan8814_ptp_probe_once() argument
3885 struct lan8814_shared_priv *shared = phy_package_get_priv(phydev); in lan8814_ptp_probe_once()
3890 shared->pin_config = devm_kmalloc_array(&phydev->mdio.dev, in lan8814_ptp_probe_once()
3908 snprintf(shared->ptp_clock_info.name, 30, "%s", phydev->drv->name); in lan8814_ptp_probe_once()
3925 &phydev->mdio.dev); in lan8814_ptp_probe_once()
3927 phydev_err(phydev, "ptp_clock_register failed %lu\n", in lan8814_ptp_probe_once()
3936 phydev_dbg(phydev, "successfully registered ptp clock\n"); in lan8814_ptp_probe_once()
3938 shared->phydev = phydev; in lan8814_ptp_probe_once()
3943 lanphy_write_page_reg(phydev, 4, LTC_HARD_RESET, LTC_HARD_RESET_); in lan8814_ptp_probe_once()
3944 lanphy_write_page_reg(phydev, 4, PTP_OPERATING_MODE, in lan8814_ptp_probe_once()
3948 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_ENABLE_); in lan8814_ptp_probe_once()
3953 static void lan8814_setup_led(struct phy_device *phydev, int val) in lan8814_setup_led() argument
3957 temp = lanphy_read_page_reg(phydev, 5, LAN8814_LED_CTRL_1); in lan8814_setup_led()
3964 lanphy_write_page_reg(phydev, 5, LAN8814_LED_CTRL_1, temp); in lan8814_setup_led()
3967 static int lan8814_config_init(struct phy_device *phydev) in lan8814_config_init() argument
3969 struct kszphy_priv *lan8814 = phydev->priv; in lan8814_config_init()
3973 val = lanphy_read_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET); in lan8814_config_init()
3975 lanphy_write_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET, val); in lan8814_config_init()
3978 val = lanphy_read_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG); in lan8814_config_init()
3980 lanphy_write_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG, val); in lan8814_config_init()
3983 val = lanphy_read_page_reg(phydev, 2, LAN8814_ALIGN_SWAP); in lan8814_config_init()
3986 lanphy_write_page_reg(phydev, 2, LAN8814_ALIGN_SWAP, val); in lan8814_config_init()
3989 lan8814_setup_led(phydev, lan8814->led_mode); in lan8814_config_init()
3999 static int lan8814_release_coma_mode(struct phy_device *phydev) in lan8814_release_coma_mode() argument
4003 gpiod = devm_gpiod_get_optional(&phydev->mdio.dev, "coma-mode", in lan8814_release_coma_mode()
4015 static void lan8814_clear_2psp_bit(struct phy_device *phydev) in lan8814_clear_2psp_bit() argument
4023 val = lanphy_read_page_reg(phydev, 2, LAN8814_EEE_STATE); in lan8814_clear_2psp_bit()
4025 lanphy_write_page_reg(phydev, 2, LAN8814_EEE_STATE, val); in lan8814_clear_2psp_bit()
4028 static void lan8814_update_meas_time(struct phy_device *phydev) in lan8814_update_meas_time() argument
4036 val = lanphy_read_page_reg(phydev, 1, LAN8814_PD_CONTROLS); in lan8814_update_meas_time()
4039 lanphy_write_page_reg(phydev, 1, LAN8814_PD_CONTROLS, val); in lan8814_update_meas_time()
4042 static int lan8814_probe(struct phy_device *phydev) in lan8814_probe() argument
4044 const struct kszphy_type *type = phydev->drv->driver_data; in lan8814_probe()
4049 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in lan8814_probe()
4053 phydev->priv = priv; in lan8814_probe()
4057 kszphy_parse_led_mode(phydev); in lan8814_probe()
4062 addr = lanphy_read_page_reg(phydev, 4, 0) & 0x1F; in lan8814_probe()
4063 devm_phy_package_join(&phydev->mdio.dev, phydev, in lan8814_probe()
4066 if (phy_package_init_once(phydev)) { in lan8814_probe()
4067 err = lan8814_release_coma_mode(phydev); in lan8814_probe()
4071 err = lan8814_ptp_probe_once(phydev); in lan8814_probe()
4076 lan8814_ptp_init(phydev); in lan8814_probe()
4079 lan8814_clear_2psp_bit(phydev); in lan8814_probe()
4080 lan8814_update_meas_time(phydev); in lan8814_probe()
4124 static int lan8841_config_init(struct phy_device *phydev) in lan8841_config_init() argument
4128 ret = ksz9131_config_init(phydev); in lan8841_config_init()
4133 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4138 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4144 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4146 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4148 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4150 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4152 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4154 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4158 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4160 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4164 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
4167 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
4174 ret = phy_read_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4177 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
4180 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
4191 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
4196 phy_write_mmd(phydev, MDIO_MMD_PMAPMD, in lan8841_config_init()
4198 phy_write_mmd(phydev, LAN8841_MMD_TIMER_REG, in lan8841_config_init()
4210 static int lan8841_config_intr(struct phy_device *phydev) in lan8841_config_intr() argument
4214 phy_modify(phydev, LAN8841_OUTPUT_CTRL, in lan8841_config_intr()
4217 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8841_config_intr()
4218 err = phy_read(phydev, LAN8814_INTS); in lan8841_config_intr()
4227 err = phy_write(phydev, LAN8814_INTC, in lan8841_config_intr()
4230 err = phy_write(phydev, LAN8814_INTC, 0); in lan8841_config_intr()
4234 err = phy_read(phydev, LAN8814_INTS); in lan8841_config_intr()
4258 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_get_tx_ts() local
4260 *nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_NS_HI); in lan8841_ptp_get_tx_ts()
4265 *nsec = *nsec | phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_NS_LO); in lan8841_ptp_get_tx_ts()
4267 *sec = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_SEC_HI); in lan8841_ptp_get_tx_ts()
4269 *sec = *sec | phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_SEC_LO); in lan8841_ptp_get_tx_ts()
4271 *seq = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_MSG_HEADER2); in lan8841_ptp_get_tx_ts()
4292 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_flush_fifo() local
4296 phy_read_mmd(phydev, 2, LAN8841_PTP_TX_MSG_HEADER2); in lan8841_ptp_flush_fifo()
4298 phy_read_mmd(phydev, 2, LAN8841_PTP_INT_STS); in lan8841_ptp_flush_fifo()
4315 struct phy_device *phydev = ptp_priv->phydev; in lan8841_gpio_process_cap() local
4324 tmp = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_STS); in lan8841_gpio_process_cap()
4328 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_SEL, in lan8841_gpio_process_cap()
4335 sec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_SEC_HI_CAP); in lan8841_gpio_process_cap()
4337 sec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_SEC_LO_CAP); in lan8841_gpio_process_cap()
4339 nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_NS_HI_CAP) & 0x3fff; in lan8841_gpio_process_cap()
4341 nsec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_NS_LO_CAP); in lan8841_gpio_process_cap()
4343 sec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_SEC_HI_CAP); in lan8841_gpio_process_cap()
4345 sec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_SEC_LO_CAP); in lan8841_gpio_process_cap()
4347 nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_NS_HI_CAP) & 0x3fff; in lan8841_gpio_process_cap()
4349 nsec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_NS_LO_CAP); in lan8841_gpio_process_cap()
4352 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_SEL, 0); in lan8841_gpio_process_cap()
4362 static void lan8841_handle_ptp_interrupt(struct phy_device *phydev) in lan8841_handle_ptp_interrupt() argument
4364 struct kszphy_priv *priv = phydev->priv; in lan8841_handle_ptp_interrupt()
4369 status = phy_read_mmd(phydev, 2, LAN8841_PTP_INT_STS); in lan8841_handle_ptp_interrupt()
4389 static irqreturn_t lan8841_handle_interrupt(struct phy_device *phydev) in lan8841_handle_interrupt() argument
4394 irq_status = phy_read(phydev, LAN8814_INTS); in lan8841_handle_interrupt()
4396 phy_error(phydev); in lan8841_handle_interrupt()
4401 phy_trigger_machine(phydev); in lan8841_handle_interrupt()
4406 lan8841_handle_ptp_interrupt(phydev); in lan8841_handle_interrupt()
4448 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_enable_processing() local
4452 phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_enable_processing()
4462 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_ptp_enable_processing()
4472 phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_enable_processing()
4477 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_ptp_enable_processing()
4495 struct phy_device *phydev = ptp_priv->phydev; in lan8841_hwtstamp() local
4540 phy_write_mmd(phydev, 2, LAN8841_PTP_RX_PARSE_CONFIG, rxcfg); in lan8841_hwtstamp()
4541 phy_write_mmd(phydev, 2, LAN8841_PTP_TX_PARSE_CONFIG, txcfg); in lan8841_hwtstamp()
4545 phy_write_mmd(phydev, 2, LAN8841_PTP_RX_TIMESTAMP_EN, pkt_ts_enable); in lan8841_hwtstamp()
4546 phy_write_mmd(phydev, 2, LAN8841_PTP_TX_TIMESTAMP_EN, pkt_ts_enable); in lan8841_hwtstamp()
4549 phy_modify_mmd(phydev, 2, LAN8841_PTP_TX_MOD, in lan8841_hwtstamp()
4620 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_set_target() local
4623 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_SEC_HI(event), in lan8841_ptp_set_target()
4628 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_SEC_LO(event), in lan8841_ptp_set_target()
4633 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_NS_HI(event) & 0x3fff, in lan8841_ptp_set_target()
4638 return phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_NS_LO(event), in lan8841_ptp_set_target()
4659 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_set_reload() local
4662 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_SEC_HI(event), in lan8841_ptp_set_reload()
4667 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_SEC_LO(event), in lan8841_ptp_set_reload()
4672 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_NS_HI(event) & 0x3fff, in lan8841_ptp_set_reload()
4677 return phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_NS_LO(event), in lan8841_ptp_set_reload()
4693 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_settime64() local
4699 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_LO, lower_16_bits(ts->tv_sec)); in lan8841_ptp_settime64()
4700 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_MID, upper_16_bits(ts->tv_sec)); in lan8841_ptp_settime64()
4701 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_HI, upper_32_bits(ts->tv_sec) & 0xffff); in lan8841_ptp_settime64()
4702 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_LO, lower_16_bits(ts->tv_nsec)); in lan8841_ptp_settime64()
4703 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_HI, upper_16_bits(ts->tv_nsec) & 0x3fff); in lan8841_ptp_settime64()
4706 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_settime64()
4730 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_gettime64() local
4736 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_gettime64()
4740 s = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_HI); in lan8841_ptp_gettime64()
4742 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_MID); in lan8841_ptp_gettime64()
4744 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_LO); in lan8841_ptp_gettime64()
4746 ns = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_NS_HI) & 0x3fff; in lan8841_ptp_gettime64()
4748 ns |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_NS_LO); in lan8841_ptp_gettime64()
4760 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_getseconds() local
4765 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_getseconds()
4769 s = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_HI); in lan8841_ptp_getseconds()
4771 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_MID); in lan8841_ptp_getseconds()
4773 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_LO); in lan8841_ptp_getseconds()
4789 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_adjtime() local
4841 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_LO, sec); in lan8841_ptp_adjtime()
4842 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_HI, in lan8841_ptp_adjtime()
4844 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_adjtime()
4849 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_LO, in lan8841_ptp_adjtime()
4851 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_HI, in lan8841_ptp_adjtime()
4853 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_adjtime()
4875 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_adjfine() local
4891 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_RATE_ADJ_HI, in lan8841_ptp_adjfine()
4894 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_RATE_ADJ_LO, lower_16_bits(rate)); in lan8841_ptp_adjfine()
4922 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout_off() local
4925 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_perout_off()
4929 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DIR, BIT(pin)); in lan8841_ptp_perout_off()
4933 return phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_perout_off()
4938 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout_on() local
4941 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_perout_on()
4945 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DIR, BIT(pin)); in lan8841_ptp_perout_on()
4949 return phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_perout_on()
4968 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_remove_event() local
4978 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL1, tmp); in lan8841_ptp_remove_event()
4981 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL2, tmp); in lan8841_ptp_remove_event()
4993 return phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, tmp); in lan8841_ptp_remove_event()
4999 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_enable_event() local
5005 ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GENERAL_CONFIG, in lan8841_ptp_enable_event()
5011 ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GENERAL_CONFIG, in lan8841_ptp_enable_event()
5029 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL1, in lan8841_ptp_enable_event()
5032 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL2, in lan8841_ptp_enable_event()
5058 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout() local
5090 phydev_name(phydev)); in lan8841_ptp_perout()
5096 phydev_name(phydev)); in lan8841_ptp_perout()
5145 phydev_name(phydev)); in lan8841_ptp_perout()
5182 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_extts_on() local
5187 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_extts_on()
5191 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_extts_on()
5200 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_EN, tmp); in lan8841_ptp_extts_on()
5205 return phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_extts_on()
5212 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_extts_off() local
5216 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_extts_off()
5220 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_extts_off()
5225 ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_EN, in lan8841_ptp_extts_off()
5233 return phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_extts_off()
5316 static int lan8841_probe(struct phy_device *phydev) in lan8841_probe() argument
5322 err = kszphy_probe(phydev); in lan8841_probe()
5326 if (phy_read_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_probe()
5329 phydev->interface = PHY_INTERFACE_MODE_RGMII_RXID; in lan8841_probe()
5335 priv = phydev->priv; in lan8841_probe()
5338 ptp_priv->pin_config = devm_kcalloc(&phydev->mdio.dev, in lan8841_probe()
5356 &phydev->mdio.dev); in lan8841_probe()
5358 phydev_err(phydev, "ptp_clock_register failed: %lu\n", in lan8841_probe()
5368 ptp_priv->phydev = phydev; in lan8841_probe()
5377 phydev->mii_ts = &ptp_priv->mii_ts; in lan8841_probe()
5380 phydev->default_timestamp = true; in lan8841_probe()
5385 static int lan8804_resume(struct phy_device *phydev) in lan8804_resume() argument
5387 return kszphy_resume(phydev); in lan8804_resume()
5390 static int lan8804_suspend(struct phy_device *phydev) in lan8804_suspend() argument
5392 return kszphy_generic_suspend(phydev); in lan8804_suspend()
5395 static int lan8841_resume(struct phy_device *phydev) in lan8841_resume() argument
5397 return kszphy_generic_resume(phydev); in lan8841_resume()
5400 static int lan8841_suspend(struct phy_device *phydev) in lan8841_suspend() argument
5402 struct kszphy_priv *priv = phydev->priv; in lan8841_suspend()
5408 return kszphy_generic_suspend(phydev); in lan8841_suspend()