Lines Matching +full:clock +full:- +full:1000000000

1 // SPDX-License-Identifier: GPL-2.0
2 /* cavium_ptp.c - PTP 1588 clock on Cavium hardware
3 * Copyright (c) 2003-2015, 2017 Cavium, Inc.
67 return ERR_PTR(-ENODEV); in cavium_ptp_get()
71 ptp = ERR_PTR(-EPROBE_DEFER); in cavium_ptp_get()
83 pci_dev_put(ptp->pdev); in cavium_ptp_put()
88 * cavium_ptp_adjfine() - Adjust ptp frequency
89 * @ptp_info: PTP clock info
95 struct cavium_ptp *clock = in cavium_ptp_adjfine() local
104 scaled_ppm = -scaled_ppm; in cavium_ptp_adjfine()
107 /* The hardware adds the clock compensation value to the PTP clock in cavium_ptp_adjfine()
108 * on every coprocessor clock cycle. Typical convention is that it in cavium_ptp_adjfine()
110 * convention compensation value is in 64 bit fixed-point in cavium_ptp_adjfine()
119 * in cavium_ptp_init() -> tbase = 1/Hz. Then we use endian in cavium_ptp_adjfine()
122 comp = ((u64)1000000000ull << 32) / clock->clock_rate; in cavium_ptp_adjfine()
126 comp = neg_adj ? comp - adj : comp + adj; in cavium_ptp_adjfine()
128 spin_lock_irqsave(&clock->spin_lock, flags); in cavium_ptp_adjfine()
129 writeq(comp, clock->reg_base + PTP_CLOCK_COMP); in cavium_ptp_adjfine()
130 spin_unlock_irqrestore(&clock->spin_lock, flags); in cavium_ptp_adjfine()
136 * cavium_ptp_adjtime() - Adjust ptp time
137 * @ptp_info: PTP clock info
142 struct cavium_ptp *clock = in cavium_ptp_adjtime() local
146 spin_lock_irqsave(&clock->spin_lock, flags); in cavium_ptp_adjtime()
147 timecounter_adjtime(&clock->time_counter, delta); in cavium_ptp_adjtime()
148 spin_unlock_irqrestore(&clock->spin_lock, flags); in cavium_ptp_adjtime()
157 * cavium_ptp_gettime() - Get hardware clock time with adjustment
158 * @ptp_info: PTP clock info
164 struct cavium_ptp *clock = in cavium_ptp_gettime() local
169 spin_lock_irqsave(&clock->spin_lock, flags); in cavium_ptp_gettime()
170 nsec = timecounter_read(&clock->time_counter); in cavium_ptp_gettime()
171 spin_unlock_irqrestore(&clock->spin_lock, flags); in cavium_ptp_gettime()
179 * cavium_ptp_settime() - Set hardware clock time. Reset adjustment
180 * @ptp_info: PTP clock info
186 struct cavium_ptp *clock = in cavium_ptp_settime() local
193 spin_lock_irqsave(&clock->spin_lock, flags); in cavium_ptp_settime()
194 timecounter_init(&clock->time_counter, &clock->cycle_counter, nsec); in cavium_ptp_settime()
195 spin_unlock_irqrestore(&clock->spin_lock, flags); in cavium_ptp_settime()
201 * cavium_ptp_enable() - Request to enable or disable an ancillary feature.
202 * @ptp_info: PTP clock info
209 return -EOPNOTSUPP; in cavium_ptp_enable()
214 struct cavium_ptp *clock = in cavium_ptp_cc_read() local
217 return readq(clock->reg_base + PTP_CLOCK_HI); in cavium_ptp_cc_read()
223 struct device *dev = &pdev->dev; in cavium_ptp_probe()
224 struct cavium_ptp *clock; in cavium_ptp_probe() local
230 clock = devm_kzalloc(dev, sizeof(*clock), GFP_KERNEL); in cavium_ptp_probe()
231 if (!clock) { in cavium_ptp_probe()
232 err = -ENOMEM; in cavium_ptp_probe()
236 clock->pdev = pdev; in cavium_ptp_probe()
242 clock->reg_base = pcim_iomap_region(pdev, PCI_PTP_BAR_NO, pci_name(pdev)); in cavium_ptp_probe()
243 err = PTR_ERR_OR_ZERO(clock->reg_base); in cavium_ptp_probe()
247 spin_lock_init(&clock->spin_lock); in cavium_ptp_probe()
249 cc = &clock->cycle_counter; in cavium_ptp_probe()
250 cc->read = cavium_ptp_cc_read; in cavium_ptp_probe()
251 cc->mask = CYCLECOUNTER_MASK(64); in cavium_ptp_probe()
252 cc->mult = 1; in cavium_ptp_probe()
253 cc->shift = 0; in cavium_ptp_probe()
255 timecounter_init(&clock->time_counter, &clock->cycle_counter, in cavium_ptp_probe()
258 clock->clock_rate = ptp_cavium_clock_get(); in cavium_ptp_probe()
260 clock->ptp_info = (struct ptp_clock_info) { in cavium_ptp_probe()
263 .max_adj = 1000000000ull, in cavium_ptp_probe()
274 clock_cfg = readq(clock->reg_base + PTP_CLOCK_CFG); in cavium_ptp_probe()
276 writeq(clock_cfg, clock->reg_base + PTP_CLOCK_CFG); in cavium_ptp_probe()
278 clock_comp = ((u64)1000000000ull << 32) / clock->clock_rate; in cavium_ptp_probe()
279 writeq(clock_comp, clock->reg_base + PTP_CLOCK_COMP); in cavium_ptp_probe()
281 clock->ptp_clock = ptp_clock_register(&clock->ptp_info, dev); in cavium_ptp_probe()
282 if (IS_ERR(clock->ptp_clock)) { in cavium_ptp_probe()
283 err = PTR_ERR(clock->ptp_clock); in cavium_ptp_probe()
287 pci_set_drvdata(pdev, clock); in cavium_ptp_probe()
291 clock_cfg = readq(clock->reg_base + PTP_CLOCK_CFG); in cavium_ptp_probe()
293 writeq(clock_cfg, clock->reg_base + PTP_CLOCK_CFG); in cavium_ptp_probe()
297 devm_kfree(dev, clock); in cavium_ptp_probe()
304 * `dev->driver_data`. in cavium_ptp_probe()
312 struct cavium_ptp *clock = pci_get_drvdata(pdev); in cavium_ptp_remove() local
315 if (IS_ERR_OR_NULL(clock)) in cavium_ptp_remove()
318 ptp_clock_unregister(clock->ptp_clock); in cavium_ptp_remove()
320 clock_cfg = readq(clock->reg_base + PTP_CLOCK_CFG); in cavium_ptp_remove()
322 writeq(clock_cfg, clock->reg_base + PTP_CLOCK_CFG); in cavium_ptp_remove()