Skip to content

Commit 7d102d0

Browse files
Jimmy Assarssonmarckleinebudde
authored andcommitted
can: kvaser_usb: Add helper functions to convert device timestamp into ktime
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 <[email protected]> Reviewed-by: Vincent Mailhol <[email protected]> Link: https://lore.kernel.org/all/[email protected] Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent 0fe41a8 commit 7d102d0

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

drivers/net/can/usb/kvaser_usb/kvaser_usb.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
*/
2323

2424
#include <linux/completion.h>
25+
#include <linux/ktime.h>
26+
#include <linux/math64.h>
2527
#include <linux/spinlock.h>
2628
#include <linux/types.h>
2729
#include <linux/usb.h>
@@ -216,4 +218,26 @@ int kvaser_usb_can_rx_over_error(struct net_device *netdev);
216218

217219
extern const struct can_bittiming_const kvaser_usb_flexc_bittiming_const;
218220

221+
static inline ktime_t kvaser_usb_ticks_to_ktime(const struct kvaser_usb_dev_cfg *cfg,
222+
u64 ticks)
223+
{
224+
return ns_to_ktime(div_u64(ticks * 1000, cfg->timestamp_freq));
225+
}
226+
227+
static inline ktime_t kvaser_usb_timestamp48_to_ktime(const struct kvaser_usb_dev_cfg *cfg,
228+
const __le16 *timestamp)
229+
{
230+
u64 ticks = le16_to_cpu(timestamp[0]) |
231+
(u64)(le16_to_cpu(timestamp[1])) << 16 |
232+
(u64)(le16_to_cpu(timestamp[2])) << 32;
233+
234+
return kvaser_usb_ticks_to_ktime(cfg, ticks);
235+
}
236+
237+
static inline ktime_t kvaser_usb_timestamp64_to_ktime(const struct kvaser_usb_dev_cfg *cfg,
238+
__le64 timestamp)
239+
{
240+
return kvaser_usb_ticks_to_ktime(cfg, le64_to_cpu(timestamp));
241+
}
242+
219243
#endif /* KVASER_USB_H */

drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -526,19 +526,17 @@ static ktime_t
526526
kvaser_usb_hydra_ktime_from_rx_cmd(const struct kvaser_usb_dev_cfg *cfg,
527527
const struct kvaser_cmd *cmd)
528528
{
529-
u64 ticks;
529+
ktime_t hwtstamp = 0;
530530

531531
if (cmd->header.cmd_no == CMD_EXTENDED) {
532532
struct kvaser_cmd_ext *cmd_ext = (struct kvaser_cmd_ext *)cmd;
533533

534-
ticks = le64_to_cpu(cmd_ext->rx_can.timestamp);
534+
hwtstamp = kvaser_usb_timestamp64_to_ktime(cfg, cmd_ext->rx_can.timestamp);
535535
} else {
536-
ticks = le16_to_cpu(cmd->rx_can.timestamp[0]);
537-
ticks += (u64)(le16_to_cpu(cmd->rx_can.timestamp[1])) << 16;
538-
ticks += (u64)(le16_to_cpu(cmd->rx_can.timestamp[2])) << 32;
536+
hwtstamp = kvaser_usb_timestamp48_to_ktime(cfg, cmd->rx_can.timestamp);
539537
}
540538

541-
return ns_to_ktime(div_u64(ticks * 1000, cfg->timestamp_freq));
539+
return hwtstamp;
542540
}
543541

544542
static int kvaser_usb_hydra_send_simple_cmd(struct kvaser_usb *dev,

0 commit comments

Comments
 (0)