can: kvaser_usb: Add helper functions to convert device timestamp into ktime
authorJimmy Assarsson <extja@kvaser.com>
Mon, 1 Jul 2024 15:49:22 +0000 (17:49 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 5 Aug 2024 15:39:00 +0000 (17:39 +0200)
Add helper function kvaser_usb_ticks_to_ktime() that converts from
device ticks to ktime.
And kvaser_usb_timestamp{48,64}_to_ktime() that converts from device
48-bit or 64-bit timestamp, to ktime.

Signed-off-by: Jimmy Assarsson <extja@kvaser.com>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Link: https://lore.kernel.org/all/20240701154936.92633-2-extja@kvaser.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/usb/kvaser_usb/kvaser_usb.h
drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c

index ff10b37..4256a0c 100644 (file)
@@ -22,6 +22,8 @@
  */
 
 #include <linux/completion.h>
+#include <linux/ktime.h>
+#include <linux/math64.h>
 #include <linux/spinlock.h>
 #include <linux/types.h>
 #include <linux/usb.h>
@@ -216,4 +218,26 @@ int kvaser_usb_can_rx_over_error(struct net_device *netdev);
 
 extern const struct can_bittiming_const kvaser_usb_flexc_bittiming_const;
 
+static inline ktime_t kvaser_usb_ticks_to_ktime(const struct kvaser_usb_dev_cfg *cfg,
+                                               u64 ticks)
+{
+       return ns_to_ktime(div_u64(ticks * 1000, cfg->timestamp_freq));
+}
+
+static inline ktime_t kvaser_usb_timestamp48_to_ktime(const struct kvaser_usb_dev_cfg *cfg,
+                                                     const __le16 *timestamp)
+{
+       u64 ticks = le16_to_cpu(timestamp[0]) |
+                   (u64)(le16_to_cpu(timestamp[1])) << 16 |
+                   (u64)(le16_to_cpu(timestamp[2])) << 32;
+
+       return kvaser_usb_ticks_to_ktime(cfg, ticks);
+}
+
+static inline ktime_t kvaser_usb_timestamp64_to_ktime(const struct kvaser_usb_dev_cfg *cfg,
+                                                     __le64 timestamp)
+{
+       return kvaser_usb_ticks_to_ktime(cfg, le64_to_cpu(timestamp));
+}
+
 #endif /* KVASER_USB_H */
index c7ba768..ad1c610 100644 (file)
@@ -526,19 +526,17 @@ static ktime_t
 kvaser_usb_hydra_ktime_from_rx_cmd(const struct kvaser_usb_dev_cfg *cfg,
                                   const struct kvaser_cmd *cmd)
 {
-       u64 ticks;
+       ktime_t hwtstamp = 0;
 
        if (cmd->header.cmd_no == CMD_EXTENDED) {
                struct kvaser_cmd_ext *cmd_ext = (struct kvaser_cmd_ext *)cmd;
 
-               ticks = le64_to_cpu(cmd_ext->rx_can.timestamp);
+               hwtstamp = kvaser_usb_timestamp64_to_ktime(cfg, cmd_ext->rx_can.timestamp);
        } else {
-               ticks = le16_to_cpu(cmd->rx_can.timestamp[0]);
-               ticks += (u64)(le16_to_cpu(cmd->rx_can.timestamp[1])) << 16;
-               ticks += (u64)(le16_to_cpu(cmd->rx_can.timestamp[2])) << 32;
+               hwtstamp = kvaser_usb_timestamp48_to_ktime(cfg, cmd->rx_can.timestamp);
        }
 
-       return ns_to_ktime(div_u64(ticks * 1000, cfg->timestamp_freq));
+       return hwtstamp;
 }
 
 static int kvaser_usb_hydra_send_simple_cmd(struct kvaser_usb *dev,