drivers: can: sjw == 0 in can_set_timing should not change sjw
If the supplied sjw in the timing parameters is zero, the sjw parameter should not be changed. This fixes the uninitialized swj in can_set_bitrate. Signed-off-by: Alexander Wachter <alexander@wachter.cloud>
This commit is contained in:
parent
6910d4d482
commit
5e0ca9b41e
6 changed files with 44 additions and 14 deletions
|
@ -79,6 +79,8 @@ void can_mcan_configure_timing(struct can_mcan_reg *can,
|
|||
const struct can_timing *timing_data)
|
||||
{
|
||||
if (timing) {
|
||||
uint32_t nbtp_sjw = can->nbtp & CAN_MCAN_NBTP_NSJW_MSK;
|
||||
|
||||
__ASSERT_NO_MSG(timing->prop_seg == 0);
|
||||
__ASSERT_NO_MSG(timing->phase_seg1 <= 0x100 &&
|
||||
timing->phase_seg1 > 0);
|
||||
|
@ -92,14 +94,21 @@ void can_mcan_configure_timing(struct can_mcan_reg *can,
|
|||
CAN_MCAN_NBTP_NTSEG1_POS |
|
||||
(((uint32_t)timing->phase_seg2 - 1UL) & 0x7F) <<
|
||||
CAN_MCAN_NBTP_NTSEG2_POS |
|
||||
(((uint32_t)timing->sjw - 1UL) & 0x7F) <<
|
||||
CAN_MCAN_NBTP_NSJW_POS |
|
||||
(((uint32_t)timing->prescaler - 1UL) & 0x1FF) <<
|
||||
CAN_MCAN_NBTP_NBRP_POS;
|
||||
|
||||
if (timing->sjw == CAN_SJW_NO_CHANGE) {
|
||||
can->nbtp |= nbtp_sjw;
|
||||
} else {
|
||||
can->nbtp |= (((uint32_t)timing->sjw - 1UL) & 0x7F) <<
|
||||
CAN_MCAN_NBTP_NSJW_POS;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CAN_FD_MODE
|
||||
if (timing_data) {
|
||||
uint32_t dbtp_sjw = can->dbtp & CAN_MCAN_DBTP_DSJW_MSK;
|
||||
|
||||
__ASSERT_NO_MSG(timing_data->prop_seg == 0);
|
||||
__ASSERT_NO_MSG(timing_data->phase_seg1 <= 0x20 &&
|
||||
timing_data->phase_seg1 > 0);
|
||||
|
@ -112,12 +121,17 @@ void can_mcan_configure_timing(struct can_mcan_reg *can,
|
|||
|
||||
can->dbtp = (((uint32_t)timing_data->phase_seg1 - 1UL) & 0x1F) <<
|
||||
CAN_MCAN_DBTP_DTSEG1_POS |
|
||||
(((uint32_t)timing_data->phase_seg2 - 1UL) & 0x0F) <<
|
||||
(((uint32_t)timing_data->phase_seg2 - 1UL) & 0x0F) <<
|
||||
CAN_MCAN_DBTP_DTSEG2_POS |
|
||||
(((uint32_t)timing_data->sjw - 1UL) & 0x0F) <<
|
||||
CAN_MCAN_DBTP_DSJW_POS |
|
||||
(((uint32_t)timing_data->prescaler - 1UL) & 0x1F) <<
|
||||
CAN_MCAN_DBTP_DBRP_POS;
|
||||
|
||||
if (timing_data->sjw == CAN_SJW_NO_CHANGE) {
|
||||
can->nbtp |= dbtp_sjw;
|
||||
} else {
|
||||
can->nbtp |= (((uint32_t)timing_data->sjw - 1UL) & 0x0F) <<
|
||||
CAN_MCAN_DBTP_DSJW_POS;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue