1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Marvell 88E6xxx Switch PTP support 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2008 Marvell Semiconductor 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (c) 2017 National Instruments 8*4882a593Smuzhiyun * Erik Hons <erik.hons@ni.com> 9*4882a593Smuzhiyun * Brandon Streiff <brandon.streiff@ni.com> 10*4882a593Smuzhiyun * Dane Wagner <dane.wagner@ni.com> 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #ifndef _MV88E6XXX_PTP_H 14*4882a593Smuzhiyun #define _MV88E6XXX_PTP_H 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include "chip.h" 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* Offset 0x00: TAI Global Config */ 19*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG 0x00 20*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_CAP_OVERWRITE 0x8000 21*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_CAP_CTR_START 0x4000 22*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_EVREQ_FALLING 0x2000 23*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_TRIG_ACTIVE_LO 0x1000 24*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_IRL_ENABLE 0x0400 25*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_TRIG_IRQ_EN 0x0200 26*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_EVREQ_IRQ_EN 0x0100 27*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_TRIG_LOCK 0x0080 28*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_BLOCK_UPDATE 0x0008 29*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_MULTI_PTP 0x0004 30*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_TRIG_MODE_ONESHOT 0x0002 31*4882a593Smuzhiyun #define MV88E6XXX_TAI_CFG_TRIG_ENABLE 0x0001 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* Offset 0x01: Timestamp Clock Period (ps) */ 34*4882a593Smuzhiyun #define MV88E6XXX_TAI_CLOCK_PERIOD 0x01 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* Offset 0x02/0x03: Trigger Generation Amount */ 37*4882a593Smuzhiyun #define MV88E6XXX_TAI_TRIG_GEN_AMOUNT_LO 0x02 38*4882a593Smuzhiyun #define MV88E6XXX_TAI_TRIG_GEN_AMOUNT_HI 0x03 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* Offset 0x04: Clock Compensation */ 41*4882a593Smuzhiyun #define MV88E6XXX_TAI_TRIG_CLOCK_COMP 0x04 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* Offset 0x05: Trigger Configuration */ 44*4882a593Smuzhiyun #define MV88E6XXX_TAI_TRIG_CFG 0x05 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun /* Offset 0x06: Ingress Rate Limiter Clock Generation Amount */ 47*4882a593Smuzhiyun #define MV88E6XXX_TAI_IRL_AMOUNT 0x06 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* Offset 0x07: Ingress Rate Limiter Compensation */ 50*4882a593Smuzhiyun #define MV88E6XXX_TAI_IRL_COMP 0x07 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* Offset 0x08: Ingress Rate Limiter Compensation */ 53*4882a593Smuzhiyun #define MV88E6XXX_TAI_IRL_COMP_PS 0x08 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* Offset 0x09: Event Status */ 56*4882a593Smuzhiyun #define MV88E6XXX_TAI_EVENT_STATUS 0x09 57*4882a593Smuzhiyun #define MV88E6XXX_TAI_EVENT_STATUS_CAP_TRIG 0x4000 58*4882a593Smuzhiyun #define MV88E6XXX_TAI_EVENT_STATUS_ERROR 0x0200 59*4882a593Smuzhiyun #define MV88E6XXX_TAI_EVENT_STATUS_VALID 0x0100 60*4882a593Smuzhiyun #define MV88E6XXX_TAI_EVENT_STATUS_CTR_MASK 0x00ff 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* Offset 0x0A/0x0B: Event Time */ 63*4882a593Smuzhiyun #define MV88E6XXX_TAI_EVENT_TIME_LO 0x0a 64*4882a593Smuzhiyun #define MV88E6XXX_TAI_EVENT_TYPE_HI 0x0b 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* Offset 0x0E/0x0F: PTP Global Time */ 67*4882a593Smuzhiyun #define MV88E6XXX_TAI_TIME_LO 0x0e 68*4882a593Smuzhiyun #define MV88E6XXX_TAI_TIME_HI 0x0f 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* Offset 0x10/0x11: Trig Generation Time */ 71*4882a593Smuzhiyun #define MV88E6XXX_TAI_TRIG_TIME_LO 0x10 72*4882a593Smuzhiyun #define MV88E6XXX_TAI_TRIG_TIME_HI 0x11 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* Offset 0x12: Lock Status */ 75*4882a593Smuzhiyun #define MV88E6XXX_TAI_LOCK_STATUS 0x12 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun /* Offset 0x00: Ether Type */ 78*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_ETYPE 0x00 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* 6165 Global Control Registers */ 81*4882a593Smuzhiyun /* Offset 0x00: Ether Type */ 82*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_ETYPE 0x00 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* Offset 0x01: Message ID */ 85*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_MESSAGE_ID 0x01 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* Offset 0x02: Time Stamp Arrive Time */ 88*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_TS_ARR_PTR 0x02 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* Offset 0x03: Port Arrival Interrupt Enable */ 91*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_PORT_ARR_INT_EN 0x03 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* Offset 0x04: Port Departure Interrupt Enable */ 94*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_PORT_DEP_INT_EN 0x04 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* Offset 0x05: Configuration */ 97*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_CONFIG 0x05 98*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_CONFIG_DIS_OVERWRITE BIT(1) 99*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_CONFIG_DIS_TS BIT(0) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun /* Offset 0x8: Interrupt Status */ 102*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_INT_STATUS 0x08 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* Offset 0x9/0xa: Global Time */ 105*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_TIME_LO 0x09 106*4882a593Smuzhiyun #define MV88E6XXX_PTP_GC_TIME_HI 0x0A 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun /* 6165 Per Port Registers */ 109*4882a593Smuzhiyun /* Offset 0: Arrival Time 0 Status */ 110*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_ARR0_STS 0x00 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /* Offset 0x01/0x02: PTP Arrival 0 Time */ 113*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_ARR0_TIME_LO 0x01 114*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_ARR0_TIME_HI 0x02 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /* Offset 0x03: PTP Arrival 0 Sequence ID */ 117*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_ARR0_SEQID 0x03 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /* Offset 0x04: PTP Arrival 1 Status */ 120*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_ARR1_STS 0x04 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* Offset 0x05/0x6E: PTP Arrival 1 Time */ 123*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_ARR1_TIME_LO 0x05 124*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_ARR1_TIME_HI 0x06 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* Offset 0x07: PTP Arrival 1 Sequence ID */ 127*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_ARR1_SEQID 0x07 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* Offset 0x08: PTP Departure Status */ 130*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_DEP_STS 0x08 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /* Offset 0x09/0x0a: PTP Deperture Time */ 133*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_DEP_TIME_LO 0x09 134*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_DEP_TIME_HI 0x0a 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun /* Offset 0x0b: PTP Departure Sequence ID */ 137*4882a593Smuzhiyun #define MV88E6165_PORT_PTP_DEP_SEQID 0x0b 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun /* Offset 0x0d: Port Status */ 140*4882a593Smuzhiyun #define MV88E6164_PORT_STATUS 0x0d 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #ifdef CONFIG_NET_DSA_MV88E6XXX_PTP 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun long mv88e6xxx_hwtstamp_work(struct ptp_clock_info *ptp); 145*4882a593Smuzhiyun int mv88e6xxx_ptp_setup(struct mv88e6xxx_chip *chip); 146*4882a593Smuzhiyun void mv88e6xxx_ptp_free(struct mv88e6xxx_chip *chip); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define ptp_to_chip(ptp) container_of(ptp, struct mv88e6xxx_chip, \ 149*4882a593Smuzhiyun ptp_clock_info) 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun extern const struct mv88e6xxx_ptp_ops mv88e6165_ptp_ops; 152*4882a593Smuzhiyun extern const struct mv88e6xxx_ptp_ops mv88e6250_ptp_ops; 153*4882a593Smuzhiyun extern const struct mv88e6xxx_ptp_ops mv88e6352_ptp_ops; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun #else /* !CONFIG_NET_DSA_MV88E6XXX_PTP */ 156*4882a593Smuzhiyun mv88e6xxx_hwtstamp_work(struct ptp_clock_info * ptp)157*4882a593Smuzhiyunstatic inline long mv88e6xxx_hwtstamp_work(struct ptp_clock_info *ptp) 158*4882a593Smuzhiyun { 159*4882a593Smuzhiyun return -1; 160*4882a593Smuzhiyun } 161*4882a593Smuzhiyun mv88e6xxx_ptp_setup(struct mv88e6xxx_chip * chip)162*4882a593Smuzhiyunstatic inline int mv88e6xxx_ptp_setup(struct mv88e6xxx_chip *chip) 163*4882a593Smuzhiyun { 164*4882a593Smuzhiyun return 0; 165*4882a593Smuzhiyun } 166*4882a593Smuzhiyun mv88e6xxx_ptp_free(struct mv88e6xxx_chip * chip)167*4882a593Smuzhiyunstatic inline void mv88e6xxx_ptp_free(struct mv88e6xxx_chip *chip) 168*4882a593Smuzhiyun { 169*4882a593Smuzhiyun } 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun static const struct mv88e6xxx_ptp_ops mv88e6165_ptp_ops = {}; 172*4882a593Smuzhiyun static const struct mv88e6xxx_ptp_ops mv88e6250_ptp_ops = {}; 173*4882a593Smuzhiyun static const struct mv88e6xxx_ptp_ops mv88e6352_ptp_ops = {}; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun #endif /* CONFIG_NET_DSA_MV88E6XXX_PTP */ 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun #endif /* _MV88E6XXX_PTP_H */ 178