Lines Matching full:phydev

389 	struct phy_device *phydev;  member
407 struct phy_device *phydev; member
501 static int kszphy_extended_write(struct phy_device *phydev, in kszphy_extended_write() argument
504 phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum); in kszphy_extended_write()
505 return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val); in kszphy_extended_write()
508 static int kszphy_extended_read(struct phy_device *phydev, in kszphy_extended_read() argument
511 phy_write(phydev, MII_KSZPHY_EXTREG, regnum); in kszphy_extended_read()
512 return phy_read(phydev, MII_KSZPHY_EXTREG_READ); in kszphy_extended_read()
515 static int kszphy_ack_interrupt(struct phy_device *phydev) in kszphy_ack_interrupt() argument
520 rc = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_ack_interrupt()
525 static int kszphy_config_intr(struct phy_device *phydev) in kszphy_config_intr() argument
527 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
537 temp = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_config_intr()
541 phy_write(phydev, MII_KSZPHY_CTRL, temp); in kszphy_config_intr()
544 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in kszphy_config_intr()
545 err = kszphy_ack_interrupt(phydev); in kszphy_config_intr()
549 err = phy_write(phydev, MII_KSZPHY_INTCS, KSZPHY_INTCS_ALL); in kszphy_config_intr()
551 err = phy_write(phydev, MII_KSZPHY_INTCS, 0); in kszphy_config_intr()
555 err = kszphy_ack_interrupt(phydev); in kszphy_config_intr()
561 static irqreturn_t kszphy_handle_interrupt(struct phy_device *phydev) in kszphy_handle_interrupt() argument
565 irq_status = phy_read(phydev, MII_KSZPHY_INTCS); in kszphy_handle_interrupt()
567 phy_error(phydev); in kszphy_handle_interrupt()
574 phy_trigger_machine(phydev); in kszphy_handle_interrupt()
579 static int kszphy_rmii_clk_sel(struct phy_device *phydev, bool val) in kszphy_rmii_clk_sel() argument
583 ctrl = phy_read(phydev, MII_KSZPHY_CTRL); in kszphy_rmii_clk_sel()
592 return phy_write(phydev, MII_KSZPHY_CTRL, ctrl); in kszphy_rmii_clk_sel()
595 static int kszphy_setup_led(struct phy_device *phydev, u32 reg, int val) in kszphy_setup_led() argument
610 temp = phy_read(phydev, reg); in kszphy_setup_led()
618 rc = phy_write(phydev, reg, temp); in kszphy_setup_led()
621 phydev_err(phydev, "failed to set led mode\n"); in kszphy_setup_led()
629 static int kszphy_broadcast_disable(struct phy_device *phydev) in kszphy_broadcast_disable() argument
633 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_broadcast_disable()
637 ret = phy_write(phydev, MII_KSZPHY_OMSO, ret | KSZPHY_OMSO_B_CAST_OFF); in kszphy_broadcast_disable()
640 phydev_err(phydev, "failed to disable broadcast address\n"); in kszphy_broadcast_disable()
645 static int kszphy_nand_tree_disable(struct phy_device *phydev) in kszphy_nand_tree_disable() argument
649 ret = phy_read(phydev, MII_KSZPHY_OMSO); in kszphy_nand_tree_disable()
656 ret = phy_write(phydev, MII_KSZPHY_OMSO, in kszphy_nand_tree_disable()
660 phydev_err(phydev, "failed to disable NAND tree mode\n"); in kszphy_nand_tree_disable()
666 static int kszphy_config_reset(struct phy_device *phydev) in kszphy_config_reset() argument
668 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
672 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
674 phydev_err(phydev, in kszphy_config_reset()
681 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
686 static int kszphy_config_init(struct phy_device *phydev) in kszphy_config_init() argument
688 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
697 kszphy_broadcast_disable(phydev); in kszphy_config_init()
700 kszphy_nand_tree_disable(phydev); in kszphy_config_init()
702 return kszphy_config_reset(phydev); in kszphy_config_init()
705 static int ksz8041_fiber_mode(struct phy_device *phydev) in ksz8041_fiber_mode() argument
707 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_fiber_mode()
712 static int ksz8041_config_init(struct phy_device *phydev) in ksz8041_config_init() argument
717 if (ksz8041_fiber_mode(phydev)) { in ksz8041_config_init()
718 phydev->dev_flags |= MICREL_PHY_FXEN; in ksz8041_config_init()
722 linkmode_and(phydev->supported, phydev->supported, mask); in ksz8041_config_init()
724 phydev->supported); in ksz8041_config_init()
725 linkmode_and(phydev->advertising, phydev->advertising, mask); in ksz8041_config_init()
727 phydev->advertising); in ksz8041_config_init()
728 phydev->autoneg = AUTONEG_DISABLE; in ksz8041_config_init()
731 return kszphy_config_init(phydev); in ksz8041_config_init()
734 static int ksz8041_config_aneg(struct phy_device *phydev) in ksz8041_config_aneg() argument
737 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
738 phydev->speed = SPEED_100; in ksz8041_config_aneg()
742 return genphy_config_aneg(phydev); in ksz8041_config_aneg()
745 static int ksz8051_ksz8795_match_phy_device(struct phy_device *phydev, in ksz8051_ksz8795_match_phy_device() argument
750 if (!phy_id_compare(phydev->phy_id, PHY_ID_KSZ8051, MICREL_PHY_ID_MASK)) in ksz8051_ksz8795_match_phy_device()
753 ret = phy_read(phydev, MII_BMSR); in ksz8051_ksz8795_match_phy_device()
769 static int ksz8051_match_phy_device(struct phy_device *phydev) in ksz8051_match_phy_device() argument
771 return ksz8051_ksz8795_match_phy_device(phydev, true); in ksz8051_match_phy_device()
774 static int ksz8081_config_init(struct phy_device *phydev) in ksz8081_config_init() argument
781 phy_clear_bits(phydev, MII_KSZPHY_OMSO, KSZPHY_OMSO_FACTORY_TEST); in ksz8081_config_init()
783 return kszphy_config_init(phydev); in ksz8081_config_init()
786 static int ksz8081_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz8081_config_mdix() argument
805 return phy_modify(phydev, MII_KSZPHY_CTRL_2, in ksz8081_config_mdix()
812 static int ksz8081_config_aneg(struct phy_device *phydev) in ksz8081_config_aneg() argument
816 ret = genphy_config_aneg(phydev); in ksz8081_config_aneg()
824 return ksz8081_config_mdix(phydev, phydev->mdix_ctrl); in ksz8081_config_aneg()
827 static int ksz8081_mdix_update(struct phy_device *phydev) in ksz8081_mdix_update() argument
831 ret = phy_read(phydev, MII_KSZPHY_CTRL_2); in ksz8081_mdix_update()
837 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz8081_mdix_update()
839 phydev->mdix_ctrl = ETH_TP_MDI; in ksz8081_mdix_update()
841 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz8081_mdix_update()
844 ret = phy_read(phydev, MII_KSZPHY_CTRL_1); in ksz8081_mdix_update()
849 phydev->mdix = ETH_TP_MDI; in ksz8081_mdix_update()
851 phydev->mdix = ETH_TP_MDI_X; in ksz8081_mdix_update()
856 static int ksz8081_read_status(struct phy_device *phydev) in ksz8081_read_status() argument
860 ret = ksz8081_mdix_update(phydev); in ksz8081_read_status()
864 return genphy_read_status(phydev); in ksz8081_read_status()
867 static int ksz8061_config_init(struct phy_device *phydev) in ksz8061_config_init() argument
872 ret = phy_read(phydev, MII_BMCR); in ksz8061_config_init()
876 ret = phy_write(phydev, MII_BMCR, ret & ~BMCR_PDOWN); in ksz8061_config_init()
882 ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); in ksz8061_config_init()
886 return kszphy_config_init(phydev); in ksz8061_config_init()
889 static int ksz8795_match_phy_device(struct phy_device *phydev) in ksz8795_match_phy_device() argument
891 return ksz8051_ksz8795_match_phy_device(phydev, false); in ksz8795_match_phy_device()
894 static int ksz9021_load_values_from_of(struct phy_device *phydev, in ksz9021_load_values_from_of() argument
923 newval = kszphy_extended_read(phydev, reg); in ksz9021_load_values_from_of()
939 return kszphy_extended_write(phydev, reg, newval); in ksz9021_load_values_from_of()
942 static int ksz9021_config_init(struct phy_device *phydev) in ksz9021_config_init() argument
951 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
959 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
963 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
967 ksz9021_load_values_from_of(phydev, of_node, in ksz9021_config_init()
1033 static int ksz9031_of_load_skew_values(struct phy_device *phydev, in ksz9031_of_load_skew_values() argument
1056 newval = phy_read_mmd(phydev, 2, reg); in ksz9031_of_load_skew_values()
1070 return phy_write_mmd(phydev, 2, reg, newval); in ksz9031_of_load_skew_values()
1074 static int ksz9031_center_flp_timing(struct phy_device *phydev) in ksz9031_center_flp_timing() argument
1078 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_HI, in ksz9031_center_flp_timing()
1083 result = phy_write_mmd(phydev, 0, MII_KSZ9031RN_FLP_BURST_TX_LO, in ksz9031_center_flp_timing()
1088 return genphy_restart_aneg(phydev); in ksz9031_center_flp_timing()
1092 static int ksz9031_enable_edpd(struct phy_device *phydev) in ksz9031_enable_edpd() argument
1096 reg = phy_read_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD); in ksz9031_enable_edpd()
1099 return phy_write_mmd(phydev, 0x1C, MII_KSZ9031RN_EDPD, in ksz9031_enable_edpd()
1103 static int ksz9031_config_rgmii_delay(struct phy_device *phydev) in ksz9031_config_rgmii_delay() argument
1108 switch (phydev->interface) { in ksz9031_config_rgmii_delay()
1137 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_CONTROL_PAD_SKEW, in ksz9031_config_rgmii_delay()
1143 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_RX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
1151 ret = phy_write_mmd(phydev, 2, MII_KSZ9031RN_TX_DATA_PAD_SKEW, in ksz9031_config_rgmii_delay()
1159 return phy_write_mmd(phydev, 2, MII_KSZ9031RN_CLK_PAD_SKEW, in ksz9031_config_rgmii_delay()
1164 static int ksz9031_config_init(struct phy_device *phydev) in ksz9031_config_init() argument
1180 result = ksz9031_enable_edpd(phydev); in ksz9031_config_init()
1188 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
1197 if (phy_interface_is_rgmii(phydev)) { in ksz9031_config_init()
1198 result = ksz9031_config_rgmii_delay(phydev); in ksz9031_config_init()
1203 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1207 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1211 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1215 ksz9031_of_load_skew_values(phydev, of_node, in ksz9031_config_init()
1219 if (update && !phy_interface_is_rgmii(phydev)) in ksz9031_config_init()
1220 phydev_warn(phydev, in ksz9031_config_init()
1239 result = phy_read(phydev, MII_CTRL1000); in ksz9031_config_init()
1245 result = phy_write(phydev, MII_CTRL1000, result); in ksz9031_config_init()
1251 return ksz9031_center_flp_timing(phydev); in ksz9031_config_init()
1254 phydev_err(phydev, "failed to force the phy to master mode\n"); in ksz9031_config_init()
1263 static int ksz9131_of_load_skew_values(struct phy_device *phydev, in ksz9131_of_load_skew_values() argument
1298 newval = phy_read_mmd(phydev, 2, reg); in ksz9131_of_load_skew_values()
1312 return phy_write_mmd(phydev, 2, reg, newval); in ksz9131_of_load_skew_values()
1320 static int ksz9131_config_rgmii_delay(struct phy_device *phydev) in ksz9131_config_rgmii_delay() argument
1322 const struct kszphy_type *type = phydev->drv->driver_data; in ksz9131_config_rgmii_delay()
1326 switch (phydev->interface) { in ksz9131_config_rgmii_delay()
1347 ret = phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
1353 return phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in ksz9131_config_rgmii_delay()
1364 static int ksz9131_led_errata(struct phy_device *phydev) in ksz9131_led_errata() argument
1368 reg = phy_read_mmd(phydev, 2, 0); in ksz9131_led_errata()
1375 return phy_set_bits(phydev, 0x1e, BIT(9)); in ksz9131_led_errata()
1378 static int ksz9131_config_init(struct phy_device *phydev) in ksz9131_config_init() argument
1394 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz9131_config_init()
1396 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
1405 if (phy_interface_is_rgmii(phydev)) { in ksz9131_config_init()
1406 ret = ksz9131_config_rgmii_delay(phydev); in ksz9131_config_init()
1411 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1417 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1423 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1429 ret = ksz9131_of_load_skew_values(phydev, of_node, in ksz9131_config_init()
1435 ret = ksz9131_led_errata(phydev); in ksz9131_config_init()
1449 static int ksz9131_mdix_update(struct phy_device *phydev) in ksz9131_mdix_update() argument
1453 if (phydev->mdix_ctrl != ETH_TP_MDI_AUTO) { in ksz9131_mdix_update()
1454 phydev->mdix = phydev->mdix_ctrl; in ksz9131_mdix_update()
1456 ret = phy_read(phydev, MII_KSZ9131_DIG_AXAN_STS); in ksz9131_mdix_update()
1462 phydev->mdix = ETH_TP_MDI; in ksz9131_mdix_update()
1464 phydev->mdix = ETH_TP_MDI_X; in ksz9131_mdix_update()
1466 phydev->mdix = ETH_TP_MDI_INVALID; in ksz9131_mdix_update()
1473 static int ksz9131_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz9131_config_mdix() argument
1492 return phy_modify(phydev, MII_KSZ9131_AUTO_MDIX, in ksz9131_config_mdix()
1497 static int ksz9131_read_status(struct phy_device *phydev) in ksz9131_read_status() argument
1501 ret = ksz9131_mdix_update(phydev); in ksz9131_read_status()
1505 return genphy_read_status(phydev); in ksz9131_read_status()
1508 static int ksz9131_config_aneg(struct phy_device *phydev) in ksz9131_config_aneg() argument
1512 ret = ksz9131_config_mdix(phydev, phydev->mdix_ctrl); in ksz9131_config_aneg()
1516 return genphy_config_aneg(phydev); in ksz9131_config_aneg()
1519 static int ksz9477_get_features(struct phy_device *phydev) in ksz9477_get_features() argument
1523 ret = genphy_read_abilities(phydev); in ksz9477_get_features()
1533 linkmode_and(phydev->supported_eee, phydev->supported, in ksz9477_get_features()
1542 static int ksz8873mll_read_status(struct phy_device *phydev) in ksz8873mll_read_status() argument
1547 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
1549 regval = phy_read(phydev, KSZ8873MLL_GLOBAL_CONTROL_4); in ksz8873mll_read_status()
1552 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
1554 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
1557 phydev->speed = SPEED_10; in ksz8873mll_read_status()
1559 phydev->speed = SPEED_100; in ksz8873mll_read_status()
1561 phydev->link = 1; in ksz8873mll_read_status()
1562 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
1567 static int ksz9031_get_features(struct phy_device *phydev) in ksz9031_get_features() argument
1571 ret = genphy_read_abilities(phydev); in ksz9031_get_features()
1584 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
1589 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
1594 static int ksz9031_read_status(struct phy_device *phydev) in ksz9031_read_status() argument
1599 err = genphy_read_status(phydev); in ksz9031_read_status()
1606 regval = phy_read(phydev, MII_STAT1000); in ksz9031_read_status()
1608 phy_init_hw(phydev); in ksz9031_read_status()
1609 phydev->link = 0; in ksz9031_read_status()
1610 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
1611 phydev->drv->config_intr(phydev); in ksz9031_read_status()
1612 return genphy_config_aneg(phydev); in ksz9031_read_status()
1618 static int ksz9x31_cable_test_start(struct phy_device *phydev) in ksz9x31_cable_test_start() argument
1620 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_start()
1628 ret = phy_modify(phydev, MII_BMCR, in ksz9x31_cable_test_start()
1640 ret = phy_read(phydev, MII_CTRL1000); in ksz9x31_cable_test_start()
1649 return phy_write(phydev, MII_CTRL1000, ret); in ksz9x31_cable_test_start()
1686 static int ksz9x31_cable_test_fault_length(struct phy_device *phydev, u16 stat) in ksz9x31_cable_test_fault_length() argument
1694 if (phydev_id_compare(phydev, PHY_ID_KSZ9131)) in ksz9x31_cable_test_fault_length()
1700 static int ksz9x31_cable_test_wait_for_completion(struct phy_device *phydev) in ksz9x31_cable_test_wait_for_completion() argument
1704 ret = phy_read_poll_timeout(phydev, KSZ9x31_LMD, val, in ksz9x31_cable_test_wait_for_completion()
1723 static int ksz9x31_cable_test_one_pair(struct phy_device *phydev, int pair) in ksz9x31_cable_test_one_pair() argument
1734 ret = phy_write(phydev, KSZ9x31_LMD, in ksz9x31_cable_test_one_pair()
1739 ret = ksz9x31_cable_test_wait_for_completion(phydev); in ksz9x31_cable_test_one_pair()
1743 val = phy_read(phydev, KSZ9x31_LMD); in ksz9x31_cable_test_one_pair()
1750 ret = ethnl_cable_test_result(phydev, in ksz9x31_cable_test_one_pair()
1759 return ethnl_cable_test_fault_length(phydev, in ksz9x31_cable_test_one_pair()
1761 ksz9x31_cable_test_fault_length(phydev, val)); in ksz9x31_cable_test_one_pair()
1764 static int ksz9x31_cable_test_get_status(struct phy_device *phydev, in ksz9x31_cable_test_get_status() argument
1767 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_get_status()
1777 ret = ksz9x31_cable_test_one_pair(phydev, pair); in ksz9x31_cable_test_get_status()
1794 ret = ethnl_cable_test_result(phydev, in ksz9x31_cable_test_get_status()
1802 rv = phy_modify(phydev, MII_CTRL1000, in ksz9x31_cable_test_get_status()
1811 static int ksz8873mll_config_aneg(struct phy_device *phydev) in ksz8873mll_config_aneg() argument
1816 static int ksz886x_config_mdix(struct phy_device *phydev, u8 ctrl) in ksz886x_config_mdix() argument
1840 return phy_modify(phydev, MII_BMCR, in ksz886x_config_mdix()
1846 static int ksz886x_config_aneg(struct phy_device *phydev) in ksz886x_config_aneg() argument
1850 ret = genphy_config_aneg(phydev); in ksz886x_config_aneg()
1854 if (phydev->autoneg != AUTONEG_ENABLE) { in ksz886x_config_aneg()
1861 ret = phy_set_bits(phydev, MII_KSZPHY_CTRL, in ksz886x_config_aneg()
1870 ret = phy_clear_bits(phydev, MII_KSZPHY_CTRL, in ksz886x_config_aneg()
1880 return ksz886x_config_mdix(phydev, phydev->mdix_ctrl); in ksz886x_config_aneg()
1883 static int ksz886x_mdix_update(struct phy_device *phydev) in ksz886x_mdix_update() argument
1887 ret = phy_read(phydev, MII_BMCR); in ksz886x_mdix_update()
1893 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz886x_mdix_update()
1895 phydev->mdix_ctrl = ETH_TP_MDI; in ksz886x_mdix_update()
1897 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz886x_mdix_update()
1900 ret = phy_read(phydev, MII_KSZPHY_CTRL); in ksz886x_mdix_update()
1906 phydev->mdix = ETH_TP_MDI_X; in ksz886x_mdix_update()
1908 phydev->mdix = ETH_TP_MDI; in ksz886x_mdix_update()
1913 static int ksz886x_read_status(struct phy_device *phydev) in ksz886x_read_status() argument
1917 ret = ksz886x_mdix_update(phydev); in ksz886x_read_status()
1921 return genphy_read_status(phydev); in ksz886x_read_status()
1959 static int ksz9477_phy_errata(struct phy_device *phydev) in ksz9477_phy_errata() argument
1975 err = phy_write(phydev, MII_BMCR, BMCR_SPEED100 | BMCR_FULLDPLX); in ksz9477_phy_errata()
1982 err = phy_write_mmd(phydev, errata->dev_addr, errata->reg_addr, errata->val); in ksz9477_phy_errata()
1987 err = genphy_restart_aneg(phydev); in ksz9477_phy_errata()
1994 static int ksz9477_config_init(struct phy_device *phydev) in ksz9477_config_init() argument
1999 if ((phydev->phy_id & 0xf) == 1) { in ksz9477_config_init()
2000 err = ksz9477_phy_errata(phydev); in ksz9477_config_init()
2008 if (phydev->dev_flags & MICREL_NO_EEE) in ksz9477_config_init()
2009 phy_disable_eee(phydev); in ksz9477_config_init()
2011 return kszphy_config_init(phydev); in ksz9477_config_init()
2014 static int kszphy_get_sset_count(struct phy_device *phydev) in kszphy_get_sset_count() argument
2019 static void kszphy_get_strings(struct phy_device *phydev, u8 *data) in kszphy_get_strings() argument
2027 static u64 kszphy_get_stat(struct phy_device *phydev, int i) in kszphy_get_stat() argument
2030 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
2034 val = phy_read(phydev, stat.reg); in kszphy_get_stat()
2046 static void kszphy_get_stats(struct phy_device *phydev, in kszphy_get_stats() argument
2052 data[i] = kszphy_get_stat(phydev, i); in kszphy_get_stats()
2055 static void kszphy_enable_clk(struct phy_device *phydev) in kszphy_enable_clk() argument
2057 struct kszphy_priv *priv = phydev->priv; in kszphy_enable_clk()
2065 static void kszphy_disable_clk(struct phy_device *phydev) in kszphy_disable_clk() argument
2067 struct kszphy_priv *priv = phydev->priv; in kszphy_disable_clk()
2075 static int kszphy_generic_resume(struct phy_device *phydev) in kszphy_generic_resume() argument
2077 kszphy_enable_clk(phydev); in kszphy_generic_resume()
2079 return genphy_resume(phydev); in kszphy_generic_resume()
2082 static int kszphy_generic_suspend(struct phy_device *phydev) in kszphy_generic_suspend() argument
2086 ret = genphy_suspend(phydev); in kszphy_generic_suspend()
2090 kszphy_disable_clk(phydev); in kszphy_generic_suspend()
2095 static int kszphy_suspend(struct phy_device *phydev) in kszphy_suspend() argument
2098 if (phy_interrupt_is_valid(phydev)) { in kszphy_suspend()
2099 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
2100 if (phydev->drv->config_intr) in kszphy_suspend()
2101 phydev->drv->config_intr(phydev); in kszphy_suspend()
2104 return kszphy_generic_suspend(phydev); in kszphy_suspend()
2107 static void kszphy_parse_led_mode(struct phy_device *phydev) in kszphy_parse_led_mode() argument
2109 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_parse_led_mode()
2110 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_parse_led_mode()
2111 struct kszphy_priv *priv = phydev->priv; in kszphy_parse_led_mode()
2122 phydev_err(phydev, "invalid led mode: 0x%02x\n", in kszphy_parse_led_mode()
2131 static int kszphy_resume(struct phy_device *phydev) in kszphy_resume() argument
2135 ret = kszphy_generic_resume(phydev); in kszphy_resume()
2145 ret = kszphy_config_reset(phydev); in kszphy_resume()
2150 if (phy_interrupt_is_valid(phydev)) { in kszphy_resume()
2151 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
2152 if (phydev->drv->config_intr) in kszphy_resume()
2153 phydev->drv->config_intr(phydev); in kszphy_resume()
2163 static int ksz8041_resume(struct phy_device *phydev) in ksz8041_resume() argument
2165 kszphy_enable_clk(phydev); in ksz8041_resume()
2170 static int ksz8041_suspend(struct phy_device *phydev) in ksz8041_suspend() argument
2172 kszphy_disable_clk(phydev); in ksz8041_suspend()
2177 static int ksz9477_resume(struct phy_device *phydev) in ksz9477_resume() argument
2182 ret = phy_read(phydev, MII_BMCR); in ksz9477_resume()
2188 genphy_resume(phydev); in ksz9477_resume()
2197 if ((phydev->phy_id & 0xf) == 1) { in ksz9477_resume()
2198 ret = ksz9477_phy_errata(phydev); in ksz9477_resume()
2204 if (phy_interrupt_is_valid(phydev)) { in ksz9477_resume()
2205 phydev->interrupts = PHY_INTERRUPT_ENABLED; in ksz9477_resume()
2206 if (phydev->drv->config_intr) in ksz9477_resume()
2207 phydev->drv->config_intr(phydev); in ksz9477_resume()
2213 static int ksz8061_resume(struct phy_device *phydev) in ksz8061_resume() argument
2218 ret = phy_read(phydev, MII_BMCR); in ksz8061_resume()
2224 ret = kszphy_generic_resume(phydev); in ksz8061_resume()
2231 ret = phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_DEVID1, 0xB61A); in ksz8061_resume()
2236 if (phy_interrupt_is_valid(phydev)) { in ksz8061_resume()
2237 phydev->interrupts = PHY_INTERRUPT_ENABLED; in ksz8061_resume()
2238 if (phydev->drv->config_intr) in ksz8061_resume()
2239 phydev->drv->config_intr(phydev); in ksz8061_resume()
2245 static int ksz8061_suspend(struct phy_device *phydev) in ksz8061_suspend() argument
2247 return kszphy_suspend(phydev); in ksz8061_suspend()
2250 static int kszphy_probe(struct phy_device *phydev) in kszphy_probe() argument
2252 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
2253 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
2257 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
2261 phydev->priv = priv; in kszphy_probe()
2265 kszphy_parse_led_mode(phydev); in kszphy_probe()
2267 clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
2283 phydev_err(phydev, "Clock rate out of range: %ld\n", in kszphy_probe()
2289 clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, NULL); in kszphy_probe()
2298 if (ksz8041_fiber_mode(phydev)) in kszphy_probe()
2299 phydev->port = PORT_FIBRE; in kszphy_probe()
2302 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()
2310 static int lan8814_cable_test_start(struct phy_device *phydev) in lan8814_cable_test_start() argument
2317 return phy_modify(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100, in lan8814_cable_test_start()
2321 static int ksz886x_cable_test_start(struct phy_device *phydev) in ksz886x_cable_test_start() argument
2323 if (phydev->dev_flags & MICREL_KSZ8_P1_ERRATA) in ksz886x_cable_test_start()
2331 return phy_clear_bits(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_SPEED100); in ksz886x_cable_test_start()
2367 static __always_inline int ksz886x_cable_test_fault_length(struct phy_device *phydev, in ksz886x_cable_test_fault_length() argument
2378 if (phydev_id_compare(phydev, PHY_ID_LAN8814)) in ksz886x_cable_test_fault_length()
2384 static int ksz886x_cable_test_wait_for_completion(struct phy_device *phydev) in ksz886x_cable_test_wait_for_completion() argument
2386 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_wait_for_completion()
2389 ret = phy_read_poll_timeout(phydev, type->cable_diag_reg, val, in ksz886x_cable_test_wait_for_completion()
2396 static int lan8814_cable_test_one_pair(struct phy_device *phydev, int pair) in lan8814_cable_test_one_pair() argument
2410 ret = phy_write(phydev, LAN8814_CABLE_DIAG, val); in lan8814_cable_test_one_pair()
2414 ret = ksz886x_cable_test_wait_for_completion(phydev); in lan8814_cable_test_one_pair()
2418 val = phy_read(phydev, LAN8814_CABLE_DIAG); in lan8814_cable_test_one_pair()
2425 ret = ethnl_cable_test_result(phydev, ethtool_pair[pair], in lan8814_cable_test_one_pair()
2435 fault_length = ksz886x_cable_test_fault_length(phydev, val, in lan8814_cable_test_one_pair()
2438 return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], fault_length); in lan8814_cable_test_one_pair()
2441 static int ksz886x_cable_test_one_pair(struct phy_device *phydev, int pair) in ksz886x_cable_test_one_pair() argument
2458 switch (phydev->phy_id & MICREL_PHY_ID_MASK) { in ksz886x_cable_test_one_pair()
2460 ret = ksz8081_config_mdix(phydev, mdix); in ksz886x_cable_test_one_pair()
2463 ret = ksz886x_config_mdix(phydev, mdix); in ksz886x_cable_test_one_pair()
2475 ret = phy_write(phydev, KSZ8081_LMD, KSZ8081_LMD_ENABLE_TEST); in ksz886x_cable_test_one_pair()
2479 ret = ksz886x_cable_test_wait_for_completion(phydev); in ksz886x_cable_test_one_pair()
2483 val = phy_read(phydev, KSZ8081_LMD); in ksz886x_cable_test_one_pair()
2490 ret = ethnl_cable_test_result(phydev, ethtool_pair[pair], in ksz886x_cable_test_one_pair()
2498 fault_length = ksz886x_cable_test_fault_length(phydev, val, KSZ8081_LMD_DELTA_TIME_MASK); in ksz886x_cable_test_one_pair()
2500 return ethnl_cable_test_fault_length(phydev, ethtool_pair[pair], fault_length); in ksz886x_cable_test_one_pair()
2503 static int ksz886x_cable_test_get_status(struct phy_device *phydev, in ksz886x_cable_test_get_status() argument
2506 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_get_status()
2518 ret = lan8814_cable_test_one_pair(phydev, pair); in ksz886x_cable_test_get_status()
2520 ret = ksz886x_cable_test_one_pair(phydev, pair); in ksz886x_cable_test_get_status()
2558 static int lanphy_read_page_reg(struct phy_device *phydev, int page, u32 addr) in lanphy_read_page_reg() argument
2562 phy_lock_mdio_bus(phydev); in lanphy_read_page_reg()
2563 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page); in lanphy_read_page_reg()
2564 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr); in lanphy_read_page_reg()
2565 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, in lanphy_read_page_reg()
2567 data = __phy_read(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA); in lanphy_read_page_reg()
2568 phy_unlock_mdio_bus(phydev); in lanphy_read_page_reg()
2573 static int lanphy_write_page_reg(struct phy_device *phydev, int page, u16 addr, in lanphy_write_page_reg() argument
2576 phy_lock_mdio_bus(phydev); in lanphy_write_page_reg()
2577 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, page); in lanphy_write_page_reg()
2578 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, addr); in lanphy_write_page_reg()
2579 __phy_write(phydev, LAN_EXT_PAGE_ACCESS_CONTROL, in lanphy_write_page_reg()
2582 val = __phy_write(phydev, LAN_EXT_PAGE_ACCESS_ADDRESS_DATA, val); in lanphy_write_page_reg()
2584 phydev_err(phydev, "Error: phy_write has returned error %d\n", in lanphy_write_page_reg()
2586 phy_unlock_mdio_bus(phydev); in lanphy_write_page_reg()
2590 static int lan8814_config_ts_intr(struct phy_device *phydev, bool enable) in lan8814_config_ts_intr() argument
2600 return lanphy_write_page_reg(phydev, 5, PTP_TSU_INT_EN, val); in lan8814_config_ts_intr()
2603 static void lan8814_ptp_rx_ts_get(struct phy_device *phydev, in lan8814_ptp_rx_ts_get() argument
2606 *seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_HI); in lan8814_ptp_rx_ts_get()
2608 lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_LO); in lan8814_ptp_rx_ts_get()
2610 *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_HI); in lan8814_ptp_rx_ts_get()
2612 lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_NS_LO); in lan8814_ptp_rx_ts_get()
2614 *seq_id = lanphy_read_page_reg(phydev, 5, PTP_RX_MSG_HEADER2); in lan8814_ptp_rx_ts_get()
2617 static void lan8814_ptp_tx_ts_get(struct phy_device *phydev, in lan8814_ptp_tx_ts_get() argument
2620 *seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_HI); in lan8814_ptp_tx_ts_get()
2622 lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_LO); in lan8814_ptp_tx_ts_get()
2624 *nano_seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_HI); in lan8814_ptp_tx_ts_get()
2626 lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_NS_LO); in lan8814_ptp_tx_ts_get()
2628 *seq_id = lanphy_read_page_reg(phydev, 5, PTP_TX_MSG_HEADER2); in lan8814_ptp_tx_ts_get()
2634 struct phy_device *phydev = ptp_priv->phydev; in lan8814_ts_info() local
2635 struct lan8814_shared_priv *shared = phydev->shared->priv; in lan8814_ts_info()
2658 static void lan8814_flush_fifo(struct phy_device *phydev, bool egress) in lan8814_flush_fifo() argument
2663 lanphy_read_page_reg(phydev, 5, in lan8814_flush_fifo()
2667 lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS); in lan8814_flush_fifo()
2718 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_PARSE_CONFIG, rxcfg); in lan8814_hwtstamp()
2719 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_PARSE_CONFIG, txcfg); in lan8814_hwtstamp()
2723 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_TIMESTAMP_EN, pkt_ts_enable); in lan8814_hwtstamp()
2724 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_TIMESTAMP_EN, pkt_ts_enable); in lan8814_hwtstamp()
2726 tx_mod = lanphy_read_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD); in lan8814_hwtstamp()
2728 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD, in lan8814_hwtstamp()
2731 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD, in lan8814_hwtstamp()
2736 lan8814_config_ts_intr(ptp_priv->phydev, true); in lan8814_hwtstamp()
2738 lan8814_config_ts_intr(ptp_priv->phydev, false); in lan8814_hwtstamp()
2748 lan8814_flush_fifo(ptp_priv->phydev, false); in lan8814_hwtstamp()
2749 lan8814_flush_fifo(ptp_priv->phydev, true); in lan8814_hwtstamp()
2851 static void lan8814_ptp_clock_set(struct phy_device *phydev, in lan8814_ptp_clock_set() argument
2854 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_LO, lower_16_bits(sec)); in lan8814_ptp_clock_set()
2855 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_MID, upper_16_bits(sec)); in lan8814_ptp_clock_set()
2856 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_SEC_HI, upper_32_bits(sec)); in lan8814_ptp_clock_set()
2857 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_LO, lower_16_bits(nsec)); in lan8814_ptp_clock_set()
2858 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_SET_NS_HI, upper_16_bits(nsec)); in lan8814_ptp_clock_set()
2860 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_LOAD_); in lan8814_ptp_clock_set()
2863 static void lan8814_ptp_clock_get(struct phy_device *phydev, in lan8814_ptp_clock_get() argument
2866 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_CLOCK_READ_); in lan8814_ptp_clock_get()
2868 *sec = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_HI); in lan8814_ptp_clock_get()
2870 *sec |= lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_MID); in lan8814_ptp_clock_get()
2872 *sec |= lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_SEC_LO); in lan8814_ptp_clock_get()
2874 *nsec = lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_HI); in lan8814_ptp_clock_get()
2876 *nsec |= lanphy_read_page_reg(phydev, 4, PTP_CLOCK_READ_NS_LO); in lan8814_ptp_clock_get()
2884 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_gettime64() local
2889 lan8814_ptp_clock_get(phydev, &seconds, &nano_seconds); in lan8814_ptpci_gettime64()
2902 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_settime64() local
2905 lan8814_ptp_clock_set(phydev, ts->tv_sec, ts->tv_nsec); in lan8814_ptpci_settime64()
2911 static void lan8814_ptp_set_target(struct phy_device *phydev, int event, in lan8814_ptp_set_target() argument
2915 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_SEC_LO(event), in lan8814_ptp_set_target()
2917 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_SEC_HI(event), in lan8814_ptp_set_target()
2920 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_NS_LO(event), in lan8814_ptp_set_target()
2922 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_CLOCK_TARGET_NS_HI(event), in lan8814_ptp_set_target()
2926 static void lan8814_ptp_update_target(struct phy_device *phydev, time64_t sec) in lan8814_ptp_update_target() argument
2928 lan8814_ptp_set_target(phydev, LAN8814_EVENT_A, in lan8814_ptp_update_target()
2930 lan8814_ptp_set_target(phydev, LAN8814_EVENT_B, in lan8814_ptp_update_target()
2934 static void lan8814_ptp_clock_step(struct phy_device *phydev, in lan8814_ptp_clock_step() argument
2946 lan8814_ptp_clock_get(phydev, &set_seconds, &nano_seconds); in lan8814_ptp_clock_step()
2954 lan8814_ptp_clock_set(phydev, set_seconds, nano_seconds); in lan8814_ptp_clock_step()
2955 lan8814_ptp_update_target(phydev, set_seconds); in lan8814_ptp_clock_step()
2961 lan8814_ptp_clock_get(phydev, &set_seconds, &nano_seconds); in lan8814_ptp_clock_step()
2970 lan8814_ptp_clock_set(phydev, set_seconds, nano_seconds); in lan8814_ptp_clock_step()
2971 lan8814_ptp_update_target(phydev, set_seconds); in lan8814_ptp_clock_step()
3020 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
3022 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
3027 lan8814_ptp_clock_get(phydev, &set_seconds, &nsec); in lan8814_ptp_clock_step()
3029 lan8814_ptp_update_target(phydev, set_seconds); in lan8814_ptp_clock_step()
3040 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
3042 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
3046 lan8814_ptp_clock_get(phydev, &set_seconds, &nsec); in lan8814_ptp_clock_step()
3048 lan8814_ptp_update_target(phydev, set_seconds); in lan8814_ptp_clock_step()
3050 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, in lan8814_ptp_clock_step()
3060 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_LO, in lan8814_ptp_clock_step()
3062 lanphy_write_page_reg(phydev, 4, PTP_LTC_STEP_ADJ_HI, in lan8814_ptp_clock_step()
3065 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, in lan8814_ptp_clock_step()
3074 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjtime() local
3077 lan8814_ptp_clock_step(phydev, delta); in lan8814_ptpci_adjtime()
3087 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjfine() local
3107 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_HI, kszphy_rate_adj_hi); in lan8814_ptpci_adjfine()
3108 lanphy_write_page_reg(phydev, 4, PTP_CLOCK_RATE_ADJ_LO, kszphy_rate_adj_lo); in lan8814_ptpci_adjfine()
3114 static void lan8814_ptp_set_reload(struct phy_device *phydev, int event, in lan8814_ptp_set_reload() argument
3117 lanphy_write_page_reg(phydev, 4, in lan8814_ptp_set_reload()
3120 lanphy_write_page_reg(phydev, 4, in lan8814_ptp_set_reload()
3124 lanphy_write_page_reg(phydev, 4, in lan8814_ptp_set_reload()
3127 lanphy_write_page_reg(phydev, 4, in lan8814_ptp_set_reload()
3132 static void lan8814_ptp_enable_event(struct phy_device *phydev, int event, in lan8814_ptp_enable_event() argument
3137 val = lanphy_read_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG); in lan8814_ptp_enable_event()
3147 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG, val); in lan8814_ptp_enable_event()
3150 static void lan8814_ptp_disable_event(struct phy_device *phydev, int event) in lan8814_ptp_disable_event() argument
3155 lan8814_ptp_set_target(phydev, event, 0xFFFFFFFF, 0); in lan8814_ptp_disable_event()
3158 val = lanphy_read_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG); in lan8814_ptp_disable_event()
3160 lanphy_write_page_reg(phydev, 4, LAN8814_PTP_GENERAL_CONFIG, val); in lan8814_ptp_disable_event()
3163 static void lan8814_ptp_perout_off(struct phy_device *phydev, int pin) in lan8814_ptp_perout_off() argument
3171 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin)); in lan8814_ptp_perout_off()
3173 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin), val); in lan8814_ptp_perout_off()
3175 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); in lan8814_ptp_perout_off()
3177 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), val); in lan8814_ptp_perout_off()
3179 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin)); in lan8814_ptp_perout_off()
3181 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin), val); in lan8814_ptp_perout_off()
3184 static void lan8814_ptp_perout_on(struct phy_device *phydev, int pin) in lan8814_ptp_perout_on() argument
3189 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); in lan8814_ptp_perout_on()
3191 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), val); in lan8814_ptp_perout_on()
3194 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin)); in lan8814_ptp_perout_on()
3196 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin), val); in lan8814_ptp_perout_on()
3199 val = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin)); in lan8814_ptp_perout_on()
3201 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_BUF_ADDR(pin), val); in lan8814_ptp_perout_on()
3209 struct phy_device *phydev = shared->phydev; in lan8814_ptp_perout() local
3228 lan8814_ptp_perout_off(phydev, pin); in lan8814_ptp_perout()
3229 lan8814_ptp_disable_event(phydev, event); in lan8814_ptp_perout()
3244 phydev_name(phydev)); in lan8814_ptp_perout()
3251 phydev_name(phydev)); in lan8814_ptp_perout()
3301 phydev_name(phydev)); in lan8814_ptp_perout()
3307 lan8814_ptp_enable_event(phydev, event, pulse_width); in lan8814_ptp_perout()
3308 lan8814_ptp_set_target(phydev, event, rq->perout.start.sec, in lan8814_ptp_perout()
3310 lan8814_ptp_set_reload(phydev, event, rq->perout.period.sec, in lan8814_ptp_perout()
3312 lan8814_ptp_perout_on(phydev, pin); in lan8814_ptp_perout()
3318 static void lan8814_ptp_extts_on(struct phy_device *phydev, int pin, u32 flags) in lan8814_ptp_extts_on() argument
3323 tmp = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); in lan8814_ptp_extts_on()
3325 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), tmp); in lan8814_ptp_extts_on()
3328 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO); in lan8814_ptp_extts_on()
3330 lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO, tmp); in lan8814_ptp_extts_on()
3333 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_EN); in lan8814_ptp_extts_on()
3338 lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_EN, tmp); in lan8814_ptp_extts_on()
3341 tmp = lanphy_read_page_reg(phydev, 4, PTP_COMMON_INT_ENA); in lan8814_ptp_extts_on()
3343 lanphy_write_page_reg(phydev, 4, PTP_COMMON_INT_ENA, tmp); in lan8814_ptp_extts_on()
3346 static void lan8814_ptp_extts_off(struct phy_device *phydev, int pin) in lan8814_ptp_extts_off() argument
3351 tmp = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin)); in lan8814_ptp_extts_off()
3353 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_DIR_ADDR(pin), tmp); in lan8814_ptp_extts_off()
3356 tmp = lanphy_read_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin)); in lan8814_ptp_extts_off()
3358 lanphy_write_page_reg(phydev, 4, LAN8814_GPIO_EN_ADDR(pin), tmp); in lan8814_ptp_extts_off()
3361 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO); in lan8814_ptp_extts_off()
3363 lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_MAP_LO, tmp); in lan8814_ptp_extts_off()
3366 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_EN); in lan8814_ptp_extts_off()
3369 lanphy_write_page_reg(phydev, 4, PTP_GPIO_CAP_EN, tmp); in lan8814_ptp_extts_off()
3372 tmp = lanphy_read_page_reg(phydev, 4, PTP_COMMON_INT_ENA); in lan8814_ptp_extts_off()
3374 lanphy_write_page_reg(phydev, 4, PTP_COMMON_INT_ENA, tmp); in lan8814_ptp_extts_off()
3382 struct phy_device *phydev = shared->phydev; in lan8814_ptp_extts() local
3397 lan8814_ptp_extts_on(phydev, pin, rq->extts.flags); in lan8814_ptp_extts()
3399 lan8814_ptp_extts_off(phydev, pin); in lan8814_ptp_extts()
3490 struct phy_device *phydev = ptp_priv->phydev; in lan8814_dequeue_tx_skb() local
3494 lan8814_ptp_tx_ts_get(phydev, &seconds, &nsec, &seq_id); in lan8814_dequeue_tx_skb()
3500 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_tx_ts() local
3509 reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO); in lan8814_get_tx_ts()
3566 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_rx_ts() local
3575 lan8814_ptp_rx_ts_get(phydev, &rx_ts->seconds, &rx_ts->nsec, in lan8814_get_rx_ts()
3582 reg = lanphy_read_page_reg(phydev, 5, PTP_CAP_INFO); in lan8814_get_rx_ts()
3586 static void lan8814_handle_ptp_interrupt(struct phy_device *phydev, u16 status) in lan8814_handle_ptp_interrupt() argument
3588 struct kszphy_priv *priv = phydev->priv; in lan8814_handle_ptp_interrupt()
3598 lan8814_flush_fifo(phydev, true); in lan8814_handle_ptp_interrupt()
3603 lan8814_flush_fifo(phydev, false); in lan8814_handle_ptp_interrupt()
3610 struct phy_device *phydev = shared->phydev; in lan8814_gpio_process_cap() local
3619 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_SEL); in lan8814_gpio_process_cap()
3621 lanphy_write_page_reg(phydev, 4, PTP_GPIO_SEL, tmp); in lan8814_gpio_process_cap()
3623 tmp = lanphy_read_page_reg(phydev, 4, PTP_GPIO_CAP_STS); in lan8814_gpio_process_cap()
3629 sec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_SEC_HI_CAP); in lan8814_gpio_process_cap()
3631 sec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_SEC_LO_CAP); in lan8814_gpio_process_cap()
3633 nsec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_NS_HI_CAP) & 0x3fff; in lan8814_gpio_process_cap()
3635 nsec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_NS_LO_CAP); in lan8814_gpio_process_cap()
3637 sec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_FE_LTC_SEC_HI_CAP); in lan8814_gpio_process_cap()
3639 sec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_FE_LTC_SEC_LO_CAP); in lan8814_gpio_process_cap()
3641 nsec = lanphy_read_page_reg(phydev, 4, PTP_GPIO_FE_LTC_NS_HI_CAP) & 0x3fff; in lan8814_gpio_process_cap()
3643 nsec |= lanphy_read_page_reg(phydev, 4, PTP_GPIO_RE_LTC_NS_LO_CAP); in lan8814_gpio_process_cap()
3654 static int lan8814_handle_gpio_interrupt(struct phy_device *phydev, u16 status) in lan8814_handle_gpio_interrupt() argument
3656 struct lan8814_shared_priv *shared = phydev->shared->priv; in lan8814_handle_gpio_interrupt()
3666 static int lan8804_config_init(struct phy_device *phydev) in lan8804_config_init() argument
3671 val = lanphy_read_page_reg(phydev, 2, LAN8804_ALIGN_SWAP); in lan8804_config_init()
3674 lanphy_write_page_reg(phydev, 2, LAN8804_ALIGN_SWAP, val); in lan8804_config_init()
3679 lanphy_write_page_reg(phydev, 31, LAN8814_CLOCK_MANAGEMENT, 0x27e); in lan8804_config_init()
3680 lanphy_read_page_reg(phydev, 1, LAN8814_LINK_QUALITY); in lan8804_config_init()
3685 static irqreturn_t lan8804_handle_interrupt(struct phy_device *phydev) in lan8804_handle_interrupt() argument
3689 status = phy_read(phydev, LAN8814_INTS); in lan8804_handle_interrupt()
3691 phy_error(phydev); in lan8804_handle_interrupt()
3696 phy_trigger_machine(phydev); in lan8804_handle_interrupt()
3706 static int lan8804_config_intr(struct phy_device *phydev) in lan8804_config_intr() argument
3715 phy_write(phydev, LAN8804_CONTROL, LAN8804_CONTROL_INTR_POLARITY); in lan8804_config_intr()
3721 phy_write(phydev, LAN8804_OUTPUT_CONTROL, in lan8804_config_intr()
3724 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8804_config_intr()
3725 err = phy_read(phydev, LAN8814_INTS); in lan8804_config_intr()
3729 err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK); in lan8804_config_intr()
3733 err = phy_write(phydev, LAN8814_INTC, 0); in lan8804_config_intr()
3737 err = phy_read(phydev, LAN8814_INTS); in lan8804_config_intr()
3745 static irqreturn_t lan8814_handle_interrupt(struct phy_device *phydev) in lan8814_handle_interrupt() argument
3750 irq_status = phy_read(phydev, LAN8814_INTS); in lan8814_handle_interrupt()
3752 phy_error(phydev); in lan8814_handle_interrupt()
3757 phy_trigger_machine(phydev); in lan8814_handle_interrupt()
3762 irq_status = lanphy_read_page_reg(phydev, 5, PTP_TSU_INT_STS); in lan8814_handle_interrupt()
3766 lan8814_handle_ptp_interrupt(phydev, irq_status); in lan8814_handle_interrupt()
3770 if (!lan8814_handle_gpio_interrupt(phydev, irq_status)) in lan8814_handle_interrupt()
3776 static int lan8814_ack_interrupt(struct phy_device *phydev) in lan8814_ack_interrupt() argument
3781 rc = phy_read(phydev, LAN8814_INTS); in lan8814_ack_interrupt()
3786 static int lan8814_config_intr(struct phy_device *phydev) in lan8814_config_intr() argument
3790 lanphy_write_page_reg(phydev, 4, LAN8814_INTR_CTRL_REG, in lan8814_config_intr()
3795 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8814_config_intr()
3796 err = lan8814_ack_interrupt(phydev); in lan8814_config_intr()
3800 err = phy_write(phydev, LAN8814_INTC, LAN8814_INT_LINK); in lan8814_config_intr()
3802 err = phy_write(phydev, LAN8814_INTC, 0); in lan8814_config_intr()
3806 err = lan8814_ack_interrupt(phydev); in lan8814_config_intr()
3812 static void lan8814_ptp_init(struct phy_device *phydev) in lan8814_ptp_init() argument
3814 struct kszphy_priv *priv = phydev->priv; in lan8814_ptp_init()
3822 lanphy_write_page_reg(phydev, 5, TSU_HARD_RESET, TSU_HARD_RESET_); in lan8814_ptp_init()
3824 temp = lanphy_read_page_reg(phydev, 5, PTP_TX_MOD); in lan8814_ptp_init()
3826 lanphy_write_page_reg(phydev, 5, PTP_TX_MOD, temp); in lan8814_ptp_init()
3828 temp = lanphy_read_page_reg(phydev, 5, PTP_RX_MOD); in lan8814_ptp_init()
3830 lanphy_write_page_reg(phydev, 5, PTP_RX_MOD, temp); in lan8814_ptp_init()
3832 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_CONFIG, 0); in lan8814_ptp_init()
3833 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_CONFIG, 0); in lan8814_ptp_init()
3836 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_L2_ADDR_EN, 0); in lan8814_ptp_init()
3837 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_L2_ADDR_EN, 0); in lan8814_ptp_init()
3838 lanphy_write_page_reg(phydev, 5, PTP_TX_PARSE_IP_ADDR_EN, 0); in lan8814_ptp_init()
3839 lanphy_write_page_reg(phydev, 5, PTP_RX_PARSE_IP_ADDR_EN, 0); in lan8814_ptp_init()
3842 lanphy_write_page_reg(phydev, 5, PTP_RX_VERSION, in lan8814_ptp_init()
3844 lanphy_write_page_reg(phydev, 5, PTP_TX_VERSION, in lan8814_ptp_init()
3852 ptp_priv->phydev = phydev; in lan8814_ptp_init()
3859 phydev->mii_ts = &ptp_priv->mii_ts; in lan8814_ptp_init()
3862 phydev->default_timestamp = true; in lan8814_ptp_init()
3865 static int lan8814_ptp_probe_once(struct phy_device *phydev) in lan8814_ptp_probe_once() argument
3867 struct lan8814_shared_priv *shared = phydev->shared->priv; in lan8814_ptp_probe_once()
3872 shared->pin_config = devm_kmalloc_array(&phydev->mdio.dev, in lan8814_ptp_probe_once()
3890 snprintf(shared->ptp_clock_info.name, 30, "%s", phydev->drv->name); in lan8814_ptp_probe_once()
3907 &phydev->mdio.dev); in lan8814_ptp_probe_once()
3909 phydev_err(phydev, "ptp_clock_register failed %lu\n", in lan8814_ptp_probe_once()
3918 phydev_dbg(phydev, "successfully registered ptp clock\n"); in lan8814_ptp_probe_once()
3920 shared->phydev = phydev; in lan8814_ptp_probe_once()
3925 lanphy_write_page_reg(phydev, 4, LTC_HARD_RESET, LTC_HARD_RESET_); in lan8814_ptp_probe_once()
3926 lanphy_write_page_reg(phydev, 4, PTP_OPERATING_MODE, in lan8814_ptp_probe_once()
3930 lanphy_write_page_reg(phydev, 4, PTP_CMD_CTL, PTP_CMD_CTL_PTP_ENABLE_); in lan8814_ptp_probe_once()
3935 static void lan8814_setup_led(struct phy_device *phydev, int val) in lan8814_setup_led() argument
3939 temp = lanphy_read_page_reg(phydev, 5, LAN8814_LED_CTRL_1); in lan8814_setup_led()
3946 lanphy_write_page_reg(phydev, 5, LAN8814_LED_CTRL_1, temp); in lan8814_setup_led()
3949 static int lan8814_config_init(struct phy_device *phydev) in lan8814_config_init() argument
3951 struct kszphy_priv *lan8814 = phydev->priv; in lan8814_config_init()
3955 val = lanphy_read_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET); in lan8814_config_init()
3957 lanphy_write_page_reg(phydev, 4, LAN8814_QSGMII_SOFT_RESET, val); in lan8814_config_init()
3960 val = lanphy_read_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG); in lan8814_config_init()
3962 lanphy_write_page_reg(phydev, 5, LAN8814_QSGMII_PCS1G_ANEG_CONFIG, val); in lan8814_config_init()
3965 val = lanphy_read_page_reg(phydev, 2, LAN8814_ALIGN_SWAP); in lan8814_config_init()
3968 lanphy_write_page_reg(phydev, 2, LAN8814_ALIGN_SWAP, val); in lan8814_config_init()
3971 lan8814_setup_led(phydev, lan8814->led_mode); in lan8814_config_init()
3981 static int lan8814_release_coma_mode(struct phy_device *phydev) in lan8814_release_coma_mode() argument
3985 gpiod = devm_gpiod_get_optional(&phydev->mdio.dev, "coma-mode", in lan8814_release_coma_mode()
3997 static void lan8814_clear_2psp_bit(struct phy_device *phydev) in lan8814_clear_2psp_bit() argument
4005 val = lanphy_read_page_reg(phydev, 2, LAN8814_EEE_STATE); in lan8814_clear_2psp_bit()
4007 lanphy_write_page_reg(phydev, 2, LAN8814_EEE_STATE, val); in lan8814_clear_2psp_bit()
4010 static void lan8814_update_meas_time(struct phy_device *phydev) in lan8814_update_meas_time() argument
4018 val = lanphy_read_page_reg(phydev, 1, LAN8814_PD_CONTROLS); in lan8814_update_meas_time()
4021 lanphy_write_page_reg(phydev, 1, LAN8814_PD_CONTROLS, val); in lan8814_update_meas_time()
4024 static int lan8814_probe(struct phy_device *phydev) in lan8814_probe() argument
4026 const struct kszphy_type *type = phydev->drv->driver_data; in lan8814_probe()
4031 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in lan8814_probe()
4035 phydev->priv = priv; in lan8814_probe()
4039 kszphy_parse_led_mode(phydev); in lan8814_probe()
4044 addr = lanphy_read_page_reg(phydev, 4, 0) & 0x1F; in lan8814_probe()
4045 devm_phy_package_join(&phydev->mdio.dev, phydev, in lan8814_probe()
4048 if (phy_package_init_once(phydev)) { in lan8814_probe()
4049 err = lan8814_release_coma_mode(phydev); in lan8814_probe()
4053 err = lan8814_ptp_probe_once(phydev); in lan8814_probe()
4058 lan8814_ptp_init(phydev); in lan8814_probe()
4061 lan8814_clear_2psp_bit(phydev); in lan8814_probe()
4062 lan8814_update_meas_time(phydev); in lan8814_probe()
4106 static int lan8841_config_init(struct phy_device *phydev) in lan8841_config_init() argument
4110 ret = ksz9131_config_init(phydev); in lan8841_config_init()
4115 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4120 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4126 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4128 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4130 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4132 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4134 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4136 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4140 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4142 phy_write_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4146 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
4149 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
4156 ret = phy_read_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_config_init()
4159 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
4162 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
4173 phy_write_mmd(phydev, LAN8841_MMD_ANALOG_REG, in lan8841_config_init()
4178 phy_write_mmd(phydev, MDIO_MMD_PMAPMD, in lan8841_config_init()
4180 phy_write_mmd(phydev, LAN8841_MMD_TIMER_REG, in lan8841_config_init()
4192 static int lan8841_config_intr(struct phy_device *phydev) in lan8841_config_intr() argument
4196 phy_modify(phydev, LAN8841_OUTPUT_CTRL, in lan8841_config_intr()
4199 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8841_config_intr()
4200 err = phy_read(phydev, LAN8814_INTS); in lan8841_config_intr()
4209 err = phy_write(phydev, LAN8814_INTC, in lan8841_config_intr()
4212 err = phy_write(phydev, LAN8814_INTC, 0); in lan8841_config_intr()
4216 err = phy_read(phydev, LAN8814_INTS); in lan8841_config_intr()
4240 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_get_tx_ts() local
4242 *nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_NS_HI); in lan8841_ptp_get_tx_ts()
4247 *nsec = *nsec | phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_NS_LO); in lan8841_ptp_get_tx_ts()
4249 *sec = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_SEC_HI); in lan8841_ptp_get_tx_ts()
4251 *sec = *sec | phy_read_mmd(phydev, 2, LAN8841_PTP_TX_EGRESS_SEC_LO); in lan8841_ptp_get_tx_ts()
4253 *seq = phy_read_mmd(phydev, 2, LAN8841_PTP_TX_MSG_HEADER2); in lan8841_ptp_get_tx_ts()
4274 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_flush_fifo() local
4278 phy_read_mmd(phydev, 2, LAN8841_PTP_TX_MSG_HEADER2); in lan8841_ptp_flush_fifo()
4280 phy_read_mmd(phydev, 2, LAN8841_PTP_INT_STS); in lan8841_ptp_flush_fifo()
4297 struct phy_device *phydev = ptp_priv->phydev; in lan8841_gpio_process_cap() local
4306 tmp = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_STS); in lan8841_gpio_process_cap()
4310 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_SEL, in lan8841_gpio_process_cap()
4317 sec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_SEC_HI_CAP); in lan8841_gpio_process_cap()
4319 sec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_SEC_LO_CAP); in lan8841_gpio_process_cap()
4321 nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_NS_HI_CAP) & 0x3fff; in lan8841_gpio_process_cap()
4323 nsec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_RE_LTC_NS_LO_CAP); in lan8841_gpio_process_cap()
4325 sec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_SEC_HI_CAP); in lan8841_gpio_process_cap()
4327 sec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_SEC_LO_CAP); in lan8841_gpio_process_cap()
4329 nsec = phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_NS_HI_CAP) & 0x3fff; in lan8841_gpio_process_cap()
4331 nsec |= phy_read_mmd(phydev, 2, LAN8841_PTP_GPIO_FE_LTC_NS_LO_CAP); in lan8841_gpio_process_cap()
4334 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_SEL, 0); in lan8841_gpio_process_cap()
4344 static void lan8841_handle_ptp_interrupt(struct phy_device *phydev) in lan8841_handle_ptp_interrupt() argument
4346 struct kszphy_priv *priv = phydev->priv; in lan8841_handle_ptp_interrupt()
4351 status = phy_read_mmd(phydev, 2, LAN8841_PTP_INT_STS); in lan8841_handle_ptp_interrupt()
4371 static irqreturn_t lan8841_handle_interrupt(struct phy_device *phydev) in lan8841_handle_interrupt() argument
4376 irq_status = phy_read(phydev, LAN8814_INTS); in lan8841_handle_interrupt()
4378 phy_error(phydev); in lan8841_handle_interrupt()
4383 phy_trigger_machine(phydev); in lan8841_handle_interrupt()
4388 lan8841_handle_ptp_interrupt(phydev); in lan8841_handle_interrupt()
4430 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_enable_processing() local
4434 phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_enable_processing()
4444 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_ptp_enable_processing()
4454 phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_enable_processing()
4459 phy_modify_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_ptp_enable_processing()
4477 struct phy_device *phydev = ptp_priv->phydev; in lan8841_hwtstamp() local
4522 phy_write_mmd(phydev, 2, LAN8841_PTP_RX_PARSE_CONFIG, rxcfg); in lan8841_hwtstamp()
4523 phy_write_mmd(phydev, 2, LAN8841_PTP_TX_PARSE_CONFIG, txcfg); in lan8841_hwtstamp()
4527 phy_write_mmd(phydev, 2, LAN8841_PTP_RX_TIMESTAMP_EN, pkt_ts_enable); in lan8841_hwtstamp()
4528 phy_write_mmd(phydev, 2, LAN8841_PTP_TX_TIMESTAMP_EN, pkt_ts_enable); in lan8841_hwtstamp()
4531 phy_modify_mmd(phydev, 2, LAN8841_PTP_TX_MOD, in lan8841_hwtstamp()
4602 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_set_target() local
4605 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_SEC_HI(event), in lan8841_ptp_set_target()
4610 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_SEC_LO(event), in lan8841_ptp_set_target()
4615 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_NS_HI(event) & 0x3fff, in lan8841_ptp_set_target()
4620 return phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_NS_LO(event), in lan8841_ptp_set_target()
4641 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_set_reload() local
4644 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_SEC_HI(event), in lan8841_ptp_set_reload()
4649 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_SEC_LO(event), in lan8841_ptp_set_reload()
4654 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_NS_HI(event) & 0x3fff, in lan8841_ptp_set_reload()
4659 return phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_TARGET_RELOAD_NS_LO(event), in lan8841_ptp_set_reload()
4675 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_settime64() local
4681 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_LO, lower_16_bits(ts->tv_sec)); in lan8841_ptp_settime64()
4682 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_MID, upper_16_bits(ts->tv_sec)); in lan8841_ptp_settime64()
4683 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_HI, upper_32_bits(ts->tv_sec) & 0xffff); in lan8841_ptp_settime64()
4684 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_LO, lower_16_bits(ts->tv_nsec)); in lan8841_ptp_settime64()
4685 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_HI, upper_16_bits(ts->tv_nsec) & 0x3fff); in lan8841_ptp_settime64()
4688 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_settime64()
4712 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_gettime64() local
4718 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_gettime64()
4722 s = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_HI); in lan8841_ptp_gettime64()
4724 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_MID); in lan8841_ptp_gettime64()
4726 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_LO); in lan8841_ptp_gettime64()
4728 ns = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_NS_HI) & 0x3fff; in lan8841_ptp_gettime64()
4730 ns |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_NS_LO); in lan8841_ptp_gettime64()
4742 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_getseconds() local
4747 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_getseconds()
4751 s = phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_HI); in lan8841_ptp_getseconds()
4753 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_MID); in lan8841_ptp_getseconds()
4755 s |= phy_read_mmd(phydev, 2, LAN8841_PTP_LTC_RD_SEC_LO); in lan8841_ptp_getseconds()
4771 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_adjtime() local
4823 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_LO, sec); in lan8841_ptp_adjtime()
4824 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_HI, in lan8841_ptp_adjtime()
4826 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_adjtime()
4831 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_LO, in lan8841_ptp_adjtime()
4833 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_STEP_ADJ_HI, in lan8841_ptp_adjtime()
4835 phy_write_mmd(phydev, 2, LAN8841_PTP_CMD_CTL, in lan8841_ptp_adjtime()
4857 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_adjfine() local
4873 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_RATE_ADJ_HI, in lan8841_ptp_adjfine()
4876 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_RATE_ADJ_LO, lower_16_bits(rate)); in lan8841_ptp_adjfine()
4904 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout_off() local
4907 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_perout_off()
4911 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DIR, BIT(pin)); in lan8841_ptp_perout_off()
4915 return phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_perout_off()
4920 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout_on() local
4923 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_perout_on()
4927 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DIR, BIT(pin)); in lan8841_ptp_perout_on()
4931 return phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_perout_on()
4950 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_remove_event() local
4960 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL1, tmp); in lan8841_ptp_remove_event()
4963 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL2, tmp); in lan8841_ptp_remove_event()
4975 return phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, tmp); in lan8841_ptp_remove_event()
4981 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_enable_event() local
4987 ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GENERAL_CONFIG, in lan8841_ptp_enable_event()
4993 ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GENERAL_CONFIG, in lan8841_ptp_enable_event()
5011 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL1, in lan8841_ptp_enable_event()
5014 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_DATA_SEL2, in lan8841_ptp_enable_event()
5040 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout() local
5072 phydev_name(phydev)); in lan8841_ptp_perout()
5078 phydev_name(phydev)); in lan8841_ptp_perout()
5127 phydev_name(phydev)); in lan8841_ptp_perout()
5164 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_extts_on() local
5169 ret = phy_set_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_extts_on()
5173 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_extts_on()
5182 ret = phy_write_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_EN, tmp); in lan8841_ptp_extts_on()
5187 return phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_extts_on()
5194 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_extts_off() local
5198 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_EN, BIT(pin)); in lan8841_ptp_extts_off()
5202 ret = phy_clear_bits_mmd(phydev, 2, LAN8841_GPIO_BUF, BIT(pin)); in lan8841_ptp_extts_off()
5207 ret = phy_modify_mmd(phydev, 2, LAN8841_PTP_GPIO_CAP_EN, in lan8841_ptp_extts_off()
5215 return phy_modify_mmd(phydev, 2, LAN8841_PTP_INT_EN, in lan8841_ptp_extts_off()
5298 static int lan8841_probe(struct phy_device *phydev) in lan8841_probe() argument
5304 err = kszphy_probe(phydev); in lan8841_probe()
5308 if (phy_read_mmd(phydev, KSZ9131RN_MMD_COMMON_CTRL_REG, in lan8841_probe()
5311 phydev->interface = PHY_INTERFACE_MODE_RGMII_RXID; in lan8841_probe()
5317 priv = phydev->priv; in lan8841_probe()
5320 ptp_priv->pin_config = devm_kcalloc(&phydev->mdio.dev, in lan8841_probe()
5338 &phydev->mdio.dev); in lan8841_probe()
5340 phydev_err(phydev, "ptp_clock_register failed: %lu\n", in lan8841_probe()
5350 ptp_priv->phydev = phydev; in lan8841_probe()
5359 phydev->mii_ts = &ptp_priv->mii_ts; in lan8841_probe()
5362 phydev->default_timestamp = true; in lan8841_probe()
5367 static int lan8804_resume(struct phy_device *phydev) in lan8804_resume() argument
5369 return kszphy_resume(phydev); in lan8804_resume()
5372 static int lan8804_suspend(struct phy_device *phydev) in lan8804_suspend() argument
5374 return kszphy_generic_suspend(phydev); in lan8804_suspend()
5377 static int lan8841_resume(struct phy_device *phydev) in lan8841_resume() argument
5379 return kszphy_generic_resume(phydev); in lan8841_resume()
5382 static int lan8841_suspend(struct phy_device *phydev) in lan8841_suspend() argument
5384 struct kszphy_priv *priv = phydev->priv; in lan8841_suspend()
5390 return kszphy_generic_suspend(phydev); in lan8841_suspend()