|
169 | 169 | #define RCANFD_CERFL_ERR(x) ((x) & (0x7fff)) /* above bits 14:0 */ |
170 | 170 |
|
171 | 171 | /* RSCFDnCFDCmDCFG */ |
172 | | -#define RCANFD_DCFG_DSJW(gpriv, x) (((x) & ((gpriv)->info->data_bittiming->sjw_max - 1)) << 24) |
173 | | - |
174 | | -#define RCANFD_DCFG_DTSEG2(gpriv, x) \ |
175 | | - (((x) & ((gpriv)->info->data_bittiming->tseg2_max - 1)) << (gpriv)->info->sh->dtseg2) |
176 | | - |
177 | | -#define RCANFD_DCFG_DTSEG1(gpriv, x) \ |
178 | | - (((x) & ((gpriv)->info->data_bittiming->tseg1_max - 1)) << (gpriv)->info->sh->dtseg1) |
179 | | - |
180 | | -#define RCANFD_DCFG_DBRP(x) (((x) & 0xff) << 0) |
| 172 | +#define RCANFD_DCFG_DBRP GENMASK(7, 0) |
181 | 173 |
|
182 | 174 | /* RSCFDnCFDCmFDCFG */ |
183 | 175 | #define RCANFD_GEN4_FDCFG_CLOE BIT(30) |
@@ -1401,6 +1393,19 @@ static inline u32 rcar_canfd_compute_nominal_bit_rate_cfg(struct rcar_canfd_chan |
1401 | 1393 | return (ntseg1 | ntseg2 | nsjw | nbrp); |
1402 | 1394 | } |
1403 | 1395 |
|
| 1396 | +static inline u32 rcar_canfd_compute_data_bit_rate_cfg(const struct rcar_canfd_hw_info *info, |
| 1397 | + u16 tseg1, u16 tseg2, u16 sjw, u16 brp) |
| 1398 | +{ |
| 1399 | + u32 dtseg1, dtseg2, dsjw, dbrp; |
| 1400 | + |
| 1401 | + dtseg1 = (tseg1 & (info->data_bittiming->tseg1_max - 1)) << info->sh->dtseg1; |
| 1402 | + dtseg2 = (tseg2 & (info->data_bittiming->tseg2_max - 1)) << info->sh->dtseg2; |
| 1403 | + dsjw = (sjw & (info->data_bittiming->sjw_max - 1)) << 24; |
| 1404 | + dbrp = FIELD_PREP(RCANFD_DCFG_DBRP, brp); |
| 1405 | + |
| 1406 | + return (dtseg1 | dtseg2 | dsjw | dbrp); |
| 1407 | +} |
| 1408 | + |
1404 | 1409 | static void rcar_canfd_set_bittiming(struct net_device *ndev) |
1405 | 1410 | { |
1406 | 1411 | u32 mask = RCANFD_FDCFG_TDCO | RCANFD_FDCFG_TDCE | RCANFD_FDCFG_TDCOC; |
@@ -1430,10 +1435,7 @@ static void rcar_canfd_set_bittiming(struct net_device *ndev) |
1430 | 1435 | sjw = dbt->sjw - 1; |
1431 | 1436 | tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1; |
1432 | 1437 | tseg2 = dbt->phase_seg2 - 1; |
1433 | | - |
1434 | | - cfg = (RCANFD_DCFG_DTSEG1(gpriv, tseg1) | RCANFD_DCFG_DBRP(brp) | |
1435 | | - RCANFD_DCFG_DSJW(gpriv, sjw) | RCANFD_DCFG_DTSEG2(gpriv, tseg2)); |
1436 | | - |
| 1438 | + cfg = rcar_canfd_compute_data_bit_rate_cfg(gpriv->info, tseg1, tseg2, sjw, brp); |
1437 | 1439 | writel(cfg, &gpriv->fcbase[ch].dcfg); |
1438 | 1440 |
|
1439 | 1441 | /* Transceiver Delay Compensation */ |
|
0 commit comments