linux/drivers/net/ethernet/cavium/common/cavium_ptp.h
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/* cavium_ptp.h - PTP 1588 clock on Cavium hardware
   3 * Copyright (c) 2003-2015, 2017 Cavium, Inc.
   4 */
   5
   6#ifndef CAVIUM_PTP_H
   7#define CAVIUM_PTP_H
   8
   9#include <linux/ptp_clock_kernel.h>
  10#include <linux/timecounter.h>
  11
  12struct cavium_ptp {
  13        struct pci_dev *pdev;
  14
  15        /* Serialize access to cycle_counter, time_counter and hw_registers */
  16        spinlock_t spin_lock;
  17        struct cyclecounter cycle_counter;
  18        struct timecounter time_counter;
  19        void __iomem *reg_base;
  20
  21        u32 clock_rate;
  22
  23        struct ptp_clock_info ptp_info;
  24        struct ptp_clock *ptp_clock;
  25};
  26
  27#if IS_ENABLED(CONFIG_CAVIUM_PTP)
  28
  29struct cavium_ptp *cavium_ptp_get(void);
  30void cavium_ptp_put(struct cavium_ptp *ptp);
  31
  32static inline u64 cavium_ptp_tstamp2time(struct cavium_ptp *ptp, u64 tstamp)
  33{
  34        unsigned long flags;
  35        u64 ret;
  36
  37        spin_lock_irqsave(&ptp->spin_lock, flags);
  38        ret = timecounter_cyc2time(&ptp->time_counter, tstamp);
  39        spin_unlock_irqrestore(&ptp->spin_lock, flags);
  40
  41        return ret;
  42}
  43
  44static inline int cavium_ptp_clock_index(struct cavium_ptp *clock)
  45{
  46        return ptp_clock_index(clock->ptp_clock);
  47}
  48
  49#else
  50
  51static inline struct cavium_ptp *cavium_ptp_get(void)
  52{
  53        return ERR_PTR(-ENODEV);
  54}
  55
  56static inline void cavium_ptp_put(struct cavium_ptp *ptp) {}
  57
  58static inline u64 cavium_ptp_tstamp2time(struct cavium_ptp *ptp, u64 tstamp)
  59{
  60        return 0;
  61}
  62
  63static inline int cavium_ptp_clock_index(struct cavium_ptp *clock)
  64{
  65        return -1;
  66}
  67
  68#endif
  69
  70#endif
  71