Skip to content

Commit 2c14119

Browse files
committed
Merge tag 'linux-can-next-for-6.12-20240806' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next
Marc Kleine-Budde says: ==================== pull-request: can-next 2024-08-06 The first patch is by Frank Li and adds the can-transceiver property to the flexcan device-tree bindings. Haibo Chen contributes 2 patches for the flexcan driver to add wakeup support for the imx95. The 2 patches by Stefan Mätje for the esd_402_pci driver clean up the driver and add support for the one-shot mode. The last 15 patches are by Jimmy Assarsson and add hardware timestamp support for all devices covered by the kvaser_usb driver. * tag 'linux-can-next-for-6.12-20240806' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next: can: kvaser_usb: Rename kvaser_usb_{ethtool,netdev}_ops_hwts to kvaser_usb_{ethtool,netdev}_ops can: kvaser_usb: Remove struct variables kvaser_usb_{ethtool,netdev}_ops can: kvaser_usb: Remove KVASER_USB_QUIRK_HAS_HARDWARE_TIMESTAMP can: kvaser_usb: leaf: Add hardware timestamp support to usbcan devices can: kvaser_usb: leaf: Store MSB of timestamp can: kvaser_usb: leaf: Add structs for Tx ACK and clock overflow commands can: kvaser_usb: leaf: Add hardware timestamp support to leaf based devices can: kvaser_usb: leaf: kvaser_usb_leaf_tx_acknowledge: Rename local variable can: kvaser_usb: leaf: Replace kvaser_usb_leaf_m32c_dev_cfg with kvaser_usb_leaf_m32c_dev_cfg_{16,24,32}mhz can: kvaser_usb: leaf: Assign correct timestamp_freq for kvaser_usb_leaf_imx_dev_cfg_{16,24,32}mhz can: kvaser_usb: leaf: Add struct for Tx ACK commands can: kvaser_usb: hydra: Set hardware timestamp on transmitted packets can: kvaser_usb: hydra: Add struct for Tx ACK commands can: kvaser_usb: hydra: kvaser_usb_hydra_ktime_from_rx_cmd: Drop {rx_} in function name can: kvaser_usb: Add helper functions to convert device timestamp into ktime can: esd_402_pci: Add support for one-shot mode can: esd_402_pci: Rename esdACC CTRL register macros can: flexcan: add wakeup support for imx95 dt-bindings: can: fsl,flexcan: move fsl,imx95-flexcan standalone dt-bindings: can: fsl,flexcan: add common 'can-transceiver' for fsl,flexcan ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents acd221a + fa3c40b commit 2c14119

File tree

10 files changed

+256
-104
lines changed

10 files changed

+256
-104
lines changed

Documentation/devicetree/bindings/net/can/fsl,flexcan.yaml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ properties:
1717
compatible:
1818
oneOf:
1919
- enum:
20+
- fsl,imx95-flexcan
2021
- fsl,imx93-flexcan
2122
- fsl,imx8qm-flexcan
2223
- fsl,imx8mp-flexcan
@@ -38,9 +39,6 @@ properties:
3839
- fsl,imx6ul-flexcan
3940
- fsl,imx6sx-flexcan
4041
- const: fsl,imx6q-flexcan
41-
- items:
42-
- const: fsl,imx95-flexcan
43-
- const: fsl,imx93-flexcan
4442
- items:
4543
- enum:
4644
- fsl,ls1028ar1-flexcan
@@ -80,6 +78,10 @@ properties:
8078
node then controller is assumed to be little endian. If this property is
8179
present then controller is assumed to be big endian.
8280
81+
can-transceiver:
82+
$ref: can-transceiver.yaml#
83+
unevaluatedProperties: false
84+
8385
fsl,stop-mode:
8486
description: |
8587
Register bits of stop mode control.

drivers/net/can/esd/esd_402_pci-core.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,12 +369,13 @@ static int pci402_init_cores(struct pci_dev *pdev)
369369
SET_NETDEV_DEV(netdev, &pdev->dev);
370370

371371
priv = netdev_priv(netdev);
372+
priv->can.clock.freq = card->ov.core_frequency;
372373
priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
373374
CAN_CTRLMODE_LISTENONLY |
374375
CAN_CTRLMODE_BERR_REPORTING |
375376
CAN_CTRLMODE_CC_LEN8_DLC;
376-
377-
priv->can.clock.freq = card->ov.core_frequency;
377+
if (card->ov.features & ACC_OV_REG_FEAT_MASK_DAR)
378+
priv->can.ctrlmode_supported |= CAN_CTRLMODE_ONE_SHOT;
378379
if (card->ov.features & ACC_OV_REG_FEAT_MASK_CANFD)
379380
priv->can.bittiming_const = &pci402_bittiming_const_canfd;
380381
else

drivers/net/can/esd/esdacc.c

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
/* esdACC DLC register layout */
1818
#define ACC_DLC_DLC_MASK GENMASK(3, 0)
1919
#define ACC_DLC_RTR_FLAG BIT(4)
20+
#define ACC_DLC_SSTX_FLAG BIT(24) /* Single Shot TX */
21+
22+
/* esdACC DLC in struct acc_bmmsg_rxtxdone::acc_dlc.len only! */
2023
#define ACC_DLC_TXD_FLAG BIT(5)
2124

2225
/* ecc value of esdACC equals SJA1000's ECC register */
@@ -43,23 +46,23 @@
4346

4447
static void acc_resetmode_enter(struct acc_core *core)
4548
{
46-
acc_set_bits(core, ACC_CORE_OF_CTRL_MODE,
47-
ACC_REG_CONTROL_MASK_MODE_RESETMODE);
49+
acc_set_bits(core, ACC_CORE_OF_CTRL,
50+
ACC_REG_CTRL_MASK_RESETMODE);
4851

4952
/* Read back reset mode bit to flush PCI write posting */
5053
acc_resetmode_entered(core);
5154
}
5255

5356
static void acc_resetmode_leave(struct acc_core *core)
5457
{
55-
acc_clear_bits(core, ACC_CORE_OF_CTRL_MODE,
56-
ACC_REG_CONTROL_MASK_MODE_RESETMODE);
58+
acc_clear_bits(core, ACC_CORE_OF_CTRL,
59+
ACC_REG_CTRL_MASK_RESETMODE);
5760

5861
/* Read back reset mode bit to flush PCI write posting */
5962
acc_resetmode_entered(core);
6063
}
6164

62-
static void acc_txq_put(struct acc_core *core, u32 acc_id, u8 acc_dlc,
65+
static void acc_txq_put(struct acc_core *core, u32 acc_id, u32 acc_dlc,
6366
const void *data)
6467
{
6568
acc_write32_noswap(core, ACC_CORE_OF_TXFIFO_DATA_1,
@@ -172,7 +175,7 @@ int acc_open(struct net_device *netdev)
172175
struct acc_net_priv *priv = netdev_priv(netdev);
173176
struct acc_core *core = priv->core;
174177
u32 tx_fifo_status;
175-
u32 ctrl_mode;
178+
u32 ctrl;
176179
int err;
177180

178181
/* Retry to enter RESET mode if out of sync. */
@@ -187,19 +190,19 @@ int acc_open(struct net_device *netdev)
187190
if (err)
188191
return err;
189192

190-
ctrl_mode = ACC_REG_CONTROL_MASK_IE_RXTX |
191-
ACC_REG_CONTROL_MASK_IE_TXERROR |
192-
ACC_REG_CONTROL_MASK_IE_ERRWARN |
193-
ACC_REG_CONTROL_MASK_IE_OVERRUN |
194-
ACC_REG_CONTROL_MASK_IE_ERRPASS;
193+
ctrl = ACC_REG_CTRL_MASK_IE_RXTX |
194+
ACC_REG_CTRL_MASK_IE_TXERROR |
195+
ACC_REG_CTRL_MASK_IE_ERRWARN |
196+
ACC_REG_CTRL_MASK_IE_OVERRUN |
197+
ACC_REG_CTRL_MASK_IE_ERRPASS;
195198

196199
if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
197-
ctrl_mode |= ACC_REG_CONTROL_MASK_IE_BUSERR;
200+
ctrl |= ACC_REG_CTRL_MASK_IE_BUSERR;
198201

199202
if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
200-
ctrl_mode |= ACC_REG_CONTROL_MASK_MODE_LOM;
203+
ctrl |= ACC_REG_CTRL_MASK_LOM;
201204

202-
acc_set_bits(core, ACC_CORE_OF_CTRL_MODE, ctrl_mode);
205+
acc_set_bits(core, ACC_CORE_OF_CTRL, ctrl);
203206

204207
acc_resetmode_leave(core);
205208
priv->can.state = CAN_STATE_ERROR_ACTIVE;
@@ -218,13 +221,13 @@ int acc_close(struct net_device *netdev)
218221
struct acc_net_priv *priv = netdev_priv(netdev);
219222
struct acc_core *core = priv->core;
220223

221-
acc_clear_bits(core, ACC_CORE_OF_CTRL_MODE,
222-
ACC_REG_CONTROL_MASK_IE_RXTX |
223-
ACC_REG_CONTROL_MASK_IE_TXERROR |
224-
ACC_REG_CONTROL_MASK_IE_ERRWARN |
225-
ACC_REG_CONTROL_MASK_IE_OVERRUN |
226-
ACC_REG_CONTROL_MASK_IE_ERRPASS |
227-
ACC_REG_CONTROL_MASK_IE_BUSERR);
224+
acc_clear_bits(core, ACC_CORE_OF_CTRL,
225+
ACC_REG_CTRL_MASK_IE_RXTX |
226+
ACC_REG_CTRL_MASK_IE_TXERROR |
227+
ACC_REG_CTRL_MASK_IE_ERRWARN |
228+
ACC_REG_CTRL_MASK_IE_OVERRUN |
229+
ACC_REG_CTRL_MASK_IE_ERRPASS |
230+
ACC_REG_CTRL_MASK_IE_BUSERR);
228231

229232
netif_stop_queue(netdev);
230233
acc_resetmode_enter(core);
@@ -233,9 +236,9 @@ int acc_close(struct net_device *netdev)
233236
/* Mark pending TX requests to be aborted after controller restart. */
234237
acc_write32(core, ACC_CORE_OF_TX_ABORT_MASK, 0xffff);
235238

236-
/* ACC_REG_CONTROL_MASK_MODE_LOM is only accessible in RESET mode */
237-
acc_clear_bits(core, ACC_CORE_OF_CTRL_MODE,
238-
ACC_REG_CONTROL_MASK_MODE_LOM);
239+
/* ACC_REG_CTRL_MASK_LOM is only accessible in RESET mode */
240+
acc_clear_bits(core, ACC_CORE_OF_CTRL,
241+
ACC_REG_CTRL_MASK_LOM);
239242

240243
close_candev(netdev);
241244
return 0;
@@ -249,7 +252,7 @@ netdev_tx_t acc_start_xmit(struct sk_buff *skb, struct net_device *netdev)
249252
u8 tx_fifo_head = core->tx_fifo_head;
250253
int fifo_usage;
251254
u32 acc_id;
252-
u8 acc_dlc;
255+
u32 acc_dlc;
253256

254257
if (can_dropped_invalid_skb(netdev, skb))
255258
return NETDEV_TX_OK;
@@ -274,6 +277,8 @@ netdev_tx_t acc_start_xmit(struct sk_buff *skb, struct net_device *netdev)
274277
acc_dlc = can_get_cc_dlc(cf, priv->can.ctrlmode);
275278
if (cf->can_id & CAN_RTR_FLAG)
276279
acc_dlc |= ACC_DLC_RTR_FLAG;
280+
if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
281+
acc_dlc |= ACC_DLC_SSTX_FLAG;
277282

278283
if (cf->can_id & CAN_EFF_FLAG) {
279284
acc_id = cf->can_id & CAN_EFF_MASK;

drivers/net/can/esd/esdacc.h

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
*/
3636
#define ACC_OV_REG_FEAT_MASK_CANFD BIT(27 - 16)
3737
#define ACC_OV_REG_FEAT_MASK_NEW_PSC BIT(28 - 16)
38+
#define ACC_OV_REG_FEAT_MASK_DAR BIT(30 - 16)
3839

3940
#define ACC_OV_REG_MODE_MASK_ENDIAN_LITTLE BIT(0)
4041
#define ACC_OV_REG_MODE_MASK_BM_ENABLE BIT(1)
@@ -50,7 +51,7 @@
5051
#define ACC_OV_REG_MODE_MASK_FPGA_RESET BIT(31)
5152

5253
/* esdACC CAN Core Module */
53-
#define ACC_CORE_OF_CTRL_MODE 0x0000
54+
#define ACC_CORE_OF_CTRL 0x0000
5455
#define ACC_CORE_OF_STATUS_IRQ 0x0008
5556
#define ACC_CORE_OF_BRP 0x000c
5657
#define ACC_CORE_OF_BTR 0x0010
@@ -66,21 +67,22 @@
6667
#define ACC_CORE_OF_TXFIFO_DATA_0 0x00c8
6768
#define ACC_CORE_OF_TXFIFO_DATA_1 0x00cc
6869

69-
#define ACC_REG_CONTROL_MASK_MODE_RESETMODE BIT(0)
70-
#define ACC_REG_CONTROL_MASK_MODE_LOM BIT(1)
71-
#define ACC_REG_CONTROL_MASK_MODE_STM BIT(2)
72-
#define ACC_REG_CONTROL_MASK_MODE_TRANSEN BIT(5)
73-
#define ACC_REG_CONTROL_MASK_MODE_TS BIT(6)
74-
#define ACC_REG_CONTROL_MASK_MODE_SCHEDULE BIT(7)
75-
76-
#define ACC_REG_CONTROL_MASK_IE_RXTX BIT(8)
77-
#define ACC_REG_CONTROL_MASK_IE_TXERROR BIT(9)
78-
#define ACC_REG_CONTROL_MASK_IE_ERRWARN BIT(10)
79-
#define ACC_REG_CONTROL_MASK_IE_OVERRUN BIT(11)
80-
#define ACC_REG_CONTROL_MASK_IE_TSI BIT(12)
81-
#define ACC_REG_CONTROL_MASK_IE_ERRPASS BIT(13)
82-
#define ACC_REG_CONTROL_MASK_IE_ALI BIT(14)
83-
#define ACC_REG_CONTROL_MASK_IE_BUSERR BIT(15)
70+
/* CTRL register layout */
71+
#define ACC_REG_CTRL_MASK_RESETMODE BIT(0)
72+
#define ACC_REG_CTRL_MASK_LOM BIT(1)
73+
#define ACC_REG_CTRL_MASK_STM BIT(2)
74+
#define ACC_REG_CTRL_MASK_TRANSEN BIT(5)
75+
#define ACC_REG_CTRL_MASK_TS BIT(6)
76+
#define ACC_REG_CTRL_MASK_SCHEDULE BIT(7)
77+
78+
#define ACC_REG_CTRL_MASK_IE_RXTX BIT(8)
79+
#define ACC_REG_CTRL_MASK_IE_TXERROR BIT(9)
80+
#define ACC_REG_CTRL_MASK_IE_ERRWARN BIT(10)
81+
#define ACC_REG_CTRL_MASK_IE_OVERRUN BIT(11)
82+
#define ACC_REG_CTRL_MASK_IE_TSI BIT(12)
83+
#define ACC_REG_CTRL_MASK_IE_ERRPASS BIT(13)
84+
#define ACC_REG_CTRL_MASK_IE_ALI BIT(14)
85+
#define ACC_REG_CTRL_MASK_IE_BUSERR BIT(15)
8486

8587
/* BRP and BTR register layout for CAN-Classic version */
8688
#define ACC_REG_BRP_CL_MASK_BRP GENMASK(8, 0)
@@ -300,9 +302,9 @@ static inline void acc_clear_bits(struct acc_core *core,
300302

301303
static inline int acc_resetmode_entered(struct acc_core *core)
302304
{
303-
u32 ctrl = acc_read32(core, ACC_CORE_OF_CTRL_MODE);
305+
u32 ctrl = acc_read32(core, ACC_CORE_OF_CTRL);
304306

305-
return (ctrl & ACC_REG_CONTROL_MASK_MODE_RESETMODE) != 0;
307+
return (ctrl & ACC_REG_CTRL_MASK_RESETMODE) != 0;
306308
}
307309

308310
static inline u32 acc_ov_read32(struct acc_ov *ov, unsigned short offs)

drivers/net/can/flexcan/flexcan-core.c

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,14 @@ static struct flexcan_devtype_data fsl_imx93_devtype_data = {
354354
FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX_RTR,
355355
};
356356

357+
static const struct flexcan_devtype_data fsl_imx95_devtype_data = {
358+
.quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS |
359+
FLEXCAN_QUIRK_DISABLE_MECR | FLEXCAN_QUIRK_USE_RX_MAILBOX |
360+
FLEXCAN_QUIRK_BROKEN_PERR_STATE | FLEXCAN_QUIRK_SUPPORT_FD |
361+
FLEXCAN_QUIRK_SUPPORT_ECC | FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX |
362+
FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX_RTR | FLEXCAN_QUIRK_SETUP_STOP_MODE_SCMI,
363+
};
364+
357365
static const struct flexcan_devtype_data fsl_vf610_devtype_data = {
358366
.quirks = FLEXCAN_QUIRK_DISABLE_RXFG | FLEXCAN_QUIRK_ENABLE_EACEN_RRS |
359367
FLEXCAN_QUIRK_DISABLE_MECR | FLEXCAN_QUIRK_USE_RX_MAILBOX |
@@ -544,6 +552,13 @@ static inline int flexcan_enter_stop_mode(struct flexcan_priv *priv)
544552
} else if (priv->devtype_data.quirks & FLEXCAN_QUIRK_SETUP_STOP_MODE_GPR) {
545553
regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr,
546554
1 << priv->stm.req_bit, 1 << priv->stm.req_bit);
555+
} else if (priv->devtype_data.quirks & FLEXCAN_QUIRK_SETUP_STOP_MODE_SCMI) {
556+
/* For the SCMI mode, driver do nothing, ATF will send request to
557+
* SM(system manager, M33 core) through SCMI protocol after linux
558+
* suspend. Once SM get this request, it will send IPG_STOP signal
559+
* to Flex_CAN, let CAN in STOP mode.
560+
*/
561+
return 0;
547562
}
548563

549564
return flexcan_low_power_enter_ack(priv);
@@ -555,7 +570,11 @@ static inline int flexcan_exit_stop_mode(struct flexcan_priv *priv)
555570
u32 reg_mcr;
556571
int ret;
557572

558-
/* remove stop request */
573+
/* Remove stop request, for FLEXCAN_QUIRK_SETUP_STOP_MODE_SCMI,
574+
* do nothing here, because ATF already send request to SM before
575+
* linux resume. Once SM get this request, it will deassert the
576+
* IPG_STOP signal to Flex_CAN.
577+
*/
559578
if (priv->devtype_data.quirks & FLEXCAN_QUIRK_SETUP_STOP_MODE_SCFW) {
560579
ret = flexcan_stop_mode_enable_scfw(priv, false);
561580
if (ret < 0)
@@ -1983,6 +2002,9 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev)
19832002
ret = flexcan_setup_stop_mode_scfw(pdev);
19842003
else if (priv->devtype_data.quirks & FLEXCAN_QUIRK_SETUP_STOP_MODE_GPR)
19852004
ret = flexcan_setup_stop_mode_gpr(pdev);
2005+
else if (priv->devtype_data.quirks & FLEXCAN_QUIRK_SETUP_STOP_MODE_SCMI)
2006+
/* ATF will handle all STOP_IPG related work */
2007+
ret = 0;
19862008
else
19872009
/* return 0 directly if doesn't support stop mode feature */
19882010
return 0;
@@ -2009,6 +2031,7 @@ static const struct of_device_id flexcan_of_match[] = {
20092031
{ .compatible = "fsl,imx8qm-flexcan", .data = &fsl_imx8qm_devtype_data, },
20102032
{ .compatible = "fsl,imx8mp-flexcan", .data = &fsl_imx8mp_devtype_data, },
20112033
{ .compatible = "fsl,imx93-flexcan", .data = &fsl_imx93_devtype_data, },
2034+
{ .compatible = "fsl,imx95-flexcan", .data = &fsl_imx95_devtype_data, },
20122035
{ .compatible = "fsl,imx6q-flexcan", .data = &fsl_imx6q_devtype_data, },
20132036
{ .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, },
20142037
{ .compatible = "fsl,imx53-flexcan", .data = &fsl_imx25_devtype_data, },
@@ -2309,9 +2332,19 @@ static int __maybe_unused flexcan_noirq_suspend(struct device *device)
23092332
if (device_may_wakeup(device))
23102333
flexcan_enable_wakeup_irq(priv, true);
23112334

2312-
err = pm_runtime_force_suspend(device);
2313-
if (err)
2314-
return err;
2335+
/* For FLEXCAN_QUIRK_SETUP_STOP_MODE_SCMI, it need ATF to send
2336+
* to SM through SCMI protocol, SM will assert the IPG_STOP
2337+
* signal. But all this works need the CAN clocks keep on.
2338+
* After the CAN module get the IPG_STOP mode, and switch to
2339+
* STOP mode, whether still keep the CAN clocks on or gate them
2340+
* off depend on the Hardware design.
2341+
*/
2342+
if (!(device_may_wakeup(device) &&
2343+
priv->devtype_data.quirks & FLEXCAN_QUIRK_SETUP_STOP_MODE_SCMI)) {
2344+
err = pm_runtime_force_suspend(device);
2345+
if (err)
2346+
return err;
2347+
}
23152348
}
23162349

23172350
return 0;
@@ -2325,9 +2358,12 @@ static int __maybe_unused flexcan_noirq_resume(struct device *device)
23252358
if (netif_running(dev)) {
23262359
int err;
23272360

2328-
err = pm_runtime_force_resume(device);
2329-
if (err)
2330-
return err;
2361+
if (!(device_may_wakeup(device) &&
2362+
priv->devtype_data.quirks & FLEXCAN_QUIRK_SETUP_STOP_MODE_SCMI)) {
2363+
err = pm_runtime_force_resume(device);
2364+
if (err)
2365+
return err;
2366+
}
23312367

23322368
if (device_may_wakeup(device))
23332369
flexcan_enable_wakeup_irq(priv, false);

drivers/net/can/flexcan/flexcan.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@
6868
#define FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX_RTR BIT(15)
6969
/* Device supports RX via FIFO */
7070
#define FLEXCAN_QUIRK_SUPPORT_RX_FIFO BIT(16)
71+
/* Setup stop mode with ATF SCMI protocol to support wakeup */
72+
#define FLEXCAN_QUIRK_SETUP_STOP_MODE_SCMI BIT(17)
7173

7274
struct flexcan_devtype_data {
7375
u32 quirks; /* quirks needed for different IP cores */

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

Lines changed: 25 additions & 1 deletion
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>
@@ -39,7 +41,6 @@
3941
#define KVASER_USB_QUIRK_HAS_SILENT_MODE BIT(0)
4042
#define KVASER_USB_QUIRK_HAS_TXRX_ERRORS BIT(1)
4143
#define KVASER_USB_QUIRK_IGNORE_CLK_FREQ BIT(2)
42-
#define KVASER_USB_QUIRK_HAS_HARDWARE_TIMESTAMP BIT(3)
4344

4445
/* Device capabilities */
4546
#define KVASER_USB_CAP_BERR_CAP 0x01
@@ -68,6 +69,7 @@ struct kvaser_usb_dev_card_data {
6869
u32 ctrlmode_supported;
6970
u32 capabilities;
7071
struct kvaser_usb_dev_card_data_hydra hydra;
72+
u32 usbcan_timestamp_msb;
7173
};
7274

7375
/* Context for an outstanding, not yet ACKed, transmission */
@@ -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 */

0 commit comments

Comments
 (0)