}
 
 /* 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;
 
        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;
 {
        u64 s;
 
-       __hellcreek_ptp_gettime(hellcreek);
+       __hellcreek_ptp_gettime(hellcreek, NULL);
        if (hellcreek->last_ts > ns)
                s = hellcreek->seconds * NSEC_PER_SEC;
        else
        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);
        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);
 
        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,
        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;