Lines Matching +full:pps +full:- +full:channel
1 // SPDX-License-Identifier: GPL-2.0-only
21 * Scaled parts per million is ppm with a 16-bit binary fractional field.
30 addend = adjust_by_scaled_ppm(priv->default_addend, scaled_ppm); in stmmac_adjust_freq()
32 write_lock_irqsave(&priv->ptp_lock, flags); in stmmac_adjust_freq()
33 stmmac_config_addend(priv, priv->ptpaddr, addend); in stmmac_adjust_freq()
34 write_unlock_irqrestore(&priv->ptp_lock, flags); in stmmac_adjust_freq()
58 xmac = priv->plat->has_gmac4 || priv->plat->has_xgmac; in stmmac_adjust_time()
62 delta = -delta; in stmmac_adjust_time()
70 if (priv->est && priv->est->enable) { in stmmac_adjust_time()
72 mutex_lock(&priv->est_lock); in stmmac_adjust_time()
73 priv->est->enable = false; in stmmac_adjust_time()
74 stmmac_est_configure(priv, priv, priv->est, in stmmac_adjust_time()
75 priv->plat->clk_ptp_rate); in stmmac_adjust_time()
76 mutex_unlock(&priv->est_lock); in stmmac_adjust_time()
79 write_lock_irqsave(&priv->ptp_lock, flags); in stmmac_adjust_time()
80 stmmac_adjust_systime(priv, priv->ptpaddr, sec, nsec, neg_adj, xmac); in stmmac_adjust_time()
81 write_unlock_irqrestore(&priv->ptp_lock, flags); in stmmac_adjust_time()
83 /* Calculate new basetime and re-configured EST after PTP time adjust. */ in stmmac_adjust_time()
89 mutex_lock(&priv->est_lock); in stmmac_adjust_time()
90 priv->ptp_clock_ops.gettime64(&priv->ptp_clock_ops, ¤t_time); in stmmac_adjust_time()
92 time.tv_nsec = priv->est->btr_reserve[0]; in stmmac_adjust_time()
93 time.tv_sec = priv->est->btr_reserve[1]; in stmmac_adjust_time()
95 cycle_time = (u64)priv->est->ctr[1] * NSEC_PER_SEC + in stmmac_adjust_time()
96 priv->est->ctr[0]; in stmmac_adjust_time()
101 priv->est->btr[0] = (u32)time.tv_nsec; in stmmac_adjust_time()
102 priv->est->btr[1] = (u32)time.tv_sec; in stmmac_adjust_time()
103 priv->est->enable = true; in stmmac_adjust_time()
104 ret = stmmac_est_configure(priv, priv, priv->est, in stmmac_adjust_time()
105 priv->plat->clk_ptp_rate); in stmmac_adjust_time()
106 mutex_unlock(&priv->est_lock); in stmmac_adjust_time()
108 netdev_err(priv->dev, "failed to configure EST\n"); in stmmac_adjust_time()
130 read_lock_irqsave(&priv->ptp_lock, flags); in stmmac_get_time()
131 stmmac_get_systime(priv, priv->ptpaddr, &ns); in stmmac_get_time()
132 read_unlock_irqrestore(&priv->ptp_lock, flags); in stmmac_get_time()
155 write_lock_irqsave(&priv->ptp_lock, flags); in stmmac_set_time()
156 stmmac_init_systime(priv, priv->ptpaddr, ts->tv_sec, ts->tv_nsec); in stmmac_set_time()
157 write_unlock_irqrestore(&priv->ptp_lock, flags); in stmmac_set_time()
167 void __iomem *ptpaddr = priv->ptpaddr; in stmmac_enable()
169 int ret = -EOPNOTSUPP; in stmmac_enable()
173 switch (rq->type) { in stmmac_enable()
176 if (rq->perout.flags) in stmmac_enable()
177 return -EOPNOTSUPP; in stmmac_enable()
179 cfg = &priv->pps[rq->perout.index]; in stmmac_enable()
181 cfg->start.tv_sec = rq->perout.start.sec; in stmmac_enable()
182 cfg->start.tv_nsec = rq->perout.start.nsec; in stmmac_enable()
183 cfg->period.tv_sec = rq->perout.period.sec; in stmmac_enable()
184 cfg->period.tv_nsec = rq->perout.period.nsec; in stmmac_enable()
186 write_lock_irqsave(&priv->ptp_lock, flags); in stmmac_enable()
187 ret = stmmac_flex_pps_config(priv, priv->ioaddr, in stmmac_enable()
188 rq->perout.index, cfg, on, in stmmac_enable()
189 priv->sub_second_inc, in stmmac_enable()
190 priv->systime_flags); in stmmac_enable()
191 write_unlock_irqrestore(&priv->ptp_lock, flags); in stmmac_enable()
194 u8 channel; in stmmac_enable() local
196 mutex_lock(&priv->aux_ts_lock); in stmmac_enable()
198 channel = ilog2(FIELD_GET(PTP_ACR_MASK, acr_value)); in stmmac_enable()
203 netdev_err(priv->dev, in stmmac_enable()
205 rq->extts.index, channel); in stmmac_enable()
206 mutex_unlock(&priv->aux_ts_lock); in stmmac_enable()
207 return -EBUSY; in stmmac_enable()
210 priv->plat->flags |= STMMAC_FLAG_EXT_SNAPSHOT_EN; in stmmac_enable()
213 acr_value |= PTP_ACR_ATSEN(rq->extts.index); in stmmac_enable()
216 priv->plat->flags &= ~STMMAC_FLAG_EXT_SNAPSHOT_EN; in stmmac_enable()
218 netdev_dbg(priv->dev, "Auxiliary Snapshot %d %s.\n", in stmmac_enable()
219 rq->extts.index, on ? "enabled" : "disabled"); in stmmac_enable()
221 mutex_unlock(&priv->aux_ts_lock); in stmmac_enable()
250 if (priv->plat->crosststamp) in stmmac_get_syncdevicetime()
251 return priv->plat->crosststamp(device, system, ctx); in stmmac_get_syncdevicetime()
253 return -EOPNOTSUPP; in stmmac_get_syncdevicetime()
275 .pps = 0,
293 .pps = 0,
312 for (i = 0; i < priv->dma_cap.pps_out_num; i++) { in stmmac_ptp_register()
315 priv->pps[i].available = true; in stmmac_ptp_register()
319 priv->plat->cdc_error_adj = 0; in stmmac_ptp_register()
320 if (priv->plat->has_gmac4) in stmmac_ptp_register()
321 priv->plat->cdc_error_adj = (2 * NSEC_PER_SEC) / priv->plat->clk_ptp_rate; in stmmac_ptp_register()
326 if (priv->dma_cap.pps_out_num) in stmmac_ptp_register()
327 priv->ptp_clock_ops.n_per_out = priv->dma_cap.pps_out_num; in stmmac_ptp_register()
329 if (priv->dma_cap.aux_snapshot_n) in stmmac_ptp_register()
330 priv->ptp_clock_ops.n_ext_ts = priv->dma_cap.aux_snapshot_n; in stmmac_ptp_register()
332 if (priv->plat->ptp_max_adj) in stmmac_ptp_register()
333 priv->ptp_clock_ops.max_adj = priv->plat->ptp_max_adj; in stmmac_ptp_register()
335 rwlock_init(&priv->ptp_lock); in stmmac_ptp_register()
336 mutex_init(&priv->aux_ts_lock); in stmmac_ptp_register()
338 priv->ptp_clock = ptp_clock_register(&priv->ptp_clock_ops, in stmmac_ptp_register()
339 priv->device); in stmmac_ptp_register()
340 if (IS_ERR(priv->ptp_clock)) { in stmmac_ptp_register()
341 netdev_err(priv->dev, "ptp_clock_register failed\n"); in stmmac_ptp_register()
342 priv->ptp_clock = NULL; in stmmac_ptp_register()
343 } else if (priv->ptp_clock) in stmmac_ptp_register()
344 netdev_info(priv->dev, "registered PTP clock\n"); in stmmac_ptp_register()
355 if (priv->ptp_clock) { in stmmac_ptp_unregister()
356 ptp_clock_unregister(priv->ptp_clock); in stmmac_ptp_unregister()
357 priv->ptp_clock = NULL; in stmmac_ptp_unregister()
359 priv->dev->name); in stmmac_ptp_unregister()
362 mutex_destroy(&priv->aux_ts_lock); in stmmac_ptp_unregister()