Lines Matching refs:ptp_dte
41 struct ptp_dte { struct
87 static void dte_write_nco_delta(struct ptp_dte *ptp_dte, s64 delta) in dte_write_nco_delta() argument
91 ns = dte_read_nco(ptp_dte->regs); in dte_write_nco_delta()
95 if (ptp_dte->ts_wrap_cnt) { in dte_write_nco_delta()
97 ptp_dte->ts_wrap_cnt--; in dte_write_nco_delta()
104 ptp_dte->ts_wrap_cnt++; in dte_write_nco_delta()
109 dte_write_nco(ptp_dte->regs, ns); in dte_write_nco_delta()
111 ptp_dte->ts_ovf_last = (ns >> DTE_NCO_TS_WRAP_LSHIFT) & in dte_write_nco_delta()
115 static s64 dte_read_nco_with_ovf(struct ptp_dte *ptp_dte) in dte_read_nco_with_ovf() argument
120 ns = dte_read_nco(ptp_dte->regs); in dte_read_nco_with_ovf()
126 if (ts_ovf < ptp_dte->ts_ovf_last) in dte_read_nco_with_ovf()
127 ptp_dte->ts_wrap_cnt++; in dte_read_nco_with_ovf()
129 ptp_dte->ts_ovf_last = ts_ovf; in dte_read_nco_with_ovf()
132 ns += (s64)(BIT_ULL(DTE_WRAP_AROUND_NSEC_SHIFT) * ptp_dte->ts_wrap_cnt); in dte_read_nco_with_ovf()
142 struct ptp_dte *ptp_dte = container_of(ptp, struct ptp_dte, caps); in ptp_dte_adjfine() local
144 if (abs(ppb) > ptp_dte->caps.max_adj) { in ptp_dte_adjfine()
145 dev_err(ptp_dte->dev, "ppb adj too big\n"); in ptp_dte_adjfine()
154 spin_lock_irqsave(&ptp_dte->lock, flags); in ptp_dte_adjfine()
155 writel(nco_incr, ptp_dte->regs + DTE_NCO_INC_REG); in ptp_dte_adjfine()
156 spin_unlock_irqrestore(&ptp_dte->lock, flags); in ptp_dte_adjfine()
164 struct ptp_dte *ptp_dte = container_of(ptp, struct ptp_dte, caps); in ptp_dte_adjtime() local
166 spin_lock_irqsave(&ptp_dte->lock, flags); in ptp_dte_adjtime()
167 dte_write_nco_delta(ptp_dte, delta); in ptp_dte_adjtime()
168 spin_unlock_irqrestore(&ptp_dte->lock, flags); in ptp_dte_adjtime()
176 struct ptp_dte *ptp_dte = container_of(ptp, struct ptp_dte, caps); in ptp_dte_gettime() local
178 spin_lock_irqsave(&ptp_dte->lock, flags); in ptp_dte_gettime()
179 *ts = ns_to_timespec64(dte_read_nco_with_ovf(ptp_dte)); in ptp_dte_gettime()
180 spin_unlock_irqrestore(&ptp_dte->lock, flags); in ptp_dte_gettime()
189 struct ptp_dte *ptp_dte = container_of(ptp, struct ptp_dte, caps); in ptp_dte_settime() local
191 spin_lock_irqsave(&ptp_dte->lock, flags); in ptp_dte_settime()
194 writel(0, ptp_dte->regs + DTE_NCO_INC_REG); in ptp_dte_settime()
196 dte_write_nco(ptp_dte->regs, timespec64_to_ns(ts)); in ptp_dte_settime()
199 ptp_dte->ts_ovf_last = 0; in ptp_dte_settime()
200 ptp_dte->ts_wrap_cnt = 0; in ptp_dte_settime()
203 writel(DTE_NCO_INC_DEFAULT, ptp_dte->regs + DTE_NCO_INC_REG); in ptp_dte_settime()
205 spin_unlock_irqrestore(&ptp_dte->lock, flags); in ptp_dte_settime()
232 struct ptp_dte *ptp_dte; in ptp_dte_probe() local
235 ptp_dte = devm_kzalloc(dev, sizeof(struct ptp_dte), GFP_KERNEL); in ptp_dte_probe()
236 if (!ptp_dte) in ptp_dte_probe()
239 ptp_dte->regs = devm_platform_ioremap_resource(pdev, 0); in ptp_dte_probe()
240 if (IS_ERR(ptp_dte->regs)) in ptp_dte_probe()
241 return PTR_ERR(ptp_dte->regs); in ptp_dte_probe()
243 spin_lock_init(&ptp_dte->lock); in ptp_dte_probe()
245 ptp_dte->dev = dev; in ptp_dte_probe()
246 ptp_dte->caps = ptp_dte_caps; in ptp_dte_probe()
247 ptp_dte->ptp_clk = ptp_clock_register(&ptp_dte->caps, &pdev->dev); in ptp_dte_probe()
248 if (IS_ERR(ptp_dte->ptp_clk)) { in ptp_dte_probe()
251 return PTR_ERR(ptp_dte->ptp_clk); in ptp_dte_probe()
254 platform_set_drvdata(pdev, ptp_dte); in ptp_dte_probe()
263 struct ptp_dte *ptp_dte = platform_get_drvdata(pdev); in ptp_dte_remove() local
266 ptp_clock_unregister(ptp_dte->ptp_clk); in ptp_dte_remove()
269 writel(0, ptp_dte->regs + (i * sizeof(u32))); in ptp_dte_remove()
277 struct ptp_dte *ptp_dte = dev_get_drvdata(dev); in ptp_dte_suspend() local
281 ptp_dte->reg_val[i] = in ptp_dte_suspend()
282 readl(ptp_dte->regs + (i * sizeof(u32))); in ptp_dte_suspend()
286 writel(0, ptp_dte->regs + DTE_NCO_INC_REG); in ptp_dte_suspend()
293 struct ptp_dte *ptp_dte = dev_get_drvdata(dev); in ptp_dte_resume() local
298 writel(ptp_dte->reg_val[i], in ptp_dte_resume()
299 (ptp_dte->regs + (i * sizeof(u32)))); in ptp_dte_resume()
301 writel(((ptp_dte->reg_val[i] & in ptp_dte_resume()
303 (ptp_dte->regs + (i * sizeof(u32)))); in ptp_dte_resume()