linux/drivers/net/ethernet/microchip/lan743x_ptp.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/* Copyright (C) 2018 Microchip Technology Inc. */
   3
   4#ifndef _LAN743X_PTP_H
   5#define _LAN743X_PTP_H
   6
   7#include "linux/ptp_clock_kernel.h"
   8#include "linux/netdevice.h"
   9
  10#define LAN7430_N_LED                   4
  11#define LAN7430_N_GPIO                  4       /* multiplexed with PHY LEDs */
  12#define LAN7431_N_GPIO                  12
  13
  14#define LAN743X_PTP_N_GPIO              LAN7431_N_GPIO
  15
  16/* the number of periodic outputs is limited by number of
  17 * PTP clock event channels
  18 */
  19#define LAN743X_PTP_N_EVENT_CHAN        2
  20#define LAN743X_PTP_N_PEROUT            LAN743X_PTP_N_EVENT_CHAN
  21
  22struct lan743x_adapter;
  23
  24/* GPIO */
  25struct lan743x_gpio {
  26        /* gpio_lock: used to prevent concurrent access to gpio settings */
  27        spinlock_t gpio_lock;
  28
  29        int used_bits;
  30        int output_bits;
  31        int ptp_bits;
  32        u32 gpio_cfg0;
  33        u32 gpio_cfg1;
  34        u32 gpio_cfg2;
  35        u32 gpio_cfg3;
  36};
  37
  38int lan743x_gpio_init(struct lan743x_adapter *adapter);
  39
  40void lan743x_ptp_isr(void *context);
  41bool lan743x_ptp_request_tx_timestamp(struct lan743x_adapter *adapter);
  42void lan743x_ptp_unrequest_tx_timestamp(struct lan743x_adapter *adapter);
  43void lan743x_ptp_tx_timestamp_skb(struct lan743x_adapter *adapter,
  44                                  struct sk_buff *skb, bool ignore_sync);
  45int lan743x_ptp_init(struct lan743x_adapter *adapter);
  46int lan743x_ptp_open(struct lan743x_adapter *adapter);
  47void lan743x_ptp_close(struct lan743x_adapter *adapter);
  48void lan743x_ptp_update_latency(struct lan743x_adapter *adapter,
  49                                u32 link_speed);
  50
  51int lan743x_ptp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd);
  52
  53#define LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS (4)
  54
  55#define PTP_FLAG_PTP_CLOCK_REGISTERED           BIT(1)
  56#define PTP_FLAG_ISR_ENABLED                    BIT(2)
  57
  58struct lan743x_ptp_perout {
  59        int  event_ch;  /* PTP event channel (0=channel A, 1=channel B) */
  60        int  gpio_pin;  /* GPIO pin where output appears */
  61};
  62
  63struct lan743x_ptp {
  64        int flags;
  65
  66        /* command_lock: used to prevent concurrent ptp commands */
  67        struct mutex    command_lock;
  68
  69        struct ptp_clock *ptp_clock;
  70        struct ptp_clock_info ptp_clock_info;
  71        struct ptp_pin_desc pin_config[LAN743X_PTP_N_GPIO];
  72
  73        unsigned long used_event_ch;
  74        struct lan743x_ptp_perout perout[LAN743X_PTP_N_PEROUT];
  75
  76        bool leds_multiplexed;
  77        bool led_enabled[LAN7430_N_LED];
  78
  79        /* tx_ts_lock: used to prevent concurrent access to timestamp arrays */
  80        spinlock_t      tx_ts_lock;
  81        int pending_tx_timestamps;
  82        struct sk_buff *tx_ts_skb_queue[LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS];
  83        unsigned int    tx_ts_ignore_sync_queue;
  84        int tx_ts_skb_queue_size;
  85        u32 tx_ts_seconds_queue[LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS];
  86        u32 tx_ts_nseconds_queue[LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS];
  87        u32 tx_ts_header_queue[LAN743X_PTP_NUMBER_OF_TX_TIMESTAMPS];
  88        int tx_ts_queue_size;
  89};
  90
  91#endif /* _LAN743X_PTP_H */
  92