#include <linux/if_hsr.h>
 #include <linux/if_vlan.h>
 #include <linux/interrupt.h>
+#include <linux/io-64-nonatomic-hi-lo.h>
 #include <linux/kernel.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
        struct prueth_emac *emac = clockops_data;
        u32 reduction_factor = 0, offset = 0;
        struct timespec64 ts;
+       u64 current_cycle;
+       u64 start_offset;
        u64 ns_period;
 
        if (!on)
        writel(reduction_factor, emac->prueth->shram.va +
                TIMESYNC_FW_WC_SYNCOUT_REDUCTION_FACTOR_OFFSET);
 
-       writel(0, emac->prueth->shram.va +
-               TIMESYNC_FW_WC_SYNCOUT_START_TIME_CYCLECOUNT_OFFSET);
+       current_cycle = icssg_read_time(emac->prueth->shram.va +
+                                       TIMESYNC_FW_WC_CYCLECOUNT_OFFSET);
+
+       /* Rounding of current_cycle count to next second */
+       start_offset = roundup(current_cycle, MSEC_PER_SEC);
+
+       hi_lo_writeq(start_offset, emac->prueth->shram.va +
+                    TIMESYNC_FW_WC_SYNCOUT_START_TIME_CYCLECOUNT_OFFSET);
 
        return 0;
 }
 
 extern const struct ethtool_ops icssg_ethtool_ops;
 extern const struct dev_pm_ops prueth_dev_pm_ops;
 
+static inline u64 icssg_read_time(const void __iomem *addr)
+{
+       u32 low, high;
+
+       do {
+               high = readl(addr + 4);
+               low = readl(addr);
+       } while (high != readl(addr + 4));
+
+       return low + ((u64)high << 32);
+}
+
 /* Classifier helpers */
 void icssg_class_set_mac_addr(struct regmap *miig_rt, int slice, u8 *mac);
 void icssg_class_set_host_mac_addr(struct regmap *miig_rt, const u8 *mac);