Lines Matching +full:rx +full:- +full:ts +full:- +full:routes
1 // SPDX-License-Identifier: GPL-2.0
7 /* The adjfine API clamps ppb between [-32,768,000, 32,768,000], and
8 * therefore scaled_ppm between [-2,147,483,648, 2,147,483,647].
11 * Percentually speaking, this is a +/- 0.032x adjustment of the
12 * free-running counter (0.968x to 1.032x).
20 * one-shot toggle (no return to level) on the PTP_CLK pin. When used as a
29 /* This range is actually +/- SJA1105_MAX_ADJ_PPB
30 * divided by 1000 (ppb -> ppm) and with a 16-bit
34 * Convert scaled_ppm from the +/- ((10^6) << 16) range
35 * into the +/- (1 << 31) range.
63 struct sja1105_private *priv = ds->priv; in sja1105_hwtstamp_set()
67 if (copy_from_user(&config, ifr->ifr_data, sizeof(config))) in sja1105_hwtstamp_set()
68 return -EFAULT; in sja1105_hwtstamp_set()
70 hwts_tx_en = priv->hwts_tx_en; in sja1105_hwtstamp_set()
71 hwts_rx_en = priv->hwts_rx_en; in sja1105_hwtstamp_set()
81 return -ERANGE; in sja1105_hwtstamp_set()
92 return -ERANGE; in sja1105_hwtstamp_set()
95 if (copy_to_user(ifr->ifr_data, &config, sizeof(config))) in sja1105_hwtstamp_set()
96 return -EFAULT; in sja1105_hwtstamp_set()
98 priv->hwts_tx_en = hwts_tx_en; in sja1105_hwtstamp_set()
99 priv->hwts_rx_en = hwts_rx_en; in sja1105_hwtstamp_set()
106 struct sja1105_private *priv = ds->priv; in sja1105_hwtstamp_get()
110 if (priv->hwts_tx_en & BIT(port)) in sja1105_hwtstamp_get()
114 if (priv->hwts_rx_en & BIT(port)) in sja1105_hwtstamp_get()
119 return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ? in sja1105_hwtstamp_get()
120 -EFAULT : 0; in sja1105_hwtstamp_get()
126 struct sja1105_private *priv = ds->priv; in sja1105_get_ts_info()
127 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1105_get_ts_info()
130 if (!ptp_data->clock) in sja1105_get_ts_info()
131 return -ENODEV; in sja1105_get_ts_info()
133 info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | in sja1105_get_ts_info()
136 info->tx_types = (1 << HWTSTAMP_TX_OFF) | in sja1105_get_ts_info()
138 info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) | in sja1105_get_ts_info()
140 info->phc_index = ptp_clock_index(ptp_data->clock); in sja1105_get_ts_info()
152 sja1105_packing(buf, &cmd->ptpstrtsch, 30, 30, size, op); in sja1105et_ptp_cmd_packing()
153 sja1105_packing(buf, &cmd->ptpstopsch, 29, 29, size, op); in sja1105et_ptp_cmd_packing()
154 sja1105_packing(buf, &cmd->startptpcp, 28, 28, size, op); in sja1105et_ptp_cmd_packing()
155 sja1105_packing(buf, &cmd->stopptpcp, 27, 27, size, op); in sja1105et_ptp_cmd_packing()
156 sja1105_packing(buf, &cmd->resptp, 2, 2, size, op); in sja1105et_ptp_cmd_packing()
157 sja1105_packing(buf, &cmd->corrclk4ts, 1, 1, size, op); in sja1105et_ptp_cmd_packing()
158 sja1105_packing(buf, &cmd->ptpclkadd, 0, 0, size, op); in sja1105et_ptp_cmd_packing()
169 sja1105_packing(buf, &cmd->ptpstrtsch, 30, 30, size, op); in sja1105pqrs_ptp_cmd_packing()
170 sja1105_packing(buf, &cmd->ptpstopsch, 29, 29, size, op); in sja1105pqrs_ptp_cmd_packing()
171 sja1105_packing(buf, &cmd->startptpcp, 28, 28, size, op); in sja1105pqrs_ptp_cmd_packing()
172 sja1105_packing(buf, &cmd->stopptpcp, 27, 27, size, op); in sja1105pqrs_ptp_cmd_packing()
173 sja1105_packing(buf, &cmd->resptp, 3, 3, size, op); in sja1105pqrs_ptp_cmd_packing()
174 sja1105_packing(buf, &cmd->corrclk4ts, 2, 2, size, op); in sja1105pqrs_ptp_cmd_packing()
175 sja1105_packing(buf, &cmd->ptpclkadd, 0, 0, size, op); in sja1105pqrs_ptp_cmd_packing()
181 const struct sja1105_private *priv = ds->priv; in sja1105_ptp_commit()
182 const struct sja1105_regs *regs = priv->info->regs; in sja1105_ptp_commit()
187 priv->info->ptp_cmd_packing(buf, cmd, PACK); in sja1105_ptp_commit()
189 rc = sja1105_xfer_buf(priv, rw, regs->ptp_control, buf, in sja1105_ptp_commit()
193 priv->info->ptp_cmd_packing(buf, cmd, UNPACK); in sja1105_ptp_commit()
202 * This receives the RX or TX MAC timestamps, provided by hardware as
206 * To reconstruct into a full 64-bit-wide timestamp, the cycle counter is
207 * read and the high-order bits are filled in.
215 struct sja1105_private *priv = ds->priv; in sja1105_tstamp_reconstruct()
216 u64 partial_tstamp_mask = CYCLECOUNTER_MASK(priv->info->ptp_ts_bits); in sja1105_tstamp_reconstruct()
226 ts_reconstructed -= (partial_tstamp_mask + 1); in sja1105_tstamp_reconstruct()
232 * for frames sent using management routes.
234 * SJA1105 E/T layout of the 4-byte SPI payload:
238 * +-----+-----+-----+ ^
241 * 24-bit timestamp Update bit
244 * SJA1105 P/Q/R/S layout of the 8-byte SPI payload:
248 * ^ +-----+-----+-----+-----+
251 * Update bit 32-bit timestamp
257 static int sja1105_ptpegr_ts_poll(struct dsa_switch *ds, int port, u64 *ts) in sja1105_ptpegr_ts_poll() argument
259 struct sja1105_private *priv = ds->priv; in sja1105_ptpegr_ts_poll()
260 const struct sja1105_regs *regs = priv->info->regs; in sja1105_ptpegr_ts_poll()
268 rc = sja1105_xfer_buf(priv, SPI_READ, regs->ptpegr_ts[port], in sja1105_ptpegr_ts_poll()
269 packed_buf, priv->info->ptpegr_ts_bytes); in sja1105_ptpegr_ts_poll()
274 priv->info->ptpegr_ts_bytes); in sja1105_ptpegr_ts_poll()
279 } while (--timeout); in sja1105_ptpegr_ts_poll()
282 return -ETIMEDOUT; in sja1105_ptpegr_ts_poll()
284 /* Point the end bit to the second 32-bit word on P/Q/R/S, in sja1105_ptpegr_ts_poll()
285 * no-op on E/T. in sja1105_ptpegr_ts_poll()
287 tstamp_bit_end = (priv->info->ptpegr_ts_bytes - 4) * 8; in sja1105_ptpegr_ts_poll()
288 /* Shift the 24-bit timestamp on E/T to be collected from 31:8. in sja1105_ptpegr_ts_poll()
289 * No-op on P/Q/R/S. in sja1105_ptpegr_ts_poll()
291 tstamp_bit_end += 32 - priv->info->ptp_ts_bits; in sja1105_ptpegr_ts_poll()
292 tstamp_bit_start = tstamp_bit_end + priv->info->ptp_ts_bits - 1; in sja1105_ptpegr_ts_poll()
294 *ts = 0; in sja1105_ptpegr_ts_poll()
296 sja1105_unpack(packed_buf, ts, tstamp_bit_start, tstamp_bit_end, in sja1105_ptpegr_ts_poll()
297 priv->info->ptpegr_ts_bytes); in sja1105_ptpegr_ts_poll()
302 /* Caller must hold ptp_data->lock */
306 const struct sja1105_regs *regs = priv->info->regs; in sja1105_ptpclkval_read()
308 return sja1105_xfer_u64(priv, SPI_READ, regs->ptpclkval, ticks, in sja1105_ptpclkval_read()
312 /* Caller must hold ptp_data->lock */
316 const struct sja1105_regs *regs = priv->info->regs; in sja1105_ptpclkval_write()
318 return sja1105_xfer_u64(priv, SPI_WRITE, regs->ptpclkval, &ticks, in sja1105_ptpclkval_write()
324 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1105_extts_poll()
325 const struct sja1105_regs *regs = priv->info->regs; in sja1105_extts_poll()
330 rc = sja1105_xfer_u64(priv, SPI_READ, regs->ptpsyncts, &ptpsyncts, in sja1105_extts_poll()
333 dev_err_ratelimited(priv->ds->dev, in sja1105_extts_poll()
336 if (ptpsyncts && ptp_data->ptpsyncts != ptpsyncts) { in sja1105_extts_poll()
340 ptp_clock_event(ptp_data->clock, &event); in sja1105_extts_poll()
342 ptp_data->ptpsyncts = ptpsyncts; in sja1105_extts_poll()
350 struct dsa_switch *ds = priv->ds; in sja1105_rxtstamp_work()
353 mutex_lock(&ptp_data->lock); in sja1105_rxtstamp_work()
355 while ((skb = skb_dequeue(&ptp_data->skb_rxtstamp_queue)) != NULL) { in sja1105_rxtstamp_work()
357 u64 ticks, ts; in sja1105_rxtstamp_work() local
362 dev_err(ds->dev, "Failed to read PTP clock: %d\n", rc); in sja1105_rxtstamp_work()
369 ts = SJA1105_SKB_CB(skb)->tstamp; in sja1105_rxtstamp_work()
370 ts = sja1105_tstamp_reconstruct(ds, ticks, ts); in sja1105_rxtstamp_work()
372 shwt->hwtstamp = ns_to_ktime(sja1105_ticks_to_ns(ts)); in sja1105_rxtstamp_work()
376 if (ptp_data->extts_enabled) in sja1105_rxtstamp_work()
379 mutex_unlock(&ptp_data->lock); in sja1105_rxtstamp_work()
382 return -1; in sja1105_rxtstamp_work()
387 struct sja1105_private *priv = ds->priv; in sja1105_rxtstamp()
388 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1105_rxtstamp()
390 if (!(priv->hwts_rx_en & BIT(port))) in sja1105_rxtstamp()
393 /* We need to read the full PTP clock to reconstruct the Rx in sja1105_rxtstamp()
396 skb_queue_tail(&ptp_data->skb_rxtstamp_queue, skb); in sja1105_rxtstamp()
397 ptp_schedule_worker(ptp_data->clock, 0); in sja1105_rxtstamp()
404 u64 ts = SJA1105_SKB_CB(skb)->tstamp; in sja1110_rxtstamp() local
408 shwt->hwtstamp = ns_to_ktime(sja1105_ticks_to_ns(ts)); in sja1110_rxtstamp()
418 struct sja1105_private *priv = ds->priv; in sja1105_port_rxtstamp()
420 return priv->info->rxtstamp(ds, port, skb); in sja1105_port_rxtstamp()
426 struct sja1105_private *priv = ds->priv; in sja1110_process_meta_tstamp()
427 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1110_process_meta_tstamp()
431 /* We don't care about RX timestamps on the CPU port */ in sja1110_process_meta_tstamp()
435 spin_lock(&ptp_data->skb_txtstamp_queue.lock); in sja1110_process_meta_tstamp()
437 skb_queue_walk_safe(&ptp_data->skb_txtstamp_queue, skb, skb_tmp) { in sja1110_process_meta_tstamp()
438 if (SJA1105_SKB_CB(skb)->ts_id != ts_id) in sja1110_process_meta_tstamp()
441 __skb_unlink(skb, &ptp_data->skb_txtstamp_queue); in sja1110_process_meta_tstamp()
447 spin_unlock(&ptp_data->skb_txtstamp_queue.lock); in sja1110_process_meta_tstamp()
462 struct sk_buff *clone = SJA1105_SKB_CB(skb)->clone; in sja1110_txtstamp()
463 struct sja1105_private *priv = ds->priv; in sja1110_txtstamp()
464 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1110_txtstamp()
467 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in sja1110_txtstamp()
469 spin_lock(&priv->ts_id_lock); in sja1110_txtstamp()
471 ts_id = priv->ts_id; in sja1110_txtstamp()
472 /* Deal automatically with 8-bit wraparound */ in sja1110_txtstamp()
473 priv->ts_id++; in sja1110_txtstamp()
475 SJA1105_SKB_CB(clone)->ts_id = ts_id; in sja1110_txtstamp()
477 spin_unlock(&priv->ts_id_lock); in sja1110_txtstamp()
479 skb_queue_tail(&ptp_data->skb_txtstamp_queue, clone); in sja1110_txtstamp()
488 struct sja1105_private *priv = ds->priv; in sja1105_port_txtstamp()
491 if (!(priv->hwts_tx_en & BIT(port))) in sja1105_port_txtstamp()
498 SJA1105_SKB_CB(skb)->clone = clone; in sja1105_port_txtstamp()
500 if (priv->info->txtstamp) in sja1105_port_txtstamp()
501 priv->info->txtstamp(ds, port, skb); in sja1105_port_txtstamp()
506 struct sja1105_private *priv = ds->priv; in sja1105_ptp_reset()
507 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1105_ptp_reset()
508 struct sja1105_ptp_cmd cmd = ptp_data->cmd; in sja1105_ptp_reset()
511 mutex_lock(&ptp_data->lock); in sja1105_ptp_reset()
515 dev_dbg(ds->dev, "Resetting PTP clock\n"); in sja1105_ptp_reset()
518 sja1105_tas_clockstep(priv->ds); in sja1105_ptp_reset()
520 mutex_unlock(&ptp_data->lock); in sja1105_ptp_reset()
525 /* Caller must hold ptp_data->lock */
529 struct sja1105_private *priv = ds->priv; in __sja1105_ptp_gettimex()
535 dev_err(ds->dev, "Failed to read PTP clock: %d\n", rc); in __sja1105_ptp_gettimex()
545 struct timespec64 *ts, in sja1105_ptp_gettimex() argument
553 mutex_lock(&ptp_data->lock); in sja1105_ptp_gettimex()
555 rc = __sja1105_ptp_gettimex(priv->ds, &now, ptp_sts); in sja1105_ptp_gettimex()
556 *ts = ns_to_timespec64(now); in sja1105_ptp_gettimex()
558 mutex_unlock(&ptp_data->lock); in sja1105_ptp_gettimex()
563 /* Caller must hold ptp_data->lock */
567 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1105_ptp_mode_set()
569 if (ptp_data->cmd.ptpclkadd == mode) in sja1105_ptp_mode_set()
572 ptp_data->cmd.ptpclkadd = mode; in sja1105_ptp_mode_set()
574 return sja1105_ptp_commit(priv->ds, &ptp_data->cmd, SPI_WRITE); in sja1105_ptp_mode_set()
581 struct sja1105_private *priv = ds->priv; in __sja1105_ptp_settime()
587 dev_err(priv->ds->dev, "Failed to put PTPCLK in set mode\n"); in __sja1105_ptp_settime()
593 sja1105_tas_clockstep(priv->ds); in __sja1105_ptp_settime()
599 const struct timespec64 *ts) in sja1105_ptp_settime() argument
603 u64 ns = timespec64_to_ns(ts); in sja1105_ptp_settime()
606 mutex_lock(&ptp_data->lock); in sja1105_ptp_settime()
608 rc = __sja1105_ptp_settime(priv->ds, ns, NULL); in sja1105_ptp_settime()
610 mutex_unlock(&ptp_data->lock); in sja1105_ptp_settime()
619 const struct sja1105_regs *regs = priv->info->regs; in sja1105_ptp_adjfine()
627 /* Take a +/- value and re-center it around 2^31. */ in sja1105_ptp_adjfine()
632 mutex_lock(&ptp_data->lock); in sja1105_ptp_adjfine()
634 rc = sja1105_xfer_u32(priv, SPI_WRITE, regs->ptpclkrate, &clkrate32, in sja1105_ptp_adjfine()
637 sja1105_tas_adjfreq(priv->ds); in sja1105_ptp_adjfine()
639 mutex_unlock(&ptp_data->lock); in sja1105_ptp_adjfine()
647 struct sja1105_private *priv = ds->priv; in __sja1105_ptp_adjtime()
653 dev_err(priv->ds->dev, "Failed to put PTPCLK in add mode\n"); in __sja1105_ptp_adjtime()
659 sja1105_tas_clockstep(priv->ds); in __sja1105_ptp_adjtime()
670 mutex_lock(&ptp_data->lock); in sja1105_ptp_adjtime()
672 rc = __sja1105_ptp_adjtime(priv->ds, delta); in sja1105_ptp_adjtime()
674 mutex_unlock(&ptp_data->lock); in sja1105_ptp_adjtime()
684 mod_timer(&ptp_data->extts_timer, expires); in sja1105_ptp_extts_setup_timer()
691 ptp_schedule_worker(ptp_data->clock, 0); in sja1105_ptp_extts_timer()
702 avb = priv->static_config.tables[BLK_IDX_AVB_PARAMS].entries; in sja1105_change_ptp_clk_pin_func()
704 if (priv->info->device_id == SJA1105E_DEVICE_ID || in sja1105_change_ptp_clk_pin_func()
705 priv->info->device_id == SJA1105T_DEVICE_ID || in sja1105_change_ptp_clk_pin_func()
706 avb->cas_master) in sja1105_change_ptp_clk_pin_func()
714 avb->cas_master = (func == PTP_PF_PEROUT); in sja1105_change_ptp_clk_pin_func()
724 * f = ----------------------
731 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1105_per_out_enable()
732 const struct sja1105_regs *regs = priv->info->regs; in sja1105_per_out_enable()
733 struct sja1105_ptp_cmd cmd = ptp_data->cmd; in sja1105_per_out_enable()
737 if (perout->index != 0) in sja1105_per_out_enable()
738 return -EOPNOTSUPP; in sja1105_per_out_enable()
741 if (perout->flags) in sja1105_per_out_enable()
742 return -EOPNOTSUPP; in sja1105_per_out_enable()
744 mutex_lock(&ptp_data->lock); in sja1105_per_out_enable()
752 .tv_sec = perout->period.sec, in sja1105_per_out_enable()
753 .tv_nsec = perout->period.nsec, in sja1105_per_out_enable()
756 .tv_sec = perout->start.sec, in sja1105_per_out_enable()
757 .tv_nsec = perout->start.nsec, in sja1105_per_out_enable()
770 rc = -ERANGE; in sja1105_per_out_enable()
781 rc = __sja1105_ptp_gettimex(priv->ds, &now, NULL); in sja1105_per_out_enable()
789 rc = sja1105_xfer_u64(priv, SPI_WRITE, regs->ptppinst, in sja1105_per_out_enable()
794 rc = sja1105_xfer_u32(priv, SPI_WRITE, regs->ptppindur, in sja1105_per_out_enable()
805 rc = sja1105_ptp_commit(priv->ds, &cmd, SPI_WRITE); in sja1105_per_out_enable()
808 mutex_unlock(&ptp_data->lock); in sja1105_per_out_enable()
820 if (extts->index != 0) in sja1105_extts_enable()
821 return -EOPNOTSUPP; in sja1105_extts_enable()
824 if (extts->flags & ~(PTP_ENABLE_FEATURE | in sja1105_extts_enable()
828 return -EOPNOTSUPP; in sja1105_extts_enable()
831 if ((extts->flags & PTP_STRICT_FLAGS) && in sja1105_extts_enable()
832 (extts->flags & PTP_ENABLE_FEATURE) && in sja1105_extts_enable()
833 (extts->flags & PTP_EXTTS_EDGES) != PTP_EXTTS_EDGES) in sja1105_extts_enable()
834 return -EOPNOTSUPP; in sja1105_extts_enable()
840 priv->ptp_data.extts_enabled = on; in sja1105_extts_enable()
843 sja1105_ptp_extts_setup_timer(&priv->ptp_data); in sja1105_extts_enable()
845 del_timer_sync(&priv->ptp_data.extts_timer); in sja1105_extts_enable()
855 int rc = -EOPNOTSUPP; in sja1105_ptp_enable()
857 if (req->type == PTP_CLK_REQ_PEROUT) in sja1105_ptp_enable()
858 rc = sja1105_per_out_enable(priv, &req->perout, on); in sja1105_ptp_enable()
859 else if (req->type == PTP_CLK_REQ_EXTTS) in sja1105_ptp_enable()
860 rc = sja1105_extts_enable(priv, &req->extts, on); in sja1105_ptp_enable()
872 return -1; in sja1105_ptp_verify_pin()
879 if (priv->info->device_id == SJA1105E_DEVICE_ID || in sja1105_ptp_verify_pin()
880 priv->info->device_id == SJA1105T_DEVICE_ID) in sja1105_ptp_verify_pin()
881 return -1; in sja1105_ptp_verify_pin()
884 return -1; in sja1105_ptp_verify_pin()
897 struct sja1105_private *priv = ds->priv; in sja1105_ptp_clock_register()
898 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1105_ptp_clock_register()
900 ptp_data->caps = (struct ptp_clock_info) { in sja1105_ptp_clock_register()
918 skb_queue_head_init(&ptp_data->skb_rxtstamp_queue); in sja1105_ptp_clock_register()
920 skb_queue_head_init(&ptp_data->skb_txtstamp_queue); in sja1105_ptp_clock_register()
922 ptp_data->clock = ptp_clock_register(&ptp_data->caps, ds->dev); in sja1105_ptp_clock_register()
923 if (IS_ERR_OR_NULL(ptp_data->clock)) in sja1105_ptp_clock_register()
924 return PTR_ERR(ptp_data->clock); in sja1105_ptp_clock_register()
926 ptp_data->cmd.corrclk4ts = true; in sja1105_ptp_clock_register()
927 ptp_data->cmd.ptpclkadd = PTP_SET_MODE; in sja1105_ptp_clock_register()
929 timer_setup(&ptp_data->extts_timer, sja1105_ptp_extts_timer, 0); in sja1105_ptp_clock_register()
936 struct sja1105_private *priv = ds->priv; in sja1105_ptp_clock_unregister()
937 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1105_ptp_clock_unregister()
939 if (IS_ERR_OR_NULL(ptp_data->clock)) in sja1105_ptp_clock_unregister()
942 del_timer_sync(&ptp_data->extts_timer); in sja1105_ptp_clock_unregister()
943 ptp_cancel_worker_sync(ptp_data->clock); in sja1105_ptp_clock_unregister()
944 skb_queue_purge(&ptp_data->skb_txtstamp_queue); in sja1105_ptp_clock_unregister()
945 skb_queue_purge(&ptp_data->skb_rxtstamp_queue); in sja1105_ptp_clock_unregister()
946 ptp_clock_unregister(ptp_data->clock); in sja1105_ptp_clock_unregister()
947 ptp_data->clock = NULL; in sja1105_ptp_clock_unregister()
953 struct sja1105_private *priv = ds->priv; in sja1105_ptp_txtstamp_skb()
954 struct sja1105_ptp_data *ptp_data = &priv->ptp_data; in sja1105_ptp_txtstamp_skb()
956 u64 ticks, ts; in sja1105_ptp_txtstamp_skb() local
959 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in sja1105_ptp_txtstamp_skb()
961 mutex_lock(&ptp_data->lock); in sja1105_ptp_txtstamp_skb()
963 rc = sja1105_ptpegr_ts_poll(ds, port, &ts); in sja1105_ptp_txtstamp_skb()
965 dev_err(ds->dev, "timed out polling for tstamp\n"); in sja1105_ptp_txtstamp_skb()
972 dev_err(ds->dev, "Failed to read PTP clock: %d\n", rc); in sja1105_ptp_txtstamp_skb()
977 ts = sja1105_tstamp_reconstruct(ds, ticks, ts); in sja1105_ptp_txtstamp_skb()
979 shwt.hwtstamp = ns_to_ktime(sja1105_ticks_to_ns(ts)); in sja1105_ptp_txtstamp_skb()
983 mutex_unlock(&ptp_data->lock); in sja1105_ptp_txtstamp_skb()