Skip to content

Commit 5b3712a

Browse files
henrikbrixandersencarlescufi
authored andcommitted
drivers: can: mcan: refactor to get rid of wrapper functions
Refactor the Bosch M_CAN shared driver functions to get rid of the front-end driver wrapper functions. This requires flipping the relationship between shared config/data structs and front-end config/data structs. Front-end drivers can now store a pointer to their custom config/data structs in the .custom fields of the can_mcan_config and can_mcan_data data structures. Signed-off-by: Henrik Brix Andersen <[email protected]>
1 parent 7ea0951 commit 5b3712a

File tree

7 files changed

+303
-706
lines changed

7 files changed

+303
-706
lines changed

drivers/can/can_mcan.c

Lines changed: 78 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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

Comments
 (0)