162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* cavium_ptp.h - PTP 1588 clock on Cavium hardware
362306a36Sopenharmony_ci * Copyright (c) 2003-2015, 2017 Cavium, Inc.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef CAVIUM_PTP_H
762306a36Sopenharmony_ci#define CAVIUM_PTP_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/ptp_clock_kernel.h>
1062306a36Sopenharmony_ci#include <linux/timecounter.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cistruct cavium_ptp {
1362306a36Sopenharmony_ci	struct pci_dev *pdev;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	/* Serialize access to cycle_counter, time_counter and hw_registers */
1662306a36Sopenharmony_ci	spinlock_t spin_lock;
1762306a36Sopenharmony_ci	struct cyclecounter cycle_counter;
1862306a36Sopenharmony_ci	struct timecounter time_counter;
1962306a36Sopenharmony_ci	void __iomem *reg_base;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	u32 clock_rate;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	struct ptp_clock_info ptp_info;
2462306a36Sopenharmony_ci	struct ptp_clock *ptp_clock;
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#if IS_REACHABLE(CONFIG_CAVIUM_PTP)
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistruct cavium_ptp *cavium_ptp_get(void);
3062306a36Sopenharmony_civoid cavium_ptp_put(struct cavium_ptp *ptp);
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistatic inline u64 cavium_ptp_tstamp2time(struct cavium_ptp *ptp, u64 tstamp)
3362306a36Sopenharmony_ci{
3462306a36Sopenharmony_ci	unsigned long flags;
3562306a36Sopenharmony_ci	u64 ret;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	spin_lock_irqsave(&ptp->spin_lock, flags);
3862306a36Sopenharmony_ci	ret = timecounter_cyc2time(&ptp->time_counter, tstamp);
3962306a36Sopenharmony_ci	spin_unlock_irqrestore(&ptp->spin_lock, flags);
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	return ret;
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic inline int cavium_ptp_clock_index(struct cavium_ptp *clock)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	return ptp_clock_index(clock->ptp_clock);
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci#else
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic inline struct cavium_ptp *cavium_ptp_get(void)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	return ERR_PTR(-ENODEV);
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic inline void cavium_ptp_put(struct cavium_ptp *ptp) {}
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_cistatic inline u64 cavium_ptp_tstamp2time(struct cavium_ptp *ptp, u64 tstamp)
5962306a36Sopenharmony_ci{
6062306a36Sopenharmony_ci	return 0;
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic inline int cavium_ptp_clock_index(struct cavium_ptp *clock)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci	return -1;
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#endif
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci#endif
71