microchip_rds_ptp.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /* SPDX-License-Identifier: GPL-2.0
  2. * Copyright (C) 2024 Microchip Technology
  3. */
  4. #ifndef _MICROCHIP_RDS_PTP_H
  5. #define _MICROCHIP_RDS_PTP_H
  6. #include <linux/ptp_clock_kernel.h>
  7. #include <linux/ptp_clock.h>
  8. #include <linux/ptp_classify.h>
  9. #include <linux/net_tstamp.h>
  10. #include <linux/mii.h>
  11. #include <linux/phy.h>
  12. #define MCHP_RDS_PTP_CMD_CTL 0x0
  13. #define MCHP_RDS_PTP_CMD_CTL_LTC_STEP_NSEC BIT(6)
  14. #define MCHP_RDS_PTP_CMD_CTL_LTC_STEP_SEC BIT(5)
  15. #define MCHP_RDS_PTP_CMD_CTL_CLOCK_LOAD BIT(4)
  16. #define MCHP_RDS_PTP_CMD_CTL_CLOCK_READ BIT(3)
  17. #define MCHP_RDS_PTP_CMD_CTL_EN BIT(1)
  18. #define MCHP_RDS_PTP_CMD_CTL_DIS BIT(0)
  19. #define MCHP_RDS_PTP_REF_CLK_CFG 0x2
  20. #define MCHP_RDS_PTP_REF_CLK_SRC_250MHZ 0x0
  21. #define MCHP_RDS_PTP_REF_CLK_PERIOD_OVERRIDE BIT(9)
  22. #define MCHP_RDS_PTP_REF_CLK_PERIOD 4
  23. #define MCHP_RDS_PTP_REF_CLK_CFG_SET (MCHP_RDS_PTP_REF_CLK_SRC_250MHZ |\
  24. MCHP_RDS_PTP_REF_CLK_PERIOD_OVERRIDE |\
  25. MCHP_RDS_PTP_REF_CLK_PERIOD)
  26. #define MCHP_RDS_PTP_LTC_SEC_HI 0x5
  27. #define MCHP_RDS_PTP_LTC_SEC_MID 0x6
  28. #define MCHP_RDS_PTP_LTC_SEC_LO 0x7
  29. #define MCHP_RDS_PTP_LTC_NS_HI 0x8
  30. #define MCHP_RDS_PTP_LTC_NS_LO 0x9
  31. #define MCHP_RDS_PTP_LTC_RATE_ADJ_HI 0xc
  32. #define MCHP_RDS_PTP_LTC_RATE_ADJ_HI_DIR BIT(15)
  33. #define MCHP_RDS_PTP_LTC_RATE_ADJ_LO 0xd
  34. #define MCHP_RDS_PTP_STEP_ADJ_HI 0x12
  35. #define MCHP_RDS_PTP_STEP_ADJ_HI_DIR BIT(15)
  36. #define MCHP_RDS_PTP_STEP_ADJ_LO 0x13
  37. #define MCHP_RDS_PTP_LTC_READ_SEC_HI 0x29
  38. #define MCHP_RDS_PTP_LTC_READ_SEC_MID 0x2a
  39. #define MCHP_RDS_PTP_LTC_READ_SEC_LO 0x2b
  40. #define MCHP_RDS_PTP_LTC_READ_NS_HI 0x2c
  41. #define MCHP_RDS_PTP_LTC_READ_NS_LO 0x2d
  42. #define MCHP_RDS_PTP_OP_MODE 0x41
  43. #define MCHP_RDS_PTP_OP_MODE_DIS 0
  44. #define MCHP_RDS_PTP_OP_MODE_STANDALONE 1
  45. #define MCHP_RDS_PTP_LATENCY_CORRECTION_CTL 0x44
  46. #define MCHP_RDS_PTP_PREDICTOR_EN BIT(6)
  47. #define MCHP_RDS_PTP_TX_PRED_DIS BIT(1)
  48. #define MCHP_RDS_PTP_RX_PRED_DIS BIT(0)
  49. #define MCHP_RDS_PTP_LATENCY_SETTING (MCHP_RDS_PTP_PREDICTOR_EN | \
  50. MCHP_RDS_PTP_TX_PRED_DIS | \
  51. MCHP_RDS_PTP_RX_PRED_DIS)
  52. #define MCHP_RDS_PTP_INT_EN 0x0
  53. #define MCHP_RDS_PTP_INT_STS 0x01
  54. #define MCHP_RDS_PTP_INT_TX_TS_OVRFL_EN BIT(3)
  55. #define MCHP_RDS_PTP_INT_TX_TS_EN BIT(2)
  56. #define MCHP_RDS_PTP_INT_RX_TS_OVRFL_EN BIT(1)
  57. #define MCHP_RDS_PTP_INT_RX_TS_EN BIT(0)
  58. #define MCHP_RDS_PTP_INT_ALL_MSK (MCHP_RDS_PTP_INT_TX_TS_OVRFL_EN | \
  59. MCHP_RDS_PTP_INT_TX_TS_EN | \
  60. MCHP_RDS_PTP_INT_RX_TS_OVRFL_EN |\
  61. MCHP_RDS_PTP_INT_RX_TS_EN)
  62. #define MCHP_RDS_PTP_CAP_INFO 0x2e
  63. #define MCHP_RDS_PTP_TX_TS_CNT(v) (((v) & GENMASK(11, 8)) >> 8)
  64. #define MCHP_RDS_PTP_RX_TS_CNT(v) ((v) & GENMASK(3, 0))
  65. #define MCHP_RDS_PTP_RX_PARSE_CONFIG 0x42
  66. #define MCHP_RDS_PTP_RX_PARSE_L2_ADDR_EN 0x44
  67. #define MCHP_RDS_PTP_RX_PARSE_IPV4_ADDR_EN 0x45
  68. #define MCHP_RDS_PTP_RX_TIMESTAMP_CONFIG 0x4e
  69. #define MCHP_RDS_PTP_RX_TIMESTAMP_CONFIG_PTP_FCS_DIS BIT(0)
  70. #define MCHP_RDS_PTP_RX_VERSION 0x48
  71. #define MCHP_RDS_PTP_RX_TIMESTAMP_EN 0x4d
  72. #define MCHP_RDS_PTP_RX_INGRESS_NS_HI 0x54
  73. #define MCHP_RDS_PTP_RX_INGRESS_NS_HI_TS_VALID BIT(15)
  74. #define MCHP_RDS_PTP_RX_INGRESS_NS_LO 0x55
  75. #define MCHP_RDS_PTP_RX_INGRESS_SEC_HI 0x56
  76. #define MCHP_RDS_PTP_RX_INGRESS_SEC_LO 0x57
  77. #define MCHP_RDS_PTP_RX_MSG_HDR2 0x59
  78. #define MCHP_RDS_PTP_TX_PARSE_CONFIG 0x82
  79. #define MCHP_RDS_PTP_PARSE_CONFIG_LAYER2_EN BIT(0)
  80. #define MCHP_RDS_PTP_PARSE_CONFIG_IPV4_EN BIT(1)
  81. #define MCHP_RDS_PTP_PARSE_CONFIG_IPV6_EN BIT(2)
  82. #define MCHP_RDS_PTP_TX_PARSE_L2_ADDR_EN 0x84
  83. #define MCHP_RDS_PTP_TX_PARSE_IPV4_ADDR_EN 0x85
  84. #define MCHP_RDS_PTP_TX_VERSION 0x88
  85. #define MCHP_RDS_PTP_MAX_VERSION(x) (((x) & GENMASK(7, 0)) << 8)
  86. #define MCHP_RDS_PTP_MIN_VERSION(x) ((x) & GENMASK(7, 0))
  87. #define MCHP_RDS_PTP_TX_TIMESTAMP_EN 0x8d
  88. #define MCHP_RDS_PTP_TIMESTAMP_EN_SYNC BIT(0)
  89. #define MCHP_RDS_PTP_TIMESTAMP_EN_DREQ BIT(1)
  90. #define MCHP_RDS_PTP_TIMESTAMP_EN_PDREQ BIT(2)
  91. #define MCHP_RDS_PTP_TIMESTAMP_EN_PDRES BIT(3)
  92. #define MCHP_RDS_PTP_TIMESTAMP_EN_ALL (MCHP_RDS_PTP_TIMESTAMP_EN_SYNC |\
  93. MCHP_RDS_PTP_TIMESTAMP_EN_DREQ |\
  94. MCHP_RDS_PTP_TIMESTAMP_EN_PDREQ |\
  95. MCHP_RDS_PTP_TIMESTAMP_EN_PDRES)
  96. #define MCHP_RDS_PTP_TX_TIMESTAMP_CONFIG 0x8e
  97. #define MCHP_RDS_PTP_TX_TIMESTAMP_CONFIG_PTP_FCS_DIS BIT(0)
  98. #define MCHP_RDS_PTP_TX_MOD 0x8f
  99. #define MCHP_RDS_TX_MOD_PTP_SYNC_TS_INSERT BIT(12)
  100. #define MCHP_RDS_PTP_TX_EGRESS_NS_HI 0x94
  101. #define MCHP_RDS_PTP_TX_EGRESS_NS_HI_TS_VALID BIT(15)
  102. #define MCHP_RDS_PTP_TX_EGRESS_NS_LO 0x95
  103. #define MCHP_RDS_PTP_TX_EGRESS_SEC_HI 0x96
  104. #define MCHP_RDS_PTP_TX_EGRESS_SEC_LO 0x97
  105. #define MCHP_RDS_PTP_TX_MSG_HDR2 0x99
  106. #define MCHP_RDS_PTP_TSU_GEN_CONFIG 0xc0
  107. #define MCHP_RDS_PTP_TSU_GEN_CFG_TSU_EN BIT(0)
  108. #define MCHP_RDS_PTP_TSU_HARD_RESET 0xc1
  109. #define MCHP_RDS_PTP_TSU_HARDRESET BIT(0)
  110. #define MCHP_RDS_PTP_CLK_TRGT_SEC_HI 0x15
  111. #define MCHP_RDS_PTP_CLK_TRGT_SEC_LO 0x16
  112. #define MCHP_RDS_PTP_CLK_TRGT_NS_HI 0x17
  113. #define MCHP_RDS_PTP_CLK_TRGT_NS_LO 0x18
  114. #define MCHP_RDS_PTP_CLK_TRGT_RELOAD_SEC_HI 0x19
  115. #define MCHP_RDS_PTP_CLK_TRGT_RELOAD_SEC_LO 0x1a
  116. #define MCHP_RDS_PTP_CLK_TRGT_RELOAD_NS_HI 0x1b
  117. #define MCHP_RDS_PTP_CLK_TRGT_RELOAD_NS_LO 0x1c
  118. #define MCHP_RDS_PTP_GEN_CFG 0x01
  119. #define MCHP_RDS_PTP_GEN_CFG_LTC_EVT_MASK GENMASK(11, 8)
  120. #define MCHP_RDS_PTP_GEN_CFG_LTC_EVT_SET(value) (((value) & 0xF) << 4)
  121. #define MCHP_RDS_PTP_GEN_CFG_RELOAD_ADD BIT(0)
  122. #define MCHP_RDS_PTP_GEN_CFG_POLARITY BIT(1)
  123. /* Represents 1ppm adjustment in 2^32 format with
  124. * each nsec contains 4 clock cycles in 250MHz.
  125. * The value is calculated as following: (1/1000000)/((2^-32)/4)
  126. */
  127. #define MCHP_RDS_PTP_1PPM_FORMAT 17179
  128. #define MCHP_RDS_PTP_FIFO_SIZE 8
  129. #define MCHP_RDS_PTP_MAX_ADJ 31249999
  130. #define MCHP_RDS_PTP_BUFFER_TIME 2
  131. #define MCHP_RDS_PTP_N_PIN 4
  132. #define MCHP_RDS_PTP_N_PEROUT 1
  133. #define BASE_CLK(p) ((p)->clk_base_addr)
  134. #define BASE_PORT(p) ((p)->port_base_addr)
  135. #define PTP_MMD(p) ((p)->mmd)
  136. enum mchp_rds_ptp_base {
  137. MCHP_RDS_PTP_PORT,
  138. MCHP_RDS_PTP_CLOCK
  139. };
  140. enum mchp_rds_ptp_fifo_dir {
  141. MCHP_RDS_PTP_INGRESS_FIFO,
  142. MCHP_RDS_PTP_EGRESS_FIFO
  143. };
  144. struct mchp_rds_ptp_clock {
  145. struct mii_timestamper mii_ts;
  146. struct phy_device *phydev;
  147. struct ptp_clock *ptp_clock;
  148. struct sk_buff_head tx_queue;
  149. struct sk_buff_head rx_queue;
  150. struct list_head rx_ts_list;
  151. struct ptp_clock_info caps;
  152. /* Lock for Rx ts fifo */
  153. spinlock_t rx_ts_lock;
  154. int hwts_tx_type;
  155. enum hwtstamp_rx_filters rx_filter;
  156. int layer;
  157. int version;
  158. u16 port_base_addr;
  159. u16 clk_base_addr;
  160. /* Lock for phc */
  161. struct mutex ptp_lock;
  162. u8 mmd;
  163. int mchp_rds_ptp_event;
  164. int event_pin;
  165. struct ptp_pin_desc *pin_config;
  166. };
  167. struct mchp_rds_ptp_rx_ts {
  168. struct list_head list;
  169. u32 seconds;
  170. u32 nsec;
  171. u16 seq_id;
  172. };
  173. #if IS_ENABLED(CONFIG_MICROCHIP_PHY_RDS_PTP)
  174. struct mchp_rds_ptp_clock *mchp_rds_ptp_probe(struct phy_device *phydev, u8 mmd,
  175. u16 clk_base, u16 port_base);
  176. int mchp_rds_ptp_top_config_intr(struct mchp_rds_ptp_clock *clock,
  177. u16 reg, u16 val, bool enable);
  178. irqreturn_t mchp_rds_ptp_handle_interrupt(struct mchp_rds_ptp_clock *clock);
  179. #else
  180. static inline struct mchp_rds_ptp_clock *mchp_rds_ptp_probe(struct phy_device
  181. *phydev, u8 mmd,
  182. u16 clk_base,
  183. u16 port_base)
  184. {
  185. return NULL;
  186. }
  187. static inline int mchp_rds_ptp_top_config_intr(struct mchp_rds_ptp_clock *clock,
  188. u16 reg, u16 val, bool enable)
  189. {
  190. return 0;
  191. }
  192. static inline irqreturn_t mchp_rds_ptp_handle_interrupt(struct
  193. mchp_rds_ptp_clock
  194. * clock)
  195. {
  196. return IRQ_NONE;
  197. }
  198. #endif //CONFIG_MICROCHIP_PHY_RDS_PTP
  199. #endif //_MICROCHIP_RDS_PTP_H