@@ -37,17 +37,19 @@ enum m_can_reg {
3737 M_CAN_CREL = 0x0 ,
3838 M_CAN_ENDN = 0x4 ,
3939 M_CAN_CUST = 0x8 ,
40- M_CAN_FBTP = 0xc ,
40+ M_CAN_DBTP = 0xc ,
4141 M_CAN_TEST = 0x10 ,
4242 M_CAN_RWD = 0x14 ,
4343 M_CAN_CCCR = 0x18 ,
44- M_CAN_BTP = 0x1c ,
44+ M_CAN_NBTP = 0x1c ,
4545 M_CAN_TSCC = 0x20 ,
4646 M_CAN_TSCV = 0x24 ,
4747 M_CAN_TOCC = 0x28 ,
4848 M_CAN_TOCV = 0x2c ,
4949 M_CAN_ECR = 0x40 ,
5050 M_CAN_PSR = 0x44 ,
51+ /* TDCR Register only available for version >=3.1.x */
52+ M_CAN_TDCR = 0x48 ,
5153 M_CAN_IR = 0x50 ,
5254 M_CAN_IE = 0x54 ,
5355 M_CAN_ILS = 0x58 ,
@@ -105,21 +107,21 @@ enum m_can_mram_cfg {
105107 MRAM_CFG_NUM ,
106108};
107109
108- /* Fast Bit Timing & Prescaler Register (FBTP) */
109- #define FBTR_FBRP_MASK 0x1f
110- #define FBTR_FBRP_SHIFT 16
111- #define FBTR_FTSEG1_SHIFT 8
112- #define FBTR_FTSEG1_MASK (0xf << FBTR_FTSEG1_SHIFT)
113- #define FBTR_FTSEG2_SHIFT 4
114- #define FBTR_FTSEG2_MASK (0x7 << FBTR_FTSEG2_SHIFT)
115- #define FBTR_FSJW_SHIFT 0
116- #define FBTR_FSJW_MASK 0x3
110+ /* Data Bit Timing & Prescaler Register (DBTP) */
111+ #define DBTP_TDC BIT(23)
112+ #define DBTP_DBRP_SHIFT 16
113+ #define DBTP_DBRP_MASK (0x1f << DBTP_DBRP_SHIFT)
114+ #define DBTP_DTSEG1_SHIFT 8
115+ #define DBTP_DTSEG1_MASK (0x1f << DBTP_DTSEG1_SHIFT)
116+ #define DBTP_DTSEG2_SHIFT 4
117+ #define DBTP_DTSEG2_MASK (0xf << DBTP_DTSEG2_SHIFT)
118+ #define DBTP_DSJW_SHIFT 0
119+ #define DBTP_DSJW_MASK (0xf << DBTP_DSJW_SHIFT)
117120
118121/* Test Register (TEST) */
119- #define TEST_LBCK BIT(4)
122+ #define TEST_LBCK BIT(4)
120123
121124/* CC Control Register(CCCR) */
122- #define CCCR_TEST BIT(7)
123125#define CCCR_CMR_MASK 0x3
124126#define CCCR_CMR_SHIFT 10
125127#define CCCR_CMR_CANFD 0x1
@@ -130,21 +132,32 @@ enum m_can_mram_cfg {
130132#define CCCR_CME_CAN 0
131133#define CCCR_CME_CANFD 0x1
132134#define CCCR_CME_CANFD_BRS 0x2
135+ #define CCCR_TXP BIT(14)
133136#define CCCR_TEST BIT(7)
134137#define CCCR_MON BIT(5)
138+ #define CCCR_CSR BIT(4)
139+ #define CCCR_CSA BIT(3)
140+ #define CCCR_ASM BIT(2)
135141#define CCCR_CCE BIT(1)
136142#define CCCR_INIT BIT(0)
137143#define CCCR_CANFD 0x10
138-
139- /* Bit Timing & Prescaler Register (BTP) */
140- #define BTR_BRP_MASK 0x3ff
141- #define BTR_BRP_SHIFT 16
142- #define BTR_TSEG1_SHIFT 8
143- #define BTR_TSEG1_MASK (0x3f << BTR_TSEG1_SHIFT)
144- #define BTR_TSEG2_SHIFT 4
145- #define BTR_TSEG2_MASK (0xf << BTR_TSEG2_SHIFT)
146- #define BTR_SJW_SHIFT 0
147- #define BTR_SJW_MASK 0xf
144+ /* for version >=3.1.x */
145+ #define CCCR_EFBI BIT(13)
146+ #define CCCR_PXHD BIT(12)
147+ #define CCCR_BRSE BIT(9)
148+ #define CCCR_FDOE BIT(8)
149+ /* only for version >=3.2.x */
150+ #define CCCR_NISO BIT(15)
151+
152+ /* Nominal Bit Timing & Prescaler Register (NBTP) */
153+ #define NBTP_NSJW_SHIFT 25
154+ #define NBTP_NSJW_MASK (0x7f << NBTP_NSJW_SHIFT)
155+ #define NBTP_NBRP_SHIFT 16
156+ #define NBTP_NBRP_MASK (0x1ff << NBTP_NBRP_SHIFT)
157+ #define NBTP_NTSEG1_SHIFT 8
158+ #define NBTP_NTSEG1_MASK (0xff << NBTP_NTSEG1_SHIFT)
159+ #define NBTP_NTSEG2_SHIFT 0
160+ #define NBTP_NTSEG2_MASK (0x7f << NBTP_NTSEG2_SHIFT)
148161
149162/* Error Counter Register(ECR) */
150163#define ECR_RP BIT(15)
@@ -161,6 +174,13 @@ enum m_can_mram_cfg {
161174
162175/* Interrupt Register(IR) */
163176#define IR_ALL_INT 0xffffffff
177+
178+ /* Renamed bits for versions > 3.1.x */
179+ #define IR_ARA BIT(29)
180+ #define IR_PED BIT(28)
181+ #define IR_PEA BIT(27)
182+
183+ /* Bits for version 3.0.x */
164184#define IR_STE BIT(31)
165185#define IR_FOE BIT(30)
166186#define IR_ACKE BIT(29)
@@ -194,33 +214,40 @@ enum m_can_mram_cfg {
194214#define IR_RF0W BIT(1)
195215#define IR_RF0N BIT(0)
196216#define IR_ERR_STATE (IR_BO | IR_EW | IR_EP)
197- #define IR_ERR_LEC (IR_STE | IR_FOE | IR_ACKE | IR_BE | IR_CRCE)
198- #define IR_ERR_BUS (IR_ERR_LEC | IR_WDI | IR_ELO | IR_BEU | \
217+
218+ /* Interrupts for version 3.0.x */
219+ #define IR_ERR_LEC_30X (IR_STE | IR_FOE | IR_ACKE | IR_BE | IR_CRCE)
220+ #define IR_ERR_BUS_30X (IR_ERR_LEC_30X | IR_WDI | IR_ELO | IR_BEU | \
221+ IR_BEC | IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | \
222+ IR_RF1L | IR_RF0L)
223+ #define IR_ERR_ALL_30X (IR_ERR_STATE | IR_ERR_BUS_30X)
224+ /* Interrupts for version >= 3.1.x */
225+ #define IR_ERR_LEC_31X (IR_PED | IR_PEA)
226+ #define IR_ERR_BUS_31X (IR_ERR_LEC_31X | IR_WDI | IR_ELO | IR_BEU | \
199227 IR_BEC | IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | \
200228 IR_RF1L | IR_RF0L)
201- #define IR_ERR_ALL (IR_ERR_STATE | IR_ERR_BUS )
229+ #define IR_ERR_ALL_31X (IR_ERR_STATE | IR_ERR_BUS_31X )
202230
203231/* Interrupt Line Select (ILS) */
204232#define ILS_ALL_INT0 0x0
205233#define ILS_ALL_INT1 0xFFFFFFFF
206234
207235/* Interrupt Line Enable (ILE) */
208- #define ILE_EINT0 BIT(0)
209236#define ILE_EINT1 BIT(1)
237+ #define ILE_EINT0 BIT(0)
210238
211239/* Rx FIFO 0/1 Configuration (RXF0C/RXF1C) */
212- #define RXFC_FWM_OFF 24
213- #define RXFC_FWM_MASK 0x7f
214- #define RXFC_FWM_1 (1 << RXFC_FWM_OFF)
215- #define RXFC_FS_OFF 16
216- #define RXFC_FS_MASK 0x7f
240+ #define RXFC_FWM_SHIFT 24
241+ #define RXFC_FWM_MASK (0x7f < RXFC_FWM_SHIFT)
242+ #define RXFC_FS_SHIFT 16
243+ #define RXFC_FS_MASK (0x7f << RXFC_FS_SHIFT)
217244
218245/* Rx FIFO 0/1 Status (RXF0S/RXF1S) */
219246#define RXFS_RFL BIT(25)
220247#define RXFS_FF BIT(24)
221- #define RXFS_FPI_OFF 16
248+ #define RXFS_FPI_SHIFT 16
222249#define RXFS_FPI_MASK 0x3f0000
223- #define RXFS_FGI_OFF 8
250+ #define RXFS_FGI_SHIFT 8
224251#define RXFS_FGI_MASK 0x3f00
225252#define RXFS_FFL_MASK 0x7f
226253
@@ -229,23 +256,46 @@ enum m_can_mram_cfg {
229256#define M_CAN_RXESC_64BYTES 0x777
230257
231258/* Tx Buffer Configuration(TXBC) */
232- #define TXBC_NDTB_OFF 16
233- #define TXBC_NDTB_MASK 0x3f
259+ #define TXBC_NDTB_SHIFT 16
260+ #define TXBC_NDTB_MASK (0x3f << TXBC_NDTB_SHIFT)
261+ #define TXBC_TFQS_SHIFT 24
262+ #define TXBC_TFQS_MASK (0x3f << TXBC_TFQS_SHIFT)
263+
264+ /* Tx FIFO/Queue Status (TXFQS) */
265+ #define TXFQS_TFQF BIT(21)
266+ #define TXFQS_TFQPI_SHIFT 16
267+ #define TXFQS_TFQPI_MASK (0x1f << TXFQS_TFQPI_SHIFT)
268+ #define TXFQS_TFGI_SHIFT 8
269+ #define TXFQS_TFGI_MASK (0x1f << TXFQS_TFGI_SHIFT)
270+ #define TXFQS_TFFL_SHIFT 0
271+ #define TXFQS_TFFL_MASK (0x3f << TXFQS_TFFL_SHIFT)
234272
235273/* Tx Buffer Element Size Configuration(TXESC) */
236274#define TXESC_TBDS_8BYTES 0x0
237275#define TXESC_TBDS_64BYTES 0x7
238276
239- /* Tx Event FIFO Con.guration (TXEFC) */
240- #define TXEFC_EFS_OFF 16
241- #define TXEFC_EFS_MASK 0x3f
277+ /* Tx Event FIFO Configuration (TXEFC) */
278+ #define TXEFC_EFS_SHIFT 16
279+ #define TXEFC_EFS_MASK (0x3f << TXEFC_EFS_SHIFT)
280+
281+ /* Tx Event FIFO Status (TXEFS) */
282+ #define TXEFS_TEFL BIT(25)
283+ #define TXEFS_EFF BIT(24)
284+ #define TXEFS_EFGI_SHIFT 8
285+ #define TXEFS_EFGI_MASK (0x1f << TXEFS_EFGI_SHIFT)
286+ #define TXEFS_EFFL_SHIFT 0
287+ #define TXEFS_EFFL_MASK (0x3f << TXEFS_EFFL_SHIFT)
288+
289+ /* Tx Event FIFO Acknowledge (TXEFA) */
290+ #define TXEFA_EFAI_SHIFT 0
291+ #define TXEFA_EFAI_MASK (0x1f << TXEFA_EFAI_SHIFT)
242292
243293/* Message RAM Configuration (in bytes) */
244294#define SIDF_ELEMENT_SIZE 4
245295#define XIDF_ELEMENT_SIZE 8
246296#define RXF0_ELEMENT_SIZE 72
247297#define RXF1_ELEMENT_SIZE 72
248- #define RXB_ELEMENT_SIZE 16
298+ #define RXB_ELEMENT_SIZE 72
249299#define TXE_ELEMENT_SIZE 8
250300#define TXB_ELEMENT_SIZE 72
251301
@@ -261,13 +311,20 @@ enum m_can_mram_cfg {
261311#define RX_BUF_RTR BIT(29)
262312/* R1 */
263313#define RX_BUF_ANMF BIT(31)
264- #define RX_BUF_EDL BIT(21)
314+ #define RX_BUF_FDF BIT(21)
265315#define RX_BUF_BRS BIT(20)
266316
267317/* Tx Buffer Element */
268- /* R0 */
318+ /* T0 */
319+ #define TX_BUF_ESI BIT(31)
269320#define TX_BUF_XTD BIT(30)
270321#define TX_BUF_RTR BIT(29)
322+ /* T1 */
323+ #define TX_BUF_EFC BIT(23)
324+ #define TX_BUF_FDF BIT(21)
325+ #define TX_BUF_BRS BIT(20)
326+ #define TX_BUF_MM_SHIFT 24
327+ #define TX_BUF_MM_MASK (0xff << TX_BUF_MM_SHIFT)
271328
272329/* address offset and element number for each FIFO/Buffer in the Message RAM */
273330struct mram_cfg {
@@ -368,9 +425,9 @@ static void m_can_read_fifo(struct net_device *dev, u32 rxfs)
368425 int i ;
369426
370427 /* calculate the fifo get index for where to read data */
371- fgi = (rxfs & RXFS_FGI_MASK ) >> RXFS_FGI_OFF ;
428+ fgi = (rxfs & RXFS_FGI_MASK ) >> RXFS_FGI_SHIFT ;
372429 dlc = m_can_fifo_read (priv , fgi , M_CAN_FIFO_DLC );
373- if (dlc & RX_BUF_EDL )
430+ if (dlc & RX_BUF_FDF )
374431 skb = alloc_canfd_skb (dev , & cf );
375432 else
376433 skb = alloc_can_skb (dev , (struct can_frame * * )& cf );
@@ -379,7 +436,7 @@ static void m_can_read_fifo(struct net_device *dev, u32 rxfs)
379436 return ;
380437 }
381438
382- if (dlc & RX_BUF_EDL )
439+ if (dlc & RX_BUF_FDF )
383440 cf -> len = can_dlc2len ((dlc >> 16 ) & 0x0F );
384441 else
385442 cf -> len = get_can_dlc ((dlc >> 16 ) & 0x0F );
@@ -395,7 +452,7 @@ static void m_can_read_fifo(struct net_device *dev, u32 rxfs)
395452 netdev_dbg (dev , "ESI Error\n" );
396453 }
397454
398- if (!(dlc & RX_BUF_EDL ) && (id & RX_BUF_RTR )) {
455+ if (!(dlc & RX_BUF_FDF ) && (id & RX_BUF_RTR )) {
399456 cf -> can_id |= CAN_RTR_FLAG ;
400457 } else {
401458 if (dlc & RX_BUF_BRS )
@@ -533,7 +590,7 @@ static int __m_can_get_berr_counter(const struct net_device *dev,
533590
534591 ecr = m_can_read (priv , M_CAN_ECR );
535592 bec -> rxerr = (ecr & ECR_REC_MASK ) >> ECR_REC_SHIFT ;
536- bec -> txerr = ecr & ECR_TEC_MASK ;
593+ bec -> txerr = ( ecr & ECR_TEC_MASK ) >> ECR_TEC_SHIFT ;
537594
538595 return 0 ;
539596}
@@ -724,7 +781,7 @@ static int m_can_poll(struct napi_struct *napi, int quota)
724781 if (irqstatus & IR_ERR_STATE )
725782 work_done += m_can_handle_state_errors (dev , psr );
726783
727- if (irqstatus & IR_ERR_BUS )
784+ if (irqstatus & IR_ERR_BUS_30X )
728785 work_done += m_can_handle_bus_errors (dev , irqstatus , psr );
729786
730787 if (irqstatus & IR_RF0N )
@@ -759,7 +816,7 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
759816 * - state change IRQ
760817 * - bus error IRQ and bus error reporting
761818 */
762- if ((ir & IR_RF0N ) || (ir & IR_ERR_ALL )) {
819+ if ((ir & IR_RF0N ) || (ir & IR_ERR_ALL_30X )) {
763820 priv -> irqstatus = ir ;
764821 m_can_disable_all_interrupts (priv );
765822 napi_schedule (& priv -> napi );
@@ -812,19 +869,19 @@ static int m_can_set_bittiming(struct net_device *dev)
812869 sjw = bt -> sjw - 1 ;
813870 tseg1 = bt -> prop_seg + bt -> phase_seg1 - 1 ;
814871 tseg2 = bt -> phase_seg2 - 1 ;
815- reg_btp = (brp << BTR_BRP_SHIFT ) | (sjw << BTR_SJW_SHIFT ) |
816- (tseg1 << BTR_TSEG1_SHIFT ) | (tseg2 << BTR_TSEG2_SHIFT );
817- m_can_write (priv , M_CAN_BTP , reg_btp );
872+ reg_btp = (brp << NBTP_NBRP_SHIFT ) | (sjw << NBTP_NSJW_SHIFT ) |
873+ (tseg1 << NBTP_NTSEG1_SHIFT ) | (tseg2 << NBTP_NTSEG2_SHIFT );
874+ m_can_write (priv , M_CAN_NBTP , reg_btp );
818875
819876 if (priv -> can .ctrlmode & CAN_CTRLMODE_FD ) {
820877 brp = dbt -> brp - 1 ;
821878 sjw = dbt -> sjw - 1 ;
822879 tseg1 = dbt -> prop_seg + dbt -> phase_seg1 - 1 ;
823880 tseg2 = dbt -> phase_seg2 - 1 ;
824- reg_btp = (brp << FBTR_FBRP_SHIFT ) | (sjw << FBTR_FSJW_SHIFT ) |
825- (tseg1 << FBTR_FTSEG1_SHIFT ) |
826- (tseg2 << FBTR_FTSEG2_SHIFT );
827- m_can_write (priv , M_CAN_FBTP , reg_btp );
881+ reg_btp = (brp << DBTP_DBRP_SHIFT ) | (sjw << DBTP_DSJW_SHIFT ) |
882+ (tseg1 << DBTP_DTSEG1_SHIFT ) |
883+ (tseg2 << DBTP_DTSEG2_SHIFT );
884+ m_can_write (priv , M_CAN_DBTP , reg_btp );
828885 }
829886
830887 return 0 ;
@@ -852,22 +909,22 @@ static void m_can_chip_config(struct net_device *dev)
852909 m_can_write (priv , M_CAN_GFC , 0x0 );
853910
854911 /* only support one Tx Buffer currently */
855- m_can_write (priv , M_CAN_TXBC , (1 << TXBC_NDTB_OFF ) |
912+ m_can_write (priv , M_CAN_TXBC , (1 << TXBC_NDTB_SHIFT ) |
856913 priv -> mcfg [MRAM_TXB ].off );
857914
858915 /* support 64 bytes payload */
859916 m_can_write (priv , M_CAN_TXESC , TXESC_TBDS_64BYTES );
860917
861- m_can_write (priv , M_CAN_TXEFC , (1 << TXEFC_EFS_OFF ) |
918+ m_can_write (priv , M_CAN_TXEFC , (1 << TXEFC_EFS_SHIFT ) |
862919 priv -> mcfg [MRAM_TXE ].off );
863920
864921 /* rx fifo configuration, blocking mode, fifo size 1 */
865922 m_can_write (priv , M_CAN_RXF0C ,
866- (priv -> mcfg [MRAM_RXF0 ].num << RXFC_FS_OFF ) |
923+ (priv -> mcfg [MRAM_RXF0 ].num << RXFC_FS_SHIFT ) |
867924 priv -> mcfg [MRAM_RXF0 ].off );
868925
869926 m_can_write (priv , M_CAN_RXF1C ,
870- (priv -> mcfg [MRAM_RXF1 ].num << RXFC_FS_OFF ) |
927+ (priv -> mcfg [MRAM_RXF1 ].num << RXFC_FS_SHIFT ) |
871928 priv -> mcfg [MRAM_RXF1 ].off );
872929
873930 cccr = m_can_read (priv , M_CAN_CCCR );
@@ -893,7 +950,7 @@ static void m_can_chip_config(struct net_device *dev)
893950 /* enable interrupts */
894951 m_can_write (priv , M_CAN_IR , IR_ALL_INT );
895952 if (!(priv -> can .ctrlmode & CAN_CTRLMODE_BERR_REPORTING ))
896- m_can_write (priv , M_CAN_IE , IR_ALL_INT & ~IR_ERR_LEC );
953+ m_can_write (priv , M_CAN_IE , IR_ALL_INT & ~IR_ERR_LEC_30X );
897954 else
898955 m_can_write (priv , M_CAN_IE , IR_ALL_INT );
899956
@@ -1144,10 +1201,12 @@ static int m_can_of_parse_mram(struct platform_device *pdev,
11441201 priv -> mcfg [MRAM_XIDF ].num = out_val [2 ];
11451202 priv -> mcfg [MRAM_RXF0 ].off = priv -> mcfg [MRAM_XIDF ].off +
11461203 priv -> mcfg [MRAM_XIDF ].num * XIDF_ELEMENT_SIZE ;
1147- priv -> mcfg [MRAM_RXF0 ].num = out_val [3 ] & RXFC_FS_MASK ;
1204+ priv -> mcfg [MRAM_RXF0 ].num = out_val [3 ] &
1205+ (RXFC_FS_MASK >> RXFC_FS_SHIFT );
11481206 priv -> mcfg [MRAM_RXF1 ].off = priv -> mcfg [MRAM_RXF0 ].off +
11491207 priv -> mcfg [MRAM_RXF0 ].num * RXF0_ELEMENT_SIZE ;
1150- priv -> mcfg [MRAM_RXF1 ].num = out_val [4 ] & RXFC_FS_MASK ;
1208+ priv -> mcfg [MRAM_RXF1 ].num = out_val [4 ] &
1209+ (RXFC_FS_MASK >> RXFC_FS_SHIFT );
11511210 priv -> mcfg [MRAM_RXB ].off = priv -> mcfg [MRAM_RXF1 ].off +
11521211 priv -> mcfg [MRAM_RXF1 ].num * RXF1_ELEMENT_SIZE ;
11531212 priv -> mcfg [MRAM_RXB ].num = out_val [5 ];
@@ -1156,7 +1215,8 @@ static int m_can_of_parse_mram(struct platform_device *pdev,
11561215 priv -> mcfg [MRAM_TXE ].num = out_val [6 ];
11571216 priv -> mcfg [MRAM_TXB ].off = priv -> mcfg [MRAM_TXE ].off +
11581217 priv -> mcfg [MRAM_TXE ].num * TXE_ELEMENT_SIZE ;
1159- priv -> mcfg [MRAM_TXB ].num = out_val [7 ] & TXBC_NDTB_MASK ;
1218+ priv -> mcfg [MRAM_TXB ].num = out_val [7 ] &
1219+ (TXBC_NDTB_MASK >> TXBC_NDTB_SHIFT );
11601220
11611221 dev_dbg (& pdev -> dev , "mram_base %p sidf 0x%x %d xidf 0x%x %d rxf0 0x%x %d rxf1 0x%x %d rxb 0x%x %d txe 0x%x %d txb 0x%x %d\n" ,
11621222 priv -> mram_base ,
@@ -1192,7 +1252,7 @@ static int m_can_plat_probe(struct platform_device *pdev)
11921252 hclk = devm_clk_get (& pdev -> dev , "hclk" );
11931253 cclk = devm_clk_get (& pdev -> dev , "cclk" );
11941254 if (IS_ERR (hclk ) || IS_ERR (cclk )) {
1195- dev_err (& pdev -> dev , "no clock find \n" );
1255+ dev_err (& pdev -> dev , "no clock found \n" );
11961256 return - ENODEV ;
11971257 }
11981258
0 commit comments