mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-09 19:10:45 +00:00
net: dsa: mv88e6xxx: Add mv88e6165 PTP support
The mv88e6165 family has its global clock in the PTP global registers. It does not support any form of PTP events. Add a function to read the clock, fill in an ops structure, and register it with the two members of the family. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Acked-by: Richard Cochran <richardcochran@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a469a61231
commit
dfa5434810
@ -2811,6 +2811,7 @@ static const struct mv88e6xxx_ops mv88e6161_ops = {
|
||||
.vtu_getnext = mv88e6352_g1_vtu_getnext,
|
||||
.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
|
||||
.avb_ops = &mv88e6165_avb_ops,
|
||||
.ptp_ops = &mv88e6165_ptp_ops,
|
||||
};
|
||||
|
||||
static const struct mv88e6xxx_ops mv88e6165_ops = {
|
||||
@ -2840,6 +2841,7 @@ static const struct mv88e6xxx_ops mv88e6165_ops = {
|
||||
.vtu_getnext = mv88e6352_g1_vtu_getnext,
|
||||
.vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
|
||||
.avb_ops = &mv88e6165_avb_ops,
|
||||
.ptp_ops = &mv88e6165_ptp_ops,
|
||||
};
|
||||
|
||||
static const struct mv88e6xxx_ops mv88e6171_ops = {
|
||||
@ -3693,6 +3695,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
|
||||
.pvt = true,
|
||||
.multi_chip = true,
|
||||
.tag_protocol = DSA_TAG_PROTO_EDSA,
|
||||
.ptp_support = true,
|
||||
.ops = &mv88e6161_ops,
|
||||
},
|
||||
|
||||
@ -3715,6 +3718,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
|
||||
.pvt = true,
|
||||
.multi_chip = true,
|
||||
.tag_protocol = DSA_TAG_PROTO_DSA,
|
||||
.ptp_support = true,
|
||||
.ops = &mv88e6165_ops,
|
||||
},
|
||||
|
||||
|
@ -79,6 +79,20 @@ static u64 mv88e6352_ptp_clock_read(const struct cyclecounter *cc)
|
||||
return ((u32)phc_time[1] << 16) | phc_time[0];
|
||||
}
|
||||
|
||||
static u64 mv88e6165_ptp_clock_read(const struct cyclecounter *cc)
|
||||
{
|
||||
struct mv88e6xxx_chip *chip = cc_to_chip(cc);
|
||||
u16 phc_time[2];
|
||||
int err;
|
||||
|
||||
err = mv88e6xxx_tai_read(chip, MV88E6XXX_PTP_GC_TIME_LO, phc_time,
|
||||
ARRAY_SIZE(phc_time));
|
||||
if (err)
|
||||
return 0;
|
||||
else
|
||||
return ((u32)phc_time[1] << 16) | phc_time[0];
|
||||
}
|
||||
|
||||
/* mv88e6352_config_eventcap - configure TAI event capture
|
||||
* @event: PTP_CLOCK_PPS (internal) or PTP_CLOCK_EXTTS (external)
|
||||
* @rising: zero for falling-edge trigger, else rising-edge trigger
|
||||
@ -307,6 +321,10 @@ const struct mv88e6xxx_ptp_ops mv88e6352_ptp_ops = {
|
||||
.n_ext_ts = 1,
|
||||
};
|
||||
|
||||
const struct mv88e6xxx_ptp_ops mv88e6165_ptp_ops = {
|
||||
.clock_read = mv88e6165_ptp_clock_read,
|
||||
};
|
||||
|
||||
static u64 mv88e6xxx_ptp_clock_read(const struct cyclecounter *cc)
|
||||
{
|
||||
struct mv88e6xxx_chip *chip = cc_to_chip(cc);
|
||||
|
@ -78,6 +78,33 @@
|
||||
/* Offset 0x12: Lock Status */
|
||||
#define MV88E6XXX_TAI_LOCK_STATUS 0x12
|
||||
|
||||
/* Offset 0x00: Ether Type */
|
||||
#define MV88E6XXX_PTP_GC_ETYPE 0x00
|
||||
|
||||
/* Offset 0x01: Message ID */
|
||||
#define MV88E6XXX_PTP_GC_MESSAGE_ID 0x01
|
||||
|
||||
/* Offset 0x02: Time Stamp Arrive Time */
|
||||
#define MV88E6XXX_PTP_GC_TS_ARR_PTR 0x02
|
||||
|
||||
/* Offset 0x03: Port Arrival Interrupt Enable */
|
||||
#define MV88E6XXX_PTP_GC_PORT_ARR_INT_EN 0x03
|
||||
|
||||
/* Offset 0x04: Port Departure Interrupt Enable */
|
||||
#define MV88E6XXX_PTP_GC_PORT_DEP_INT_EN 0x04
|
||||
|
||||
/* Offset 0x05: Configuration */
|
||||
#define MV88E6XXX_PTP_GC_CONFIG 0x05
|
||||
#define MV88E6XXX_PTP_GC_CONFIG_DIS_OVERWRITE BIT(1)
|
||||
#define MV88E6XXX_PTP_GC_CONFIG_DIS_TS BIT(0)
|
||||
|
||||
/* Offset 0x8: Interrupt Status */
|
||||
#define MV88E6XXX_PTP_GC_INT_STATUS 0x08
|
||||
|
||||
/* Offset 0x9/0xa: Global Time */
|
||||
#define MV88E6XXX_PTP_GC_TIME_LO 0x09
|
||||
#define MV88E6XXX_PTP_GC_TIME_HI 0x0A
|
||||
|
||||
#ifdef CONFIG_NET_DSA_MV88E6XXX_PTP
|
||||
|
||||
long mv88e6xxx_hwtstamp_work(struct ptp_clock_info *ptp);
|
||||
@ -88,6 +115,7 @@ void mv88e6xxx_ptp_free(struct mv88e6xxx_chip *chip);
|
||||
ptp_clock_info)
|
||||
|
||||
extern const struct mv88e6xxx_ptp_ops mv88e6352_ptp_ops;
|
||||
extern const struct mv88e6xxx_ptp_ops mv88e6165_ptp_ops;
|
||||
|
||||
#else /* !CONFIG_NET_DSA_MV88E6XXX_PTP */
|
||||
|
||||
@ -106,6 +134,7 @@ static inline void mv88e6xxx_ptp_free(struct mv88e6xxx_chip *chip)
|
||||
}
|
||||
|
||||
static const struct mv88e6xxx_ptp_ops mv88e6352_ptp_ops = {};
|
||||
static const struct mv88e6xxx_ptp_ops mv88e6165_ptp_ops = {};
|
||||
|
||||
#endif /* CONFIG_NET_DSA_MV88E6XXX_PTP */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user