11/*
2+ * Copyright (c) 2022 Vestas Wind Systems A/S
23 * Copyright (c) 2020 Alexander Wachter
34 *
45 * SPDX-License-Identifier: Apache-2.0
@@ -120,7 +121,7 @@ static int can_leave_init_mode(struct can_mcan_reg *can, k_timeout_t timeout)
120121 return 0 ;
121122}
122123
123- void can_mcan_configure_timing (struct can_mcan_reg * can ,
124+ void can_mcan_configure_timing (struct can_mcan_reg * can ,
124125 const struct can_timing * timing ,
125126 const struct can_timing * timing_data )
126127{
@@ -183,10 +184,11 @@ void can_mcan_configure_timing(struct can_mcan_reg *can,
183184#endif
184185}
185186
186- int can_mcan_set_timing (const struct can_mcan_config * cfg ,
187+ int can_mcan_set_timing (const struct device * dev ,
187188 const struct can_timing * timing ,
188189 const struct can_timing * timing_data )
189190{
191+ const struct can_mcan_config * cfg = dev -> config ;
190192 struct can_mcan_reg * can = cfg -> can ;
191193 int ret ;
192194
@@ -210,8 +212,9 @@ int can_mcan_set_timing(const struct can_mcan_config *cfg,
210212 return 0 ;
211213}
212214
213- int can_mcan_set_mode (const struct can_mcan_config * cfg , enum can_mode mode )
215+ int can_mcan_set_mode (const struct device * dev , enum can_mode mode )
214216{
217+ const struct can_mcan_config * cfg = dev -> config ;
215218 struct can_mcan_reg * can = cfg -> can ;
216219 int ret ;
217220
@@ -279,18 +282,18 @@ int can_mcan_set_mode(const struct can_mcan_config *cfg, enum can_mode mode)
279282 return 0 ;
280283}
281284
282- int can_mcan_init (const struct device * dev , const struct can_mcan_config * cfg ,
283- struct can_mcan_msg_sram * msg_ram ,
284- struct can_mcan_data * data )
285+ int can_mcan_init (const struct device * dev )
285286{
286- struct can_mcan_reg * can = cfg -> can ;
287+ const struct can_mcan_config * cfg = dev -> config ;
288+ struct can_mcan_data * data = dev -> data ;
289+ struct can_mcan_reg * can = cfg -> can ;
290+ struct can_mcan_msg_sram * msg_ram = data -> msg_ram ;
287291 struct can_timing timing ;
288292#ifdef CONFIG_CAN_FD_MODE
289293 struct can_timing timing_data ;
290294#endif
291295 int ret ;
292296
293- data -> dev = dev ;
294297 k_mutex_init (& data -> inst_mutex );
295298 k_mutex_init (& data -> tx_mtx );
296299 k_sem_init (& data -> tx_sem , NUM_TX_BUF_ELEMENTS , NUM_TX_BUF_ELEMENTS );
@@ -495,25 +498,27 @@ int can_mcan_init(const struct device *dev, const struct can_mcan_config *cfg,
495498 return ret ;
496499}
497500
498- static void can_mcan_state_change_handler (const struct can_mcan_config * cfg ,
499- struct can_mcan_data * data )
501+ static void can_mcan_state_change_handler (const struct device * dev )
500502{
501- enum can_state state ;
502- struct can_bus_err_cnt err_cnt ;
503+ struct can_mcan_data * data = dev -> data ;
503504 const can_state_change_callback_t cb = data -> state_change_cb ;
504505 void * cb_data = data -> state_change_cb_data ;
506+ struct can_bus_err_cnt err_cnt ;
507+ enum can_state state ;
505508
506- (void )can_mcan_get_state (cfg , & state , & err_cnt );
509+ (void )can_mcan_get_state (dev , & state , & err_cnt );
507510
508511 if (cb != NULL ) {
509- cb (data -> dev , state , err_cnt , cb_data );
512+ cb (dev , state , err_cnt , cb_data );
510513 }
511514}
512515
513- static void can_mcan_tc_event_handler (struct can_mcan_reg * can ,
514- struct can_mcan_msg_sram * msg_ram ,
515- struct can_mcan_data * data )
516+ static void can_mcan_tc_event_handler (const struct device * dev )
516517{
518+ const struct can_mcan_config * cfg = dev -> config ;
519+ struct can_mcan_data * data = dev -> data ;
520+ struct can_mcan_reg * can = cfg -> can ;
521+ struct can_mcan_msg_sram * msg_ram = data -> msg_ram ;
517522 volatile struct can_mcan_tx_event_fifo * tx_event ;
518523 can_tx_callback_t tx_cb ;
519524 uint32_t event_idx , tx_idx ;
@@ -534,28 +539,28 @@ static void can_mcan_tc_event_handler(struct can_mcan_reg *can,
534539 if (tx_cb == NULL ) {
535540 k_sem_give (& data -> tx_fin_sem [tx_idx ]);
536541 } else {
537- tx_cb (data -> dev , 0 , data -> tx_fin_cb_arg [tx_idx ]);
542+ tx_cb (dev , 0 , data -> tx_fin_cb_arg [tx_idx ]);
538543 }
539544 }
540545}
541546
542- void can_mcan_line_0_isr (const struct can_mcan_config * cfg ,
543- struct can_mcan_msg_sram * msg_ram ,
544- struct can_mcan_data * data )
547+ void can_mcan_line_0_isr (const struct device * dev )
545548{
549+ const struct can_mcan_config * cfg = dev -> config ;
550+ struct can_mcan_data * data = dev -> data ;
546551 struct can_mcan_reg * can = cfg -> can ;
547552
548553 do {
549554 if (can -> ir & (CAN_MCAN_IR_BO | CAN_MCAN_IR_EP |
550555 CAN_MCAN_IR_EW )) {
551556 can -> ir = CAN_MCAN_IR_BO | CAN_MCAN_IR_EP |
552557 CAN_MCAN_IR_EW ;
553- can_mcan_state_change_handler (cfg , data );
558+ can_mcan_state_change_handler (dev );
554559 }
555560 /* TX event FIFO new entry */
556561 if (can -> ir & CAN_MCAN_IR_TEFN ) {
557562 can -> ir = CAN_MCAN_IR_TEFN ;
558- can_mcan_tc_event_handler (can , msg_ram , data );
563+ can_mcan_tc_event_handler (dev );
559564 }
560565
561566 if (can -> ir & CAN_MCAN_IR_TEFL ) {
@@ -578,11 +583,12 @@ void can_mcan_line_0_isr(const struct can_mcan_config *cfg,
578583 CAN_MCAN_IR_TEFL | CAN_MCAN_IR_TEFN ));
579584}
580585
581- static void can_mcan_get_message (struct can_mcan_data * data ,
586+ static void can_mcan_get_message (const struct device * dev ,
582587 volatile struct can_mcan_rx_fifo * fifo ,
583588 volatile uint32_t * fifo_status_reg ,
584589 volatile uint32_t * fifo_ack_reg )
585590{
591+ struct can_mcan_data * data = dev -> data ;
586592 uint32_t get_idx , filt_idx ;
587593 struct zcan_frame frame ;
588594 can_rx_callback_t cb ;
@@ -647,7 +653,7 @@ static void can_mcan_get_message(struct can_mcan_data *data,
647653 }
648654
649655 if (cb ) {
650- cb (data -> dev , & frame , cb_arg );
656+ cb (dev , & frame , cb_arg );
651657 } else {
652658 LOG_DBG ("cb missing" );
653659 }
@@ -659,24 +665,25 @@ static void can_mcan_get_message(struct can_mcan_data *data,
659665 }
660666}
661667
662- void can_mcan_line_1_isr (const struct can_mcan_config * cfg ,
663- struct can_mcan_msg_sram * msg_ram ,
664- struct can_mcan_data * data )
668+ void can_mcan_line_1_isr (const struct device * dev )
665669{
670+ const struct can_mcan_config * cfg = dev -> config ;
671+ struct can_mcan_data * data = dev -> data ;
666672 struct can_mcan_reg * can = cfg -> can ;
673+ struct can_mcan_msg_sram * msg_ram = data -> msg_ram ;
667674
668675 do {
669676 if (can -> ir & CAN_MCAN_IR_RF0N ) {
670677 can -> ir = CAN_MCAN_IR_RF0N ;
671678 LOG_DBG ("RX FIFO0 INT" );
672- can_mcan_get_message (data , msg_ram -> rx_fifo0 ,
679+ can_mcan_get_message (dev , msg_ram -> rx_fifo0 ,
673680 & can -> rxf0s , & can -> rxf0a );
674681 }
675682
676683 if (can -> ir & CAN_MCAN_IR_RF1N ) {
677684 can -> ir = CAN_MCAN_IR_RF1N ;
678685 LOG_DBG ("RX FIFO1 INT" );
679- can_mcan_get_message (data , msg_ram -> rx_fifo1 ,
686+ can_mcan_get_message (dev , msg_ram -> rx_fifo1 ,
680687 & can -> rxf1s , & can -> rxf1a );
681688 }
682689
@@ -694,9 +701,10 @@ void can_mcan_line_1_isr(const struct can_mcan_config *cfg,
694701 CAN_MCAN_IR_RF0L | CAN_MCAN_IR_RF1L ));
695702}
696703
697- int can_mcan_get_state (const struct can_mcan_config * cfg , enum can_state * state ,
704+ int can_mcan_get_state (const struct device * dev , enum can_state * state ,
698705 struct can_bus_err_cnt * err_cnt )
699706{
707+ const struct can_mcan_config * cfg = dev -> config ;
700708 struct can_mcan_reg * can = cfg -> can ;
701709
702710 if (state != NULL ) {
@@ -723,23 +731,25 @@ int can_mcan_get_state(const struct can_mcan_config *cfg, enum can_state *state,
723731}
724732
725733#ifndef CONFIG_CAN_AUTO_BUS_OFF_RECOVERY
726- int can_mcan_recover (const struct can_mcan_config * cfg , k_timeout_t timeout )
734+ int can_mcan_recover (const struct device * dev , k_timeout_t timeout )
727735{
736+ const struct can_mcan_config * cfg = dev -> config ;
728737 struct can_mcan_reg * can = cfg -> can ;
729738
730739 return can_leave_init_mode (can , timeout );
731740}
732741#endif /* CONFIG_CAN_AUTO_BUS_OFF_RECOVERY */
733742
734743
735- int can_mcan_send (const struct can_mcan_config * cfg ,
736- struct can_mcan_data * data ,
737- struct can_mcan_msg_sram * msg_ram ,
744+ int can_mcan_send (const struct device * dev ,
738745 const struct zcan_frame * frame ,
739746 k_timeout_t timeout ,
740747 can_tx_callback_t callback , void * user_data )
741748{
742- struct can_mcan_reg * can = cfg -> can ;
749+ const struct can_mcan_config * cfg = dev -> config ;
750+ struct can_mcan_data * data = dev -> data ;
751+ struct can_mcan_reg * can = cfg -> can ;
752+ struct can_mcan_msg_sram * msg_ram = data -> msg_ram ;
743753 size_t data_length = can_dlc_to_bytes (frame -> dlc );
744754 struct can_mcan_tx_buffer_hdr tx_hdr = {
745755 .rtr = frame -> rtr == CAN_REMOTEREQUEST ,
@@ -850,11 +860,12 @@ int can_mcan_get_max_filters(const struct device *dev, enum can_ide id_type)
850860 * Dual mode gets tricky, because we can only activate both filters.
851861 * If one of the IDs is not used anymore, we would need to mark it as unused.
852862 */
853- int can_mcan_add_rx_filter_std (struct can_mcan_data * data ,
854- struct can_mcan_msg_sram * msg_ram ,
863+ int can_mcan_add_rx_filter_std (const struct device * dev ,
855864 can_rx_callback_t callback , void * user_data ,
856865 const struct zcan_filter * filter )
857866{
867+ struct can_mcan_data * data = dev -> data ;
868+ struct can_mcan_msg_sram * msg_ram = data -> msg_ram ;
858869 struct can_mcan_std_filter filter_element = {
859870 .id1 = filter -> id ,
860871 .id2 = filter -> id_mask ,
@@ -912,11 +923,12 @@ static int can_mcan_get_free_ext(volatile struct can_mcan_ext_filter *filters)
912923 return - ENOSPC ;
913924}
914925
915- static int can_mcan_add_rx_filter_ext (struct can_mcan_data * data ,
916- struct can_mcan_msg_sram * msg_ram ,
926+ static int can_mcan_add_rx_filter_ext (const struct device * dev ,
917927 can_rx_callback_t callback , void * user_data ,
918928 const struct zcan_filter * filter )
919929{
930+ struct can_mcan_data * data = dev -> data ;
931+ struct can_mcan_msg_sram * msg_ram = data -> msg_ram ;
920932 struct can_mcan_ext_filter filter_element = {
921933 .id2 = filter -> id_mask ,
922934 .id1 = filter -> id ,
@@ -963,8 +975,7 @@ static int can_mcan_add_rx_filter_ext(struct can_mcan_data *data,
963975 return filter_id ;
964976}
965977
966- int can_mcan_add_rx_filter (struct can_mcan_data * data ,
967- struct can_mcan_msg_sram * msg_ram ,
978+ int can_mcan_add_rx_filter (const struct device * dev ,
968979 can_rx_callback_t callback , void * user_data ,
969980 const struct zcan_filter * filter )
970981{
@@ -975,11 +986,9 @@ int can_mcan_add_rx_filter(struct can_mcan_data *data,
975986 }
976987
977988 if (filter -> id_type == CAN_STANDARD_IDENTIFIER ) {
978- filter_id = can_mcan_add_rx_filter_std (data , msg_ram , callback ,
979- user_data , filter );
989+ filter_id = can_mcan_add_rx_filter_std (dev , callback , user_data , filter );
980990 } else {
981- filter_id = can_mcan_add_rx_filter_ext (data , msg_ram , callback ,
982- user_data , filter );
991+ filter_id = can_mcan_add_rx_filter_ext (dev , callback , user_data , filter );
983992 if (filter_id >= 0 ) {
984993 filter_id += NUM_STD_FILTER_DATA ;
985994 }
@@ -988,9 +997,11 @@ int can_mcan_add_rx_filter(struct can_mcan_data *data,
988997 return filter_id ;
989998}
990999
991- void can_mcan_remove_rx_filter (struct can_mcan_data * data ,
992- struct can_mcan_msg_sram * msg_ram , int filter_id )
1000+ void can_mcan_remove_rx_filter (const struct device * dev , int filter_id )
9931001{
1002+ struct can_mcan_data * data = dev -> data ;
1003+ struct can_mcan_msg_sram * msg_ram = data -> msg_ram ;
1004+
9941005 k_mutex_lock (& data -> inst_mutex , K_FOREVER );
9951006 if (filter_id >= NUM_STD_FILTER_DATA ) {
9961007 filter_id -= NUM_STD_FILTER_DATA ;
@@ -1012,3 +1023,22 @@ void can_mcan_remove_rx_filter(struct can_mcan_data *data,
10121023
10131024 k_mutex_unlock (& data -> inst_mutex );
10141025}
1026+
1027+ void can_mcan_set_state_change_callback (const struct device * dev ,
1028+ can_state_change_callback_t callback ,
1029+ void * user_data )
1030+ {
1031+ struct can_mcan_data * data = dev -> data ;
1032+
1033+ data -> state_change_cb = callback ;
1034+ data -> state_change_cb_data = user_data ;
1035+ }
1036+
1037+ int can_mcan_get_max_bitrate (const struct device * dev , uint32_t * max_bitrate )
1038+ {
1039+ const struct can_mcan_config * cfg = dev -> config ;
1040+
1041+ * max_bitrate = cfg -> max_bitrate ;
1042+
1043+ return 0 ;
1044+ }
0 commit comments