Lines Matching +full:layer +full:- +full:base +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0
7 u32 offset, enum mchp_rds_ptp_base base) in mchp_rds_phy_read_mmd() argument
9 struct phy_device *phydev = clock->phydev; in mchp_rds_phy_read_mmd()
12 addr = (offset + ((base == MCHP_RDS_PTP_PORT) ? BASE_PORT(clock) : in mchp_rds_phy_read_mmd()
19 u32 offset, enum mchp_rds_ptp_base base, in mchp_rds_phy_write_mmd() argument
22 struct phy_device *phydev = clock->phydev; in mchp_rds_phy_write_mmd()
25 addr = (offset + ((base == MCHP_RDS_PTP_PORT) ? BASE_PORT(clock) : in mchp_rds_phy_write_mmd()
32 u32 offset, enum mchp_rds_ptp_base base, in mchp_rds_phy_modify_mmd() argument
35 struct phy_device *phydev = clock->phydev; in mchp_rds_phy_modify_mmd()
38 addr = (offset + ((base == MCHP_RDS_PTP_PORT) ? BASE_PORT(clock) : in mchp_rds_phy_modify_mmd()
45 u32 offset, enum mchp_rds_ptp_base base, in mchp_rds_phy_set_bits_mmd() argument
48 struct phy_device *phydev = clock->phydev; in mchp_rds_phy_set_bits_mmd()
51 addr = (offset + ((base == MCHP_RDS_PTP_PORT) ? BASE_PORT(clock) : in mchp_rds_phy_set_bits_mmd()
81 ts_period.tv_sec = perout_request->period.sec; in mchp_get_pulsewidth()
82 ts_period.tv_nsec = perout_request->period.nsec; in mchp_get_pulsewidth()
84 ts_on.tv_sec = perout_request->on.sec; in mchp_get_pulsewidth()
85 ts_on.tv_nsec = perout_request->on.nsec; in mchp_get_pulsewidth()
91 return -EOPNOTSUPP; in mchp_get_pulsewidth()
203 clock->mchp_rds_ptp_event = -1; in mchp_rds_ptp_perout_off()
210 if (clock->mchp_rds_ptp_event < 0 && pin == clock->event_pin) { in mchp_get_event()
211 clock->mchp_rds_ptp_event = pin; in mchp_get_event()
224 struct phy_device *phydev = clock->phydev; in mchp_rds_ptp_perout()
228 if (perout->flags & ~PTP_PEROUT_DUTY_CYCLE) in mchp_rds_ptp_perout()
229 return -EOPNOTSUPP; in mchp_rds_ptp_perout()
231 event_pin = ptp_find_pin(clock->ptp_clock, PTP_PF_PEROUT, in mchp_rds_ptp_perout()
232 perout->index); in mchp_rds_ptp_perout()
233 if (event_pin != clock->event_pin) in mchp_rds_ptp_perout()
234 return -EINVAL; in mchp_rds_ptp_perout()
242 return -EINVAL; in mchp_rds_ptp_perout()
253 ret = mchp_set_clock_target(clock, perout->start.sec, in mchp_rds_ptp_perout()
254 perout->start.nsec); in mchp_rds_ptp_perout()
258 return mchp_set_clock_reload(clock, perout->period.sec, in mchp_rds_ptp_perout()
259 perout->period.nsec); in mchp_rds_ptp_perout()
265 switch (request->type) { in mchp_rds_ptpci_enable()
267 return mchp_rds_ptp_perout(ptpci, &request->perout, on); in mchp_rds_ptpci_enable()
269 return -EINVAL; in mchp_rds_ptpci_enable()
280 if (!(pin == clock->event_pin && chan == 0)) in mchp_rds_ptpci_verify()
281 return -1; in mchp_rds_ptpci_verify()
288 return -1; in mchp_rds_ptpci_verify()
300 skb_queue_purge(&clock->tx_queue); in mchp_rds_ptp_flush_fifo()
302 skb_queue_purge(&clock->rx_queue); in mchp_rds_ptp_flush_fifo()
333 switch (clock->hwts_tx_type) { in mchp_rds_ptp_txtstamp()
341 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in mchp_rds_ptp_txtstamp()
342 skb_queue_tail(&clock->tx_queue, skb); in mchp_rds_ptp_txtstamp()
367 *sig = (__force u16)(ntohs(ptp_header->sequence_id)); in mchp_rds_ptp_get_sig_rx()
381 spin_lock_irqsave(&clock->rx_queue.lock, flags); in mchp_rds_ptp_match_skb()
382 skb_queue_walk_safe(&clock->rx_queue, skb, skb_tmp) { in mchp_rds_ptp_match_skb()
386 if (skb_sig != rx_ts->seq_id) in mchp_rds_ptp_match_skb()
389 __skb_unlink(skb, &clock->rx_queue); in mchp_rds_ptp_match_skb()
394 spin_unlock_irqrestore(&clock->rx_queue.lock, flags); in mchp_rds_ptp_match_skb()
398 shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds, rx_ts->nsec); in mchp_rds_ptp_match_skb()
414 spin_lock_irqsave(&clock->rx_ts_lock, flags); in mchp_rds_ptp_match_rx_ts()
415 list_add(&rx_ts->list, &clock->rx_ts_list); in mchp_rds_ptp_match_rx_ts()
416 spin_unlock_irqrestore(&clock->rx_ts_lock, flags); in mchp_rds_ptp_match_rx_ts()
434 spin_lock_irqsave(&clock->rx_ts_lock, flags); in mchp_rds_ptp_match_rx_skb()
435 list_for_each_entry_safe(rx_ts, tmp, &clock->rx_ts_list, list) { in mchp_rds_ptp_match_rx_skb()
437 if (skb_sig != rx_ts->seq_id) in mchp_rds_ptp_match_rx_skb()
441 shhwtstamps->hwtstamp = ktime_set(rx_ts->seconds, rx_ts->nsec); in mchp_rds_ptp_match_rx_skb()
448 spin_unlock_irqrestore(&clock->rx_ts_lock, flags); in mchp_rds_ptp_match_rx_skb()
451 list_del(&rx_ts_var->list); in mchp_rds_ptp_match_rx_skb()
454 skb_queue_tail(&clock->rx_queue, skb); in mchp_rds_ptp_match_rx_skb()
465 if (clock->rx_filter == HWTSTAMP_FILTER_NONE || in mchp_rds_ptp_rxtstamp()
469 if ((type & clock->version) == 0 || (type & clock->layer) == 0) in mchp_rds_ptp_rxtstamp()
495 clock->hwts_tx_type = config->tx_type; in mchp_rds_ptp_hwtstamp()
496 clock->rx_filter = config->rx_filter; in mchp_rds_ptp_hwtstamp()
498 switch (config->rx_filter) { in mchp_rds_ptp_hwtstamp()
500 clock->layer = 0; in mchp_rds_ptp_hwtstamp()
501 clock->version = 0; in mchp_rds_ptp_hwtstamp()
506 clock->layer = PTP_CLASS_L4; in mchp_rds_ptp_hwtstamp()
507 clock->version = PTP_CLASS_V2; in mchp_rds_ptp_hwtstamp()
512 clock->layer = PTP_CLASS_L2; in mchp_rds_ptp_hwtstamp()
513 clock->version = PTP_CLASS_V2; in mchp_rds_ptp_hwtstamp()
518 clock->layer = PTP_CLASS_L4 | PTP_CLASS_L2; in mchp_rds_ptp_hwtstamp()
519 clock->version = PTP_CLASS_V2; in mchp_rds_ptp_hwtstamp()
522 return -ERANGE; in mchp_rds_ptp_hwtstamp()
528 if (clock->layer & PTP_CLASS_L2) { in mchp_rds_ptp_hwtstamp()
532 if (clock->layer & PTP_CLASS_L4) { in mchp_rds_ptp_hwtstamp()
560 if (clock->hwts_tx_type == HWTSTAMP_TX_ONESTEP_SYNC) in mchp_rds_ptp_hwtstamp()
576 spin_lock_irqsave(&clock->rx_ts_lock, flags); in mchp_rds_ptp_hwtstamp()
577 list_for_each_entry_safe(rx_ts, tmp, &clock->rx_ts_list, list) { in mchp_rds_ptp_hwtstamp()
578 list_del(&rx_ts->list); in mchp_rds_ptp_hwtstamp()
581 spin_unlock_irqrestore(&clock->rx_ts_lock, flags); in mchp_rds_ptp_hwtstamp()
593 config->rx_filter != HWTSTAMP_FILTER_NONE); in mchp_rds_ptp_hwtstamp()
605 info->phc_index = ptp_clock_index(clock->ptp_clock); in mchp_rds_ptp_ts_info()
607 info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | in mchp_rds_ptp_ts_info()
611 info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON) | in mchp_rds_ptp_ts_info()
614 info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) | in mchp_rds_ptp_ts_info()
639 if (delta > 10000000000LL || delta < -10000000000LL) { in mchp_rds_ptp_ltc_adjtime()
643 info->gettime64(info, &ts); in mchp_rds_ptp_ltc_adjtime()
648 info->settime64(info, &ts); in mchp_rds_ptp_ltc_adjtime()
657 sec--; in mchp_rds_ptp_ltc_adjtime()
658 nsec = NSEC_PER_SEC - nsec; in mchp_rds_ptp_ltc_adjtime()
672 nsec -= NSEC_PER_SEC; in mchp_rds_ptp_ltc_adjtime()
676 mutex_lock(&clock->ptp_lock); in mchp_rds_ptp_ltc_adjtime()
719 mutex_unlock(&clock->ptp_lock); in mchp_rds_ptp_ltc_adjtime()
720 info->gettime64(info, &ts); in mchp_rds_ptp_ltc_adjtime()
721 mutex_lock(&clock->ptp_lock); in mchp_rds_ptp_ltc_adjtime()
726 if (clock->mchp_rds_ptp_event >= 0) in mchp_rds_ptp_ltc_adjtime()
730 mutex_unlock(&clock->ptp_lock); in mchp_rds_ptp_ltc_adjtime()
750 scaled_ppm = -scaled_ppm; in mchp_rds_ptp_ltc_adjfine()
763 mutex_lock(&clock->ptp_lock); in mchp_rds_ptp_ltc_adjfine()
774 mutex_unlock(&clock->ptp_lock); in mchp_rds_ptp_ltc_adjfine()
789 mutex_lock(&clock->ptp_lock); in mchp_rds_ptp_ltc_gettime64()
837 mutex_unlock(&clock->ptp_lock); in mchp_rds_ptp_ltc_gettime64()
850 mutex_lock(&clock->ptp_lock); in mchp_rds_ptp_ltc_settime64()
853 lower_16_bits(ts->tv_sec)); in mchp_rds_ptp_ltc_settime64()
859 upper_16_bits(ts->tv_sec)); in mchp_rds_ptp_ltc_settime64()
865 upper_32_bits(ts->tv_sec) & GENMASK(15, 0)); in mchp_rds_ptp_ltc_settime64()
871 lower_16_bits(ts->tv_nsec)); in mchp_rds_ptp_ltc_settime64()
877 upper_16_bits(ts->tv_nsec) & GENMASK(13, 0)); in mchp_rds_ptp_ltc_settime64()
890 mutex_unlock(&clock->ptp_lock); in mchp_rds_ptp_ltc_settime64()
908 *sig = (__force u16)(ntohs(ptp_header->sequence_id)); in mchp_rds_ptp_get_sig_tx()
922 spin_lock_irqsave(&clock->tx_queue.lock, flags); in mchp_rds_ptp_match_tx_skb()
923 skb_queue_walk_safe(&clock->tx_queue, skb, skb_tmp) { in mchp_rds_ptp_match_tx_skb()
930 __skb_unlink(skb, &clock->tx_queue); in mchp_rds_ptp_match_tx_skb()
934 spin_unlock_irqrestore(&clock->tx_queue.lock, flags); in mchp_rds_ptp_match_tx_skb()
945 struct phy_device *phydev = clock->phydev; in mchp_rds_ptp_get_rx_ts()
987 rx_ts->seconds = sec; in mchp_rds_ptp_get_rx_ts()
988 rx_ts->nsec = nsec; in mchp_rds_ptp_get_rx_ts()
989 rx_ts->seq_id = rc; in mchp_rds_ptp_get_rx_ts()
1076 return phy_clear_bits_mmd(clock->phydev, PTP_MMD(clock), reg, in mchp_rds_ptp_top_config_intr()
1079 return phy_set_bits_mmd(clock->phydev, PTP_MMD(clock), reg, in mchp_rds_ptp_top_config_intr()
1230 clock = devm_kzalloc(&phydev->mdio.dev, sizeof(*clock), GFP_KERNEL); in mchp_rds_ptp_probe()
1232 return ERR_PTR(-ENOMEM); in mchp_rds_ptp_probe()
1234 clock->port_base_addr = port_base_addr; in mchp_rds_ptp_probe()
1235 clock->clk_base_addr = clk_base_addr; in mchp_rds_ptp_probe()
1236 clock->mmd = mmd; in mchp_rds_ptp_probe()
1238 mutex_init(&clock->ptp_lock); in mchp_rds_ptp_probe()
1239 clock->pin_config = devm_kmalloc_array(&phydev->mdio.dev, in mchp_rds_ptp_probe()
1241 sizeof(*clock->pin_config), in mchp_rds_ptp_probe()
1243 if (!clock->pin_config) in mchp_rds_ptp_probe()
1244 return ERR_PTR(-ENOMEM); in mchp_rds_ptp_probe()
1247 struct ptp_pin_desc *p = &clock->pin_config[i]; in mchp_rds_ptp_probe()
1250 snprintf(p->name, sizeof(p->name), "pin%d", i); in mchp_rds_ptp_probe()
1251 p->index = i; in mchp_rds_ptp_probe()
1252 p->func = PTP_PF_NONE; in mchp_rds_ptp_probe()
1255 clock->caps.owner = THIS_MODULE; in mchp_rds_ptp_probe()
1256 snprintf(clock->caps.name, 30, "%s", phydev->drv->name); in mchp_rds_ptp_probe()
1257 clock->caps.max_adj = MCHP_RDS_PTP_MAX_ADJ; in mchp_rds_ptp_probe()
1258 clock->caps.n_ext_ts = 0; in mchp_rds_ptp_probe()
1259 clock->caps.pps = 0; in mchp_rds_ptp_probe()
1260 clock->caps.n_pins = MCHP_RDS_PTP_N_PIN; in mchp_rds_ptp_probe()
1261 clock->caps.n_per_out = MCHP_RDS_PTP_N_PEROUT; in mchp_rds_ptp_probe()
1262 clock->caps.pin_config = clock->pin_config; in mchp_rds_ptp_probe()
1263 clock->caps.adjfine = mchp_rds_ptp_ltc_adjfine; in mchp_rds_ptp_probe()
1264 clock->caps.adjtime = mchp_rds_ptp_ltc_adjtime; in mchp_rds_ptp_probe()
1265 clock->caps.gettime64 = mchp_rds_ptp_ltc_gettime64; in mchp_rds_ptp_probe()
1266 clock->caps.settime64 = mchp_rds_ptp_ltc_settime64; in mchp_rds_ptp_probe()
1267 clock->caps.enable = mchp_rds_ptpci_enable; in mchp_rds_ptp_probe()
1268 clock->caps.verify = mchp_rds_ptpci_verify; in mchp_rds_ptp_probe()
1269 clock->caps.getcrosststamp = NULL; in mchp_rds_ptp_probe()
1270 clock->ptp_clock = ptp_clock_register(&clock->caps, in mchp_rds_ptp_probe()
1271 &phydev->mdio.dev); in mchp_rds_ptp_probe()
1272 if (IS_ERR(clock->ptp_clock)) in mchp_rds_ptp_probe()
1273 return ERR_PTR(-EINVAL); in mchp_rds_ptp_probe()
1276 if (!clock->ptp_clock) in mchp_rds_ptp_probe()
1280 skb_queue_head_init(&clock->tx_queue); in mchp_rds_ptp_probe()
1281 skb_queue_head_init(&clock->rx_queue); in mchp_rds_ptp_probe()
1282 INIT_LIST_HEAD(&clock->rx_ts_list); in mchp_rds_ptp_probe()
1283 spin_lock_init(&clock->rx_ts_lock); in mchp_rds_ptp_probe()
1285 clock->mii_ts.rxtstamp = mchp_rds_ptp_rxtstamp; in mchp_rds_ptp_probe()
1286 clock->mii_ts.txtstamp = mchp_rds_ptp_txtstamp; in mchp_rds_ptp_probe()
1287 clock->mii_ts.hwtstamp = mchp_rds_ptp_hwtstamp; in mchp_rds_ptp_probe()
1288 clock->mii_ts.ts_info = mchp_rds_ptp_ts_info; in mchp_rds_ptp_probe()
1290 phydev->mii_ts = &clock->mii_ts; in mchp_rds_ptp_probe()
1292 clock->mchp_rds_ptp_event = -1; in mchp_rds_ptp_probe()
1295 phydev->default_timestamp = true; in mchp_rds_ptp_probe()
1297 clock->phydev = phydev; in mchp_rds_ptp_probe()