mirror of
https://github.com/torvalds/linux.git
synced 2026-06-05 13:06:59 +02:00
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 <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>
This commit is contained in:
parent
0fe41a8704
commit
7d102d0e4c
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user