Skip to content

Commit d2607f0

Browse files
talih0nashif
authored andcommitted
drivers: can: mcp251xfd: Use macro to set TDCO
Use CAN_CALC_TDCO() macro to set TDCO. There is a minor change how the tdco is calculated. In the macro the SYNC segement is taken into account while it wasn't used before. Fixes #73821. Signed-off-by: Andriy Gelman <[email protected]>
1 parent 83958eb commit d2607f0

File tree

1 file changed

+8
-11
lines changed

1 file changed

+8
-11
lines changed

drivers/can/can_mcp251xfd.c

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -286,21 +286,17 @@ static int mcp251xfd_reg_check_value_wtimeout(const struct device *dev, uint16_t
286286
return 0;
287287
}
288288

289-
static int mcp251xfd_set_tdc(const struct device *dev, bool is_enabled, int tdc_offset)
289+
static int mcp251xfd_set_tdc(const struct device *dev, bool is_enabled)
290290
{
291291
uint32_t *reg;
292292
uint32_t tmp;
293-
294-
if (is_enabled &&
295-
(tdc_offset < MCP251XFD_REG_TDC_TDCO_MIN || tdc_offset > MCP251XFD_REG_TDC_TDCO_MAX)) {
296-
return -EINVAL;
297-
}
293+
struct mcp251xfd_data *dev_data = dev->data;
298294

299295
reg = mcp251xfd_get_spi_buf_ptr(dev);
300296

301297
if (is_enabled) {
302298
tmp = FIELD_PREP(MCP251XFD_REG_TDC_TDCMOD_MASK, MCP251XFD_REG_TDC_TDCMOD_AUTO);
303-
tmp |= FIELD_PREP(MCP251XFD_REG_TDC_TDCO_MASK, tdc_offset);
299+
tmp |= FIELD_PREP(MCP251XFD_REG_TDC_TDCO_MASK, dev_data->tdco);
304300
} else {
305301
tmp = FIELD_PREP(MCP251XFD_REG_TDC_TDCMOD_MASK, MCP251XFD_REG_TDC_TDCMOD_DISABLED);
306302
}
@@ -337,9 +333,9 @@ static int mcp251xfd_set_mode_internal(const struct device *dev, uint8_t request
337333
if (requested_mode == MCP251XFD_REG_CON_MODE_CAN2_0 ||
338334
requested_mode == MCP251XFD_REG_CON_MODE_EXT_LOOPBACK ||
339335
requested_mode == MCP251XFD_REG_CON_MODE_INT_LOOPBACK) {
340-
ret = mcp251xfd_set_tdc(dev, false, 0);
336+
ret = mcp251xfd_set_tdc(dev, false);
341337
} else if (requested_mode == MCP251XFD_REG_CON_MODE_MIXED) {
342-
ret = mcp251xfd_set_tdc(dev, true, dev_data->tdco);
338+
ret = mcp251xfd_set_tdc(dev, true);
343339
}
344340

345341
if (ret < 0) {
@@ -470,7 +466,8 @@ static int mcp251xfd_set_timing_data(const struct device *dev, const struct can_
470466

471467
*reg = sys_cpu_to_le32(tmp);
472468

473-
dev_data->tdco = timing->prescaler * (timing->prop_seg + timing->phase_seg1);
469+
/* actual TDCO minimum is -64 but driver implementation only sets >= 0 values */
470+
dev_data->tdco = CAN_CALC_TDCO(timing, 0U, MCP251XFD_REG_TDC_TDCO_MAX);
474471

475472
ret = mcp251xfd_write(dev, MCP251XFD_REG_DBTCFG, MCP251XFD_REG_SIZE);
476473
if (ret < 0) {
@@ -1638,7 +1635,7 @@ static int mcp251xfd_init(const struct device *dev)
16381635
goto done;
16391636
}
16401637

1641-
ret = mcp251xfd_set_tdc(dev, false, 0);
1638+
ret = mcp251xfd_set_tdc(dev, false);
16421639
if (ret < 0) {
16431640
goto done;
16441641
}

0 commit comments

Comments
 (0)