Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

can: xilinx: add can 2.0 support

Add support for can 2.0.

Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>

authored by

Shubhrajyoti Datta and committed by
Marc Kleine-Budde
0db90713 c5435adc

+33 -1
+33 -1
drivers/net/can/xilinx_can.c
··· 63 63 XCAN_FSR_OFFSET = 0x00E8, /* RX FIFO Status */ 64 64 XCAN_TXMSG_BASE_OFFSET = 0x0100, /* TX Message Space */ 65 65 XCAN_RXMSG_BASE_OFFSET = 0x1100, /* RX Message Space */ 66 + XCAN_RXMSG_2_BASE_OFFSET = 0x2100, /* RX Message Space */ 66 67 }; 67 68 68 69 #define XCAN_FRAME_ID_OFFSET(frame_base) ((frame_base) + 0x00) ··· 75 74 #define XCAN_TXMSG_FRAME_OFFSET(n) (XCAN_TXMSG_BASE_OFFSET + \ 76 75 XCAN_CANFD_FRAME_SIZE * (n)) 77 76 #define XCAN_RXMSG_FRAME_OFFSET(n) (XCAN_RXMSG_BASE_OFFSET + \ 77 + XCAN_CANFD_FRAME_SIZE * (n)) 78 + #define XCAN_RXMSG_2_FRAME_OFFSET(n) (XCAN_RXMSG_2_BASE_OFFSET + \ 78 79 XCAN_CANFD_FRAME_SIZE * (n)) 79 80 80 81 /* the single TX mailbox used by this driver on CAN FD HW */ ··· 155 152 * instead of the regular FIFO at 0x50 156 153 */ 157 154 #define XCAN_FLAG_RX_FIFO_MULTI 0x0010 155 + #define XCAN_FLAG_CANFD_2 0x0020 158 156 159 157 struct xcan_devtype_data { 160 158 unsigned int flags; ··· 220 216 .tseg2_min = 1, 221 217 .tseg2_max = 16, 222 218 .sjw_max = 16, 219 + .brp_min = 1, 220 + .brp_max = 256, 221 + .brp_inc = 1, 222 + }; 223 + 224 + static const struct can_bittiming_const xcan_bittiming_const_canfd2 = { 225 + .name = DRIVER_NAME, 226 + .tseg1_min = 1, 227 + .tseg1_max = 256, 228 + .tseg2_min = 1, 229 + .tseg2_max = 128, 230 + .sjw_max = 128, 223 231 .brp_min = 1, 224 232 .brp_max = 256, 225 233 .brp_inc = 1, ··· 989 973 if (!(fsr & XCAN_FSR_FL_MASK)) 990 974 return -ENOENT; 991 975 992 - offset = XCAN_RXMSG_FRAME_OFFSET(fsr & XCAN_FSR_RI_MASK); 976 + if (priv->devtype.flags & XCAN_FLAG_CANFD_2) 977 + offset = XCAN_RXMSG_2_FRAME_OFFSET(fsr & XCAN_FSR_RI_MASK); 978 + else 979 + offset = XCAN_RXMSG_FRAME_OFFSET(fsr & XCAN_FSR_RI_MASK); 993 980 994 981 } else { 995 982 /* check if RX FIFO is empty */ ··· 1449 1430 .bus_clk_name = "s_axi_aclk", 1450 1431 }; 1451 1432 1433 + static const struct xcan_devtype_data xcan_canfd2_data = { 1434 + .flags = XCAN_FLAG_EXT_FILTERS | 1435 + XCAN_FLAG_RXMNF | 1436 + XCAN_FLAG_TX_MAILBOXES | 1437 + XCAN_FLAG_CANFD_2 | 1438 + XCAN_FLAG_RX_FIFO_MULTI, 1439 + .bittiming_const = &xcan_bittiming_const_canfd2, 1440 + .btr_ts2_shift = XCAN_BTR_TS2_SHIFT_CANFD, 1441 + .btr_sjw_shift = XCAN_BTR_SJW_SHIFT_CANFD, 1442 + .bus_clk_name = "s_axi_aclk", 1443 + }; 1444 + 1452 1445 /* Match table for OF platform binding */ 1453 1446 static const struct of_device_id xcan_of_match[] = { 1454 1447 { .compatible = "xlnx,zynq-can-1.0", .data = &xcan_zynq_data }, 1455 1448 { .compatible = "xlnx,axi-can-1.00.a", .data = &xcan_axi_data }, 1456 1449 { .compatible = "xlnx,canfd-1.0", .data = &xcan_canfd_data }, 1450 + { .compatible = "xlnx,canfd-2.0", .data = &xcan_canfd2_data }, 1457 1451 { /* end of list */ }, 1458 1452 }; 1459 1453 MODULE_DEVICE_TABLE(of, xcan_of_match);