@@ -142,6 +142,8 @@ struct can_renesas_ra_global_cfg {
142142 const struct device * ram_clk ;
143143 const struct clock_control_ra_subsys_cfg op_subsys ;
144144 const struct clock_control_ra_subsys_cfg ram_subsys ;
145+ const unsigned int dll_min_freq ;
146+ const unsigned int dll_max_freq ;
145147};
146148
147149struct can_renesas_ra_filter {
@@ -902,19 +904,33 @@ static inline int can_renesas_module_clock_init(const struct device *dev)
902904 return ret ;
903905 }
904906
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+
905914 /* Clock constraint: refer to '34.1.2 Clock restriction' - RA8M1 MCU group HWM */
906915 /*
907916 * Operation clock rate must be at least 40Mhz in case CANFD mode.
908917 * Otherwise, it must be at least 32MHz.
909918 */
910- if (IS_ENABLED (CONFIG_CAN_FD_MODE ) ? op_rate < 40000000 : op_rate < 32000000 ) {
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 ));
911922 return - ENOTSUP ;
912923 }
924+
913925 /*
914926 * (RAM clock rate / 2) >= DLL rate
915927 * (CANFD operation clock rate) >= DLL rate
916928 */
917929 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 );
918934 return - ENOTSUP ;
919935 }
920936
@@ -998,12 +1014,10 @@ static DEVICE_API(can, can_renesas_ra_driver_api) = {
9981014 R_ICU->IELSR_b[VECTOR_NUMBER_CAN_GLERR].IELS = ELC_EVENT_CAN_GLERR; \
9991015 R_ICU->IELSR_b[VECTOR_NUMBER_CAN_RXF].IELS = ELC_EVENT_CAN_RXF; \
10001016 IRQ_CONNECT(VECTOR_NUMBER_CAN_GLERR, \
1001- DT_IRQ_BY_NAME(DT_COMPAT_GET_ANY_STATUS_OKAY(renesas_ra_canfd_global), glerr, \
1002- priority), \
1017+ DT_IRQ_BY_NAME(DT_INST(0, renesas_ra_canfd_global), glerr, priority), \
10031018 canfd_error_isr, NULL, 0); \
10041019 IRQ_CONNECT(VECTOR_NUMBER_CAN_RXF, \
1005- DT_IRQ_BY_NAME(DT_COMPAT_GET_ANY_STATUS_OKAY(renesas_ra_canfd_global), rxf, \
1006- priority), \
1020+ DT_IRQ_BY_NAME(DT_INST(0, renesas_ra_canfd_global), rxf, priority), \
10071021 canfd_rx_fifo_isr, NULL, 0); \
10081022 irq_enable(VECTOR_NUMBER_CAN_RXF); \
10091023 irq_enable(VECTOR_NUMBER_CAN_GLERR);
@@ -1012,30 +1026,26 @@ static canfd_global_cfg_t g_canfd_global_cfg = {
10121026 .global_interrupts = CANFD_CFG_GLERR_IRQ ,
10131027 .global_config = CANFD_CFG_GLOBAL ,
10141028 .rx_mb_config = CANFD_CFG_RXMB ,
1015- .global_err_ipl = DT_IRQ_BY_NAME (DT_COMPAT_GET_ANY_STATUS_OKAY (renesas_ra_canfd_global ),
1016- glerr , priority ),
1017- .rx_fifo_ipl = DT_IRQ_BY_NAME (DT_COMPAT_GET_ANY_STATUS_OKAY (renesas_ra_canfd_global ), rxf ,
1018- priority ),
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 ),
10191031 .rx_fifo_config = CANFD_CFG_RXFIFO ,
10201032 .common_fifo_config = CANFD_CFG_COMMONFIFO ,
10211033};
10221034
10231035static const struct can_renesas_ra_global_cfg g_can_renesas_ra_global_cfg = {
1024- .op_clk = DEVICE_DT_GET (DT_CLOCKS_CTLR_BY_NAME (
1025- DT_COMPAT_GET_ANY_STATUS_OKAY (renesas_ra_canfd_global ), opclk )),
1026- .ram_clk = DEVICE_DT_GET (DT_CLOCKS_CTLR_BY_NAME (
1027- DT_COMPAT_GET_ANY_STATUS_OKAY (renesas_ra_canfd_global ), ramclk )),
1028- .op_subsys = {.mstp = DT_CLOCKS_CELL_BY_NAME (
1029- DT_COMPAT_GET_ANY_STATUS_OKAY (renesas_ra_canfd_global ), opclk , mstp ),
1030- .stop_bit = DT_CLOCKS_CELL_BY_NAME (
1031- DT_COMPAT_GET_ANY_STATUS_OKAY (renesas_ra_canfd_global ), opclk ,
1032- stop_bit )},
1033- .ram_subsys = {.mstp = DT_CLOCKS_CELL_BY_NAME (
1034- DT_COMPAT_GET_ANY_STATUS_OKAY (renesas_ra_canfd_global ), ramclk ,
1035- mstp ),
1036- .stop_bit = DT_CLOCKS_CELL_BY_NAME (
1037- DT_COMPAT_GET_ANY_STATUS_OKAY (renesas_ra_canfd_global ), ramclk ,
1038- stop_bit )},
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 ),
10391049};
10401050
10411051static int can_renesas_ra_global_init (const struct device * dev )
0 commit comments