18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* cavium_ptp.h - PTP 1588 clock on Cavium hardware
38c2ecf20Sopenharmony_ci * Copyright (c) 2003-2015, 2017 Cavium, Inc.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef CAVIUM_PTP_H
78c2ecf20Sopenharmony_ci#define CAVIUM_PTP_H
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/ptp_clock_kernel.h>
108c2ecf20Sopenharmony_ci#include <linux/timecounter.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_cistruct cavium_ptp {
138c2ecf20Sopenharmony_ci	struct pci_dev *pdev;
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci	/* Serialize access to cycle_counter, time_counter and hw_registers */
168c2ecf20Sopenharmony_ci	spinlock_t spin_lock;
178c2ecf20Sopenharmony_ci	struct cyclecounter cycle_counter;
188c2ecf20Sopenharmony_ci	struct timecounter time_counter;
198c2ecf20Sopenharmony_ci	void __iomem *reg_base;
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	u32 clock_rate;
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci	struct ptp_clock_info ptp_info;
248c2ecf20Sopenharmony_ci	struct ptp_clock *ptp_clock;
258c2ecf20Sopenharmony_ci};
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#if IS_REACHABLE(CONFIG_CAVIUM_PTP)
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_cistruct cavium_ptp *cavium_ptp_get(void);
308c2ecf20Sopenharmony_civoid cavium_ptp_put(struct cavium_ptp *ptp);
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistatic inline u64 cavium_ptp_tstamp2time(struct cavium_ptp *ptp, u64 tstamp)
338c2ecf20Sopenharmony_ci{
348c2ecf20Sopenharmony_ci	unsigned long flags;
358c2ecf20Sopenharmony_ci	u64 ret;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	spin_lock_irqsave(&ptp->spin_lock, flags);
388c2ecf20Sopenharmony_ci	ret = timecounter_cyc2time(&ptp->time_counter, tstamp);
398c2ecf20Sopenharmony_ci	spin_unlock_irqrestore(&ptp->spin_lock, flags);
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	return ret;
428c2ecf20Sopenharmony_ci}
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistatic inline int cavium_ptp_clock_index(struct cavium_ptp *clock)
458c2ecf20Sopenharmony_ci{
468c2ecf20Sopenharmony_ci	return ptp_clock_index(clock->ptp_clock);
478c2ecf20Sopenharmony_ci}
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci#else
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistatic inline struct cavium_ptp *cavium_ptp_get(void)
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	return ERR_PTR(-ENODEV);
548c2ecf20Sopenharmony_ci}
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_cistatic inline void cavium_ptp_put(struct cavium_ptp *ptp) {}
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_cistatic inline u64 cavium_ptp_tstamp2time(struct cavium_ptp *ptp, u64 tstamp)
598c2ecf20Sopenharmony_ci{
608c2ecf20Sopenharmony_ci	return 0;
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cistatic inline int cavium_ptp_clock_index(struct cavium_ptp *clock)
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	return -1;
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#endif
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci#endif
71