LCOV - code coverage report
Current view: top level - zephyr/drivers/can - can_mcan.h Hit Total Coverage
Test: new.info Lines: 108 485 22.3 %
Date: 2024-12-22 00:14:23

          Line data    Source code
       1           0 : /*
       2             :  * Copyright (c) 2023 Vestas Wind Systems A/S
       3             :  * Copyright (c) 2020 Alexander Wachter
       4             :  *
       5             :  * SPDX-License-Identifier: Apache-2.0
       6             :  *
       7             :  */
       8             : 
       9             : #ifndef ZEPHYR_INCLUDE_DRIVERS_CAN_CAN_MCAN_H_
      10             : #define ZEPHYR_INCLUDE_DRIVERS_CAN_CAN_MCAN_H_
      11             : 
      12             : #include <zephyr/cache.h>
      13             : #include <zephyr/devicetree.h>
      14             : #include <zephyr/drivers/can.h>
      15             : #include <zephyr/kernel.h>
      16             : #include <zephyr/sys/sys_io.h>
      17             : #include <zephyr/sys/util.h>
      18             : 
      19             : /*
      20             :  * The Bosch M_CAN register definitions correspond to those found in the Bosch M_CAN Controller Area
      21             :  * Network User's Manual, Revision 3.3.0.
      22             :  */
      23             : 
      24             : /* Core Release register */
      25           0 : #define CAN_MCAN_CREL         0x000
      26           0 : #define CAN_MCAN_CREL_REL     GENMASK(31, 28)
      27           0 : #define CAN_MCAN_CREL_STEP    GENMASK(27, 24)
      28           0 : #define CAN_MCAN_CREL_SUBSTEP GENMASK(23, 20)
      29           0 : #define CAN_MCAN_CREL_YEAR    GENMASK(19, 16)
      30           0 : #define CAN_MCAN_CREL_MON     GENMASK(15, 8)
      31           0 : #define CAN_MCAN_CREL_DAY     GENMASK(7, 0)
      32             : 
      33             : /* Endian register */
      34           0 : #define CAN_MCAN_ENDN     0x004
      35           0 : #define CAN_MCAN_ENDN_ETV GENMASK(31, 0)
      36             : 
      37             : /* Customer register */
      38           0 : #define CAN_MCAN_CUST      0x008
      39           0 : #define CAN_MCAN_CUST_CUST GENMASK(31, 0)
      40             : 
      41             : /* Data Bit Timing & Prescaler register */
      42           0 : #define CAN_MCAN_DBTP        0x00C
      43           0 : #define CAN_MCAN_DBTP_TDC    BIT(23)
      44           0 : #define CAN_MCAN_DBTP_DBRP   GENMASK(20, 16)
      45           0 : #define CAN_MCAN_DBTP_DTSEG1 GENMASK(12, 8)
      46           0 : #define CAN_MCAN_DBTP_DTSEG2 GENMASK(7, 4)
      47           0 : #define CAN_MCAN_DBTP_DSJW   GENMASK(3, 0)
      48             : 
      49             : /* Test register */
      50           0 : #define CAN_MCAN_TEST       0x010
      51           0 : #define CAN_MCAN_TEST_SVAL  BIT(21)
      52           0 : #define CAN_MCAN_TEST_TXBNS GENMASK(20, 16)
      53           0 : #define CAN_MCAN_TEST_PVAL  BIT(13)
      54           0 : #define CAN_MCAN_TEST_TXBNP GENMASK(12, 8)
      55           0 : #define CAN_MCAN_TEST_RX    BIT(7)
      56           0 : #define CAN_MCAN_TEST_TX    GENMASK(6, 5)
      57           0 : #define CAN_MCAN_TEST_LBCK  BIT(4)
      58             : 
      59             : /* RAM Watchdog register */
      60           0 : #define CAN_MCAN_RWD     0x014
      61           0 : #define CAN_MCAN_RWD_WDV GENMASK(15, 8)
      62           0 : #define CAN_MCAN_RWD_WDC GENMASK(7, 0)
      63             : 
      64             : /* CC Control register */
      65           0 : #define CAN_MCAN_CCCR      0x018
      66           0 : #define CAN_MCAN_CCCR_NISO BIT(15)
      67           0 : #define CAN_MCAN_CCCR_TXP  BIT(14)
      68           0 : #define CAN_MCAN_CCCR_EFBI BIT(13)
      69           0 : #define CAN_MCAN_CCCR_PXHD BIT(12)
      70           0 : #define CAN_MCAN_CCCR_WMM  BIT(11)
      71           0 : #define CAN_MCAN_CCCR_UTSU BIT(10)
      72           0 : #define CAN_MCAN_CCCR_BRSE BIT(9)
      73           0 : #define CAN_MCAN_CCCR_FDOE BIT(8)
      74           0 : #define CAN_MCAN_CCCR_TEST BIT(7)
      75           0 : #define CAN_MCAN_CCCR_DAR  BIT(6)
      76           0 : #define CAN_MCAN_CCCR_MON  BIT(5)
      77           0 : #define CAN_MCAN_CCCR_CSR  BIT(4)
      78           0 : #define CAN_MCAN_CCCR_CSA  BIT(3)
      79           0 : #define CAN_MCAN_CCCR_ASM  BIT(2)
      80           0 : #define CAN_MCAN_CCCR_CCE  BIT(1)
      81           0 : #define CAN_MCAN_CCCR_INIT BIT(0)
      82             : 
      83             : /* Nominal Bit Timing & Prescaler register */
      84           0 : #define CAN_MCAN_NBTP        0x01C
      85           0 : #define CAN_MCAN_NBTP_NSJW   GENMASK(31, 25)
      86           0 : #define CAN_MCAN_NBTP_NBRP   GENMASK(24, 16)
      87           0 : #define CAN_MCAN_NBTP_NTSEG1 GENMASK(15, 8)
      88           0 : #define CAN_MCAN_NBTP_NTSEG2 GENMASK(6, 0)
      89             : 
      90             : /* Timestamp Counter Configuration register */
      91           0 : #define CAN_MCAN_TSCC     0x020
      92           0 : #define CAN_MCAN_TSCC_TCP GENMASK(19, 16)
      93           0 : #define CAN_MCAN_TSCC_TSS GENMASK(1, 0)
      94             : 
      95             : /* Timestamp Counter Value register */
      96           0 : #define CAN_MCAN_TSCV     0x024
      97           0 : #define CAN_MCAN_TSCV_TSC GENMASK(15, 0)
      98             : 
      99             : /* Timeout Counter Configuration register */
     100           0 : #define CAN_MCAN_TOCC      0x028
     101           0 : #define CAN_MCAN_TOCC_TOP  GENMASK(31, 16)
     102           0 : #define CAN_MCAN_TOCC_TOS  GENMASK(2, 1)
     103           0 : #define CAN_MCAN_TOCC_ETOC BIT(1)
     104             : 
     105             : /* Timeout Counter Value register */
     106           0 : #define CAN_MCAN_TOCV     0x02C
     107           0 : #define CAN_MCAN_TOCV_TOC GENMASK(15, 0)
     108             : 
     109             : /* Error Counter register */
     110           0 : #define CAN_MCAN_ECR     0x040
     111           0 : #define CAN_MCAN_ECR_CEL GENMASK(23, 16)
     112           0 : #define CAN_MCAN_ECR_RP  BIT(15)
     113           0 : #define CAN_MCAN_ECR_REC GENMASK(14, 8)
     114           0 : #define CAN_MCAN_ECR_TEC GENMASK(7, 0)
     115             : 
     116             : /* Protocol Status register */
     117           0 : #define CAN_MCAN_PSR      0x044
     118           0 : #define CAN_MCAN_PSR_TDCV GENMASK(22, 16)
     119           0 : #define CAN_MCAN_PSR_PXE  BIT(14)
     120           0 : #define CAN_MCAN_PSR_RFDF BIT(13)
     121           0 : #define CAN_MCAN_PSR_RBRS BIT(12)
     122           0 : #define CAN_MCAN_PSR_RESI BIT(11)
     123           0 : #define CAN_MCAN_PSR_DLEC GENMASK(10, 8)
     124           0 : #define CAN_MCAN_PSR_BO   BIT(7)
     125           0 : #define CAN_MCAN_PSR_EW   BIT(6)
     126           0 : #define CAN_MCAN_PSR_EP   BIT(5)
     127           0 : #define CAN_MCAN_PSR_ACT  GENMASK(4, 3)
     128           0 : #define CAN_MCAN_PSR_LEC  GENMASK(2, 0)
     129             : 
     130           0 : enum can_mcan_psr_lec {
     131             :         CAN_MCAN_PSR_LEC_NO_ERROR    = 0,
     132             :         CAN_MCAN_PSR_LEC_STUFF_ERROR = 1,
     133             :         CAN_MCAN_PSR_LEC_FORM_ERROR  = 2,
     134             :         CAN_MCAN_PSR_LEC_ACK_ERROR   = 3,
     135             :         CAN_MCAN_PSR_LEC_BIT1_ERROR  = 4,
     136             :         CAN_MCAN_PSR_LEC_BIT0_ERROR  = 5,
     137             :         CAN_MCAN_PSR_LEC_CRC_ERROR   = 6,
     138             :         CAN_MCAN_PSR_LEC_NO_CHANGE   = 7
     139             : };
     140             : 
     141             : /* Transmitter Delay Compensation register */
     142           0 : #define CAN_MCAN_TDCR      0x048
     143           0 : #define CAN_MCAN_TDCR_TDCO GENMASK(14, 8)
     144           0 : #define CAN_MCAN_TDCR_TDCF GENMASK(6, 0)
     145             : 
     146             : /* Interrupt register */
     147           0 : #define CAN_MCAN_IR      0x050
     148           0 : #define CAN_MCAN_IR_ARA  BIT(29)
     149           0 : #define CAN_MCAN_IR_PED  BIT(28)
     150           0 : #define CAN_MCAN_IR_PEA  BIT(27)
     151           0 : #define CAN_MCAN_IR_WDI  BIT(26)
     152           0 : #define CAN_MCAN_IR_BO   BIT(25)
     153           0 : #define CAN_MCAN_IR_EW   BIT(24)
     154           0 : #define CAN_MCAN_IR_EP   BIT(23)
     155           0 : #define CAN_MCAN_IR_ELO  BIT(22)
     156           0 : #define CAN_MCAN_IR_BEU  BIT(21)
     157           0 : #define CAN_MCAN_IR_BEC  BIT(20)
     158           0 : #define CAN_MCAN_IR_DRX  BIT(19)
     159           0 : #define CAN_MCAN_IR_TOO  BIT(18)
     160           0 : #define CAN_MCAN_IR_MRAF BIT(17)
     161           0 : #define CAN_MCAN_IR_TSW  BIT(16)
     162           0 : #define CAN_MCAN_IR_TEFL BIT(15)
     163           0 : #define CAN_MCAN_IR_TEFF BIT(14)
     164           0 : #define CAN_MCAN_IR_TEFW BIT(13)
     165           0 : #define CAN_MCAN_IR_TEFN BIT(12)
     166           0 : #define CAN_MCAN_IR_TFE  BIT(11)
     167           0 : #define CAN_MCAN_IR_TCF  BIT(10)
     168           0 : #define CAN_MCAN_IR_TC   BIT(9)
     169           0 : #define CAN_MCAN_IR_HPM  BIT(8)
     170           0 : #define CAN_MCAN_IR_RF1L BIT(7)
     171           0 : #define CAN_MCAN_IR_RF1F BIT(6)
     172           0 : #define CAN_MCAN_IR_RF1W BIT(5)
     173           0 : #define CAN_MCAN_IR_RF1N BIT(4)
     174           0 : #define CAN_MCAN_IR_RF0L BIT(3)
     175           0 : #define CAN_MCAN_IR_RF0F BIT(2)
     176           0 : #define CAN_MCAN_IR_RF0W BIT(1)
     177           0 : #define CAN_MCAN_IR_RF0N BIT(0)
     178             : 
     179             : /* Interrupt Enable register */
     180           0 : #define CAN_MCAN_IE       0x054
     181           0 : #define CAN_MCAN_IE_ARAE  BIT(29)
     182           0 : #define CAN_MCAN_IE_PEDE  BIT(28)
     183           0 : #define CAN_MCAN_IE_PEAE  BIT(27)
     184           0 : #define CAN_MCAN_IE_WDIE  BIT(26)
     185           0 : #define CAN_MCAN_IE_BOE   BIT(25)
     186           0 : #define CAN_MCAN_IE_EWE   BIT(24)
     187           0 : #define CAN_MCAN_IE_EPE   BIT(23)
     188           0 : #define CAN_MCAN_IE_ELOE  BIT(22)
     189           0 : #define CAN_MCAN_IE_BEUE  BIT(21)
     190           0 : #define CAN_MCAN_IE_BECE  BIT(20)
     191           0 : #define CAN_MCAN_IE_DRXE  BIT(19)
     192           0 : #define CAN_MCAN_IE_TOOE  BIT(18)
     193           0 : #define CAN_MCAN_IE_MRAFE BIT(17)
     194           0 : #define CAN_MCAN_IE_TSWE  BIT(16)
     195           0 : #define CAN_MCAN_IE_TEFLE BIT(15)
     196           0 : #define CAN_MCAN_IE_TEFFE BIT(14)
     197           0 : #define CAN_MCAN_IE_TEFWE BIT(13)
     198           0 : #define CAN_MCAN_IE_TEFNE BIT(12)
     199           0 : #define CAN_MCAN_IE_TFEE  BIT(11)
     200           0 : #define CAN_MCAN_IE_TCFE  BIT(10)
     201           0 : #define CAN_MCAN_IE_TCE   BIT(9)
     202           0 : #define CAN_MCAN_IE_HPME  BIT(8)
     203           0 : #define CAN_MCAN_IE_RF1LE BIT(7)
     204           0 : #define CAN_MCAN_IE_RF1FE BIT(6)
     205           0 : #define CAN_MCAN_IE_RF1WE BIT(5)
     206           0 : #define CAN_MCAN_IE_RF1NE BIT(4)
     207           0 : #define CAN_MCAN_IE_RF0LE BIT(3)
     208           0 : #define CAN_MCAN_IE_RF0FE BIT(2)
     209           0 : #define CAN_MCAN_IE_RF0WE BIT(1)
     210           0 : #define CAN_MCAN_IE_RF0NE BIT(0)
     211             : 
     212             : /* Interrupt Line Select register */
     213           0 : #define CAN_MCAN_ILS       0x058
     214           0 : #define CAN_MCAN_ILS_ARAL  BIT(29)
     215           0 : #define CAN_MCAN_ILS_PEDL  BIT(28)
     216           0 : #define CAN_MCAN_ILS_PEAL  BIT(27)
     217           0 : #define CAN_MCAN_ILS_WDIL  BIT(26)
     218           0 : #define CAN_MCAN_ILS_BOL   BIT(25)
     219           0 : #define CAN_MCAN_ILS_EWL   BIT(24)
     220           0 : #define CAN_MCAN_ILS_EPL   BIT(23)
     221           0 : #define CAN_MCAN_ILS_ELOL  BIT(22)
     222           0 : #define CAN_MCAN_ILS_BEUL  BIT(21)
     223           0 : #define CAN_MCAN_ILS_BECL  BIT(20)
     224           0 : #define CAN_MCAN_ILS_DRXL  BIT(19)
     225           0 : #define CAN_MCAN_ILS_TOOL  BIT(18)
     226           0 : #define CAN_MCAN_ILS_MRAFL BIT(17)
     227           0 : #define CAN_MCAN_ILS_TSWL  BIT(16)
     228           0 : #define CAN_MCAN_ILS_TEFLL BIT(15)
     229           0 : #define CAN_MCAN_ILS_TEFFL BIT(14)
     230           0 : #define CAN_MCAN_ILS_TEFWL BIT(13)
     231           0 : #define CAN_MCAN_ILS_TEFNL BIT(12)
     232           0 : #define CAN_MCAN_ILS_TFEL  BIT(11)
     233           0 : #define CAN_MCAN_ILS_TCFL  BIT(10)
     234           0 : #define CAN_MCAN_ILS_TCL   BIT(9)
     235           0 : #define CAN_MCAN_ILS_HPML  BIT(8)
     236           0 : #define CAN_MCAN_ILS_RF1LL BIT(7)
     237           0 : #define CAN_MCAN_ILS_RF1FL BIT(6)
     238           0 : #define CAN_MCAN_ILS_RF1WL BIT(5)
     239           0 : #define CAN_MCAN_ILS_RF1NL BIT(4)
     240           0 : #define CAN_MCAN_ILS_RF0LL BIT(3)
     241           0 : #define CAN_MCAN_ILS_RF0FL BIT(2)
     242           0 : #define CAN_MCAN_ILS_RF0WL BIT(1)
     243           0 : #define CAN_MCAN_ILS_RF0NL BIT(0)
     244             : 
     245             : /* Interrupt Line Enable register */
     246           0 : #define CAN_MCAN_ILE       0x05C
     247           0 : #define CAN_MCAN_ILE_EINT1 BIT(1)
     248           0 : #define CAN_MCAN_ILE_EINT0 BIT(0)
     249             : 
     250             : /* Global filter configuration register */
     251           0 : #define CAN_MCAN_GFC      0x080
     252           0 : #define CAN_MCAN_GFC_ANFS GENMASK(5, 4)
     253           0 : #define CAN_MCAN_GFC_ANFE GENMASK(3, 2)
     254           0 : #define CAN_MCAN_GFC_RRFS BIT(1)
     255           0 : #define CAN_MCAN_GFC_RRFE BIT(0)
     256             : 
     257             : /* Standard ID Filter Configuration register */
     258           0 : #define CAN_MCAN_SIDFC       0x084
     259           0 : #define CAN_MCAN_SIDFC_LSS   GENMASK(23, 16)
     260           0 : #define CAN_MCAN_SIDFC_FLSSA GENMASK(15, 2)
     261             : 
     262             : /* Extended ID Filter Configuration register */
     263           0 : #define CAN_MCAN_XIDFC       0x088
     264           0 : #define CAN_MCAN_XIDFC_LSS   GENMASK(22, 16)
     265           0 : #define CAN_MCAN_XIDFC_FLESA GENMASK(15, 2)
     266             : 
     267             : /* Extended ID AND Mask register */
     268           0 : #define CAN_MCAN_XIDAM      0x090
     269           0 : #define CAN_MCAN_XIDAM_EIDM GENMASK(28, 0)
     270             : 
     271             : /* High Priority Message Status register */
     272           0 : #define CAN_MCAN_HPMS      0x094
     273           0 : #define CAN_MCAN_HPMS_FLST BIT(15)
     274           0 : #define CAN_MCAN_HPMS_FIDX GENMASK(14, 8)
     275           0 : #define CAN_MCAN_HPMS_MSI  GENMASK(7, 6)
     276           0 : #define CAN_MCAN_HPMS_BIDX GENMASK(5, 0)
     277             : 
     278             : /* New Data 1 register */
     279           0 : #define CAN_MCAN_NDAT1    0x098
     280           0 : #define CAN_MCAN_NDAT1_ND GENMASK(31, 0)
     281             : 
     282             : /* New Data 2 register */
     283           0 : #define CAN_MCAN_NDAT2    0x09C
     284           0 : #define CAN_MCAN_NDAT2_ND GENMASK(31, 0)
     285             : 
     286             : /* Rx FIFO 0 Configuration register */
     287           0 : #define CAN_MCAN_RXF0C      0x0A0
     288           0 : #define CAN_MCAN_RXF0C_F0OM BIT(31)
     289           0 : #define CAN_MCAN_RXF0C_F0WM GENMASK(30, 24)
     290           0 : #define CAN_MCAN_RXF0C_F0S  GENMASK(22, 16)
     291           0 : #define CAN_MCAN_RXF0C_F0SA GENMASK(15, 2)
     292             : 
     293             : /* Rx FIFO 0 Status register */
     294           0 : #define CAN_MCAN_RXF0S      0x0A4
     295           0 : #define CAN_MCAN_RXF0S_RF0L BIT(25)
     296           0 : #define CAN_MCAN_RXF0S_F0F  BIT(24)
     297           0 : #define CAN_MCAN_RXF0S_F0PI GENMASK(21, 16)
     298           0 : #define CAN_MCAN_RXF0S_F0GI GENMASK(13, 8)
     299           0 : #define CAN_MCAN_RXF0S_F0FL GENMASK(6, 0)
     300             : 
     301             : /* Rx FIFO 0 Acknowledge register */
     302           0 : #define CAN_MCAN_RXF0A      0x0A8
     303           0 : #define CAN_MCAN_RXF0A_F0AI GENMASK(5, 0)
     304             : 
     305             : /* Rx Buffer Configuration register */
     306           0 : #define CAN_MCAN_RXBC      0x0AC
     307           0 : #define CAN_MCAN_RXBC_RBSA GENMASK(15, 2)
     308             : 
     309             : /* Rx FIFO 1 Configuration register */
     310           0 : #define CAN_MCAN_RXF1C      0x0B0
     311           0 : #define CAN_MCAN_RXF1C_F1OM BIT(31)
     312           0 : #define CAN_MCAN_RXF1C_F1WM GENMASK(30, 24)
     313           0 : #define CAN_MCAN_RXF1C_F1S  GENMASK(22, 16)
     314           0 : #define CAN_MCAN_RXF1C_F1SA GENMASK(15, 2)
     315             : 
     316             : /* Rx FIFO 1 Status register */
     317           0 : #define CAN_MCAN_RXF1S      0x0B4
     318           0 : #define CAN_MCAN_RXF1S_RF1L BIT(25)
     319           0 : #define CAN_MCAN_RXF1S_F1F  BIT(24)
     320           0 : #define CAN_MCAN_RXF1S_F1PI GENMASK(21, 16)
     321           0 : #define CAN_MCAN_RXF1S_F1GI GENMASK(13, 8)
     322           0 : #define CAN_MCAN_RXF1S_F1FL GENMASK(6, 0)
     323             : 
     324             : /* Rx FIFO 1 Acknowledge register */
     325           0 : #define CAN_MCAN_RXF1A      0x0B8
     326           0 : #define CAN_MCAN_RXF1A_F1AI GENMASK(5, 0)
     327             : 
     328             : /* Rx Buffer/FIFO Element Size Configuration register */
     329           0 : #define CAN_MCAN_RXESC      0x0BC
     330           0 : #define CAN_MCAN_RXESC_RBDS GENMASK(10, 8)
     331           0 : #define CAN_MCAN_RXESC_F1DS GENMASK(6, 4)
     332           0 : #define CAN_MCAN_RXESC_F0DS GENMASK(2, 0)
     333             : 
     334             : /* Tx Buffer Configuration register */
     335           0 : #define CAN_MCAN_TXBC      0x0C0
     336           0 : #define CAN_MCAN_TXBC_TFQM BIT(30)
     337           0 : #define CAN_MCAN_TXBC_TFQS GENMASK(29, 24)
     338           0 : #define CAN_MCAN_TXBC_NDTB GENMASK(21, 16)
     339           0 : #define CAN_MCAN_TXBC_TBSA GENMASK(15, 2)
     340             : 
     341             : /* Tx FIFO/Queue Status register */
     342           0 : #define CAN_MCAN_TXFQS       0x0C4
     343           0 : #define CAN_MCAN_TXFQS_TFQF  BIT(21)
     344           0 : #define CAN_MCAN_TXFQS_TFQPI GENMASK(20, 16)
     345           0 : #define CAN_MCAN_TXFQS_TFGI  GENMASK(12, 8)
     346           0 : #define CAN_MCAN_TXFQS_TFFL  GENMASK(5, 0)
     347             : 
     348             : /* Tx Buffer Element Size Configuration register */
     349           0 : #define CAN_MCAN_TXESC      0x0C8
     350           0 : #define CAN_MCAN_TXESC_TBDS GENMASK(2, 0)
     351             : 
     352             : /* Tx Buffer Request Pending register */
     353           0 : #define CAN_MCAN_TXBRP     0x0CC
     354           0 : #define CAN_MCAN_TXBRP_TRP GENMASK(31, 0)
     355             : 
     356             : /* Tx Buffer Add Request register */
     357           0 : #define CAN_MCAN_TXBAR    0x0D0
     358           0 : #define CAN_MCAN_TXBAR_AR GENMASK(31, 0)
     359             : 
     360             : /* Tx Buffer Cancellation Request register */
     361           0 : #define CAN_MCAN_TXBCR    0x0D4
     362           0 : #define CAN_MCAN_TXBCR_CR GENMASK(31, 0)
     363             : 
     364             : /* Tx Buffer Transmission Occurred register */
     365           0 : #define CAN_MCAN_TXBTO    0x0D8
     366           0 : #define CAN_MCAN_TXBTO_TO GENMASK(31, 0)
     367             : 
     368             : /* Tx Buffer Cancellation Finished register */
     369           0 : #define CAN_MCAN_TXBCF    0x0DC
     370           0 : #define CAN_MCAN_TXBCF_CF GENMASK(31, 0)
     371             : 
     372             : /* Tx Buffer Transmission Interrupt Enable register */
     373           0 : #define CAN_MCAN_TXBTIE     0x0E0
     374           0 : #define CAN_MCAN_TXBTIE_TIE GENMASK(31, 0)
     375             : 
     376             : /* Tx Buffer Cancellation Finished Interrupt Enable register */
     377           0 : #define CAN_MCAN_TXBCIE      0x0E4
     378           0 : #define CAN_MCAN_TXBCIE_CFIE GENMASK(31, 0)
     379             : 
     380             : /* Tx Event FIFO Configuration register */
     381           0 : #define CAN_MCAN_TXEFC      0x0F0
     382           0 : #define CAN_MCAN_TXEFC_EFWM GENMASK(29, 24)
     383           0 : #define CAN_MCAN_TXEFC_EFS  GENMASK(21, 16)
     384           0 : #define CAN_MCAN_TXEFC_EFSA GENMASK(15, 2)
     385             : 
     386             : /* Tx Event FIFO Status register */
     387           0 : #define CAN_MCAN_TXEFS      0x0F4
     388           0 : #define CAN_MCAN_TXEFS_TEFL BIT(25)
     389           0 : #define CAN_MCAN_TXEFS_EFF  BIT(24)
     390           0 : #define CAN_MCAN_TXEFS_EFPI GENMASK(20, 16)
     391           0 : #define CAN_MCAN_TXEFS_EFGI GENMASK(12, 8)
     392           0 : #define CAN_MCAN_TXEFS_EFFL GENMASK(5, 0)
     393             : 
     394             : /* Tx Event FIFO Acknowledge register */
     395           0 : #define CAN_MCAN_TXEFA      0x0F8
     396           0 : #define CAN_MCAN_TXEFA_EFAI GENMASK(4, 0)
     397             : 
     398             : /**
     399             :  * @name Indexes for the cells in the devicetree bosch,mram-cfg property
     400             :  * @anchor CAN_MCAN_MRAM_CFG
     401             : 
     402             :  * These match the description of the cells in the bosch,m_can-base devicetree binding.
     403             :  *
     404             :  * @{
     405             :  */
     406             : /** offset cell index */
     407           1 : #define CAN_MCAN_MRAM_CFG_OFFSET        0
     408             : /** std-filter-elements cell index */
     409           1 : #define CAN_MCAN_MRAM_CFG_STD_FILTER    1
     410             : /** ext-filter-elements cell index */
     411           1 : #define CAN_MCAN_MRAM_CFG_EXT_FILTER    2
     412             : /** rx-fifo0-elements cell index */
     413           1 : #define CAN_MCAN_MRAM_CFG_RX_FIFO0      3
     414             : /** rx-fifo1-elements cell index */
     415           1 : #define CAN_MCAN_MRAM_CFG_RX_FIFO1      4
     416             : /** rx-buffer-elements cell index */
     417           1 : #define CAN_MCAN_MRAM_CFG_RX_BUFFER     5
     418             : /** tx-event-fifo-elements cell index */
     419           1 : #define CAN_MCAN_MRAM_CFG_TX_EVENT_FIFO 6
     420             : /** tx-buffer-elements cell index */
     421           1 : #define CAN_MCAN_MRAM_CFG_TX_BUFFER     7
     422             : /** Total number of cells in bosch,mram-cfg property */
     423           1 : #define CAN_MCAN_MRAM_CFG_NUM_CELLS     8
     424             : 
     425             : /** @} */
     426             : 
     427             : /**
     428             :  * @brief Get the Bosch M_CAN Message RAM offset
     429             :  *
     430             :  * @param node_id node identifier
     431             :  * @return the Message RAM offset in bytes
     432             :  */
     433           1 : #define CAN_MCAN_DT_MRAM_OFFSET(node_id)                                                           \
     434             :         DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_OFFSET)
     435             : 
     436             : /**
     437             :  * @brief Get the number of standard (11-bit) filter elements in Bosch M_CAN Message RAM
     438             :  *
     439             :  * @param node_id node identifier
     440             :  * @return the number of standard (11-bit) filter elements
     441             :  */
     442           1 : #define CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(node_id)                                              \
     443             :         DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_STD_FILTER)
     444             : 
     445             : /**
     446             :  * @brief Get the number of extended (29-bit) filter elements in Bosch M_CAN Message RAM
     447             :  *
     448             :  * @param node_id node identifier
     449             :  * @return the number of extended (29-bit) filter elements
     450             :  */
     451           1 : #define CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(node_id)                                              \
     452             :         DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_EXT_FILTER)
     453             : 
     454             : /**
     455             :  * @brief Get the number of Rx FIFO 0 elements in Bosch M_CAN Message RAM
     456             :  *
     457             :  * @param node_id node identifier
     458             :  * @return the number of Rx FIFO 0 elements
     459             :  */
     460           1 : #define CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(node_id)                                                \
     461             :         DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_RX_FIFO0)
     462             : 
     463             : /**
     464             :  * @brief Get the number of Rx FIFO 1 elements in Bosch M_CAN Message RAM
     465             :  *
     466             :  * @param node_id node identifier
     467             :  * @return the number of Rx FIFO 1 elements
     468             :  */
     469           1 : #define CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(node_id)                                                \
     470             :         DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_RX_FIFO1)
     471             : 
     472             : /**
     473             :  * @brief Get the number of Rx Buffer elements in Bosch M_CAN Message RAM
     474             :  *
     475             :  * @param node_id node identifier
     476             :  * @return the number of Rx Buffer elements
     477             :  */
     478           1 : #define CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(node_id)                                               \
     479             :         DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_RX_BUFFER)
     480             : 
     481             : /**
     482             :  * @brief Get the number of Tx Event FIFO elements in Bosch M_CAN Message RAM
     483             :  *
     484             :  * @param node_id node identifier
     485             :  * @return the number of Tx Event FIFO elements
     486             :  */
     487           1 : #define CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(node_id)                                           \
     488             :         DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_TX_EVENT_FIFO)
     489             : 
     490             : /**
     491             :  * @brief Get the number of Tx Buffer elements in Bosch M_CAN Message RAM
     492             :  *
     493             :  * @param node_id node identifier
     494             :  * @return the number of Tx Buffer elements
     495             :  */
     496           1 : #define CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(node_id)                                               \
     497             :         DT_PROP_BY_IDX(node_id, bosch_mram_cfg, CAN_MCAN_MRAM_CFG_TX_BUFFER)
     498             : 
     499             : /**
     500             :  * @brief Get the base offset of standard (11-bit) filter elements in Bosch M_CAN Message RAM
     501             :  *
     502             :  * @param node_id node identifier
     503             :  * @return the base offset of standard (11-bit) filter elements in bytes
     504             :  */
     505           1 : #define CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET(node_id) (0U)
     506             : 
     507             : /**
     508             :  * @brief Get the base offset of extended (29-bit) filter elements in Bosch M_CAN Message RAM
     509             :  *
     510             :  * @param node_id node identifier
     511             :  * @return the base offset of extended (29-bit) filter elements in bytes
     512             :  */
     513           1 : #define CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET(node_id)                                                \
     514             :         (CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET(node_id) +                                             \
     515             :          CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(node_id) * sizeof(struct can_mcan_std_filter))
     516             : 
     517             : /**
     518             :  * @brief Get the base offset of Rx FIFO 0 elements in Bosch M_CAN Message RAM
     519             :  *
     520             :  * @param node_id node identifier
     521             :  * @return the base offset of Rx FIFO 0 elements in bytes
     522             :  */
     523           1 : #define CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET(node_id)                                                  \
     524             :         (CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET(node_id) +                                             \
     525             :          CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(node_id) * sizeof(struct can_mcan_ext_filter))
     526             : 
     527             : /**
     528             :  * @brief Get the base offset of Rx FIFO 1 elements in Bosch M_CAN Message RAM
     529             :  *
     530             :  * @param node_id node identifier
     531             :  * @return the base offset of Rx FIFO 1 elements in bytes
     532             :  */
     533           1 : #define CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET(node_id)                                                  \
     534             :         (CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET(node_id) +                                               \
     535             :          CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(node_id) * sizeof(struct can_mcan_rx_fifo))
     536             : 
     537             : /**
     538             :  * @brief Get the base offset of Rx Buffer elements in Bosch M_CAN Message RAM
     539             :  *
     540             :  * @param node_id node identifier
     541             :  * @return the base offset of Rx Buffer elements in bytes
     542             :  */
     543           1 : #define CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET(node_id)                                                 \
     544             :         (CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET(node_id) +                                               \
     545             :          CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(node_id) * sizeof(struct can_mcan_rx_fifo))
     546             : 
     547             : /**
     548             :  * @brief Get the base offset of Tx Event FIFO elements in Bosch M_CAN Message RAM
     549             :  *
     550             :  * @param node_id node identifier
     551             :  * @return the base offset of Tx Event FIFO elements in bytes
     552             :  */
     553           1 : #define CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET(node_id)                                             \
     554             :         (CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET(node_id) +                                              \
     555             :          CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(node_id) * sizeof(struct can_mcan_rx_fifo))
     556             : 
     557             : /**
     558             :  * @brief Get the base offset of Tx Buffer elements in Bosch M_CAN Message RAM
     559             :  *
     560             :  * @param node_id node identifier
     561             :  * @return the base offset of Tx Buffer elements in bytes
     562             :  */
     563           1 : #define CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET(node_id)                                                 \
     564             :         (CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET(node_id) +                                          \
     565             :          CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(node_id) * sizeof(struct can_mcan_tx_event_fifo))
     566             : 
     567             : /**
     568             :  * @brief Get the Bosch M_CAN register base address
     569             :  *
     570             :  * For devicetree nodes with just one register block, this macro returns the base address of that
     571             :  * register block.
     572             :  *
     573             :  * If a devicetree node has more than one register block, this macros returns the base address of
     574             :  * the register block named "m_can".
     575             :  *
     576             :  * @param node_id node identifier
     577             :  * @return the Bosch M_CAN register base address
     578             :  */
     579           1 : #define CAN_MCAN_DT_MCAN_ADDR(node_id)                                                             \
     580             :         COND_CODE_1(DT_NUM_REGS(node_id), ((mm_reg_t)DT_REG_ADDR(node_id)),                        \
     581             :                     ((mm_reg_t)DT_REG_ADDR_BY_NAME(node_id, m_can)))
     582             : 
     583             : /**
     584             :  * @brief Get the Bosch M_CAN Message RAM base address
     585             :  *
     586             :  * For devicetree nodes with dedicated Message RAM area defined via devicetree, this macro returns
     587             :  * the base address of the Message RAM.
     588             :  *
     589             :  * @param node_id node identifier
     590             :  * @return the Bosch M_CAN Message RAM base address (MRBA)
     591             :  */
     592           1 : #define CAN_MCAN_DT_MRBA(node_id)                                                                  \
     593             :         (mem_addr_t)DT_REG_ADDR_BY_NAME(node_id, message_ram)
     594             : 
     595             : /**
     596             :  * @brief Get the Bosch M_CAN Message RAM address
     597             :  *
     598             :  * For devicetree nodes with dedicated Message RAM area defined via devicetree, this macro returns
     599             :  * the address of the Message RAM, taking in the Message RAM offset into account.
     600             :  *
     601             :  * @param node_id node identifier
     602             :  * @return the Bosch M_CAN Message RAM address
     603             :  */
     604           1 : #define CAN_MCAN_DT_MRAM_ADDR(node_id)                                                             \
     605             :         (mem_addr_t)(CAN_MCAN_DT_MRBA(node_id) + CAN_MCAN_DT_MRAM_OFFSET(node_id))
     606             : 
     607             : /**
     608             :  * @brief Get the Bosch M_CAN Message RAM size
     609             :  *
     610             :  * For devicetree nodes with dedicated Message RAM area defined via devicetree, this macro returns
     611             :  * the size of the Message RAM, taking in the Message RAM offset into account.
     612             :  *
     613             :  * @param node_id node identifier
     614             :  * @return the Bosch M_CAN Message RAM base address
     615             :  * @see CAN_MCAN_DT_MRAM_ELEMENTS_SIZE()
     616             :  */
     617           1 : #define CAN_MCAN_DT_MRAM_SIZE(node_id)                                                             \
     618             :         (mem_addr_t)(DT_REG_SIZE_BY_NAME(node_id, message_ram) - CAN_MCAN_DT_MRAM_OFFSET(node_id))
     619             : 
     620             : /**
     621             :  * @brief Get the total size of all Bosch M_CAN Message RAM elements
     622             :  *
     623             :  * @param node_id node identifier
     624             :  * @return the total size of all Message RAM elements in bytes
     625             :  * @see CAN_MCAN_DT_MRAM_SIZE()
     626             :  */
     627           1 : #define CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(node_id)                                                    \
     628             :         (CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET(node_id) +                                              \
     629             :          CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(node_id) * sizeof(struct can_mcan_tx_buffer))
     630             : 
     631             : /**
     632             :  * @brief Define a RAM buffer for Bosch M_CAN Message RAM
     633             :  *
     634             :  * For devicetree nodes without dedicated Message RAM area, this macro defines a suitable RAM buffer
     635             :  * to hold the Message RAM elements. Since this buffer cannot be shared between multiple Bosch M_CAN
     636             :  * instances, the Message RAM offset must be set to 0x0.
     637             :  *
     638             :  * @param node_id node identifier
     639             :  * @param _name buffer variable name
     640             :  */
     641           1 : #define CAN_MCAN_DT_MRAM_DEFINE(node_id, _name)                                                    \
     642             :         BUILD_ASSERT(CAN_MCAN_DT_MRAM_OFFSET(node_id) == 0, "offset must be 0");                   \
     643             :         static char __nocache_noinit __aligned(4) _name[CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(node_id)];
     644             : 
     645             : /**
     646             :  * @brief Assert that the Message RAM configuration meets the Bosch M_CAN IP core restrictions
     647             :  *
     648             :  * @param node_id node identifier
     649             :  */
     650           1 : #define CAN_MCAN_DT_BUILD_ASSERT_MRAM_CFG(node_id)                                                 \
     651             :         BUILD_ASSERT(CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(node_id) <= 128,                         \
     652             :                      "Maximum Standard filter elements exceeded");                                 \
     653             :         BUILD_ASSERT(CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(node_id) <= 64,                          \
     654             :                      "Maximum Extended filter elements exceeded");                                 \
     655             :         BUILD_ASSERT(CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(node_id) <= 64,                            \
     656             :                      "Maximum Rx FIFO 0 elements exceeded");                                       \
     657             :         BUILD_ASSERT(CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(node_id) <= 64,                            \
     658             :                      "Maximum Rx FIFO 1 elements exceeded");                                       \
     659             :         BUILD_ASSERT(CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(node_id) <= 64,                           \
     660             :                      "Maximum Rx Buffer elements exceeded");                                       \
     661             :         BUILD_ASSERT(CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(node_id) <= 32,                       \
     662             :                      "Maximum Tx Buffer elements exceeded");                                       \
     663             :         BUILD_ASSERT(CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(node_id) <= 32,                           \
     664             :                      "Maximum Tx Buffer elements exceeded");
     665             : 
     666             : /**
     667             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_OFFSET(DT_DRV_INST(inst))
     668             :  * @param inst DT_DRV_COMPAT instance number
     669             :  * @return the Message RAM offset in bytes
     670             :  * @see CAN_MCAN_DT_MRAM_OFFSET()
     671             :  */
     672           1 : #define CAN_MCAN_DT_INST_MRAM_OFFSET(inst) CAN_MCAN_DT_MRAM_OFFSET(DT_DRV_INST(inst))
     673             : 
     674             : /**
     675             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(DT_DRV_INST(inst))
     676             :  * @param inst DT_DRV_COMPAT instance number
     677             :  * @return the number of standard (11-bit) elements
     678             :  * @see CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS()
     679             :  */
     680           1 : #define CAN_MCAN_DT_INST_MRAM_STD_FILTER_ELEMENTS(inst)                                            \
     681             :         CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(DT_DRV_INST(inst))
     682             : 
     683             : /**
     684             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(DT_DRV_INST(inst))
     685             :  * @param inst DT_DRV_COMPAT instance number
     686             :  * @return the number of extended (29-bit) elements
     687             :  * @see CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS()
     688             :  */
     689           1 : #define CAN_MCAN_DT_INST_MRAM_EXT_FILTER_ELEMENTS(inst)                                            \
     690             :         CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(DT_DRV_INST(inst))
     691             : 
     692             : /**
     693             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(DT_DRV_INST(inst))
     694             :  * @param inst DT_DRV_COMPAT instance number
     695             :  * @return the number of Rx FIFO 0 elements
     696             :  * @see CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS()
     697             :  */
     698           1 : #define CAN_MCAN_DT_INST_MRAM_RX_FIFO0_ELEMENTS(inst)                                              \
     699             :         CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(DT_DRV_INST(inst))
     700             : 
     701             : /**
     702             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(DT_DRV_INST(inst))
     703             :  * @param inst DT_DRV_COMPAT instance number
     704             :  * @return the number of Rx FIFO 1 elements
     705             :  * @see CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS()
     706             :  */
     707           1 : #define CAN_MCAN_DT_INST_MRAM_RX_FIFO1_ELEMENTS(inst)                                              \
     708             :         CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(DT_DRV_INST(inst))
     709             : 
     710             : /**
     711             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(DT_DRV_INST(inst))
     712             :  * @param inst DT_DRV_COMPAT instance number
     713             :  * @return the number of Rx Buffer elements
     714             :  * @see CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS()
     715             :  */
     716           1 : #define CAN_MCAN_DT_INST_MRAM_RX_BUFFER_ELEMENTS(inst)                                             \
     717             :         CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(DT_DRV_INST(inst))
     718             : 
     719             : /**
     720             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(DT_DRV_INST(inst))
     721             :  * @param inst DT_DRV_COMPAT instance number
     722             :  * @return the number of Tx Event FIFO elements
     723             :  * @see CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS()
     724             :  */
     725           1 : #define CAN_MCAN_DT_INST_MRAM_TX_EVENT_FIFO_ELEMENTS(inst)                                         \
     726             :         CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(DT_DRV_INST(inst))
     727             : 
     728             : /**
     729             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(DT_DRV_INST(inst))
     730             :  * @param inst DT_DRV_COMPAT instance number
     731             :  * @return the number of Tx Buffer elements
     732             :  * @see CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS()
     733             :  */
     734           1 : #define CAN_MCAN_DT_INST_MRAM_TX_BUFFER_ELEMENTS(inst)                                             \
     735             :         CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(DT_DRV_INST(inst))
     736             : 
     737             : /**
     738             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET(DT_DRV_INST(inst))
     739             :  * @param inst DT_DRV_COMPAT instance number
     740             :  * @return the base offset of standard (11-bit) filter elements in bytes
     741             :  * @see CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET()
     742             :  */
     743           1 : #define CAN_MCAN_DT_INST_MRAM_STD_FILTER_OFFSET(inst)                                              \
     744             :         CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET(DT_DRV_INST(inst))
     745             : 
     746             : /**
     747             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET(DT_DRV_INST(inst))
     748             :  * @param inst DT_DRV_COMPAT instance number
     749             :  * @return the base offset of extended (29-bit) filter elements in bytes
     750             :  * @see CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET()
     751             :  */
     752           1 : #define CAN_MCAN_DT_INST_MRAM_EXT_FILTER_OFFSET(inst)                                              \
     753             :         CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET(DT_DRV_INST(inst))
     754             : 
     755             : /**
     756             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET(DT_DRV_INST(inst))
     757             :  * @param inst DT_DRV_COMPAT instance number
     758             :  * @return the base offset of Rx FIFO 0 elements in bytes
     759             :  * @see CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET()
     760             :  */
     761           1 : #define CAN_MCAN_DT_INST_MRAM_RX_FIFO0_OFFSET(inst)                                                \
     762             :         CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET(DT_DRV_INST(inst))
     763             : 
     764             : /**
     765             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET(DT_DRV_INST(inst))
     766             :  * @param inst DT_DRV_COMPAT instance number
     767             :  * @return the base offset of Rx FIFO 1 elements in bytes
     768             :  * @see CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET()
     769             :  */
     770           1 : #define CAN_MCAN_DT_INST_MRAM_RX_FIFO1_OFFSET(inst)                                                \
     771             :         CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET(DT_DRV_INST(inst))
     772             : 
     773             : /**
     774             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET(DT_DRV_INST(inst))
     775             :  * @param inst DT_DRV_COMPAT instance number
     776             :  * @return the base offset of Rx Buffer elements in bytes
     777             :  * @see CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET()
     778             :  */
     779           1 : #define CAN_MCAN_DT_INST_MRAM_RX_BUFFER_OFFSET(inst)                                               \
     780             :         CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET(DT_DRV_INST(inst))
     781             : 
     782             : /**
     783             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET(DT_DRV_INST(inst))
     784             :  * @param inst DT_DRV_COMPAT instance number
     785             :  * @return the base offset of Tx Event FIFO elements in bytes
     786             :  * @see CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET()
     787             :  */
     788           1 : #define CAN_MCAN_DT_INST_MRAM_TX_EVENT_FIFO_OFFSET(inst)                                           \
     789             :         CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET(DT_DRV_INST(inst))
     790             : 
     791             : /**
     792             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET(DT_DRV_INST(inst))
     793             :  * @param inst DT_DRV_COMPAT instance number
     794             :  * @return the base offset of Tx Buffer elements in bytes
     795             :  * @see CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET()
     796             :  */
     797           1 : #define CAN_MCAN_DT_INST_MRAM_TX_BUFFER_OFFSET(inst)                                               \
     798             :         CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET(DT_DRV_INST(inst))
     799             : 
     800             : /**
     801             :  * @brief Equivalent to CAN_MCAN_DT_MCAN_ADDR(DT_DRV_INST(inst))
     802             :  * @param inst DT_DRV_COMPAT instance number
     803             :  * @return the Bosch M_CAN register base address
     804             :  * @see CAN_MCAN_DT_MRAM_ADDR()
     805             :  */
     806           1 : #define CAN_MCAN_DT_INST_MCAN_ADDR(inst) CAN_MCAN_DT_MCAN_ADDR(DT_DRV_INST(inst))
     807             : 
     808             : /**
     809             :  * @brief Equivalent to CAN_MCAN_DT_MRBA(DT_DRV_INST(inst))
     810             :  * @param inst DT_DRV_COMPAT instance number
     811             :  * @return the Bosch M_CAN Message RAM Base Address (MRBA)
     812             :  * @see CAN_MCAN_DT_MRBA()
     813             :  */
     814           1 : #define CAN_MCAN_DT_INST_MRBA(inst) CAN_MCAN_DT_MRBA(DT_DRV_INST(inst))
     815             : 
     816             : /**
     817             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_ADDR(DT_DRV_INST(inst))
     818             :  * @param inst DT_DRV_COMPAT instance number
     819             :  * @return the Bosch M_CAN Message RAM address
     820             :  * @see CAN_MCAN_DT_MRAM_ADDR()
     821             :  */
     822           1 : #define CAN_MCAN_DT_INST_MRAM_ADDR(inst) CAN_MCAN_DT_MRAM_ADDR(DT_DRV_INST(inst))
     823             : 
     824             : /**
     825             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_SIZE(DT_DRV_INST(inst))
     826             :  * @param inst DT_DRV_COMPAT instance number
     827             :  * @return the Bosch M_CAN Message RAM size in bytes
     828             :  * @see CAN_MCAN_DT_MRAM_SIZE()
     829             :  */
     830           1 : #define CAN_MCAN_DT_INST_MRAM_SIZE(inst) CAN_MCAN_DT_MRAM_SIZE(DT_DRV_INST(inst))
     831             : 
     832             : /**
     833             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(DT_DRV_INST(inst))
     834             :  * @param inst DT_DRV_COMPAT instance number
     835             :  * @return the total size of all Message RAM elements in bytes
     836             :  * @see CAN_MCAN_DT_MRAM_ELEMENTS_SIZE()
     837             :  */
     838           1 : #define CAN_MCAN_DT_INST_MRAM_ELEMENTS_SIZE(inst) CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(DT_DRV_INST(inst))
     839             : 
     840             : /**
     841             :  * @brief Equivalent to CAN_MCAN_DT_MRAM_DEFINE(DT_DRV_INST(inst))
     842             :  * @param inst DT_DRV_COMPAT instance number
     843             :  * @param _name buffer variable name
     844             :  * @see CAN_MCAN_DT_MRAM_DEFINE()
     845             :  */
     846           1 : #define CAN_MCAN_DT_INST_MRAM_DEFINE(inst, _name) CAN_MCAN_DT_MRAM_DEFINE(DT_DRV_INST(inst), _name)
     847             : 
     848             : /**
     849             :  * @brief Bosch M_CAN specific static initializer for a minimum nominal @p can_timing struct
     850             :  */
     851           1 : #define CAN_MCAN_TIMING_MIN_INITIALIZER                                                            \
     852             :         {                                                                                          \
     853             :                 .sjw = 1,                                                                          \
     854             :                 .prop_seg = 0,                                                                     \
     855             :                 .phase_seg1 = 2,                                                                   \
     856             :                 .phase_seg2 = 2,                                                                   \
     857             :                 .prescaler = 1                                                                     \
     858             :         }
     859             : 
     860             : /**
     861             :  * @brief Bosch M_CAN specific static initializer for a maximum nominal @p can_timing struct
     862             :  */
     863           1 : #define CAN_MCAN_TIMING_MAX_INITIALIZER                                                            \
     864             :         {                                                                                          \
     865             :                 .sjw = 128,                                                                        \
     866             :                 .prop_seg = 0,                                                                     \
     867             :                 .phase_seg1 = 256,                                                                 \
     868             :                 .phase_seg2 = 128,                                                                 \
     869             :                 .prescaler = 512                                                                   \
     870             :         }
     871             : 
     872             : /**
     873             :  * @brief Bosch M_CAN specific static initializer for a minimum data phase @p can_timing struct
     874             :  */
     875           1 : #define CAN_MCAN_TIMING_DATA_MIN_INITIALIZER                                                       \
     876             :         {                                                                                          \
     877             :                 .sjw = 1,                                                                          \
     878             :                 .prop_seg = 0,                                                                     \
     879             :                 .phase_seg1 = 1,                                                                   \
     880             :                 .phase_seg2 = 1,                                                                   \
     881             :                 .prescaler = 1                                                                     \
     882             :         }
     883             : 
     884             : /**
     885             :  * @brief Bosch M_CAN specific static initializer for a maximum data phase @p can_timing struct
     886             :  */
     887           1 : #define CAN_MCAN_TIMING_DATA_MAX_INITIALIZER                                                       \
     888             :         {                                                                                          \
     889             :                 .sjw = 16,                                                                         \
     890             :                 .prop_seg = 0,                                                                     \
     891             :                 .phase_seg1 = 32,                                                                  \
     892             :                 .phase_seg2 = 16,                                                                  \
     893             :                 .prescaler = 32                                                                    \
     894             :         }
     895             : 
     896             : /**
     897             :  * @brief Equivalent to CAN_MCAN_DT_BUILD_ASSERT_MRAM_CFG(DT_DRV_INST(inst))
     898             :  * @param inst DT_DRV_COMPAT instance number
     899             :  * @see CAN_MCAN_DT_BUILD_ASSERT_MRAM_CFG()
     900             :  */
     901           1 : #define CAN_MCAN_DT_INST_BUILD_ASSERT_MRAM_CFG(inst)                                               \
     902             :         CAN_MCAN_DT_BUILD_ASSERT_MRAM_CFG(DT_DRV_INST(inst))
     903             : 
     904             : /**
     905             :  * @brief Bosch M_CAN Rx Buffer and FIFO Element header
     906             :  *
     907             :  * See Bosch M_CAN Users Manual section 2.4.2 for details.
     908             :  */
     909           1 : struct can_mcan_rx_fifo_hdr {
     910             :         union {
     911             :                 struct {
     912           0 :                         uint32_t ext_id: 29;
     913           0 :                         uint32_t rtr: 1;
     914           0 :                         uint32_t xtd: 1;
     915           0 :                         uint32_t esi: 1;
     916             :                 };
     917             :                 struct {
     918           0 :                         uint32_t pad1: 18;
     919           0 :                         uint32_t std_id: 11;
     920           0 :                         uint32_t pad2: 3;
     921             :                 };
     922           0 :         };
     923           0 :         uint32_t rxts: 16;
     924           0 :         uint32_t dlc: 4;
     925           0 :         uint32_t brs: 1;
     926           0 :         uint32_t fdf: 1;
     927           0 :         uint32_t res: 2;
     928           0 :         uint32_t fidx: 7;
     929           0 :         uint32_t anmf: 1;
     930             : } __packed __aligned(4);
     931             : 
     932             : /**
     933             :  * @brief Bosch M_CAN Rx Buffer and FIFO Element
     934             :  *
     935             :  * See Bosch M_CAN Users Manual section 2.4.2 for details.
     936             :  */
     937           1 : struct can_mcan_rx_fifo {
     938           0 :         struct can_mcan_rx_fifo_hdr hdr;
     939             :         union {
     940           0 :                 uint8_t data[64];
     941           0 :                 uint32_t data_32[16];
     942           0 :         };
     943             : } __packed __aligned(4);
     944             : 
     945             : /**
     946             :  * @brief Bosch M_CAN Tx Buffer Element header
     947             :  *
     948             :  * See Bosch M_CAN Users Manual section 2.4.3 for details.
     949             :  */
     950           1 : struct can_mcan_tx_buffer_hdr {
     951             :         union {
     952             :                 struct {
     953           0 :                         uint32_t ext_id: 29;
     954           0 :                         uint32_t rtr: 1;
     955           0 :                         uint32_t xtd: 1;
     956           0 :                         uint32_t esi: 1;
     957             :                 };
     958             :                 struct {
     959           0 :                         uint32_t pad1: 18;
     960           0 :                         uint32_t std_id: 11;
     961           0 :                         uint32_t pad2: 3;
     962             :                 };
     963           0 :         };
     964           0 :         uint16_t res1;
     965           0 :         uint8_t dlc: 4;
     966           0 :         uint8_t brs: 1;
     967           0 :         uint8_t fdf: 1;
     968           0 :         uint8_t tsce: 1;
     969           0 :         uint8_t efc: 1;
     970           0 :         uint8_t mm;
     971             : } __packed __aligned(4);
     972             : 
     973             : /**
     974             :  * @brief Bosch M_CAN Tx Buffer Element
     975             :  *
     976             :  * See Bosch M_CAN Users Manual section 2.4.3 for details.
     977             :  */
     978           1 : struct can_mcan_tx_buffer {
     979           0 :         struct can_mcan_tx_buffer_hdr hdr;
     980             :         union {
     981           0 :                 uint8_t data[64];
     982           0 :                 uint32_t data_32[16];
     983           0 :         };
     984             : } __packed __aligned(4);
     985             : 
     986             : /**
     987             :  * @brief Bosch M_CAN Tx Event FIFO Element
     988             :  *
     989             :  * See Bosch M_CAN Users Manual section 2.4.4 for details.
     990             :  */
     991           1 : struct can_mcan_tx_event_fifo {
     992             :         union {
     993             :                 struct {
     994           0 :                         uint32_t ext_id: 29;
     995           0 :                         uint32_t rtr: 1;
     996           0 :                         uint32_t xtd: 1;
     997           0 :                         uint32_t esi: 1;
     998             :                 };
     999             :                 struct {
    1000           0 :                         uint32_t pad1: 18;
    1001           0 :                         uint32_t std_id: 11;
    1002           0 :                         uint32_t pad2: 3;
    1003             :                 };
    1004           0 :         };
    1005           0 :         uint16_t txts;
    1006           0 :         uint8_t dlc: 4;
    1007           0 :         uint8_t brs: 1;
    1008           0 :         uint8_t fdf: 1;
    1009           0 :         uint8_t et: 2;
    1010           0 :         uint8_t mm;
    1011             : } __packed __aligned(4);
    1012             : 
    1013             : /* Bosch M_CAN Standard/Extended Filter Element Configuration (SFEC/EFEC) */
    1014           0 : #define CAN_MCAN_XFEC_DISABLE    0x0
    1015           0 : #define CAN_MCAN_XFEC_FIFO0      0x1
    1016           0 : #define CAN_MCAN_XFEC_FIFO1      0x2
    1017           0 : #define CAN_MCAN_XFEC_REJECT     0x3
    1018           0 : #define CAN_MCAN_XFEC_PRIO       0x4
    1019           0 : #define CAN_MCAN_XFEC_PRIO_FIFO0 0x5
    1020           0 : #define CAN_MCAN_XFEC_PRIO_FIFO1 0x7
    1021             : 
    1022             : /* Bosch M_CAN Standard Filter Type (SFT) */
    1023           0 : #define CAN_MCAN_SFT_RANGE    0x0
    1024           0 : #define CAN_MCAN_SFT_DUAL     0x1
    1025           0 : #define CAN_MCAN_SFT_CLASSIC  0x2
    1026           0 : #define CAN_MCAN_SFT_DISABLED 0x3
    1027             : 
    1028             : /**
    1029             :  * @brief Bosch M_CAN Standard Message ID Filter Element
    1030             :  *
    1031             :  * See Bosch M_CAN Users Manual section 2.4.5 for details.
    1032             :  */
    1033           1 : struct can_mcan_std_filter {
    1034           0 :         uint32_t sfid2: 11;
    1035           0 :         uint32_t res: 5;
    1036           0 :         uint32_t sfid1: 11;
    1037           0 :         uint32_t sfec: 3;
    1038           0 :         uint32_t sft: 2;
    1039             : } __packed __aligned(4);
    1040             : 
    1041             : /* Bosch M_CAN Extended Filter Type (EFT) */
    1042           0 : #define CAN_MCAN_EFT_RANGE_XIDAM 0x0
    1043           0 : #define CAN_MCAN_EFT_DUAL        0x1
    1044           0 : #define CAN_MCAN_EFT_CLASSIC     0x2
    1045           0 : #define CAN_MCAN_EFT_RANGE       0x3
    1046             : 
    1047             : /**
    1048             :  * @brief Bosch M_CAN Extended Message ID Filter Element
    1049             :  *
    1050             :  * See Bosch M_CAN Users Manual section 2.4.6 for details.
    1051             :  */
    1052           1 : struct can_mcan_ext_filter {
    1053           0 :         uint32_t efid1: 29;
    1054           0 :         uint32_t efec: 3;
    1055           0 :         uint32_t efid2: 29;
    1056           0 :         uint32_t esync: 1;
    1057           0 :         uint32_t eft: 2;
    1058             : } __packed __aligned(4);
    1059             : 
    1060             : /**
    1061             :  * @brief Bosch M_CAN driver internal data structure.
    1062             :  */
    1063           1 : struct can_mcan_data {
    1064           0 :         struct can_driver_data common;
    1065           0 :         struct k_mutex lock;
    1066           0 :         struct k_sem tx_sem;
    1067           0 :         struct k_mutex tx_mtx;
    1068           0 :         void *custom;
    1069             : } __aligned(4);
    1070             : 
    1071             : /**
    1072             :  * @brief Bosch M_CAN driver front-end callback for reading a register value
    1073             :  *
    1074             :  * @param dev Pointer to the device structure for the driver instance.
    1075             :  * @param reg Register offset
    1076             :  * @param[out] val Register value
    1077             :  *
    1078             :  * @retval 0 If successful.
    1079             :  * @retval -ENOTSUP Register not supported.
    1080             :  * @retval -EIO General input/output error.
    1081             :  */
    1082           1 : typedef int (*can_mcan_read_reg_t)(const struct device *dev, uint16_t reg, uint32_t *val);
    1083             : 
    1084             : /**
    1085             :  * @brief Bosch M_CAN driver front-end callback for writing a register value
    1086             :  *
    1087             :  * @param dev Pointer to the device structure for the driver instance.
    1088             :  * @param reg Register offset
    1089             :  * @param val Register value
    1090             :  *
    1091             :  * @retval 0 If successful.
    1092             :  * @retval -ENOTSUP Register not supported.
    1093             :  * @retval -EIO General input/output error.
    1094             :  */
    1095           1 : typedef int (*can_mcan_write_reg_t)(const struct device *dev, uint16_t reg, uint32_t val);
    1096             : 
    1097             : /**
    1098             :  * @brief Bosch M_CAN driver front-end callback for reading from Message RAM
    1099             :  *
    1100             :  * @param dev Pointer to the device structure for the driver instance.
    1101             :  * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
    1102             :  *        offset must be 32-bit aligned.
    1103             :  * @param[out] dst Destination for the data read. The destination address must be 32-bit aligned.
    1104             :  * @param len Number of bytes to read. Must be a multiple of 4.
    1105             :  *
    1106             :  * @retval 0 If successful.
    1107             :  * @retval -EIO General input/output error.
    1108             :  */
    1109           1 : typedef int (*can_mcan_read_mram_t)(const struct device *dev, uint16_t offset, void *dst,
    1110             :                                     size_t len);
    1111             : 
    1112             : /**
    1113             :  * @brief Bosch M_CAN driver front-end callback for writing to Message RAM
    1114             :  *
    1115             :  * @param dev Pointer to the device structure for the driver instance.
    1116             :  * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
    1117             :  *        offset must be 32-bit aligned.
    1118             :  * @param src Source for the data to be written. The source address must be 32-bit aligned.
    1119             :  * @param len Number of bytes to write. Must be a multiple of 4.
    1120             :  *
    1121             :  * @retval 0 If successful.
    1122             :  * @retval -EIO General input/output error.
    1123             :  */
    1124           1 : typedef int (*can_mcan_write_mram_t)(const struct device *dev, uint16_t offset, const void *src,
    1125             :                                      size_t len);
    1126             : 
    1127             : /**
    1128             :  * @brief Bosch M_CAN driver front-end callback for clearing Message RAM
    1129             :  *
    1130             :  * Clear Message RAM by writing 0 to all words.
    1131             :  *
    1132             :  * @param dev Pointer to the device structure for the driver instance.
    1133             :  * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
    1134             :  *        offset must be 32-bit aligned.
    1135             :  * @param len Number of bytes to clear. Must be a multiple of 4.
    1136             :  *
    1137             :  * @retval 0 If successful.
    1138             :  * @retval -EIO General input/output error.
    1139             :  */
    1140           1 : typedef int (*can_mcan_clear_mram_t)(const struct device *dev, uint16_t offset, size_t len);
    1141             : 
    1142             : /**
    1143             :  * @brief Bosch M_CAN driver front-end operations.
    1144             :  */
    1145           1 : struct can_mcan_ops {
    1146           0 :         can_mcan_read_reg_t read_reg;
    1147           0 :         can_mcan_write_reg_t write_reg;
    1148           0 :         can_mcan_read_mram_t read_mram;
    1149           0 :         can_mcan_write_mram_t write_mram;
    1150           0 :         can_mcan_clear_mram_t clear_mram;
    1151             : };
    1152             : 
    1153             : /**
    1154             :  * @brief Bosch M_CAN driver internal Tx callback structure.
    1155             :  */
    1156           1 : struct can_mcan_tx_callback {
    1157           0 :         can_tx_callback_t function;
    1158           0 :         void *user_data;
    1159             : };
    1160             : 
    1161             : /**
    1162             :  * @brief Bosch M_CAN driver internal Rx callback structure.
    1163             :  */
    1164           1 : struct can_mcan_rx_callback {
    1165           0 :         can_rx_callback_t function;
    1166           0 :         void *user_data;
    1167             : };
    1168             : 
    1169             : /**
    1170             :  * @brief Bosch M_CAN driver internal Tx + Rx callbacks structure.
    1171             :  */
    1172           1 : struct can_mcan_callbacks {
    1173           0 :         struct can_mcan_tx_callback *tx;
    1174           0 :         struct can_mcan_rx_callback *std;
    1175           0 :         struct can_mcan_rx_callback *ext;
    1176           0 :         uint8_t num_tx;
    1177           0 :         uint8_t num_std;
    1178           0 :         uint8_t num_ext;
    1179             : };
    1180             : 
    1181             : /**
    1182             :  * @brief Define Bosch M_CAN TX and RX callbacks
    1183             :  *
    1184             :  * This macro allows a Bosch M_CAN driver frontend using a fixed Message RAM configuration to limit
    1185             :  * the required software resources (e.g. limit the number of the standard (11-bit) or extended
    1186             :  * (29-bit) filters in use).
    1187             :  *
    1188             :  * Frontend drivers supporting dynamic Message RAM configuration should use @ref
    1189             :  * CAN_MCAN_DT_CALLBACKS_DEFINE() or @ref CAN_MCAN_DT_INST_CALLBACKS_DEFINE() instead.
    1190             :  *
    1191             :  * @param _name callbacks variable name
    1192             :  * @param _tx Number of Tx callbacks
    1193             :  * @param _std Number of standard (11-bit) filter callbacks
    1194             :  * @param _ext Number of extended (29-bit) filter callbacks
    1195             :  * @see CAN_MCAN_DT_CALLBACKS_DEFINE()
    1196             :  */
    1197           1 : #define CAN_MCAN_CALLBACKS_DEFINE(_name, _tx, _std, _ext)                                          \
    1198             :         static struct can_mcan_tx_callback _name##_tx_cbs[_tx];                                    \
    1199             :         static struct can_mcan_rx_callback _name##_std_cbs[_std];                                  \
    1200             :         static struct can_mcan_rx_callback _name##_ext_cbs[_ext];                                  \
    1201             :         static const struct can_mcan_callbacks _name = {                                           \
    1202             :                 .tx = _name##_tx_cbs,                                                              \
    1203             :                 .std = _name##_std_cbs,                                                            \
    1204             :                 .ext = _name##_ext_cbs,                                                            \
    1205             :                 .num_tx = _tx,                                                                     \
    1206             :                 .num_std = _std,                                                                   \
    1207             :                 .num_ext = _ext,                                                                   \
    1208             :         }
    1209             : 
    1210             : /**
    1211             :  * @brief Define Bosch M_CAN TX and RX callbacks
    1212             :  * @param node_id node identifier
    1213             :  * @param _name callbacks variable name
    1214             :  * @see CAN_MCAN_CALLBACKS_DEFINE()
    1215             :  */
    1216           1 : #define CAN_MCAN_DT_CALLBACKS_DEFINE(node_id, _name)                                               \
    1217             :         CAN_MCAN_CALLBACKS_DEFINE(_name, CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(node_id),             \
    1218             :                                   CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(node_id),                   \
    1219             :                                   CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(node_id))
    1220             : 
    1221             : /**
    1222             :  * @brief Equivalent to CAN_MCAN_DT_CALLBACKS_DEFINE(DT_DRV_INST(inst))
    1223             :  * @param inst DT_DRV_COMPAT instance number
    1224             :  * @param _name callbacks variable name
    1225             :  * @see CAN_MCAN_DT_CALLBACKS_DEFINE()
    1226             :  */
    1227           1 : #define CAN_MCAN_DT_INST_CALLBACKS_DEFINE(inst, _name)                                             \
    1228             :         CAN_MCAN_DT_CALLBACKS_DEFINE(DT_DRV_INST(inst), _name)
    1229             : 
    1230             : /**
    1231             :  * @brief Bosch M_CAN driver internal configuration structure.
    1232             :  */
    1233           1 : struct can_mcan_config {
    1234           0 :         const struct can_driver_config common;
    1235           0 :         const struct can_mcan_ops *ops;
    1236           0 :         const struct can_mcan_callbacks *callbacks;
    1237           0 :         uint16_t mram_elements[CAN_MCAN_MRAM_CFG_NUM_CELLS];
    1238           0 :         uint16_t mram_offsets[CAN_MCAN_MRAM_CFG_NUM_CELLS];
    1239           0 :         size_t mram_size;
    1240           0 :         const void *custom;
    1241             : };
    1242             : 
    1243             : /**
    1244             :  * @brief Get an array containing the number of elements in Bosch M_CAN Message RAM
    1245             :  *
    1246             :  * The order of the array entries is given by the @ref CAN_MCAN_MRAM_CFG definitions.
    1247             :  *
    1248             :  * @param node_id node identifier
    1249             :  * @return array of number of elements
    1250             :  */
    1251           1 : #define CAN_MCAN_DT_MRAM_ELEMENTS_GET(node_id)                                                     \
    1252             :         {                                                                                          \
    1253             :                 0, /* offset cell */                                                               \
    1254             :                         CAN_MCAN_DT_MRAM_STD_FILTER_ELEMENTS(node_id),                             \
    1255             :                         CAN_MCAN_DT_MRAM_EXT_FILTER_ELEMENTS(node_id),                             \
    1256             :                         CAN_MCAN_DT_MRAM_RX_FIFO0_ELEMENTS(node_id),                               \
    1257             :                         CAN_MCAN_DT_MRAM_RX_FIFO1_ELEMENTS(node_id),                               \
    1258             :                         CAN_MCAN_DT_MRAM_RX_BUFFER_ELEMENTS(node_id),                              \
    1259             :                         CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_ELEMENTS(node_id),                          \
    1260             :                         CAN_MCAN_DT_MRAM_TX_BUFFER_ELEMENTS(node_id)                               \
    1261             :         }
    1262             : 
    1263             : /**
    1264             :  * @brief Get an array containing the base offsets for element in Bosch M_CAN Message RAM
    1265             :  *
    1266             :  * The order of the array entries is given by the @ref CAN_MCAN_MRAM_CFG definitions.
    1267             :  *
    1268             :  * @param node_id node identifier
    1269             :  * @return array of base offsets for elements
    1270             :  */
    1271           1 : #define CAN_MCAN_DT_MRAM_OFFSETS_GET(node_id)                                                      \
    1272             :         {                                                                                          \
    1273             :                 0, /* offset cell */                                                               \
    1274             :                         CAN_MCAN_DT_MRAM_STD_FILTER_OFFSET(node_id),                               \
    1275             :                         CAN_MCAN_DT_MRAM_EXT_FILTER_OFFSET(node_id),                               \
    1276             :                         CAN_MCAN_DT_MRAM_RX_FIFO0_OFFSET(node_id),                                 \
    1277             :                         CAN_MCAN_DT_MRAM_RX_FIFO1_OFFSET(node_id),                                 \
    1278             :                         CAN_MCAN_DT_MRAM_RX_BUFFER_OFFSET(node_id),                                \
    1279             :                         CAN_MCAN_DT_MRAM_TX_EVENT_FIFO_OFFSET(node_id),                            \
    1280             :                         CAN_MCAN_DT_MRAM_TX_BUFFER_OFFSET(node_id)                                 \
    1281             :         }
    1282             : 
    1283             : /**
    1284             :  * @brief Static initializer for @p can_mcan_config struct
    1285             :  *
    1286             :  * @param node_id Devicetree node identifier
    1287             :  * @param _custom Pointer to custom driver frontend configuration structure
    1288             :  * @param _ops Pointer to front-end @a can_mcan_ops
    1289             :  * @param _cbs Pointer to front-end @a can_mcan_callbacks
    1290             :  */
    1291             : #ifdef CONFIG_CAN_FD_MODE
    1292             : #define CAN_MCAN_DT_CONFIG_GET(node_id, _custom, _ops, _cbs)                                       \
    1293             :         {                                                                                          \
    1294             :                 .common = CAN_DT_DRIVER_CONFIG_GET(node_id, 0, 8000000),                           \
    1295             :                 .ops = _ops,                                                                       \
    1296             :                 .callbacks = _cbs,                                                                 \
    1297             :                 .mram_elements = CAN_MCAN_DT_MRAM_ELEMENTS_GET(node_id),                           \
    1298             :                 .mram_offsets = CAN_MCAN_DT_MRAM_OFFSETS_GET(node_id),                             \
    1299             :                 .mram_size = CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(node_id),                              \
    1300             :                 .custom = _custom,                                                                 \
    1301             :         }
    1302             : #else /* CONFIG_CAN_FD_MODE */
    1303           1 : #define CAN_MCAN_DT_CONFIG_GET(node_id, _custom, _ops, _cbs)                                       \
    1304             :         {                                                                                          \
    1305             :                 .common = CAN_DT_DRIVER_CONFIG_GET(node_id, 0, 1000000),                           \
    1306             :                 .ops = _ops,                                                                       \
    1307             :                 .callbacks = _cbs,                                                                 \
    1308             :                 .mram_elements = CAN_MCAN_DT_MRAM_ELEMENTS_GET(node_id),                           \
    1309             :                 .mram_offsets = CAN_MCAN_DT_MRAM_OFFSETS_GET(node_id),                             \
    1310             :                 .mram_size = CAN_MCAN_DT_MRAM_ELEMENTS_SIZE(node_id),                              \
    1311             :                 .custom = _custom,                                                                 \
    1312             :         }
    1313             : #endif /* !CONFIG_CAN_FD_MODE */
    1314             : 
    1315             : /**
    1316             :  * @brief Static initializer for @p can_mcan_config struct from DT_DRV_COMPAT instance
    1317             :  *
    1318             :  * @param inst DT_DRV_COMPAT instance number
    1319             :  * @param _custom Pointer to custom driver frontend configuration structure
    1320             :  * @param _ops Pointer to front-end @a can_mcan_ops
    1321             :  * @param _cbs Pointer to front-end @a can_mcan_callbacks
    1322             :  * @see CAN_MCAN_DT_CONFIG_GET()
    1323             :  */
    1324           1 : #define CAN_MCAN_DT_CONFIG_INST_GET(inst, _custom, _ops, _cbs)                                     \
    1325             :         CAN_MCAN_DT_CONFIG_GET(DT_DRV_INST(inst), _custom, _ops, _cbs)
    1326             : 
    1327             : /**
    1328             :  * @brief Initializer for a @a can_mcan_data struct
    1329             :  * @param _custom Pointer to custom driver frontend data structure
    1330             :  */
    1331           1 : #define CAN_MCAN_DATA_INITIALIZER(_custom)                                                         \
    1332             :         {                                                                                          \
    1333             :                 .custom = _custom,                                                                 \
    1334             :         }
    1335             : 
    1336             : /**
    1337             :  * @brief Bosch M_CAN driver front-end callback helper for reading a memory mapped register
    1338             :  *
    1339             :  * @param base Register base address
    1340             :  * @param reg Register offset
    1341             :  * @param[out] val Register value
    1342             :  *
    1343             :  * @retval 0 Memory mapped register read always succeeds.
    1344             :  */
    1345           1 : static inline int can_mcan_sys_read_reg(mm_reg_t base, uint16_t reg, uint32_t *val)
    1346             : {
    1347             :         *val = sys_read32(base + reg);
    1348             : 
    1349             :         return 0;
    1350             : }
    1351             : 
    1352             : /**
    1353             :  * @brief Bosch M_CAN driver front-end callback helper for writing a memory mapped register
    1354             :  *
    1355             :  * @param base Register base address
    1356             :  * @param reg Register offset
    1357             :  * @param val Register value
    1358             :  *
    1359             :  * @retval 0 Memory mapped register write always succeeds.
    1360             :  */
    1361           1 : static inline int can_mcan_sys_write_reg(mm_reg_t base, uint16_t reg, uint32_t val)
    1362             : {
    1363             :         sys_write32(val, base + reg);
    1364             : 
    1365             :         return 0;
    1366             : }
    1367             : 
    1368             : /**
    1369             :  * @brief Bosch M_CAN driver front-end callback helper for reading from memory mapped Message RAM
    1370             :  *
    1371             :  * @param base Base address of the Message RAM for the given Bosch M_CAN instance. The base address
    1372             :  *        must be 32-bit aligned.
    1373             :  * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
    1374             :  *        offset must be 32-bit aligned.
    1375             :  * @param[out] dst Destination for the data read. The destination address must be 32-bit aligned.
    1376             :  * @param len Number of bytes to read. Must be a multiple of 4.
    1377             :  *
    1378             :  * @retval 0 If successful.
    1379             :  * @retval -EIO General input/output error.
    1380             :  */
    1381           1 : static inline int can_mcan_sys_read_mram(mem_addr_t base, uint16_t offset, void *dst, size_t len)
    1382             : {
    1383             :         volatile uint32_t *src32 = (volatile uint32_t *)(base + offset);
    1384             :         uint32_t *dst32 = (uint32_t *)dst;
    1385             :         size_t len32 = len / sizeof(uint32_t);
    1386             : 
    1387             :         __ASSERT(base % 4U == 0U, "base must be a multiple of 4");
    1388             :         __ASSERT(offset % 4U == 0U, "offset must be a multiple of 4");
    1389             :         __ASSERT(POINTER_TO_UINT(dst) % 4U == 0U, "dst must be 32-bit aligned");
    1390             :         __ASSERT(len % 4U == 0U, "len must be a multiple of 4");
    1391             : 
    1392             : #if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
    1393             :         int err;
    1394             : 
    1395             :         err = sys_cache_data_invd_range((void *)(base + offset), len);
    1396             :         if (err != 0) {
    1397             :                 return err;
    1398             :         }
    1399             : #endif /* !defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
    1400             : 
    1401             :         while (len32-- > 0) {
    1402             :                 *dst32++ = *src32++;
    1403             :         }
    1404             : 
    1405             :         return 0;
    1406             : }
    1407             : 
    1408             : /**
    1409             :  * @brief Bosch M_CAN driver front-end callback helper for writing to memory mapped Message RAM
    1410             :  *
    1411             :  * @param base Base address of the Message RAM for the given Bosch M_CAN instance. The base address
    1412             :  *        must be 32-bit aligned.
    1413             :  * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
    1414             :  *        offset must be 32-bit aligned.
    1415             :  * @param src Source for the data to be written. The source address must be 32-bit aligned.
    1416             :  * @param len Number of bytes to write. Must be a multiple of 4.
    1417             :  *
    1418             :  * @retval 0 If successful.
    1419             :  * @retval -EIO General input/output error.
    1420             :  */
    1421           1 : static inline int can_mcan_sys_write_mram(mem_addr_t base, uint16_t offset, const void *src,
    1422             :                                           size_t len)
    1423             : {
    1424             :         volatile uint32_t *dst32 = (volatile uint32_t *)(base + offset);
    1425             :         const uint32_t *src32 = (const uint32_t *)src;
    1426             :         size_t len32 = len / sizeof(uint32_t);
    1427             : 
    1428             :         __ASSERT(base % 4U == 0U, "base must be a multiple of 4");
    1429             :         __ASSERT(offset % 4U == 0U, "offset must be a multiple of 4");
    1430             :         __ASSERT(POINTER_TO_UINT(src) % 4U == 0U, "src must be 32-bit aligned");
    1431             :         __ASSERT(len % 4U == 0U, "len must be a multiple of 4");
    1432             : 
    1433             :         while (len32-- > 0) {
    1434             :                 *dst32++ = *src32++;
    1435             :         }
    1436             : 
    1437             : #if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
    1438             :         return sys_cache_data_flush_range((void *)(base + offset), len);
    1439             : #else /* defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
    1440             :         return 0;
    1441             : #endif /* !defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
    1442             : }
    1443             : 
    1444             : /**
    1445             :  * @brief Bosch M_CAN driver front-end callback helper for clearing memory mapped Message RAM
    1446             :  *
    1447             :  * Clear Message RAM by writing 0 to all words.
    1448             :  *
    1449             :  * @param base Base address of the Message RAM for the given Bosch M_CAN instance. The base address
    1450             :  *        must be 32-bit aligned.
    1451             :  * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
    1452             :  *        offset must be 32-bit aligned.
    1453             :  * @param len Number of bytes to clear. Must be a multiple of 4.
    1454             :  *
    1455             :  * @retval 0 If successful.
    1456             :  * @retval -EIO General input/output error.
    1457             :  */
    1458           1 : static inline int can_mcan_sys_clear_mram(mem_addr_t base, uint16_t offset, size_t len)
    1459             : {
    1460             :         volatile uint32_t *dst32 = (volatile uint32_t *)(base + offset);
    1461             :         size_t len32 = len / sizeof(uint32_t);
    1462             : 
    1463             :         __ASSERT(base % 4U == 0U, "base must be a multiple of 4");
    1464             :         __ASSERT(offset % 4U == 0U, "offset must be a multiple of 4");
    1465             :         __ASSERT(len % 4U == 0U, "len must be a multiple of 4");
    1466             : 
    1467             :         while (len32-- > 0) {
    1468             :                 *dst32++ = 0U;
    1469             :         }
    1470             : 
    1471             : #if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
    1472             :         return sys_cache_data_flush_range((void *)(base + offset), len);
    1473             : #else /* defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
    1474             :         return 0;
    1475             : #endif /* !defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
    1476             : }
    1477             : 
    1478             : /**
    1479             :  * @brief Read a Bosch M_CAN register
    1480             :  *
    1481             :  * @param dev Pointer to the device structure for the driver instance.
    1482             :  * @param reg Register offset
    1483             :  * @param[out] val Register value
    1484             :  *
    1485             :  * @retval 0 If successful.
    1486             :  * @retval -ENOTSUP Register not supported.
    1487             :  * @retval -EIO General input/output error.
    1488             :  */
    1489           1 : int can_mcan_read_reg(const struct device *dev, uint16_t reg, uint32_t *val);
    1490             : 
    1491             : /**
    1492             :  * @brief Write a Bosch M_CAN register
    1493             :  *
    1494             :  * @param dev Pointer to the device structure for the driver instance.
    1495             :  * @param reg Register offset
    1496             :  * @param val Register value
    1497             :  *
    1498             :  * @retval 0 If successful.
    1499             :  * @retval -ENOTSUP Register not supported.
    1500             :  * @retval -EIO General input/output error.
    1501             :  */
    1502           1 : int can_mcan_write_reg(const struct device *dev, uint16_t reg, uint32_t val);
    1503             : 
    1504             : /**
    1505             :  * @brief Read from Bosch M_CAN Message RAM
    1506             :  *
    1507             :  * @param dev Pointer to the device structure for the driver instance.
    1508             :  * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
    1509             :  *        offset must be 32-bit aligned.
    1510             :  * @param[out] dst Destination for the data read.
    1511             :  * @param len Number of bytes to read. Must be a multiple of 4.
    1512             :  *
    1513             :  * @retval 0 If successful.
    1514             :  * @retval -EIO General input/output error.
    1515             :  */
    1516           1 : static inline int can_mcan_read_mram(const struct device *dev, uint16_t offset, void *dst,
    1517             :                                      size_t len)
    1518             : {
    1519             :         const struct can_mcan_config *config = dev->config;
    1520             : 
    1521             :         return config->ops->read_mram(dev, offset, dst, len);
    1522             : }
    1523             : 
    1524             : /**
    1525             :  * @brief Write to Bosch M_CAN Message RAM
    1526             :  *
    1527             :  * @param dev Pointer to the device structure for the driver instance.
    1528             :  * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
    1529             :  *        offset must be 32-bit aligned.
    1530             :  * @param src Source for the data to be written
    1531             :  * @param len Number of bytes to write. Must be a multiple of 4.
    1532             :  *
    1533             :  * @retval 0 If successful.
    1534             :  * @retval -EIO General input/output error.
    1535             :  */
    1536           1 : static inline int can_mcan_write_mram(const struct device *dev, uint16_t offset, const void *src,
    1537             :                                       size_t len)
    1538             : {
    1539             :         const struct can_mcan_config *config = dev->config;
    1540             : 
    1541             :         return config->ops->write_mram(dev, offset, src, len);
    1542             : }
    1543             : 
    1544             : /**
    1545             :  * @brief Clear Bosch M_CAN Message RAM
    1546             :  *
    1547             :  * Clear Message RAM by writing 0 to all words.
    1548             :  *
    1549             :  * @param dev Pointer to the device structure for the driver instance.
    1550             :  * @param offset Offset from the start of the Message RAM for the given Bosch M_CAN instance. The
    1551             :  *        offset must be 32-bit aligned.
    1552             :  * @param len Number of bytes to clear. Must be a multiple of 4.
    1553             :  *
    1554             :  * @retval 0 If successful.
    1555             :  * @retval -EIO General input/output error.
    1556             :  */
    1557           1 : static inline int can_mcan_clear_mram(const struct device *dev, uint16_t offset, size_t len)
    1558             : {
    1559             :         const struct can_mcan_config *config = dev->config;
    1560             : 
    1561             :         return config->ops->clear_mram(dev, offset, len);
    1562             : }
    1563             : 
    1564             : /**
    1565             :  * @brief Configure Bosch M_MCAN Message RAM start addresses.
    1566             :  *
    1567             :  * Bosch M_CAN driver front-end callback helper function for configuring the start addresses of the
    1568             :  * Bosch M_CAN Rx FIFO0 (RXFOC), Rx FIFO1 (RXF1C), Rx Buffer (RXBCC), Tx Buffer (TXBC), and Tx Event
    1569             :  * FIFO (TXEFC) in Message RAM.
    1570             :  *
    1571             :  * The start addresses (containing bits 15:2 since Bosch M_CAN message RAM is accessed as 32 bit
    1572             :  * words) are calculated relative to the provided Message RAM Base Address (mrba).
    1573             :  *
    1574             :  * Some Bosch M_CAN implementations use a fixed Message RAM configuration, other use a fixed memory
    1575             :  * area and relative addressing, others again have custom registers for configuring the Message
    1576             :  * RAM. It is the responsibility of the front-end driver to call this function during driver
    1577             :  * initialization as needed.
    1578             :  *
    1579             :  * @param dev Pointer to the device structure for the driver instance.
    1580             :  * @param mrba Message RAM Base Address.
    1581             :  * @param mram Message RAM Address.
    1582             :  *
    1583             :  * @retval 0 If successful.
    1584             :  * @retval -EIO General input/output error.
    1585             :  */
    1586           1 : int can_mcan_configure_mram(const struct device *dev, uintptr_t mrba, uintptr_t mram);
    1587             : 
    1588             : /**
    1589             :  * @brief Bosch M_CAN driver initialization callback.
    1590             :  *
    1591             :  * @param dev Pointer to the device structure for the driver instance.
    1592             :  */
    1593           1 : int can_mcan_init(const struct device *dev);
    1594             : 
    1595             : /**
    1596             :  * @brief Bosch M_CAN driver m_can_int0 IRQ handler.
    1597             :  *
    1598             :  * @param dev Pointer to the device structure for the driver instance.
    1599             :  */
    1600           1 : void can_mcan_line_0_isr(const struct device *dev);
    1601             : 
    1602             : /**
    1603             :  * @brief Bosch M_CAN driver m_can_int1 IRQ handler.
    1604             :  *
    1605             :  * @param dev Pointer to the device structure for the driver instance.
    1606             :  */
    1607           1 : void can_mcan_line_1_isr(const struct device *dev);
    1608             : 
    1609             : /**
    1610             :  * @brief Enable Bosch M_CAN configuration change.
    1611             :  *
    1612             :  * @param dev Pointer to the device structure for the driver instance.
    1613             :  */
    1614           1 : void can_mcan_enable_configuration_change(const struct device *dev);
    1615             : 
    1616             : /**
    1617             :  * @brief Bosch M_CAN driver callback API upon getting CAN controller capabilities
    1618             :  * See @a can_get_capabilities() for argument description
    1619             :  */
    1620           1 : int can_mcan_get_capabilities(const struct device *dev, can_mode_t *cap);
    1621             : 
    1622             : /**
    1623             :  * @brief Bosch M_CAN driver callback API upon starting CAN controller
    1624             :  * See @a can_start() for argument description
    1625             :  */
    1626           1 : int can_mcan_start(const struct device *dev);
    1627             : 
    1628             : /**
    1629             :  * @brief Bosch M_CAN driver callback API upon stopping CAN controller
    1630             :  * See @a can_stop() for argument description
    1631             :  */
    1632           1 : int can_mcan_stop(const struct device *dev);
    1633             : 
    1634             : /**
    1635             :  * @brief Bosch M_CAN driver callback API upon setting CAN controller mode
    1636             :  * See @a can_set_mode() for argument description
    1637             :  */
    1638           1 : int can_mcan_set_mode(const struct device *dev, can_mode_t mode);
    1639             : 
    1640             : /**
    1641             :  * @brief Bosch M_CAN driver callback API upon setting CAN bus timing
    1642             :  * See @a can_set_timing() for argument description
    1643             :  */
    1644           1 : int can_mcan_set_timing(const struct device *dev, const struct can_timing *timing);
    1645             : 
    1646             : /**
    1647             :  * @brief Bosch M_CAN driver callback API upon setting CAN bus data phase timing
    1648             :  * See @a can_set_timing_data() for argument description
    1649             :  */
    1650           1 : int can_mcan_set_timing_data(const struct device *dev, const struct can_timing *timing_data);
    1651             : 
    1652             : #ifdef CONFIG_CAN_MANUAL_RECOVERY_MODE
    1653             : /**
    1654             :  * @brief Bosch M_CAN driver callback API upon recovering the CAN bus
    1655             :  * See @a can_recover() for argument description
    1656             :  */
    1657             : int can_mcan_recover(const struct device *dev, k_timeout_t timeout);
    1658             : #endif /* CONFIG_CAN_MANUAL_RECOVERY_MODE */
    1659             : 
    1660           0 : int can_mcan_send(const struct device *dev, const struct can_frame *frame, k_timeout_t timeout,
    1661             :                   can_tx_callback_t callback, void *user_data);
    1662             : 
    1663           0 : int can_mcan_get_max_filters(const struct device *dev, bool ide);
    1664             : 
    1665             : /**
    1666             :  * @brief Bosch M_CAN driver callback API upon adding an RX filter
    1667             :  * See @a can_add_rx_callback() for argument description
    1668             :  */
    1669           1 : int can_mcan_add_rx_filter(const struct device *dev, can_rx_callback_t callback, void *user_data,
    1670             :                            const struct can_filter *filter);
    1671             : 
    1672             : /**
    1673             :  * @brief Bosch M_CAN driver callback API upon removing an RX filter
    1674             :  * See @a can_remove_rx_filter() for argument description
    1675             :  */
    1676           1 : void can_mcan_remove_rx_filter(const struct device *dev, int filter_id);
    1677             : 
    1678             : /**
    1679             :  * @brief Bosch M_CAN driver callback API upon getting the CAN controller state
    1680             :  * See @a can_get_state() for argument description
    1681             :  */
    1682           1 : int can_mcan_get_state(const struct device *dev, enum can_state *state,
    1683             :                        struct can_bus_err_cnt *err_cnt);
    1684             : 
    1685             : /**
    1686             :  * @brief Bosch M_CAN driver callback API upon setting a state change callback
    1687             :  * See @a can_set_state_change_callback() for argument description
    1688             :  */
    1689           1 : void can_mcan_set_state_change_callback(const struct device *dev,
    1690             :                                         can_state_change_callback_t callback, void *user_data);
    1691             : 
    1692             : #endif /* ZEPHYR_INCLUDE_DRIVERS_CAN_CAN_MCAN_H_ */

Generated by: LCOV version 1.14