1 /*
2 * Copyright (c) 2024 Renesas Electronics Corporation
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6 #include <soc.h>
7 #include <zephyr/logging/log.h>
8 #include <zephyr/drivers/clock_control/renesas_ra_cgc.h>
9 #include <zephyr/drivers/pinctrl.h>
10 #include <zephyr/drivers/can.h>
11 #include <zephyr/drivers/can/transceiver.h>
12 #include "r_can_api.h"
13 #include "r_canfd.h"
14
15 LOG_MODULE_REGISTER(can_renesas_ra, CONFIG_CAN_LOG_LEVEL);
16
17 #define DT_DRV_COMPAT renesas_ra_canfd
18
19 #define CAN_RENESAS_RA_TIMING_MAX \
20 { \
21 .sjw = 128, \
22 .prop_seg = 1, \
23 .phase_seg1 = 255, \
24 .phase_seg2 = 128, \
25 .prescaler = 1024, \
26 }
27
28 #define CAN_RENESAS_RA_TIMING_MIN \
29 { \
30 .sjw = 1, \
31 .prop_seg = 1, \
32 .phase_seg1 = 2, \
33 .phase_seg2 = 2, \
34 .prescaler = 1, \
35 }
36
37 #ifdef CONFIG_CAN_FD_MODE
38 #define CAN_RENESAS_RA_TIMING_DATA_MAX \
39 { \
40 .sjw = 16, \
41 .prop_seg = 1, \
42 .phase_seg1 = 31, \
43 .phase_seg2 = 16, \
44 .prescaler = 128, \
45 }
46 #define CAN_RENESAS_RA_TIMING_DATA_MIN \
47 { \
48 .sjw = 1, \
49 .prop_seg = 1, \
50 .phase_seg1 = 2, \
51 .phase_seg2 = 2, \
52 .prescaler = 1, \
53 }
54 #endif
55
56 /* This frame ID will be reserved. Any filter using this ID may cause undefined behavior. */
57 #define CAN_RENESAS_RA_RESERVED_ID (CAN_EXT_ID_MASK)
58
59 /*
60 * Common FIFO configuration: refer to '34.2.28 CFDCFCC : Common FIFO Configuration/Control
61 * Register' - RA8M1 MCU group HWM
62 */
63 #define CANFD_CFG_COMMONFIFO0 (0U << R_CANFD_CFDCFCC_CFE_Pos) /* Common FIFO Disable */
64
65 #define CANFD_CFG_COMMONFIFO {CANFD_CFG_COMMONFIFO0}
66
67 /*
68 * RX FIFO configuration: refer to '34.2.25 CFDRFCCa : RX FIFO Configuration/Control Registers' -
69 * RA8M1 MCU group HWM
70 */
71 #define CANFD_CFG_RX_FIFO0 \
72 ((1U << R_CANFD_CFDRFCC_RFE_Pos) | /* RX FIFO Enable */ \
73 (1U << R_CANFD_CFDRFCC_RFIE_Pos) | /* RX FIFO Interrupt Enable */ \
74 (7U << R_CANFD_CFDRFCC_RFPLS_Pos) | /* RX FIFO Payload Data Size: 64 */ \
75 (3U << R_CANFD_CFDRFCC_RFDC_Pos) | /* RX FIFO Depth: 16 messages */ \
76 (1U << R_CANFD_CFDRFCC_RFIM_Pos)) /* Interrupt generated at every received message \
77 * storage \
78 */
79
80 #define CANFD_CFG_RX_FIFO1 (0U << R_CANFD_CFDRFCC_RFE_Pos) /* RX FIFO Disable */
81
82 #define CANFD_CFG_RXFIFO {CANFD_CFG_RX_FIFO0, CANFD_CFG_RX_FIFO1}
83
84 /*
85 * Global Configuration: refer to '34.2.11 CFDGCFG : Global Configuration Register' - RA8M1 MCU
86 * group HWM
87 */
88 #define CANFD_CFG_GLOBAL \
89 ((0U << R_CANFD_CFDGCFG_TPRI_Pos) | /* Transmission Priority: ID priority */ \
90 (0U << R_CANFD_CFDGCFG_DCE_Pos) | /* DLC check disabled */ \
91 (0U << R_CANFD_CFDGCFG_DCS_Pos)) /* DLL Clock Select: CANFDCLK */
92
93 /*
94 * TX Message Buffer Interrupt Enable Configuration: refer to '34.2.43 CFDTMIEC : TX Message Buffer
95 * Interrupt Enable Configuration Register' - RA8M1 MCU group HWM
96 */
97 #define CANFD_CFG_TXMB_TXI_ENABLE (BIT(0)) /* Enable TXMB0 interrupt */
98
99 /*
100 * Number and size of RX Message Buffers: refer to '34.2.23 CFDRMNB : RX Message Buffer Number
101 * Register' - RA8M1 MCU group HWM
102 */
103 #define CANFD_CFG_RXMB (0U << R_CANFD_CFDRMNB_NRXMB_Pos) /* Number of RX Message Buffers: 0 */
104
105 /*
106 * Channel Error IRQ configurations: refer to '34.2.3 CFDC0CTR : Control Register' - RA8M1 MCU group
107 * HWM
108 */
109 #define CANFD_CFG_ERR_IRQ \
110 (BIT(R_CANFD_CFDC_CTR_EWIE_Pos) | /* Error Warning Interrupt Enable */ \
111 BIT(R_CANFD_CFDC_CTR_EPIE_Pos) | /* Error Passive Interrupt Enable */ \
112 BIT(R_CANFD_CFDC_CTR_BOEIE_Pos) | /* Bus-Off Entry Interrupt Enable */ \
113 BIT(R_CANFD_CFDC_CTR_BORIE_Pos) | /* Bus-Off Recovery Interrupt Enable */ \
114 BIT(R_CANFD_CFDC_CTR_OLIE_Pos)) /* Overload Interrupt Enable */
115
116 /*
117 * Global Error IRQ configurations: refer to '34.2.12 CFDGCTR : Global Control Register' - RA8M1 MCU
118 * group HWM
119 */
120 #define CANFD_CFG_GLERR_IRQ \
121 ((3UL << R_CANFD_CFDGCTR_GMDC_Pos) | /* Global Mode Control: Keep current value */ \
122 (0UL << R_CANFD_CFDGCTR_DEIE_Pos) | /* DLC check interrupt disabled */ \
123 (0UL << R_CANFD_CFDGCTR_MEIE_Pos) | /* Message lost error interrupt disabled */ \
124 (0UL << R_CANFD_CFDGCTR_THLEIE_Pos) | /* TX history list entry lost interrupt disabled */ \
125 (0UL << R_CANFD_CFDGCTR_CMPOFIE_Pos)) /* CANFD message payload overflow flag interrupt \
126 * disabled \
127 */
128
129 /* Keycode to enable/disable accessing to AFL entry */
130 #define CFDGAFLIGNCTR_KEY_CODE (0xC4UL)
131
132 /* Default Dataphase bitrate configuration in case classic mode is enabled */
133 static const can_bit_timing_cfg_t classic_can_data_timing_default = {
134 .baud_rate_prescaler = 1,
135 .time_segment_1 = 3,
136 .time_segment_2 = 2,
137 .synchronization_jump_width = 1,
138 };
139
140 struct can_renesas_ra_global_cfg {
141 const struct device *op_clk;
142 const struct device *ram_clk;
143 const struct clock_control_ra_subsys_cfg op_subsys;
144 const struct clock_control_ra_subsys_cfg ram_subsys;
145 const unsigned int dll_min_freq;
146 const unsigned int dll_max_freq;
147 };
148
149 struct can_renesas_ra_filter {
150 bool set;
151 struct can_filter filter;
152 can_rx_callback_t rx_cb;
153 void *rx_usr_data;
154 };
155
156 struct can_renesas_ra_cfg {
157 struct can_driver_config common;
158 const struct pinctrl_dev_config *pcfg;
159 const struct device *global_dev;
160 const struct device *dll_clk;
161 const struct clock_control_ra_subsys_cfg dll_subsys;
162 const uint32_t rx_filter_num;
163 };
164
165 struct can_renesas_ra_data {
166 struct can_driver_data common;
167 struct k_mutex inst_mutex;
168 const struct device *dev;
169 can_instance_t fsp_can;
170 can_tx_callback_t tx_cb;
171 struct k_sem tx_sem;
172 void *tx_usr_data;
173 struct can_renesas_ra_filter *rx_filter;
174 can_bit_timing_cfg_t data_timing;
175 };
176
177 extern void canfd_error_isr(void);
178 extern void canfd_rx_fifo_isr(void);
179 extern void canfd_common_fifo_rx_isr(void);
180 extern void canfd_channel_tx_isr(void);
181
182 static const can_api_t *can_api = &g_canfd_on_canfd;
183
set_hw_timing_configuration(const struct device * dev,can_bit_timing_cfg_t * f_timing,const struct can_timing * z_timing)184 static inline int set_hw_timing_configuration(const struct device *dev,
185 can_bit_timing_cfg_t *f_timing,
186 const struct can_timing *z_timing)
187 {
188 struct can_renesas_ra_data *data = dev->data;
189
190 if (f_timing == NULL || z_timing == NULL) {
191 return -EINVAL;
192 }
193
194 k_mutex_lock(&data->inst_mutex, K_FOREVER);
195
196 *f_timing = (can_bit_timing_cfg_t){
197 .baud_rate_prescaler = z_timing->prescaler,
198 .time_segment_1 = z_timing->prop_seg + z_timing->phase_seg1,
199 .time_segment_2 = z_timing->phase_seg2,
200 .synchronization_jump_width = z_timing->sjw,
201 };
202
203 k_mutex_unlock(&data->inst_mutex);
204
205 return 0;
206 }
207
get_free_filter_id(const struct device * dev)208 static inline int get_free_filter_id(const struct device *dev)
209 {
210 struct can_renesas_ra_data *data = dev->data;
211 const struct can_renesas_ra_cfg *cfg = dev->config;
212
213 for (uint32_t filter_id = 0; filter_id < cfg->rx_filter_num; filter_id++) {
214 if (!data->rx_filter[filter_id].set) {
215 return filter_id;
216 }
217 }
218
219 return -ENOSPC;
220 }
221
set_afl_rule(const struct device * dev,const struct can_filter * filter,uint32_t afl_offset)222 static void set_afl_rule(const struct device *dev, const struct can_filter *filter,
223 uint32_t afl_offset)
224 {
225 struct can_renesas_ra_data *data = dev->data;
226 canfd_extended_cfg_t const *p_extend = data->fsp_can.p_cfg->p_extend;
227 canfd_afl_entry_t *afl = (canfd_afl_entry_t *)&p_extend->p_afl[afl_offset];
228
229 *afl = (canfd_afl_entry_t){.id = {.id = filter->id,
230 #ifndef CONFIG_CAN_ACCEPT_RTR
231 .frame_type = CAN_FRAME_TYPE_DATA,
232 #endif
233 .id_mode = ((filter->flags & CAN_FILTER_IDE) != 0)
234 ? CAN_ID_MODE_EXTENDED
235 : CAN_ID_MODE_STANDARD},
236 .mask = {.mask_id = filter->mask,
237 #ifdef CONFIG_CAN_ACCEPT_RTR
238 /* Accept all types of frames */
239 .mask_frame_type = 0,
240 #else
241 /* Only accept frames with the configured frametype */
242 .mask_frame_type = 1,
243 #endif
244 .mask_id_mode = ((filter->flags & CAN_FILTER_IDE) != 0)
245 ? CAN_ID_MODE_EXTENDED
246 : CAN_ID_MODE_STANDARD},
247 .destination = {.fifo_select_flags = CANFD_RX_FIFO_0}};
248
249 if (data->common.started) {
250 /* These steps help update AFL rules while CAN module running */
251 canfd_instance_ctrl_t *p_ctrl = (canfd_instance_ctrl_t *)data->fsp_can.p_ctrl;
252 R_CANFD_Type *reg = p_ctrl->p_reg;
253
254 /* Ignore AFL entry which will be changed */
255 reg->CFDGAFLIGNENT_b.IRN = afl_offset;
256 reg->CFDGAFLIGNCTR = ((CFDGAFLIGNCTR_KEY_CODE << R_CANFD_CFDGAFLIGNCTR_KEY_Pos) |
257 BIT(R_CANFD_CFDGAFLIGNCTR_IREN_Pos));
258 reg->CFDGAFLECTR_b.AFLDAE = 1;
259
260 /* Write AFL configuration */
261 reg->CFDGAFL[afl_offset] = *(R_CANFD_CFDGAFL_Type *)afl;
262
263 /* Lock AFL entry access */
264 reg->CFDGAFLECTR_b.AFLDAE = 0;
265 reg->CFDGAFLIGNCTR = ((CFDGAFLIGNCTR_KEY_CODE << R_CANFD_CFDGAFLIGNCTR_KEY_Pos));
266 }
267 }
268
remove_afl_rule(const struct device * dev,uint32_t afl_offset)269 static void remove_afl_rule(const struct device *dev, uint32_t afl_offset)
270 {
271 struct can_renesas_ra_data *data = dev->data;
272 canfd_extended_cfg_t const *p_extend = data->fsp_can.p_cfg->p_extend;
273 canfd_afl_entry_t *afl = (canfd_afl_entry_t *)&p_extend->p_afl[afl_offset];
274
275 /* Set the AFL ID to reserved ID */
276 *afl = (canfd_afl_entry_t){
277 .id = {.id = CAN_RENESAS_RA_RESERVED_ID, .id_mode = CAN_ID_MODE_EXTENDED},
278 .mask = {.mask_id = CAN_RENESAS_RA_RESERVED_ID,
279 .mask_id_mode = CAN_ID_MODE_EXTENDED}};
280
281 if (data->common.started) {
282 /* These steps help update AFL rules while CAN module running */
283 canfd_instance_ctrl_t *p_ctrl = (canfd_instance_ctrl_t *)data->fsp_can.p_ctrl;
284 R_CANFD_Type *reg = p_ctrl->p_reg;
285
286 /* Ignore AFL entry which will be changed */
287 reg->CFDGAFLIGNENT_b.IRN = afl_offset;
288 reg->CFDGAFLIGNCTR = ((CFDGAFLIGNCTR_KEY_CODE << R_CANFD_CFDGAFLIGNCTR_KEY_Pos) |
289 BIT(R_CANFD_CFDGAFLIGNCTR_IREN_Pos));
290 reg->CFDGAFLECTR_b.AFLDAE = 1;
291
292 /* Change configurations for AFL entry */
293 reg->CFDGAFL[afl_offset] = *(R_CANFD_CFDGAFL_Type *)(afl);
294
295 /* Lock AFL entry access */
296 reg->CFDGAFLECTR_b.AFLDAE = 0;
297 reg->CFDGAFLIGNCTR = ((CFDGAFLIGNCTR_KEY_CODE << R_CANFD_CFDGAFLIGNCTR_KEY_Pos));
298 }
299 }
300
301 #ifdef CONFIG_CAN_MANUAL_RECOVERY_MODE
recover_bus(const struct device * dev,k_timeout_t timeout)302 static int recover_bus(const struct device *dev, k_timeout_t timeout)
303 {
304 struct can_renesas_ra_data *data = dev->data;
305 canfd_instance_ctrl_t *p_ctrl = data->fsp_can.p_ctrl;
306 R_CANFD_Type *reg = p_ctrl->p_reg;
307 uint32_t cfdcnctr = reg->CFDC->CTR;
308 int ret = 0;
309
310 if (reg->CFDC->ERFL_b.BOEF == 0) {
311 /* Channel bus-off entry not detected */
312 goto end;
313 }
314
315 reg->CFDC->CTR_b.BOM = 0x00; /* Switch to Normal Bus-Off mode (comply with ISO 11898-1) */
316 reg->CFDC->CTR_b.RTBO = 1; /* Force channel state to return from bus-off */
317
318 int64_t start_ticks = k_uptime_ticks();
319
320 while (reg->CFDC->ERFL_b.BORF == 0) {
321 if ((k_uptime_ticks() - start_ticks) > timeout.ticks) {
322 ret = -EAGAIN;
323 goto end;
324 }
325 }
326 end:
327 reg->CFDC->CTR = cfdcnctr; /* Restore channel configuration */
328 return ret;
329 }
330 #endif
331
can_renesas_ra_call_tx_cb(const struct device * dev,int err)332 static inline void can_renesas_ra_call_tx_cb(const struct device *dev, int err)
333 {
334 struct can_renesas_ra_data *data = dev->data;
335 can_tx_callback_t cb = data->tx_cb;
336
337 if (cb != NULL) {
338 data->tx_cb = NULL;
339 cb(dev, err, data->tx_usr_data);
340 k_sem_give(&data->tx_sem);
341 }
342 }
343
can_renesas_ra_call_rx_cb(const struct device * dev,can_callback_args_t * p_args)344 static inline void can_renesas_ra_call_rx_cb(const struct device *dev, can_callback_args_t *p_args)
345 {
346 struct can_renesas_ra_data *data = dev->data;
347 struct can_renesas_ra_filter *rx_filter = data->rx_filter;
348 const struct can_renesas_ra_cfg *cfg = dev->config;
349 struct can_frame frame = {
350 .dlc = can_bytes_to_dlc(p_args->frame.data_length_code),
351 .id = p_args->frame.id,
352 .flags = (((p_args->frame.id_mode == CAN_ID_MODE_EXTENDED) ? CAN_FRAME_IDE : 0UL) |
353 ((p_args->frame.type == CAN_FRAME_TYPE_REMOTE) ? CAN_FRAME_RTR : 0UL) |
354 ((p_args->frame.options & CANFD_FRAME_OPTION_FD) != 0 ? CAN_FRAME_FDF
355 : 0UL) |
356 ((p_args->frame.options & CANFD_FRAME_OPTION_ERROR) != 0 ? CAN_FRAME_ESI
357 : 0UL) |
358 ((p_args->frame.options & CANFD_FRAME_OPTION_BRS) != 0 ? CAN_FRAME_BRS
359 : 0UL)),
360 };
361
362 memcpy(frame.data, p_args->frame.data, p_args->frame.data_length_code);
363
364 for (uint32_t i = 0; i < cfg->rx_filter_num; i++) {
365 can_rx_callback_t cb = rx_filter->rx_cb;
366 void *usr_data = rx_filter->rx_usr_data;
367
368 if (cb == NULL) {
369 rx_filter++;
370 continue; /* this filter has not set yet */
371 }
372
373 if (!can_frame_matches_filter(&frame, &rx_filter->filter)) {
374 rx_filter++;
375 continue; /* filter did not match */
376 }
377
378 cb(dev, &frame, usr_data);
379 break;
380 }
381 }
382
can_renesas_ra_call_state_change_cb(const struct device * dev,enum can_state state)383 static inline void can_renesas_ra_call_state_change_cb(const struct device *dev,
384 enum can_state state)
385 {
386 struct can_renesas_ra_data *data = dev->data;
387 can_info_t can_info;
388
389 if (FSP_SUCCESS != can_api->infoGet(data->fsp_can.p_ctrl, &can_info)) {
390 LOG_DBG("get state info failed");
391 return;
392 }
393
394 struct can_bus_err_cnt err_cnt = {
395 .rx_err_cnt = can_info.error_count_receive,
396 .tx_err_cnt = can_info.error_count_transmit,
397 };
398
399 data->common.state_change_cb(dev, state, err_cnt, data->common.state_change_cb_user_data);
400 }
401
can_renesas_ra_get_capabilities(const struct device * dev,can_mode_t * cap)402 static int can_renesas_ra_get_capabilities(const struct device *dev, can_mode_t *cap)
403 {
404 ARG_UNUSED(dev);
405 *cap = CAN_MODE_NORMAL | CAN_MODE_LOOPBACK;
406
407 #ifdef CONFIG_CAN_FD_MODE
408 *cap |= CAN_MODE_FD;
409 #endif
410
411 #ifdef CONFIG_CAN_MANUAL_RECOVERY_MODE
412 *cap |= CAN_MODE_MANUAL_RECOVERY;
413 #endif
414
415 return 0;
416 }
417
can_renesas_ra_start(const struct device * dev)418 static int can_renesas_ra_start(const struct device *dev)
419 {
420 struct can_renesas_ra_data *data = dev->data;
421 const struct device *transceiver_dev = can_get_transceiver(dev);
422 int ret = 0;
423
424 if (!device_is_ready(dev)) {
425 return -EIO;
426 }
427
428 if (data->common.started) {
429 return -EALREADY;
430 }
431
432 if (((transceiver_dev != NULL) &&
433 can_transceiver_enable(transceiver_dev, data->common.mode))) {
434 LOG_DBG("CAN transceiver enable failed");
435 return -EIO;
436 }
437
438 k_mutex_lock(&data->inst_mutex, K_FOREVER);
439 canfd_extended_cfg_t *p_extend = (canfd_extended_cfg_t *)data->fsp_can.p_cfg->p_extend;
440
441 p_extend->p_data_timing =
442 (can_bit_timing_cfg_t *)((data->common.mode & CAN_MODE_FD) != 0
443 ? &data->data_timing
444 : &classic_can_data_timing_default);
445
446 if (FSP_SUCCESS != can_api->close(data->fsp_can.p_ctrl)) {
447 LOG_DBG("CAN close failed");
448 ret = -EIO;
449 goto end;
450 }
451
452 if (FSP_SUCCESS != can_api->open(data->fsp_can.p_ctrl, data->fsp_can.p_cfg)) {
453 LOG_DBG("CAN open failed");
454 ret = -EIO;
455 goto end;
456 }
457
458 if ((data->common.mode & CAN_MODE_LOOPBACK) != 0) {
459 if (FSP_SUCCESS != can_api->modeTransition(data->fsp_can.p_ctrl,
460 CAN_OPERATION_MODE_NORMAL,
461 CAN_TEST_MODE_LOOPBACK_INTERNAL)) {
462 LOG_DBG("CAN mode change failed");
463 ret = -EIO;
464 goto end;
465 }
466 }
467
468 data->common.started = true;
469 end:
470 k_mutex_unlock(&data->inst_mutex);
471 return ret;
472 }
473
can_renesas_ra_stop(const struct device * dev)474 static int can_renesas_ra_stop(const struct device *dev)
475 {
476 struct can_renesas_ra_data *data = dev->data;
477 const struct device *transceiver_dev = can_get_transceiver(dev);
478 int ret = 0;
479
480 if (!data->common.started) {
481 return -EALREADY;
482 }
483
484 k_mutex_lock(&data->inst_mutex, K_FOREVER);
485
486 if (FSP_SUCCESS != can_api->modeTransition(data->fsp_can.p_ctrl, CAN_OPERATION_MODE_HALT,
487 CAN_TEST_MODE_DISABLED)) {
488 LOG_DBG("CAN stop failed");
489 ret = -EIO;
490 goto end;
491 }
492
493 if (((transceiver_dev != NULL) && can_transceiver_disable(transceiver_dev))) {
494 LOG_DBG("CAN transceiver disable failed");
495 ret = -EIO;
496 goto end;
497 }
498
499 if (data->tx_cb != NULL) {
500 data->tx_cb = NULL;
501 k_sem_give(&data->tx_sem);
502 }
503
504 data->common.started = false;
505
506 end:
507 k_mutex_unlock(&data->inst_mutex);
508 return ret;
509 }
510
can_renesas_ra_set_mode(const struct device * dev,can_mode_t mode)511 static int can_renesas_ra_set_mode(const struct device *dev, can_mode_t mode)
512 {
513 struct can_renesas_ra_data *data = dev->data;
514 int ret = 0;
515
516 if (data->common.started) {
517 /* CAN controller should be in stopped state */
518 return -EBUSY;
519 }
520
521 k_mutex_lock(&data->inst_mutex, K_FOREVER);
522
523 can_mode_t caps = 0;
524
525 ret = can_renesas_ra_get_capabilities(dev, &caps);
526 if (ret != 0) {
527 goto end;
528 }
529
530 if ((mode & ~caps) != 0) {
531 ret = -ENOTSUP;
532 goto end;
533 }
534
535 data->common.mode = mode;
536
537 end:
538 k_mutex_unlock(&data->inst_mutex);
539 return ret;
540 }
541
can_renesas_ra_set_timing(const struct device * dev,const struct can_timing * timing)542 static int can_renesas_ra_set_timing(const struct device *dev, const struct can_timing *timing)
543 {
544 struct can_renesas_ra_data *data = dev->data;
545
546 if (data->common.started) {
547 /* Device is not in stopped state */
548 return -EBUSY;
549 }
550
551 return set_hw_timing_configuration(dev, data->fsp_can.p_cfg->p_bit_timing, timing);
552 }
553
can_renesas_ra_send(const struct device * dev,const struct can_frame * frame,k_timeout_t timeout,can_tx_callback_t callback,void * user_data)554 static int can_renesas_ra_send(const struct device *dev, const struct can_frame *frame,
555 k_timeout_t timeout, can_tx_callback_t callback, void *user_data)
556 {
557 struct can_renesas_ra_data *data = dev->data;
558
559 if (!data->common.started) {
560 return -ENETDOWN;
561 }
562
563 #ifdef CONFIG_CAN_FD_MODE
564 if ((frame->flags & ~(CAN_FRAME_IDE | CAN_FRAME_RTR | CAN_FRAME_FDF | CAN_FRAME_BRS)) !=
565 0) {
566 LOG_ERR("unsupported CAN frame flags 0x%02x", frame->flags);
567 return -ENOTSUP;
568 }
569
570 if ((data->common.mode & CAN_MODE_FD) == 0U &&
571 ((frame->flags & (CAN_FRAME_FDF | CAN_FRAME_BRS)) != 0U)) {
572 LOG_ERR("CAN FD format not supported in non-FD mode");
573 return -ENOTSUP;
574 }
575 #else /* CONFIG_CAN_FD_MODE */
576 if ((frame->flags & ~(CAN_FRAME_IDE | CAN_FRAME_RTR)) != 0U) {
577 LOG_ERR("unsupported CAN frame flags 0x%02x", frame->flags);
578 return -ENOTSUP;
579 }
580 #endif /* !CONFIG_CAN_FD_MODE */
581
582 if ((frame->flags & CAN_FRAME_FDF) != 0U) {
583 if (frame->dlc > CANFD_MAX_DLC) {
584 LOG_ERR("DLC of %d for CAN FD format frame", frame->dlc);
585 return -EINVAL;
586 }
587 } else {
588 if (frame->dlc > CAN_MAX_DLC) {
589 LOG_ERR("DLC of %d for non-FD format frame", frame->dlc);
590 return -EINVAL;
591 }
592 }
593
594 if (k_sem_take(&data->tx_sem, timeout) != 0) {
595 return -EAGAIN;
596 }
597
598 k_mutex_lock(&data->inst_mutex, K_FOREVER);
599 int ret = 0;
600
601 data->tx_cb = callback;
602 data->tx_usr_data = user_data;
603
604 can_frame_t fsp_frame = {
605 .id = frame->id,
606 .id_mode = ((frame->flags & CAN_FRAME_IDE) != 0) ? CAN_ID_MODE_EXTENDED
607 : CAN_ID_MODE_STANDARD,
608 .type = ((frame->flags & CAN_FRAME_RTR) != 0) ? CAN_FRAME_TYPE_REMOTE
609 : CAN_FRAME_TYPE_DATA,
610 .data_length_code = can_dlc_to_bytes(frame->dlc),
611 .options =
612 ((((frame->flags & CAN_FRAME_FDF) != 0) ? CANFD_FRAME_OPTION_FD : 0UL) |
613 (((frame->flags & CAN_FRAME_BRS) != 0) ? CANFD_FRAME_OPTION_BRS : 0UL) |
614 (((frame->flags & CAN_FRAME_ESI) != 0) ? CANFD_FRAME_OPTION_ERROR : 0UL)),
615 };
616
617 memcpy(fsp_frame.data, frame->data, fsp_frame.data_length_code);
618
619 if (FSP_SUCCESS != can_api->write(data->fsp_can.p_ctrl, CANFD_TX_BUFFER_0, &fsp_frame)) {
620 LOG_DBG("CAN transmit failed");
621 data->tx_cb = NULL;
622 data->tx_usr_data = NULL;
623 k_sem_give(&data->tx_sem);
624 ret = -EIO;
625 goto end;
626 }
627
628 end:
629 k_mutex_unlock(&data->inst_mutex);
630 return ret;
631 }
632
can_renesas_ra_add_rx_filter(const struct device * dev,can_rx_callback_t callback,void * user_data,const struct can_filter * filter)633 static int can_renesas_ra_add_rx_filter(const struct device *dev, can_rx_callback_t callback,
634 void *user_data, const struct can_filter *filter)
635 {
636 struct can_renesas_ra_data *data = dev->data;
637 int filter_id = -ENOSPC;
638
639 k_mutex_lock(&data->inst_mutex, K_FOREVER);
640
641 filter_id = get_free_filter_id(dev);
642 if (filter_id == -ENOSPC) {
643 goto end;
644 }
645
646 set_afl_rule(dev, filter, filter_id);
647
648 memcpy(&data->rx_filter[filter_id].filter, filter, sizeof(struct can_filter));
649 data->rx_filter[filter_id].rx_cb = callback;
650 data->rx_filter[filter_id].rx_usr_data = user_data;
651 data->rx_filter[filter_id].set = true;
652
653 end:
654 k_mutex_unlock(&data->inst_mutex);
655 return filter_id;
656 }
657
can_renesas_ra_remove_rx_filter(const struct device * dev,int filter_id)658 static void can_renesas_ra_remove_rx_filter(const struct device *dev, int filter_id)
659 {
660 struct can_renesas_ra_data *data = dev->data;
661 const struct can_renesas_ra_cfg *cfg = dev->config;
662
663 if ((filter_id < 0) || (filter_id >= cfg->rx_filter_num)) {
664 return;
665 }
666
667 k_mutex_lock(&data->inst_mutex, K_FOREVER);
668
669 remove_afl_rule(dev, filter_id);
670
671 data->rx_filter[filter_id].rx_cb = NULL;
672 data->rx_filter[filter_id].rx_usr_data = NULL;
673 data->rx_filter[filter_id].set = false;
674
675 k_mutex_unlock(&data->inst_mutex);
676 }
677
678 #ifdef CONFIG_CAN_MANUAL_RECOVERY_MODE
can_renesas_ra_recover(const struct device * dev,k_timeout_t timeout)679 static int can_renesas_ra_recover(const struct device *dev, k_timeout_t timeout)
680 {
681 struct can_renesas_ra_data *data = dev->data;
682
683 if (!data->common.started) {
684 return -ENETDOWN;
685 }
686
687 if ((data->common.mode & CAN_MODE_MANUAL_RECOVERY) == 0) {
688 return -ENOTSUP;
689 }
690
691 return recover_bus(dev, timeout);
692 }
693 #endif
694
can_renesas_ra_get_state(const struct device * dev,enum can_state * state,struct can_bus_err_cnt * err_cnt)695 static int can_renesas_ra_get_state(const struct device *dev, enum can_state *state,
696 struct can_bus_err_cnt *err_cnt)
697 {
698 struct can_renesas_ra_data *data = dev->data;
699 can_info_t fsp_info = {0};
700
701 if (state == NULL && err_cnt == NULL) {
702 return 0;
703 }
704
705 if (FSP_SUCCESS != can_api->infoGet(data->fsp_can.p_ctrl, &fsp_info)) {
706 LOG_DBG("CAN get state info failed");
707 return -EIO;
708 }
709
710 if (state != NULL) {
711 if (!data->common.started) {
712 *state = CAN_STATE_STOPPED;
713 } else {
714 if ((fsp_info.error_code & R_CANFD_CFDC_ERFL_BOEF_Msk) != 0) {
715 *state = CAN_STATE_BUS_OFF;
716 } else if ((fsp_info.error_code & R_CANFD_CFDC_ERFL_EPF_Msk) != 0) {
717 *state = CAN_STATE_ERROR_PASSIVE;
718 } else if ((fsp_info.error_code & R_CANFD_CFDC_ERFL_EWF_Msk) != 0) {
719 *state = CAN_STATE_ERROR_WARNING;
720 } else if ((fsp_info.error_code & R_CANFD_CFDC_ERFL_BEF_Msk) != 0) {
721 *state = CAN_STATE_ERROR_ACTIVE;
722 }
723 }
724 }
725
726 if (err_cnt != NULL) {
727 err_cnt->tx_err_cnt = fsp_info.error_count_transmit;
728 err_cnt->rx_err_cnt = fsp_info.error_count_receive;
729 }
730
731 return 0;
732 }
733
can_renesas_ra_set_state_change_callback(const struct device * dev,can_state_change_callback_t callback,void * user_data)734 static void can_renesas_ra_set_state_change_callback(const struct device *dev,
735 can_state_change_callback_t callback,
736 void *user_data)
737 {
738 struct can_renesas_ra_data *data = dev->data;
739 canfd_instance_ctrl_t *p_ctrl = data->fsp_can.p_ctrl;
740 int key = irq_lock();
741
742 k_mutex_lock(&data->inst_mutex, K_FOREVER);
743
744 if (callback != NULL) {
745 /* Enable state change interrupt */
746 p_ctrl->p_reg->CFDC->CTR |= (uint32_t)CANFD_CFG_ERR_IRQ;
747 } else {
748 /* Disable state change interrupt */
749 p_ctrl->p_reg->CFDC->CTR &= (uint32_t)~CANFD_CFG_ERR_IRQ;
750
751 /* Clear state change interrupt flags */
752 p_ctrl->p_reg->CFDC->ERFL &=
753 ~(BIT(R_CANFD_CFDC_ERFL_BOEF_Pos) | BIT(R_CANFD_CFDC_ERFL_EWF_Pos) |
754 BIT(R_CANFD_CFDC_ERFL_EPF_Pos) | BIT(R_CANFD_CFDC_ERFL_BOEF_Pos));
755 }
756
757 data->common.state_change_cb = callback;
758 data->common.state_change_cb_user_data = user_data;
759
760 k_mutex_unlock(&data->inst_mutex);
761
762 irq_unlock(key);
763 }
764
can_renesas_ra_get_core_clock(const struct device * dev,uint32_t * rate)765 static int can_renesas_ra_get_core_clock(const struct device *dev, uint32_t *rate)
766 {
767 const struct can_renesas_ra_cfg *cfg = dev->config;
768 clock_control_subsys_t dll_subsys = (clock_control_subsys_t)&cfg->dll_subsys;
769
770 return clock_control_get_rate(cfg->dll_clk, dll_subsys, rate);
771 }
772
can_renesas_ra_get_max_filters(const struct device * dev,bool ide)773 static int can_renesas_ra_get_max_filters(const struct device *dev, bool ide)
774 {
775 ARG_UNUSED(ide);
776 const struct can_renesas_ra_cfg *cfg = dev->config;
777
778 return cfg->rx_filter_num;
779 }
780
781 #ifdef CONFIG_CAN_FD_MODE
can_renesas_ra_set_timing_data(const struct device * dev,const struct can_timing * timing_data)782 static int can_renesas_ra_set_timing_data(const struct device *dev,
783 const struct can_timing *timing_data)
784 {
785 struct can_renesas_ra_data *data = dev->data;
786
787 if (data->common.started) {
788 return -EBUSY;
789 }
790
791 return set_hw_timing_configuration(dev, &data->data_timing, timing_data);
792 }
793 #endif /* CONFIG_CAN_FD_MODE */
794
can_renesas_ra_fsp_cb(can_callback_args_t * p_args)795 void can_renesas_ra_fsp_cb(can_callback_args_t *p_args)
796 {
797 const struct device *dev = p_args->p_context;
798
799 switch (p_args->event) {
800 case CAN_EVENT_RX_COMPLETE: {
801 can_renesas_ra_call_rx_cb(dev, p_args);
802 break;
803 }
804
805 case CAN_EVENT_TX_COMPLETE: {
806 can_renesas_ra_call_tx_cb(dev, 0);
807 break;
808 }
809
810 case CAN_EVENT_ERR_CHANNEL: {
811 if ((p_args->error & R_CANFD_CFDC_ERFL_BEF_Msk) != 0) {
812 can_renesas_ra_call_state_change_cb(dev, CAN_STATE_ERROR_ACTIVE);
813 }
814 if ((p_args->error & R_CANFD_CFDC_ERFL_EWF_Msk) != 0) {
815 can_renesas_ra_call_state_change_cb(dev, CAN_STATE_ERROR_WARNING);
816 }
817 if ((p_args->error & R_CANFD_CFDC_ERFL_EPF_Msk) != 0) {
818 can_renesas_ra_call_state_change_cb(dev, CAN_STATE_ERROR_PASSIVE);
819 }
820 if ((p_args->error & R_CANFD_CFDC_ERFL_BOEF_Msk) != 0) {
821 can_renesas_ra_call_state_change_cb(dev, CAN_STATE_BUS_OFF);
822 }
823
824 if ((p_args->error & R_CANFD_CFDC_ERFL_ALF_Msk) != 0) { /* Arbitration Lost Error */
825 can_renesas_ra_call_tx_cb(dev, -EBUSY);
826 }
827 if ((p_args->error & (R_CANFD_CFDC_ERFL_AERR_Msk | /* ACK Error */
828 R_CANFD_CFDC_ERFL_ADERR_Msk | /* ACK Delimiter Error */
829 R_CANFD_CFDC_ERFL_B1ERR_Msk | /* Bit 1 Error */
830 R_CANFD_CFDC_ERFL_B0ERR_Msk)) /* Bit 0 Error */
831 != 0) {
832 can_renesas_ra_call_tx_cb(dev, -EIO);
833 }
834 }
835
836 default:
837 break;
838 }
839 }
840
can_renesas_ra_apply_default_config(const struct device * dev)841 static inline int can_renesas_ra_apply_default_config(const struct device *dev)
842 {
843 struct can_renesas_ra_cfg *cfg = (struct can_renesas_ra_cfg *)dev->config;
844 int ret;
845
846 struct can_timing timing = {0};
847
848 /* Calculate bit_timing parameter */
849 ret = can_calc_timing(dev, &timing, cfg->common.bitrate, cfg->common.sample_point);
850 if (ret < 0) {
851 return ret;
852 }
853
854 ret = can_renesas_ra_set_timing(dev, &timing);
855 if (ret != 0) {
856 return ret;
857 }
858
859 #ifdef CONFIG_CAN_FD_MODE
860 can_calc_timing_data(dev, &timing, cfg->common.bitrate_data, cfg->common.sample_point_data);
861 ret = can_renesas_ra_set_timing_data(dev, &timing);
862 if (ret < 0) {
863 return ret;
864 }
865 #endif
866
867 for (uint32_t filter_id = 0; filter_id < cfg->rx_filter_num; filter_id++) {
868 remove_afl_rule(dev, filter_id);
869 }
870
871 return 0;
872 }
873
can_renesas_module_clock_init(const struct device * dev)874 static inline int can_renesas_module_clock_init(const struct device *dev)
875 {
876 const struct can_renesas_ra_cfg *cfg = dev->config;
877 const struct can_renesas_ra_global_cfg *global_cfg = cfg->global_dev->config;
878 int ret;
879
880 ret = clock_control_on(cfg->dll_clk, (clock_control_subsys_t)&cfg->dll_subsys);
881 if (ret < 0) {
882 return -EIO;
883 }
884
885 uint32_t op_rate;
886 uint32_t ram_rate;
887 uint32_t dll_rate;
888
889 ret = clock_control_get_rate(global_cfg->op_clk,
890 (clock_control_subsys_t)&global_cfg->op_subsys, &op_rate);
891 if (ret < 0) {
892 return ret;
893 }
894
895 ret = clock_control_get_rate(global_cfg->ram_clk,
896 (clock_control_subsys_t)&global_cfg->ram_subsys, &ram_rate);
897 if (ret < 0) {
898 return ret;
899 }
900
901 ret = clock_control_get_rate(cfg->dll_clk, (clock_control_subsys_t)&cfg->dll_subsys,
902 &dll_rate);
903 if (ret < 0) {
904 return ret;
905 }
906
907 if (dll_rate < global_cfg->dll_min_freq || dll_rate > global_cfg->dll_max_freq) {
908 LOG_ERR("%s frequency is out of supported range: %d < %s freq < %d",
909 cfg->dll_clk->name, global_cfg->dll_min_freq, cfg->dll_clk->name,
910 global_cfg->dll_max_freq);
911 return -ENOTSUP;
912 }
913
914 /* Clock constraint: refer to '34.1.2 Clock restriction' - RA8M1 MCU group HWM */
915 /*
916 * Operation clock rate must be at least 40Mhz in case CANFD mode.
917 * Otherwise, it must be at least 32MHz.
918 */
919 if (IS_ENABLED(CONFIG_CAN_FD_MODE) ? op_rate < MHZ(40) : op_rate < MHZ(32)) {
920 LOG_ERR("%s frequency should be at least %d", global_cfg->op_clk->name,
921 IS_ENABLED(CONFIG_CAN_FD_MODE) ? MHZ(40) : MHZ(32));
922 return -ENOTSUP;
923 }
924
925 /*
926 * (RAM clock rate / 2) >= DLL rate
927 * (CANFD operation clock rate) >= DLL rate
928 */
929 if ((ram_rate / 2) < dll_rate || op_rate < dll_rate) {
930 LOG_ERR("%s frequency should be less than half of %s and %s frequency should "
931 "be less than %s",
932 global_cfg->ram_clk->name, cfg->dll_clk->name, global_cfg->op_clk->name,
933 cfg->dll_clk->name);
934 return -ENOTSUP;
935 }
936
937 return 0;
938 }
939
can_renesas_ra_init(const struct device * dev)940 static int can_renesas_ra_init(const struct device *dev)
941 {
942 const struct can_renesas_ra_cfg *cfg = dev->config;
943 struct can_renesas_ra_data *data = dev->data;
944 int ret = 0;
945
946 k_mutex_init(&data->inst_mutex);
947 k_sem_init(&data->tx_sem, 1, 1);
948 data->common.started = false;
949
950 ret = can_renesas_module_clock_init(dev);
951 if (ret < 0) {
952 LOG_DBG("clock initialize failed");
953 return ret;
954 }
955
956 /* Configure dt provided device signals when available */
957 ret = pinctrl_apply_state(cfg->pcfg, PINCTRL_STATE_DEFAULT);
958 if (ret < 0) {
959 LOG_DBG("pin function initial failed");
960 return ret;
961 }
962
963 /* Apply config and setting for CAN controller HW */
964 ret = can_renesas_ra_apply_default_config(dev);
965 if (ret < 0) {
966 LOG_DBG("invalid default configuration");
967 return ret;
968 }
969
970 ret = can_api->open(data->fsp_can.p_ctrl, data->fsp_can.p_cfg);
971 if (ret != FSP_SUCCESS) {
972 LOG_DBG("CAN bus initialize failed");
973 return -EIO;
974 }
975
976 /* Put CAN controller into stopped state */
977 ret = can_api->modeTransition(data->fsp_can.p_ctrl, CAN_OPERATION_MODE_HALT,
978 CAN_TEST_MODE_DISABLED);
979 if (ret != FSP_SUCCESS) {
980 can_api->close(data->fsp_can.p_ctrl);
981 LOG_DBG("CAN bus initialize failed");
982 return -EIO;
983 }
984
985 return 0;
986 }
987
988 static DEVICE_API(can, can_renesas_ra_driver_api) = {
989 .get_capabilities = can_renesas_ra_get_capabilities,
990 .start = can_renesas_ra_start,
991 .stop = can_renesas_ra_stop,
992 .set_mode = can_renesas_ra_set_mode,
993 .set_timing = can_renesas_ra_set_timing,
994 .send = can_renesas_ra_send,
995 .add_rx_filter = can_renesas_ra_add_rx_filter,
996 .remove_rx_filter = can_renesas_ra_remove_rx_filter,
997 #if defined(CONFIG_CAN_MANUAL_RECOVERY_MODE)
998 .recover = can_renesas_ra_recover,
999 #endif /* CONFIG_CAN_MANUAL_RECOVERY_MODE */
1000 .get_state = can_renesas_ra_get_state,
1001 .set_state_change_callback = can_renesas_ra_set_state_change_callback,
1002 .get_core_clock = can_renesas_ra_get_core_clock,
1003 .get_max_filters = can_renesas_ra_get_max_filters,
1004 .timing_min = CAN_RENESAS_RA_TIMING_MIN,
1005 .timing_max = CAN_RENESAS_RA_TIMING_MAX,
1006 #if defined(CONFIG_CAN_FD_MODE)
1007 .set_timing_data = can_renesas_ra_set_timing_data,
1008 .timing_data_min = CAN_RENESAS_RA_TIMING_DATA_MIN,
1009 .timing_data_max = CAN_RENESAS_RA_TIMING_DATA_MAX,
1010 #endif /* CONFIG_CAN_FD_MODE */
1011 };
1012
1013 #define CAN_RENESAS_RA_GLOBAL_IRQ_INIT() \
1014 R_ICU->IELSR_b[VECTOR_NUMBER_CAN_GLERR].IELS = BSP_PRV_IELS_ENUM(EVENT_CAN_GLERR); \
1015 R_ICU->IELSR_b[VECTOR_NUMBER_CAN_RXF].IELS = BSP_PRV_IELS_ENUM(EVENT_CAN_RXF); \
1016 IRQ_CONNECT(VECTOR_NUMBER_CAN_GLERR, \
1017 DT_IRQ_BY_NAME(DT_INST(0, renesas_ra_canfd_global), glerr, priority), \
1018 canfd_error_isr, NULL, 0); \
1019 IRQ_CONNECT(VECTOR_NUMBER_CAN_RXF, \
1020 DT_IRQ_BY_NAME(DT_INST(0, renesas_ra_canfd_global), rxf, priority), \
1021 canfd_rx_fifo_isr, NULL, 0); \
1022 irq_enable(VECTOR_NUMBER_CAN_RXF); \
1023 irq_enable(VECTOR_NUMBER_CAN_GLERR);
1024
1025 static canfd_global_cfg_t g_canfd_global_cfg = {
1026 .global_interrupts = CANFD_CFG_GLERR_IRQ,
1027 .global_config = CANFD_CFG_GLOBAL,
1028 .rx_mb_config = CANFD_CFG_RXMB,
1029 .global_err_ipl = DT_IRQ_BY_NAME(DT_INST(0, renesas_ra_canfd_global), glerr, priority),
1030 .rx_fifo_ipl = DT_IRQ_BY_NAME(DT_INST(0, renesas_ra_canfd_global), rxf, priority),
1031 .rx_fifo_config = CANFD_CFG_RXFIFO,
1032 .common_fifo_config = CANFD_CFG_COMMONFIFO,
1033 };
1034
1035 static const struct can_renesas_ra_global_cfg g_can_renesas_ra_global_cfg = {
1036 .op_clk = DEVICE_DT_GET(DT_CLOCKS_CTLR_BY_NAME(DT_INST(0, renesas_ra_canfd_global), opclk)),
1037 .ram_clk =
1038 DEVICE_DT_GET(DT_CLOCKS_CTLR_BY_NAME(DT_INST(0, renesas_ra_canfd_global), ramclk)),
1039 .op_subsys = {.mstp = DT_CLOCKS_CELL_BY_NAME(DT_INST(0, renesas_ra_canfd_global), opclk,
1040 mstp),
1041 .stop_bit = DT_CLOCKS_CELL_BY_NAME(DT_INST(0, renesas_ra_canfd_global), opclk,
1042 stop_bit)},
1043 .ram_subsys = {.mstp = DT_CLOCKS_CELL_BY_NAME(DT_INST(0, renesas_ra_canfd_global), ramclk,
1044 mstp),
1045 .stop_bit = DT_CLOCKS_CELL_BY_NAME(DT_INST(0, renesas_ra_canfd_global),
1046 ramclk, stop_bit)},
1047 .dll_min_freq = DT_PROP_OR(DT_INST(0, renesas_ra_canfd_global), dll_min_freq, 0),
1048 .dll_max_freq = DT_PROP_OR(DT_INST(0, renesas_ra_canfd_global), dll_max_freq, UINT_MAX),
1049 };
1050
can_renesas_ra_global_init(const struct device * dev)1051 static int can_renesas_ra_global_init(const struct device *dev)
1052 {
1053 int ret;
1054 const struct can_renesas_ra_global_cfg *cfg = dev->config;
1055
1056 ret = clock_control_on(cfg->op_clk, (clock_control_subsys_t)&cfg->op_subsys);
1057 if (ret < 0) {
1058 LOG_DBG("clock initialize failed");
1059 return ret;
1060 }
1061
1062 ret = clock_control_on(cfg->ram_clk, (clock_control_subsys_t)&cfg->ram_subsys);
1063 if (ret < 0) {
1064 LOG_DBG("clock initialize failed");
1065 return ret;
1066 }
1067
1068 CAN_RENESAS_RA_GLOBAL_IRQ_INIT();
1069
1070 return 0;
1071 }
1072
1073 DEVICE_DT_DEFINE(DT_COMPAT_GET_ANY_STATUS_OKAY(renesas_ra_canfd_global), can_renesas_ra_global_init,
1074 NULL, NULL, &g_can_renesas_ra_global_cfg, PRE_KERNEL_2, CONFIG_CAN_INIT_PRIORITY,
1075 NULL)
1076
1077 #define EVENT_CAN_COMFRX(channel) BSP_PRV_IELS_ENUM(CONCAT(EVENT_CAN, channel, _COMFRX))
1078 #define EVENT_CAN_TX(channel) BSP_PRV_IELS_ENUM(CONCAT(EVENT_CAN, channel, _TX))
1079 #define EVENT_CAN_CHERR(channel) BSP_PRV_IELS_ENUM(CONCAT(EVENT_CAN, channel, _CHERR))
1080
1081 #define CAN_RENESAS_RA_CHANNEL_IRQ_INIT(index) \
1082 { \
1083 R_ICU->IELSR_b[DT_INST_IRQ_BY_NAME(index, rx, irq)].IELS = \
1084 EVENT_CAN_COMFRX(DT_INST_PROP(index, channel)); \
1085 R_ICU->IELSR_b[DT_INST_IRQ_BY_NAME(index, tx, irq)].IELS = \
1086 EVENT_CAN_TX(DT_INST_PROP(index, channel)); \
1087 R_ICU->IELSR_b[DT_INST_IRQ_BY_NAME(index, err, irq)].IELS = \
1088 EVENT_CAN_CHERR(DT_INST_PROP(index, channel)); \
1089 \
1090 IRQ_CONNECT(DT_INST_IRQ_BY_NAME(index, rx, irq), \
1091 DT_INST_IRQ_BY_NAME(index, rx, priority), canfd_common_fifo_rx_isr, \
1092 NULL, 0); \
1093 IRQ_CONNECT(DT_INST_IRQ_BY_NAME(index, tx, irq), \
1094 DT_INST_IRQ_BY_NAME(index, tx, priority), canfd_channel_tx_isr, NULL, \
1095 0); \
1096 IRQ_CONNECT(DT_INST_IRQ_BY_NAME(index, err, irq), \
1097 DT_INST_IRQ_BY_NAME(index, err, priority), canfd_error_isr, NULL, 0); \
1098 \
1099 irq_enable(DT_INST_IRQ_BY_NAME(index, rx, irq)); \
1100 irq_enable(DT_INST_IRQ_BY_NAME(index, tx, irq)); \
1101 irq_enable(DT_INST_IRQ_BY_NAME(index, err, irq)); \
1102 }
1103
1104 #define CAN_RENESAS_RA_INIT(index) \
1105 PINCTRL_DT_INST_DEFINE(index); \
1106 static canfd_afl_entry_t canfd_afl##index[DT_INST_PROP(index, rx_max_filters)]; \
1107 struct can_renesas_ra_filter \
1108 can_renesas_ra_rx_filter##index[DT_INST_PROP(index, rx_max_filters)]; \
1109 static can_bit_timing_cfg_t g_canfd_bit_timing##index; \
1110 static const struct can_renesas_ra_cfg can_renesas_ra_cfg##index = { \
1111 .common = CAN_DT_DRIVER_CONFIG_INST_GET(index, 0, 5000000), \
1112 .global_dev = DEVICE_DT_GET(DT_INST_PARENT(index)), \
1113 .pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(index), \
1114 .dll_clk = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR_BY_NAME(index, dllclk)), \
1115 .dll_subsys = \
1116 { \
1117 .mstp = DT_INST_CLOCKS_CELL_BY_NAME(index, dllclk, mstp), \
1118 .stop_bit = DT_INST_CLOCKS_CELL_BY_NAME(index, dllclk, stop_bit), \
1119 }, \
1120 .rx_filter_num = DT_INST_PROP(index, rx_max_filters), \
1121 }; \
1122 static canfd_instance_ctrl_t fsp_canfd_ctrl##index; \
1123 static canfd_extended_cfg_t fsp_canfd_extend####index = { \
1124 .p_afl = canfd_afl##index, \
1125 .txmb_txi_enable = CANFD_CFG_TXMB_TXI_ENABLE, \
1126 .error_interrupts = 0U, \
1127 .p_global_cfg = &g_canfd_global_cfg, \
1128 }; \
1129 static can_cfg_t fsp_canfd_cfg####index = { \
1130 .channel = DT_INST_PROP(index, channel), \
1131 .ipl = DT_INST_IRQ_BY_NAME(index, err, priority), \
1132 .error_irq = DT_INST_IRQ_BY_NAME(index, err, irq), \
1133 .rx_irq = DT_INST_IRQ_BY_NAME(index, rx, irq), \
1134 .tx_irq = DT_INST_IRQ_BY_NAME(index, tx, irq), \
1135 .p_extend = &fsp_canfd_extend##index, \
1136 .p_bit_timing = &g_canfd_bit_timing##index, \
1137 .p_context = DEVICE_DT_INST_GET(index), \
1138 .p_callback = can_renesas_ra_fsp_cb, \
1139 }; \
1140 static struct can_renesas_ra_data can_renesas_ra_data##index = { \
1141 .fsp_can = \
1142 { \
1143 .p_ctrl = &fsp_canfd_ctrl##index, \
1144 .p_cfg = &fsp_canfd_cfg##index, \
1145 .p_api = &g_canfd_on_canfd, \
1146 }, \
1147 .rx_filter = can_renesas_ra_rx_filter##index, \
1148 .dev = DEVICE_DT_INST_GET(index), \
1149 }; \
1150 static int can_renesas_ra_init##index(const struct device *dev) \
1151 { \
1152 const struct device *global_canfd = DEVICE_DT_GET(DT_INST_PARENT(index)); \
1153 if (!device_is_ready(global_canfd)) { \
1154 return -EIO; \
1155 } \
1156 CAN_RENESAS_RA_CHANNEL_IRQ_INIT(index) \
1157 return can_renesas_ra_init(dev); \
1158 } \
1159 CAN_DEVICE_DT_INST_DEFINE(index, can_renesas_ra_init##index, NULL, \
1160 &can_renesas_ra_data##index, &can_renesas_ra_cfg##index, \
1161 POST_KERNEL, CONFIG_CAN_INIT_PRIORITY, \
1162 &can_renesas_ra_driver_api);
1163
1164 DT_INST_FOREACH_STATUS_OKAY(CAN_RENESAS_RA_INIT)
1165