net: dsa: hellcreek: Convert to gettimex64()
authorKurt Kanzenbach <kurt@linutronix.de>
Tue, 26 Mar 2024 11:16:36 +0000 (12:16 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 29 Mar 2024 10:44:17 +0000 (10:44 +0000)
As of commit 916444df305e ("ptp: deprecate gettime64() in favor of
gettimex64()") (new) PTP drivers should rather implement gettimex64().

In addition, this variant provides timestamps from the system clock. The
readings have to be recorded right before and after reading the lowest bits
of the PHC timestamp.

Reported-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/hirschmann/hellcreek_ptp.c

index 5249a1c2a80b8caa29451af8f6315eef29edb258..bfe21f9f7dcd36e649d17a514302d13434696217 100644 (file)
@@ -27,7 +27,8 @@ void hellcreek_ptp_write(struct hellcreek *hellcreek, u16 data,
 }
 
 /* Get nanoseconds from PTP clock */
-static u64 hellcreek_ptp_clock_read(struct hellcreek *hellcreek)
+static u64 hellcreek_ptp_clock_read(struct hellcreek *hellcreek,
+                                   struct ptp_system_timestamp *sts)
 {
        u16 nsl, nsh;
 
@@ -45,16 +46,19 @@ static u64 hellcreek_ptp_clock_read(struct hellcreek *hellcreek)
        nsh = hellcreek_ptp_read(hellcreek, PR_SS_SYNC_DATA_C);
        nsh = hellcreek_ptp_read(hellcreek, PR_SS_SYNC_DATA_C);
        nsh = hellcreek_ptp_read(hellcreek, PR_SS_SYNC_DATA_C);
+       ptp_read_system_prets(sts);
        nsl = hellcreek_ptp_read(hellcreek, PR_SS_SYNC_DATA_C);
+       ptp_read_system_postts(sts);
 
        return (u64)nsl | ((u64)nsh << 16);
 }
 
-static u64 __hellcreek_ptp_gettime(struct hellcreek *hellcreek)
+static u64 __hellcreek_ptp_gettime(struct hellcreek *hellcreek,
+                                  struct ptp_system_timestamp *sts)
 {
        u64 ns;
 
-       ns = hellcreek_ptp_clock_read(hellcreek);
+       ns = hellcreek_ptp_clock_read(hellcreek, sts);
        if (ns < hellcreek->last_ts)
                hellcreek->seconds++;
        hellcreek->last_ts = ns;
@@ -72,7 +76,7 @@ u64 hellcreek_ptp_gettime_seconds(struct hellcreek *hellcreek, u64 ns)
 {
        u64 s;
 
-       __hellcreek_ptp_gettime(hellcreek);
+       __hellcreek_ptp_gettime(hellcreek, NULL);
        if (hellcreek->last_ts > ns)
                s = hellcreek->seconds * NSEC_PER_SEC;
        else
@@ -81,14 +85,15 @@ u64 hellcreek_ptp_gettime_seconds(struct hellcreek *hellcreek, u64 ns)
        return s;
 }
 
-static int hellcreek_ptp_gettime(struct ptp_clock_info *ptp,
-                                struct timespec64 *ts)
+static int hellcreek_ptp_gettimex(struct ptp_clock_info *ptp,
+                                 struct timespec64 *ts,
+                                 struct ptp_system_timestamp *sts)
 {
        struct hellcreek *hellcreek = ptp_to_hellcreek(ptp);
        u64 ns;
 
        mutex_lock(&hellcreek->ptp_lock);
-       ns = __hellcreek_ptp_gettime(hellcreek);
+       ns = __hellcreek_ptp_gettime(hellcreek, sts);
        mutex_unlock(&hellcreek->ptp_lock);
 
        *ts = ns_to_timespec64(ns);
@@ -184,7 +189,7 @@ static int hellcreek_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
        if (abs(delta) > MAX_SLOW_OFFSET_ADJ) {
                struct timespec64 now, then = ns_to_timespec64(delta);
 
-               hellcreek_ptp_gettime(ptp, &now);
+               hellcreek_ptp_gettimex(ptp, &now, NULL);
                now = timespec64_add(now, then);
                hellcreek_ptp_settime(ptp, &now);
 
@@ -233,7 +238,7 @@ static void hellcreek_ptp_overflow_check(struct work_struct *work)
        hellcreek = dw_overflow_to_hellcreek(dw);
 
        mutex_lock(&hellcreek->ptp_lock);
-       __hellcreek_ptp_gettime(hellcreek);
+       __hellcreek_ptp_gettime(hellcreek, NULL);
        mutex_unlock(&hellcreek->ptp_lock);
 
        schedule_delayed_work(&hellcreek->overflow_work,
@@ -409,7 +414,7 @@ int hellcreek_ptp_setup(struct hellcreek *hellcreek)
        hellcreek->ptp_clock_info.pps         = 0;
        hellcreek->ptp_clock_info.adjfine     = hellcreek_ptp_adjfine;
        hellcreek->ptp_clock_info.adjtime     = hellcreek_ptp_adjtime;
-       hellcreek->ptp_clock_info.gettime64   = hellcreek_ptp_gettime;
+       hellcreek->ptp_clock_info.gettimex64  = hellcreek_ptp_gettimex;
        hellcreek->ptp_clock_info.settime64   = hellcreek_ptp_settime;
        hellcreek->ptp_clock_info.enable      = hellcreek_ptp_enable;
        hellcreek->ptp_clock_info.do_aux_work = hellcreek_hwtstamp_work;