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