Lines Matching +full:pico +full:- +full:seconds

1 // SPDX-License-Identifier: GPL-2.0+
9 * Copyright (c) 2010-2013 Micrel, Inc.
128 * The value is calculated as following: (1/1000000)/((2^-32)/4)
134 * The value is calculated as following: (1/1000000)/((2^-32)/8)
402 u32 seconds; member
429 s64 seconds; member
430 /* Lock for accessing seconds */
529 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_config_intr()
533 if (type && type->interrupt_level_mask) in kszphy_config_intr()
534 mask = type->interrupt_level_mask; in kszphy_config_intr()
546 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in kszphy_config_intr()
609 return -EINVAL; in kszphy_setup_led()
629 * unique (non-broadcast) address on a shared bus.
670 struct kszphy_priv *priv = phydev->priv; in kszphy_config_reset()
673 if (priv->rmii_ref_clk_sel) { in kszphy_config_reset()
674 ret = kszphy_rmii_clk_sel(phydev, priv->rmii_ref_clk_sel_val); in kszphy_config_reset()
682 if (priv->type && priv->led_mode >= 0) in kszphy_config_reset()
683 kszphy_setup_led(phydev, priv->type->led_mode_reg, priv->led_mode); in kszphy_config_reset()
690 struct kszphy_priv *priv = phydev->priv; in kszphy_config_init()
696 type = priv->type; in kszphy_config_init()
698 if (type && type->has_broadcast_disable) in kszphy_config_init()
701 if (type && type->has_nand_tree_disable) in kszphy_config_init()
709 struct device_node *of_node = phydev->mdio.dev.of_node; in ksz8041_fiber_mode()
711 return of_property_read_bool(of_node, "micrel,fiber-mode"); in ksz8041_fiber_mode()
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()
738 /* Skip auto-negotiation in fiber mode */ in ksz8041_config_aneg()
739 if (phydev->dev_flags & MICREL_PHY_FXEN) { in ksz8041_config_aneg()
740 phydev->speed = SPEED_100; in ksz8041_config_aneg()
752 if (!phy_id_compare(phydev->phy_id, PHY_ID_KSZ8051, MICREL_PHY_ID_MASK)) in ksz8051_ksz8795_match_phy_device()
779 /* KSZPHY_OMSO_FACTORY_TEST is set at de-assertion of the reset line in ksz8081_config_init()
781 * pull-down is missing, the factory test mode should be cleared by in ksz8081_config_init()
823 /* The MDI-X configuration is automatically changed by the PHY after in ksz8081_config_aneg()
824 * switching from autoneg off to on. So, take MDI-X configuration under in ksz8081_config_aneg()
827 return ksz8081_config_mdix(phydev, phydev->mdix_ctrl); in ksz8081_config_aneg()
840 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz8081_mdix_update()
842 phydev->mdix_ctrl = ETH_TP_MDI; in ksz8081_mdix_update()
844 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz8081_mdix_update()
852 phydev->mdix = ETH_TP_MDI; in ksz8081_mdix_update()
854 phydev->mdix = ETH_TP_MDI_X; in ksz8081_mdix_update()
904 int val1 = -1; in ksz9021_load_values_from_of()
905 int val2 = -2; in ksz9021_load_values_from_of()
906 int val3 = -3; in ksz9021_load_values_from_of()
907 int val4 = -4; in ksz9021_load_values_from_of()
931 if (val1 != -1) in ksz9021_load_values_from_of()
934 if (val2 != -2) in ksz9021_load_values_from_of()
937 if (val3 != -3) in ksz9021_load_values_from_of()
940 if (val4 != -4) in ksz9021_load_values_from_of()
955 dev_walker = &phydev->mdio.dev; in ksz9021_config_init()
957 of_node = dev_walker->of_node; in ksz9021_config_init()
958 dev_walker = dev_walker->parent; in ksz9021_config_init()
965 "txen-skew-ps", "txc-skew-ps", in ksz9021_config_init()
966 "rxdv-skew-ps", "rxc-skew-ps"); in ksz9021_config_init()
969 "rxd0-skew-ps", "rxd1-skew-ps", in ksz9021_config_init()
970 "rxd2-skew-ps", "rxd3-skew-ps"); in ksz9021_config_init()
973 "txd0-skew-ps", "txd1-skew-ps", in ksz9021_config_init()
974 "txd2-skew-ps", "txd3-skew-ps"); in ksz9021_config_init()
1017 /* set rx to +0.30ns and rx_clk to -0.90ns to compensate the
1023 /* set tx to -0.42ns and tx_clk to +0.96ns to get 1.38ns delay */
1047 phydev->speed = speed; in ksz9031_set_loopback()
1049 return -EINVAL; in ksz9031_set_loopback()
1050 phydev->duplex = DUPLEX_FULL; in ksz9031_set_loopback()
1052 ctl |= mii_bmcr_encode_fixed(phydev->speed, phydev->duplex); in ksz9031_set_loopback()
1066 int val[4] = {-1, -2, -3, -4}; in ksz9031_of_load_skew_values()
1089 if (val[i] != -(i + 1)) { in ksz9031_of_load_skew_values()
1118 /* Enable energy-detect power-down mode */
1135 switch (phydev->interface) { in ksz9031_config_rgmii_delay()
1194 static const char *clk_skews[2] = {"rxc-skew-ps", "txc-skew-ps"}; in ksz9031_config_init()
1196 "rxd0-skew-ps", "rxd1-skew-ps", in ksz9031_config_init()
1197 "rxd2-skew-ps", "rxd3-skew-ps" in ksz9031_config_init()
1200 "txd0-skew-ps", "txd1-skew-ps", in ksz9031_config_init()
1201 "txd2-skew-ps", "txd3-skew-ps" in ksz9031_config_init()
1203 static const char *control_skews[2] = {"txen-skew-ps", "rxdv-skew-ps"}; in ksz9031_config_init()
1215 dev_walker = &phydev->mdio.dev; in ksz9031_config_init()
1217 of_node = dev_walker->of_node; in ksz9031_config_init()
1218 dev_walker = dev_walker->parent; in ksz9031_config_init()
1248 "*-skew-ps values should be used only with RGMII PHY modes\n"); in ksz9031_config_init()
1251 * When the device links in the 1000BASE-T slave mode only, in ksz9031_config_init()
1265 if (of_property_read_bool(of_node, "micrel,force-master")) { in ksz9031_config_init()
1295 int val[4] = {-(1 + KSZ9131_OFFSET), -(2 + KSZ9131_OFFSET), in ksz9131_of_load_skew_values()
1296 -(3 + KSZ9131_OFFSET), -(4 + KSZ9131_OFFSET)}; in ksz9131_of_load_skew_values()
1304 /* psec properties in dts should mean x pico seconds */ in ksz9131_of_load_skew_values()
1312 if (skewval < -KSZ9131_OFFSET) in ksz9131_of_load_skew_values()
1313 skewval = -KSZ9131_OFFSET; in ksz9131_of_load_skew_values()
1331 if (val[i] != -(i + 1 + KSZ9131_OFFSET)) { in ksz9131_of_load_skew_values()
1349 const struct kszphy_type *type = phydev->drv->driver_data; in ksz9131_config_rgmii_delay()
1353 switch (phydev->interface) { in ksz9131_config_rgmii_delay()
1355 rxcdll_val = type->disable_dll_rx_bit; in ksz9131_config_rgmii_delay()
1356 txcdll_val = type->disable_dll_tx_bit; in ksz9131_config_rgmii_delay()
1364 txcdll_val = type->disable_dll_tx_bit; in ksz9131_config_rgmii_delay()
1367 rxcdll_val = type->disable_dll_rx_bit; in ksz9131_config_rgmii_delay()
1375 KSZ9131RN_RXC_DLL_CTRL, type->disable_dll_mask, in ksz9131_config_rgmii_delay()
1381 KSZ9131RN_TXC_DLL_CTRL, type->disable_dll_mask, in ksz9131_config_rgmii_delay()
1387 * When LEDs are configured in Individual Mode, LED1 is ON in a no-link
1408 char *clk_skews[2] = {"rxc-skew-psec", "txc-skew-psec"}; in ksz9131_config_init()
1410 "rxd0-skew-psec", "rxd1-skew-psec", in ksz9131_config_init()
1411 "rxd2-skew-psec", "rxd3-skew-psec" in ksz9131_config_init()
1414 "txd0-skew-psec", "txd1-skew-psec", in ksz9131_config_init()
1415 "txd2-skew-psec", "txd3-skew-psec" in ksz9131_config_init()
1417 char *control_skews[2] = {"txen-skew-psec", "rxdv-skew-psec"}; in ksz9131_config_init()
1421 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz9131_config_init()
1423 dev_walker = &phydev->mdio.dev; in ksz9131_config_init()
1425 of_node = dev_walker->of_node; in ksz9131_config_init()
1426 dev_walker = dev_walker->parent; in ksz9131_config_init()
1480 if (phydev->mdix_ctrl != ETH_TP_MDI_AUTO) { in ksz9131_mdix_update()
1481 phydev->mdix = phydev->mdix_ctrl; in ksz9131_mdix_update()
1489 phydev->mdix = ETH_TP_MDI; in ksz9131_mdix_update()
1491 phydev->mdix = ETH_TP_MDI_X; in ksz9131_mdix_update()
1493 phydev->mdix = ETH_TP_MDI_INVALID; in ksz9131_mdix_update()
1539 ret = ksz9131_config_mdix(phydev, phydev->mdix_ctrl); in ksz9131_config_aneg()
1560 linkmode_and(phydev->supported_eee, phydev->supported, in ksz9477_get_features()
1579 phydev->duplex = DUPLEX_HALF; in ksz8873mll_read_status()
1581 phydev->duplex = DUPLEX_FULL; in ksz8873mll_read_status()
1584 phydev->speed = SPEED_10; in ksz8873mll_read_status()
1586 phydev->speed = SPEED_100; in ksz8873mll_read_status()
1588 phydev->link = 1; in ksz8873mll_read_status()
1589 phydev->pause = phydev->asym_pause = 0; in ksz8873mll_read_status()
1604 * link-up may fail after a link-up to link-down transition. in ksz9031_get_features()
1611 linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, phydev->supported); in ksz9031_get_features()
1616 linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, phydev->supported); in ksz9031_get_features()
1636 phydev->link = 0; in ksz9031_read_status()
1637 if (phydev->drv->config_intr && phy_interrupt_is_valid(phydev)) in ksz9031_read_status()
1638 phydev->drv->config_intr(phydev); in ksz9031_read_status()
1647 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_start()
1650 /* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic in ksz9x31_cable_test_start()
1651 * Prior to running the cable diagnostics, Auto-negotiation should in ksz9x31_cable_test_start()
1662 /* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic in ksz9x31_cable_test_start()
1663 * The Master-Slave configuration should be set to Slave by writing in ksz9x31_cable_test_start()
1664 * a value of 0x1000 to the Auto-Negotiation Master Slave Control in ksz9x31_cable_test_start()
1672 priv->vct_ctrl1000 = ret & (CTL1000_ENABLE_MASTER | CTL1000_AS_MASTER); in ksz9x31_cable_test_start()
1717 /* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic in ksz9x31_cable_test_fault_length()
1719 * distance to fault = (VCT_DATA - 22) * 4 / cable propagation velocity in ksz9x31_cable_test_fault_length()
1722 dt = clamp(dt - 22, 0, 255); in ksz9x31_cable_test_fault_length()
1754 /* KSZ9131RNX, DS00002841B-page 38, 4.14 LinkMD (R) Cable Diagnostic in ksz9x31_cable_test_one_pair()
1775 return -EAGAIN; in ksz9x31_cable_test_one_pair()
1794 struct kszphy_priv *priv = phydev->priv; in ksz9x31_cable_test_get_status()
1802 while (pair_mask && retries--) { in ksz9x31_cable_test_get_status()
1805 if (ret == -EAGAIN) in ksz9x31_cable_test_get_status()
1831 priv->vct_ctrl1000); in ksz9x31_cable_test_get_status()
1853 * counter intuitive, the "-X" in "1 = Force MDI" in the data in ksz886x_config_mdix()
1855 * 1 = Force MDI (sic!) (transmit on RX+/RX- pins) in ksz886x_config_mdix()
1856 * 0 = Normal operation (transmit on TX+/TX- pins) in ksz886x_config_mdix()
1881 if (phydev->autoneg != AUTONEG_ENABLE) { in ksz886x_config_aneg()
1903 /* The MDI-X configuration is automatically changed by the PHY after in ksz886x_config_aneg()
1904 * switching from autoneg off to on. So, take MDI-X configuration under in ksz886x_config_aneg()
1907 return ksz886x_config_mdix(phydev, phydev->mdix_ctrl); in ksz886x_config_aneg()
1920 phydev->mdix_ctrl = ETH_TP_MDI_X; in ksz886x_mdix_update()
1922 phydev->mdix_ctrl = ETH_TP_MDI; in ksz886x_mdix_update()
1924 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in ksz886x_mdix_update()
1933 phydev->mdix = ETH_TP_MDI_X; in ksz886x_mdix_update()
1935 phydev->mdix = ETH_TP_MDI; in ksz886x_mdix_update()
1967 /* Transmit waveform amplitude can be improved (1000BASE-T, 100BASE-TX, 10BASE-Te) */
1996 * necessary to set the PHY to 100 Mbps speed with auto-negotiation in ksz9477_phy_errata()
1997 * disabled by writing to register 0xN100-0xN101. After writing the in ksz9477_phy_errata()
1999 * register settings, write register 0xN100-0xN101 again to enable in ksz9477_phy_errata()
2000 * and restart auto-negotiation. in ksz9477_phy_errata()
2009 err = phy_write_mmd(phydev, errata->dev_addr, errata->reg_addr, errata->val); in ksz9477_phy_errata()
2026 if ((phydev->phy_id & 0xf) == 1) { in ksz9477_config_init()
2051 struct kszphy_priv *priv = phydev->priv; in kszphy_get_stat()
2059 val = val & ((1 << stat.bits) - 1); in kszphy_get_stat()
2060 priv->stats[i] += val; in kszphy_get_stat()
2061 ret = priv->stats[i]; in kszphy_get_stat()
2078 struct kszphy_priv *priv = phydev->priv; in kszphy_enable_clk()
2080 if (!priv->clk_enable && priv->clk) { in kszphy_enable_clk()
2081 clk_prepare_enable(priv->clk); in kszphy_enable_clk()
2082 priv->clk_enable = true; in kszphy_enable_clk()
2088 struct kszphy_priv *priv = phydev->priv; in kszphy_disable_clk()
2090 if (priv->clk_enable && priv->clk) { in kszphy_disable_clk()
2091 clk_disable_unprepare(priv->clk); in kszphy_disable_clk()
2092 priv->clk_enable = false; in kszphy_disable_clk()
2120 phydev->interrupts = PHY_INTERRUPT_DISABLED; in kszphy_suspend()
2121 if (phydev->drv->config_intr) in kszphy_suspend()
2122 phydev->drv->config_intr(phydev); in kszphy_suspend()
2130 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_parse_led_mode()
2131 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_parse_led_mode()
2132 struct kszphy_priv *priv = phydev->priv; in kszphy_parse_led_mode()
2135 if (type && type->led_mode_reg) { in kszphy_parse_led_mode()
2136 ret = of_property_read_u32(np, "micrel,led-mode", in kszphy_parse_led_mode()
2137 &priv->led_mode); in kszphy_parse_led_mode()
2140 priv->led_mode = -1; in kszphy_parse_led_mode()
2142 if (priv->led_mode > 3) { in kszphy_parse_led_mode()
2144 priv->led_mode); in kszphy_parse_led_mode()
2145 priv->led_mode = -1; in kszphy_parse_led_mode()
2148 priv->led_mode = -1; in kszphy_parse_led_mode()
2160 /* After switching from power-down to normal mode, an internal global in kszphy_resume()
2172 phydev->interrupts = PHY_INTERRUPT_ENABLED; in kszphy_resume()
2173 if (phydev->drv->config_intr) in kszphy_resume()
2174 phydev->drv->config_intr(phydev); in kszphy_resume()
2211 /* After switching from power-down to normal mode, an internal global in ksz9477_resume()
2218 if ((phydev->phy_id & 0xf) == 1) { in ksz9477_resume()
2226 phydev->interrupts = PHY_INTERRUPT_ENABLED; in ksz9477_resume()
2227 if (phydev->drv->config_intr) in ksz9477_resume()
2228 phydev->drv->config_intr(phydev); in ksz9477_resume()
2251 /* Re-program the value after chip is reset. */ in ksz8061_resume()
2258 phydev->interrupts = PHY_INTERRUPT_ENABLED; in ksz8061_resume()
2259 if (phydev->drv->config_intr) in ksz8061_resume()
2260 phydev->drv->config_intr(phydev); in ksz8061_resume()
2273 const struct kszphy_type *type = phydev->drv->driver_data; in kszphy_probe()
2274 const struct device_node *np = phydev->mdio.dev.of_node; in kszphy_probe()
2278 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in kszphy_probe()
2280 return -ENOMEM; in kszphy_probe()
2282 phydev->priv = priv; in kszphy_probe()
2284 priv->type = type; in kszphy_probe()
2288 clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, "rmii-ref"); in kszphy_probe()
2295 priv->rmii_ref_clk_sel = type->has_rmii_ref_clk_sel; in kszphy_probe()
2297 "micrel,rmii-reference-clock-select-25-mhz"); in kszphy_probe()
2300 priv->rmii_ref_clk_sel_val = rmii_ref_clk_sel_25_mhz; in kszphy_probe()
2302 priv->rmii_ref_clk_sel_val = !rmii_ref_clk_sel_25_mhz; in kszphy_probe()
2306 return -EINVAL; in kszphy_probe()
2309 /* unnamed clock from the generic ethernet-phy binding */ in kszphy_probe()
2310 clk = devm_clk_get_optional_enabled(&phydev->mdio.dev, NULL); in kszphy_probe()
2317 priv->clk = clk; in kszphy_probe()
2320 phydev->port = PORT_FIBRE; in kszphy_probe()
2322 /* Support legacy board-file configuration */ in kszphy_probe()
2323 if (phydev->dev_flags & MICREL_PHY_50MHZ_CLK) { in kszphy_probe()
2324 priv->rmii_ref_clk_sel = true; in kszphy_probe()
2325 priv->rmii_ref_clk_sel_val = true; in kszphy_probe()
2335 * confuse the internal state machine - disable auto neg here. in lan8814_cable_test_start()
2344 if (phydev->dev_flags & MICREL_KSZ8_P1_ERRATA) in ksz886x_cable_test_start()
2345 return -EOPNOTSUPP; in ksz886x_cable_test_start()
2349 * confuse the internal state machine - disable auto neg here. in ksz886x_cable_test_start()
2395 * (DELTA_TIME - 22) * 0.8 for lan8814 phy. in ksz886x_cable_test_fault_length()
2400 return ((dt - 22) * 800) / 10; in ksz886x_cable_test_fault_length()
2407 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_wait_for_completion()
2410 ret = phy_read_poll_timeout(phydev, type->cable_diag_reg, val, in ksz886x_cable_test_wait_for_completion()
2444 return -EAGAIN; in lan8814_cable_test_one_pair()
2472 * We can workaround this limitation by using the MDI-X functionality. in ksz886x_cable_test_one_pair()
2479 switch (phydev->phy_id & MICREL_PHY_ID_MASK) { in ksz886x_cable_test_one_pair()
2487 ret = -ENODEV; in ksz886x_cable_test_one_pair()
2509 return -EAGAIN; in ksz886x_cable_test_one_pair()
2527 const struct kszphy_type *type = phydev->drv->driver_data; in ksz886x_cable_test_get_status()
2528 unsigned long pair_mask = type->pair_mask; in ksz886x_cable_test_get_status()
2536 while (pair_mask && retries--) { in ksz886x_cable_test_get_status()
2538 if (type->cable_diag_reg == LAN8814_CABLE_DIAG) in ksz886x_cable_test_get_status()
2542 if (ret == -EAGAIN) in ksz886x_cable_test_get_status()
2625 u32 *seconds, u32 *nano_seconds, u16 *seq_id) in lan8814_ptp_rx_ts_get() argument
2627 *seconds = lanphy_read_page_reg(phydev, 5, PTP_RX_INGRESS_SEC_HI); in lan8814_ptp_rx_ts_get()
2628 *seconds = (*seconds << 16) | in lan8814_ptp_rx_ts_get()
2639 u32 *seconds, u32 *nano_seconds, u16 *seq_id) in lan8814_ptp_tx_ts_get() argument
2641 *seconds = lanphy_read_page_reg(phydev, 5, PTP_TX_EGRESS_SEC_HI); in lan8814_ptp_tx_ts_get()
2642 *seconds = *seconds << 16 | in lan8814_ptp_tx_ts_get()
2655 struct lan8814_shared_priv *shared = phy_package_get_priv(ptp_priv->phydev); in lan8814_ts_info()
2657 info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | in lan8814_ts_info()
2661 info->phc_index = ptp_clock_index(shared->ptp_clock); in lan8814_ts_info()
2663 info->tx_types = in lan8814_ts_info()
2668 info->rx_filters = in lan8814_ts_info()
2701 ptp_priv->hwts_tx_type = config->tx_type; in lan8814_hwtstamp()
2702 ptp_priv->rx_filter = config->rx_filter; in lan8814_hwtstamp()
2704 switch (config->rx_filter) { in lan8814_hwtstamp()
2706 ptp_priv->layer = 0; in lan8814_hwtstamp()
2707 ptp_priv->version = 0; in lan8814_hwtstamp()
2712 ptp_priv->layer = PTP_CLASS_L4; in lan8814_hwtstamp()
2713 ptp_priv->version = PTP_CLASS_V2; in lan8814_hwtstamp()
2718 ptp_priv->layer = PTP_CLASS_L2; in lan8814_hwtstamp()
2719 ptp_priv->version = PTP_CLASS_V2; in lan8814_hwtstamp()
2724 ptp_priv->layer = PTP_CLASS_L4 | PTP_CLASS_L2; in lan8814_hwtstamp()
2725 ptp_priv->version = PTP_CLASS_V2; in lan8814_hwtstamp()
2728 return -ERANGE; in lan8814_hwtstamp()
2731 if (ptp_priv->layer & PTP_CLASS_L2) { in lan8814_hwtstamp()
2734 } else if (ptp_priv->layer & PTP_CLASS_L4) { in lan8814_hwtstamp()
2738 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_PARSE_CONFIG, rxcfg); in lan8814_hwtstamp()
2739 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_PARSE_CONFIG, txcfg); in lan8814_hwtstamp()
2743 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_RX_TIMESTAMP_EN, pkt_ts_enable); in lan8814_hwtstamp()
2744 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_TIMESTAMP_EN, pkt_ts_enable); in lan8814_hwtstamp()
2746 tx_mod = lanphy_read_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD); in lan8814_hwtstamp()
2747 if (ptp_priv->hwts_tx_type == HWTSTAMP_TX_ONESTEP_SYNC) { in lan8814_hwtstamp()
2748 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD, in lan8814_hwtstamp()
2750 } else if (ptp_priv->hwts_tx_type == HWTSTAMP_TX_ON) { in lan8814_hwtstamp()
2751 lanphy_write_page_reg(ptp_priv->phydev, 5, PTP_TX_MOD, in lan8814_hwtstamp()
2755 if (config->rx_filter != HWTSTAMP_FILTER_NONE) in lan8814_hwtstamp()
2756 lan8814_config_ts_intr(ptp_priv->phydev, true); in lan8814_hwtstamp()
2758 lan8814_config_ts_intr(ptp_priv->phydev, false); in lan8814_hwtstamp()
2761 list_for_each_entry_safe(rx_ts, tmp, &ptp_priv->rx_ts_list, list) { in lan8814_hwtstamp()
2762 list_del(&rx_ts->list); in lan8814_hwtstamp()
2765 skb_queue_purge(&ptp_priv->rx_queue); in lan8814_hwtstamp()
2766 skb_queue_purge(&ptp_priv->tx_queue); in lan8814_hwtstamp()
2768 lan8814_flush_fifo(ptp_priv->phydev, false); in lan8814_hwtstamp()
2769 lan8814_flush_fifo(ptp_priv->phydev, true); in lan8814_hwtstamp()
2779 switch (ptp_priv->hwts_tx_type) { in lan8814_txtstamp()
2787 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in lan8814_txtstamp()
2788 skb_queue_tail(&ptp_priv->tx_queue, skb); in lan8814_txtstamp()
2810 *sig = (__force u16)(ntohs(ptp_header->sequence_id)); in lan8814_get_sig_rx()
2827 spin_lock_irqsave(&ptp_priv->rx_ts_lock, flags); in lan8814_match_rx_skb()
2828 list_for_each_entry_safe(rx_ts, tmp, &ptp_priv->rx_ts_list, list) { in lan8814_match_rx_skb()
2830 if (memcmp(&skb_sig, &rx_ts->seq_id, sizeof(rx_ts->seq_id))) in lan8814_match_rx_skb()
2835 shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds, in lan8814_match_rx_skb()
2836 rx_ts->nsec); in lan8814_match_rx_skb()
2837 list_del(&rx_ts->list); in lan8814_match_rx_skb()
2843 spin_unlock_irqrestore(&ptp_priv->rx_ts_lock, flags); in lan8814_match_rx_skb()
2855 if (ptp_priv->rx_filter == HWTSTAMP_FILTER_NONE || in lan8814_rxtstamp()
2859 if ((type & ptp_priv->version) == 0 || (type & ptp_priv->layer) == 0) in lan8814_rxtstamp()
2866 skb_queue_tail(&ptp_priv->rx_queue, skb); in lan8814_rxtstamp()
2904 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_gettime64()
2906 time64_t seconds; in lan8814_ptpci_gettime64() local
2908 mutex_lock(&shared->shared_lock); in lan8814_ptpci_gettime64()
2909 lan8814_ptp_clock_get(phydev, &seconds, &nano_seconds); in lan8814_ptpci_gettime64()
2910 mutex_unlock(&shared->shared_lock); in lan8814_ptpci_gettime64()
2911 ts->tv_sec = seconds; in lan8814_ptpci_gettime64()
2912 ts->tv_nsec = nano_seconds; in lan8814_ptpci_gettime64()
2922 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_settime64()
2924 mutex_lock(&shared->shared_lock); in lan8814_ptpci_settime64()
2925 lan8814_ptp_clock_set(phydev, ts->tv_sec, ts->tv_nsec); in lan8814_ptpci_settime64()
2926 mutex_unlock(&shared->shared_lock); in lan8814_ptpci_settime64()
2962 s32 seconds; in lan8814_ptp_clock_step() local
2972 nano_seconds -= 1000000000; in lan8814_ptp_clock_step()
2977 } else if (time_step_ns < -15000000000LL) { in lan8814_ptp_clock_step()
2979 time_step_ns = -time_step_ns; in lan8814_ptp_clock_step()
2982 set_seconds -= div_u64_rem(time_step_ns, 1000000000LL, in lan8814_ptp_clock_step()
2986 set_seconds--; in lan8814_ptp_clock_step()
2989 nano_seconds -= nano_seconds_step; in lan8814_ptp_clock_step()
2998 seconds = (s32)div_u64_rem(abs_time_step_ns, 1000000000, in lan8814_ptp_clock_step()
3002 abs_time_step_ns = (u64)(-time_step_ns); in lan8814_ptp_clock_step()
3003 seconds = -((s32)div_u64_rem(abs_time_step_ns, 1000000000, in lan8814_ptp_clock_step()
3007 /* subtracting nano seconds is not allowed in lan8814_ptp_clock_step()
3008 * convert to subtracting from seconds, in lan8814_ptp_clock_step()
3011 seconds--; in lan8814_ptp_clock_step()
3012 nano_seconds = (1000000000 - nano_seconds); in lan8814_ptp_clock_step()
3022 /* carry into seconds */ in lan8814_ptp_clock_step()
3023 seconds++; in lan8814_ptp_clock_step()
3024 nano_seconds -= 1000000000; in lan8814_ptp_clock_step()
3027 while (seconds) { in lan8814_ptp_clock_step()
3030 if (seconds > 0) { in lan8814_ptp_clock_step()
3031 u32 adjustment_value = (u32)seconds; in lan8814_ptp_clock_step()
3045 seconds -= ((s32)adjustment_value); in lan8814_ptp_clock_step()
3048 set_seconds -= adjustment_value; in lan8814_ptp_clock_step()
3051 u32 adjustment_value = (u32)(-seconds); in lan8814_ptp_clock_step()
3064 seconds += ((s32)adjustment_value); in lan8814_ptp_clock_step()
3094 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjtime()
3096 mutex_lock(&shared->shared_lock); in lan8814_ptpci_adjtime()
3098 mutex_unlock(&shared->shared_lock); in lan8814_ptpci_adjtime()
3107 struct phy_device *phydev = shared->phydev; in lan8814_ptpci_adjfine()
3113 scaled_ppm = -scaled_ppm; in lan8814_ptpci_adjfine()
3126 mutex_lock(&shared->shared_lock); in lan8814_ptpci_adjfine()
3129 mutex_unlock(&shared->shared_lock); in lan8814_ptpci_adjfine()
3229 struct phy_device *phydev = shared->phydev; in lan8814_ptp_perout()
3235 mutex_lock(&shared->shared_lock); in lan8814_ptp_perout()
3236 event = rq->perout.index; in lan8814_ptp_perout()
3237 pin = ptp_find_pin(shared->ptp_clock, PTP_PF_PEROUT, event); in lan8814_ptp_perout()
3239 mutex_unlock(&shared->shared_lock); in lan8814_ptp_perout()
3240 return -EBUSY; in lan8814_ptp_perout()
3246 mutex_unlock(&shared->shared_lock); in lan8814_ptp_perout()
3250 ts_on.tv_sec = rq->perout.on.sec; in lan8814_ptp_perout()
3251 ts_on.tv_nsec = rq->perout.on.nsec; in lan8814_ptp_perout()
3254 ts_period.tv_sec = rq->perout.period.sec; in lan8814_ptp_perout()
3255 ts_period.tv_nsec = rq->perout.period.nsec; in lan8814_ptp_perout()
3261 mutex_unlock(&shared->shared_lock); in lan8814_ptp_perout()
3262 return -EOPNOTSUPP; in lan8814_ptp_perout()
3268 mutex_unlock(&shared->shared_lock); in lan8814_ptp_perout()
3269 return -EINVAL; in lan8814_ptp_perout()
3324 lan8814_ptp_set_target(phydev, event, rq->perout.start.sec, in lan8814_ptp_perout()
3325 rq->perout.start.nsec); in lan8814_ptp_perout()
3326 lan8814_ptp_set_reload(phydev, event, rq->perout.period.sec, in lan8814_ptp_perout()
3327 rq->perout.period.nsec); in lan8814_ptp_perout()
3329 mutex_unlock(&shared->shared_lock); in lan8814_ptp_perout()
3398 struct phy_device *phydev = shared->phydev; in lan8814_ptp_extts()
3401 pin = ptp_find_pin(shared->ptp_clock, PTP_PF_EXTTS, in lan8814_ptp_extts()
3402 rq->extts.index); in lan8814_ptp_extts()
3403 if (pin == -1 || pin != LAN8814_PTP_EXTTS_NUM) in lan8814_ptp_extts()
3404 return -EINVAL; in lan8814_ptp_extts()
3406 mutex_lock(&shared->shared_lock); in lan8814_ptp_extts()
3408 lan8814_ptp_extts_on(phydev, pin, rq->extts.flags); in lan8814_ptp_extts()
3412 mutex_unlock(&shared->shared_lock); in lan8814_ptp_extts()
3420 switch (rq->type) { in lan8814_ptpci_enable()
3426 return -EINVAL; in lan8814_ptpci_enable()
3441 return -1; in lan8814_ptpci_verify()
3445 return -1; in lan8814_ptpci_verify()
3448 return -1; in lan8814_ptpci_verify()
3465 *sig = (__force u16)(ntohs(ptp_header->sequence_id)); in lan8814_get_sig_tx()
3470 u32 seconds, u32 nsec, u16 seq_id) in lan8814_match_tx_skb() argument
3478 spin_lock_irqsave(&ptp_priv->tx_queue.lock, flags); in lan8814_match_tx_skb()
3479 skb_queue_walk_safe(&ptp_priv->tx_queue, skb, skb_tmp) { in lan8814_match_tx_skb()
3486 __skb_unlink(skb, &ptp_priv->tx_queue); in lan8814_match_tx_skb()
3490 spin_unlock_irqrestore(&ptp_priv->tx_queue.lock, flags); in lan8814_match_tx_skb()
3494 shhwtstamps.hwtstamp = ktime_set(seconds, nsec); in lan8814_match_tx_skb()
3501 struct phy_device *phydev = ptp_priv->phydev; in lan8814_dequeue_tx_skb()
3502 u32 seconds, nsec; in lan8814_dequeue_tx_skb() local
3505 lan8814_ptp_tx_ts_get(phydev, &seconds, &nsec, &seq_id); in lan8814_dequeue_tx_skb()
3506 lan8814_match_tx_skb(ptp_priv, seconds, nsec, seq_id); in lan8814_dequeue_tx_skb()
3511 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_tx_ts()
3533 spin_lock_irqsave(&ptp_priv->rx_queue.lock, flags); in lan8814_match_skb()
3534 skb_queue_walk_safe(&ptp_priv->rx_queue, skb, skb_tmp) { in lan8814_match_skb()
3538 if (memcmp(&skb_sig, &rx_ts->seq_id, sizeof(rx_ts->seq_id))) in lan8814_match_skb()
3541 __skb_unlink(skb, &ptp_priv->rx_queue); in lan8814_match_skb()
3546 spin_unlock_irqrestore(&ptp_priv->rx_queue.lock, flags); in lan8814_match_skb()
3551 shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds, rx_ts->nsec); in lan8814_match_skb()
3567 spin_lock_irqsave(&ptp_priv->rx_ts_lock, flags); in lan8814_match_rx_ts()
3568 list_add(&rx_ts->list, &ptp_priv->rx_ts_list); in lan8814_match_rx_ts()
3569 spin_unlock_irqrestore(&ptp_priv->rx_ts_lock, flags); in lan8814_match_rx_ts()
3577 struct phy_device *phydev = ptp_priv->phydev; in lan8814_get_rx_ts()
3586 lan8814_ptp_rx_ts_get(phydev, &rx_ts->seconds, &rx_ts->nsec, in lan8814_get_rx_ts()
3587 &rx_ts->seq_id); in lan8814_get_rx_ts()
3599 struct kszphy_priv *priv = phydev->priv; in lan8814_handle_ptp_interrupt()
3600 struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv; in lan8814_handle_ptp_interrupt()
3610 skb_queue_purge(&ptp_priv->tx_queue); in lan8814_handle_ptp_interrupt()
3615 skb_queue_purge(&ptp_priv->rx_queue); in lan8814_handle_ptp_interrupt()
3621 struct phy_device *phydev = shared->phydev; in lan8814_gpio_process_cap()
3637 return -1; in lan8814_gpio_process_cap()
3660 ptp_clock_event(shared->ptp_clock, &ptp_event); in lan8814_gpio_process_cap()
3670 mutex_lock(&shared->shared_lock); in lan8814_handle_gpio_interrupt()
3672 mutex_unlock(&shared->shared_lock); in lan8814_handle_gpio_interrupt()
3681 /* MDI-X setting for swap A,B transmit */ in lan8804_config_init()
3728 /* By default interrupt buffer is open-drain in which case the interrupt in lan8804_config_intr()
3730 * push-pull to be able to change interrupt polarity in lan8804_config_intr()
3735 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8804_config_intr()
3806 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8814_config_intr()
3825 struct kszphy_priv *priv = phydev->priv; in lan8814_ptp_init()
3826 struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv; in lan8814_ptp_init()
3858 skb_queue_head_init(&ptp_priv->tx_queue); in lan8814_ptp_init()
3859 skb_queue_head_init(&ptp_priv->rx_queue); in lan8814_ptp_init()
3860 INIT_LIST_HEAD(&ptp_priv->rx_ts_list); in lan8814_ptp_init()
3861 spin_lock_init(&ptp_priv->rx_ts_lock); in lan8814_ptp_init()
3863 ptp_priv->phydev = phydev; in lan8814_ptp_init()
3865 ptp_priv->mii_ts.rxtstamp = lan8814_rxtstamp; in lan8814_ptp_init()
3866 ptp_priv->mii_ts.txtstamp = lan8814_txtstamp; in lan8814_ptp_init()
3867 ptp_priv->mii_ts.hwtstamp = lan8814_hwtstamp; in lan8814_ptp_init()
3868 ptp_priv->mii_ts.ts_info = lan8814_ts_info; in lan8814_ptp_init()
3870 phydev->mii_ts = &ptp_priv->mii_ts; in lan8814_ptp_init()
3873 phydev->default_timestamp = true; in lan8814_ptp_init()
3881 mutex_init(&shared->shared_lock); in lan8814_ptp_probe_once()
3883 shared->pin_config = devm_kmalloc_array(&phydev->mdio.dev, in lan8814_ptp_probe_once()
3885 sizeof(*shared->pin_config), in lan8814_ptp_probe_once()
3887 if (!shared->pin_config) in lan8814_ptp_probe_once()
3888 return -ENOMEM; in lan8814_ptp_probe_once()
3891 struct ptp_pin_desc *ptp_pin = &shared->pin_config[i]; in lan8814_ptp_probe_once()
3894 snprintf(ptp_pin->name, in lan8814_ptp_probe_once()
3895 sizeof(ptp_pin->name), "lan8814_ptp_pin_%02d", i); in lan8814_ptp_probe_once()
3896 ptp_pin->index = i; in lan8814_ptp_probe_once()
3897 ptp_pin->func = PTP_PF_NONE; in lan8814_ptp_probe_once()
3900 shared->ptp_clock_info.owner = THIS_MODULE; in lan8814_ptp_probe_once()
3901 snprintf(shared->ptp_clock_info.name, 30, "%s", phydev->drv->name); in lan8814_ptp_probe_once()
3902 shared->ptp_clock_info.max_adj = 31249999; in lan8814_ptp_probe_once()
3903 shared->ptp_clock_info.n_alarm = 0; in lan8814_ptp_probe_once()
3904 shared->ptp_clock_info.n_ext_ts = LAN8814_PTP_EXTTS_NUM; in lan8814_ptp_probe_once()
3905 shared->ptp_clock_info.n_pins = LAN8814_PTP_GPIO_NUM; in lan8814_ptp_probe_once()
3906 shared->ptp_clock_info.pps = 0; in lan8814_ptp_probe_once()
3907 shared->ptp_clock_info.supported_extts_flags = PTP_RISING_EDGE | in lan8814_ptp_probe_once()
3910 shared->ptp_clock_info.supported_perout_flags = PTP_PEROUT_DUTY_CYCLE; in lan8814_ptp_probe_once()
3911 shared->ptp_clock_info.pin_config = shared->pin_config; in lan8814_ptp_probe_once()
3912 shared->ptp_clock_info.n_per_out = LAN8814_PTP_PEROUT_NUM; in lan8814_ptp_probe_once()
3913 shared->ptp_clock_info.adjfine = lan8814_ptpci_adjfine; in lan8814_ptp_probe_once()
3914 shared->ptp_clock_info.adjtime = lan8814_ptpci_adjtime; in lan8814_ptp_probe_once()
3915 shared->ptp_clock_info.gettime64 = lan8814_ptpci_gettime64; in lan8814_ptp_probe_once()
3916 shared->ptp_clock_info.settime64 = lan8814_ptpci_settime64; in lan8814_ptp_probe_once()
3917 shared->ptp_clock_info.getcrosststamp = NULL; in lan8814_ptp_probe_once()
3918 shared->ptp_clock_info.enable = lan8814_ptpci_enable; in lan8814_ptp_probe_once()
3919 shared->ptp_clock_info.verify = lan8814_ptpci_verify; in lan8814_ptp_probe_once()
3921 shared->ptp_clock = ptp_clock_register(&shared->ptp_clock_info, in lan8814_ptp_probe_once()
3922 &phydev->mdio.dev); in lan8814_ptp_probe_once()
3923 if (IS_ERR(shared->ptp_clock)) { in lan8814_ptp_probe_once()
3925 PTR_ERR(shared->ptp_clock)); in lan8814_ptp_probe_once()
3926 return -EINVAL; in lan8814_ptp_probe_once()
3930 if (!shared->ptp_clock) in lan8814_ptp_probe_once()
3935 shared->phydev = phydev; in lan8814_ptp_probe_once()
3966 struct kszphy_priv *lan8814 = phydev->priv; in lan8814_config_init()
3979 /* MDI-X setting for swap A,B transmit */ in lan8814_config_init()
3985 if (lan8814->led_mode >= 0) in lan8814_config_init()
3986 lan8814_setup_led(phydev, lan8814->led_mode); in lan8814_config_init()
4000 gpiod = devm_gpiod_get_optional(&phydev->mdio.dev, "coma-mode", in lan8814_release_coma_mode()
4041 const struct kszphy_type *type = phydev->drv->driver_data; in lan8814_probe()
4046 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in lan8814_probe()
4048 return -ENOMEM; in lan8814_probe()
4050 phydev->priv = priv; in lan8814_probe()
4052 priv->type = type; in lan8814_probe()
4056 /* Strap-in value for PHY address, below register read gives starting in lan8814_probe()
4060 devm_phy_package_join(&phydev->mdio.dev, phydev, in lan8814_probe()
4168 /* 10M/100M Ethernet Signal Tuning Errata for Shorted-Center Tap in lan8841_config_init()
4214 if (phydev->interrupts == PHY_INTERRUPT_ENABLED) { in lan8841_config_intr()
4255 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_get_tx_ts()
4289 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_flush_fifo()
4312 struct phy_device *phydev = ptp_priv->phydev; in lan8841_gpio_process_cap()
4317 pin = ptp_find_pin_unlocked(ptp_priv->ptp_clock, PTP_PF_EXTTS, 0); in lan8841_gpio_process_cap()
4318 if (pin == -1) in lan8841_gpio_process_cap()
4330 mutex_lock(&ptp_priv->ptp_lock); in lan8841_gpio_process_cap()
4348 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_gpio_process_cap()
4356 ptp_clock_event(ptp_priv->ptp_clock, &ptp_event); in lan8841_gpio_process_cap()
4361 struct kszphy_priv *priv = phydev->priv; in lan8841_handle_ptp_interrupt()
4362 struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv; in lan8841_handle_ptp_interrupt()
4376 skb_queue_purge(&ptp_priv->tx_queue); in lan8841_handle_ptp_interrupt()
4417 info->phc_index = ptp_priv->ptp_clock ? in lan8841_ts_info()
4418 ptp_clock_index(ptp_priv->ptp_clock) : -1; in lan8841_ts_info()
4419 if (info->phc_index == -1) in lan8841_ts_info()
4422 info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | in lan8841_ts_info()
4426 info->tx_types = (1 << HWTSTAMP_TX_OFF) | in lan8841_ts_info()
4430 info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | in lan8841_ts_info()
4445 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_enable_processing()
4466 ptp_schedule_worker(ptp_priv->ptp_clock, 0); in lan8841_ptp_enable_processing()
4479 ptp_cancel_worker_sync(ptp_priv->ptp_clock); in lan8841_ptp_enable_processing()
4492 struct phy_device *phydev = ptp_priv->phydev; in lan8841_hwtstamp()
4496 ptp_priv->hwts_tx_type = config->tx_type; in lan8841_hwtstamp()
4497 ptp_priv->rx_filter = config->rx_filter; in lan8841_hwtstamp()
4499 switch (config->rx_filter) { in lan8841_hwtstamp()
4501 ptp_priv->layer = 0; in lan8841_hwtstamp()
4502 ptp_priv->version = 0; in lan8841_hwtstamp()
4507 ptp_priv->layer = PTP_CLASS_L4; in lan8841_hwtstamp()
4508 ptp_priv->version = PTP_CLASS_V2; in lan8841_hwtstamp()
4513 ptp_priv->layer = PTP_CLASS_L2; in lan8841_hwtstamp()
4514 ptp_priv->version = PTP_CLASS_V2; in lan8841_hwtstamp()
4519 ptp_priv->layer = PTP_CLASS_L4 | PTP_CLASS_L2; in lan8841_hwtstamp()
4520 ptp_priv->version = PTP_CLASS_V2; in lan8841_hwtstamp()
4523 return -ERANGE; in lan8841_hwtstamp()
4529 if (ptp_priv->layer & PTP_CLASS_L2) { in lan8841_hwtstamp()
4532 } else if (ptp_priv->layer & PTP_CLASS_L4) { in lan8841_hwtstamp()
4548 ptp_priv->hwts_tx_type == HWTSTAMP_TX_ONESTEP_SYNC ? in lan8841_hwtstamp()
4553 config->rx_filter != HWTSTAMP_FILTER_NONE); in lan8841_hwtstamp()
4555 skb_queue_purge(&ptp_priv->tx_queue); in lan8841_hwtstamp()
4576 if (ptp_priv->rx_filter == HWTSTAMP_FILTER_NONE || in lan8841_rxtstamp()
4580 if ((type & ptp_priv->version) == 0 || (type & ptp_priv->layer) == 0) in lan8841_rxtstamp()
4583 spin_lock_irqsave(&ptp_priv->seconds_lock, flags); in lan8841_rxtstamp()
4584 ts.tv_sec = ptp_priv->seconds; in lan8841_rxtstamp()
4585 spin_unlock_irqrestore(&ptp_priv->seconds_lock, flags); in lan8841_rxtstamp()
4586 ts_header = __be32_to_cpu(header->reserved2); in lan8841_rxtstamp()
4593 ts.tv_sec -= GENMASK(1, 0) + 1; in lan8841_rxtstamp()
4597 shhwtstamps->hwtstamp = in lan8841_rxtstamp()
4600 header->reserved2 = 0; in lan8841_rxtstamp()
4617 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_set_target()
4645 ts->tv_sec + LAN8841_BUFFER_TIME, 0); in lan8841_ptp_update_target()
4656 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_set_reload()
4690 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_settime64()
4695 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_settime64()
4696 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_LO, lower_16_bits(ts->tv_sec)); in lan8841_ptp_settime64()
4697 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_MID, upper_16_bits(ts->tv_sec)); in lan8841_ptp_settime64()
4698 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_SEC_HI, upper_32_bits(ts->tv_sec) & 0xffff); in lan8841_ptp_settime64()
4699 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_LO, lower_16_bits(ts->tv_nsec)); in lan8841_ptp_settime64()
4700 phy_write_mmd(phydev, 2, LAN8841_PTP_LTC_SET_NS_HI, upper_16_bits(ts->tv_nsec) & 0x3fff); in lan8841_ptp_settime64()
4706 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_settime64()
4708 spin_lock_irqsave(&ptp_priv->seconds_lock, flags); in lan8841_ptp_settime64()
4709 ptp_priv->seconds = ts->tv_sec; in lan8841_ptp_settime64()
4710 spin_unlock_irqrestore(&ptp_priv->seconds_lock, flags); in lan8841_ptp_settime64()
4727 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_gettime64()
4731 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_gettime64()
4746 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_gettime64()
4757 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_getseconds()
4760 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_getseconds()
4771 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_getseconds()
4786 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_adjtime()
4799 if (delta > 10000000000LL || delta < -10000000000LL) { in lan8841_ptp_adjtime()
4803 ptp->gettime64(ptp, &ts); in lan8841_ptp_adjtime()
4808 ptp->settime64(ptp, &ts); in lan8841_ptp_adjtime()
4812 sec = div_u64_rem(delta < 0 ? -delta : delta, NSEC_PER_SEC, &nsec); in lan8841_ptp_adjtime()
4818 sec--; in lan8841_ptp_adjtime()
4819 nsec = NSEC_PER_SEC - nsec; in lan8841_ptp_adjtime()
4831 /* carry into seconds */ in lan8841_ptp_adjtime()
4833 nsec -= NSEC_PER_SEC; in lan8841_ptp_adjtime()
4836 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_adjtime()
4853 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_adjtime()
4856 ptp->gettime64(ptp, &ts); in lan8841_ptp_adjtime()
4857 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_adjtime()
4859 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_adjtime()
4872 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_adjfine()
4880 scaled_ppm = -scaled_ppm; in lan8841_ptp_adjfine()
4887 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_adjfine()
4892 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_adjfine()
4906 return -1; in lan8841_ptp_verify()
4919 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout_off()
4935 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout_on()
4965 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_remove_event()
4970 * pins 0-4 while GPIO_DATA_SEL2 contains GPIO pins 5-9, therefore in lan8841_ptp_remove_event()
4977 tmp = LAN8841_GPIO_DATA_SEL_GPIO_DATA_SEL_EVENT_MASK << (3 * (pin - 5)); in lan8841_ptp_remove_event()
4996 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_enable_event()
5017 * pins 0-4 while GPIO_DATA_SEL2 contains GPIO pins 5-9, therefore in lan8841_ptp_enable_event()
5030 tmp << (3 * (pin - 5))); in lan8841_ptp_enable_event()
5055 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_perout()
5062 pin = ptp_find_pin(ptp_priv->ptp_clock, PTP_PF_PEROUT, rq->perout.index); in lan8841_ptp_perout()
5063 if (pin == -1 || pin >= LAN8841_PTP_GPIO_NUM) in lan8841_ptp_perout()
5064 return -EINVAL; in lan8841_ptp_perout()
5074 ts_on.tv_sec = rq->perout.on.sec; in lan8841_ptp_perout()
5075 ts_on.tv_nsec = rq->perout.on.nsec; in lan8841_ptp_perout()
5078 ts_period.tv_sec = rq->perout.period.sec; in lan8841_ptp_perout()
5079 ts_period.tv_nsec = rq->perout.period.nsec; in lan8841_ptp_perout()
5085 return -EOPNOTSUPP; in lan8841_ptp_perout()
5091 return -EINVAL; in lan8841_ptp_perout()
5144 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_perout()
5145 ret = lan8841_ptp_set_target(ptp_priv, LAN8841_EVENT_A, rq->perout.start.sec, in lan8841_ptp_perout()
5146 rq->perout.start.nsec); in lan8841_ptp_perout()
5147 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_perout()
5151 ret = lan8841_ptp_set_reload(ptp_priv, LAN8841_EVENT_A, rq->perout.period.sec, in lan8841_ptp_perout()
5152 rq->perout.period.nsec); in lan8841_ptp_perout()
5176 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_extts_on()
5206 struct phy_device *phydev = ptp_priv->phydev; in lan8841_ptp_extts_off()
5241 if (rq->extts.flags & ~(PTP_ENABLE_FEATURE | in lan8841_ptp_extts()
5244 return -EOPNOTSUPP; in lan8841_ptp_extts()
5246 pin = ptp_find_pin(ptp_priv->ptp_clock, PTP_PF_EXTTS, rq->extts.index); in lan8841_ptp_extts()
5247 if (pin == -1 || pin >= LAN8841_PTP_GPIO_NUM) in lan8841_ptp_extts()
5248 return -EINVAL; in lan8841_ptp_extts()
5250 mutex_lock(&ptp_priv->ptp_lock); in lan8841_ptp_extts()
5252 ret = lan8841_ptp_extts_on(ptp_priv, pin, rq->extts.flags); in lan8841_ptp_extts()
5255 mutex_unlock(&ptp_priv->ptp_lock); in lan8841_ptp_extts()
5263 switch (rq->type) { in lan8841_ptp_enable()
5269 return -EOPNOTSUPP; in lan8841_ptp_enable()
5282 lan8841_ptp_getseconds(&ptp_priv->ptp_clock_info, &ts); in lan8841_ptp_do_aux_work()
5284 spin_lock_irqsave(&ptp_priv->seconds_lock, flags); in lan8841_ptp_do_aux_work()
5285 ptp_priv->seconds = ts.tv_sec; in lan8841_ptp_do_aux_work()
5286 spin_unlock_irqrestore(&ptp_priv->seconds_lock, flags); in lan8841_ptp_do_aux_work()
5324 phydev->interface = PHY_INTERFACE_MODE_RGMII_RXID; in lan8841_probe()
5330 priv = phydev->priv; in lan8841_probe()
5331 ptp_priv = &priv->ptp_priv; in lan8841_probe()
5333 ptp_priv->pin_config = devm_kcalloc(&phydev->mdio.dev, in lan8841_probe()
5335 sizeof(*ptp_priv->pin_config), in lan8841_probe()
5337 if (!ptp_priv->pin_config) in lan8841_probe()
5338 return -ENOMEM; in lan8841_probe()
5341 struct ptp_pin_desc *p = &ptp_priv->pin_config[i]; in lan8841_probe()
5343 snprintf(p->name, sizeof(p->name), "pin%d", i); in lan8841_probe()
5344 p->index = i; in lan8841_probe()
5345 p->func = PTP_PF_NONE; in lan8841_probe()
5348 ptp_priv->ptp_clock_info = lan8841_ptp_clock_info; in lan8841_probe()
5349 ptp_priv->ptp_clock_info.pin_config = ptp_priv->pin_config; in lan8841_probe()
5350 ptp_priv->ptp_clock = ptp_clock_register(&ptp_priv->ptp_clock_info, in lan8841_probe()
5351 &phydev->mdio.dev); in lan8841_probe()
5352 if (IS_ERR(ptp_priv->ptp_clock)) { in lan8841_probe()
5354 PTR_ERR(ptp_priv->ptp_clock)); in lan8841_probe()
5355 return -EINVAL; in lan8841_probe()
5358 if (!ptp_priv->ptp_clock) in lan8841_probe()
5362 skb_queue_head_init(&ptp_priv->tx_queue); in lan8841_probe()
5363 ptp_priv->phydev = phydev; in lan8841_probe()
5364 mutex_init(&ptp_priv->ptp_lock); in lan8841_probe()
5365 spin_lock_init(&ptp_priv->seconds_lock); in lan8841_probe()
5367 ptp_priv->mii_ts.rxtstamp = lan8841_rxtstamp; in lan8841_probe()
5368 ptp_priv->mii_ts.txtstamp = lan8814_txtstamp; in lan8841_probe()
5369 ptp_priv->mii_ts.hwtstamp = lan8841_hwtstamp; in lan8841_probe()
5370 ptp_priv->mii_ts.ts_info = lan8841_ts_info; in lan8841_probe()
5372 phydev->mii_ts = &ptp_priv->mii_ts; in lan8841_probe()
5375 phydev->default_timestamp = true; in lan8841_probe()
5397 struct kszphy_priv *priv = phydev->priv; in lan8841_suspend()
5398 struct kszphy_ptp_priv *ptp_priv = &priv->ptp_priv; in lan8841_suspend()
5400 if (ptp_priv->ptp_clock) in lan8841_suspend()
5401 ptp_cancel_worker_sync(ptp_priv->ptp_clock); in lan8841_suspend()