Skip to content

Commit b0debcc

Browse files
thenguyenyfkartben
authored andcommitted
drivers: can: add DLL bitrate limit check for can_renesas_ra
Add condition to check uppper/lower limit of DLL clock rate Signed-off-by: The Nguyen <[email protected]>
1 parent c1ed3b8 commit b0debcc

File tree

2 files changed

+44
-24
lines changed

2 files changed

+44
-24
lines changed

drivers/can/can_renesas_ra.c

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

147149
struct 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

10231035
static 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

10411051
static int can_renesas_ra_global_init(const struct device *dev)

dts/bindings/can/renesas,ra-canfd-global.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,13 @@ properties:
1313

1414
clocks:
1515
required: true
16+
17+
dll-min-freq:
18+
type: int
19+
description: |
20+
Specifies the Data Link Layer clock limit on this device: DLL clock frequency > dll-min-freq.
21+
22+
dll-max-freq:
23+
type: int
24+
description: |
25+
Specifies the Data Link Layer clock limit on this device: DLL clock frequency < dll-max-freq.

0 commit comments

Comments
 (0)