Message ID | 20250326122003.122976-12-biju.das.jz@bp.renesas.com (mailing list archive) |
---|---|
State | New |
Delegated to: | Geert Uytterhoeven |
Headers | show |
Series | Add support for RZ/G3E CANFD | expand |
On 26/03/2025 at 21:19, Biju Das wrote: > Both R-Car Gen4 and R-Car Gen3 have different bit timing parameters > Add {nom,data}_bittiming variables to struct rcar_canfd_hw_info to > handle this difference. > > Since the mask used in the macros are max value - 1, replace that > as well. > > Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> > Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr> > --- > v6->v7: > * Collected tag. > * Updated 'aswell'->'as well' in commit description. > v6: > * New patch. > --- > drivers/net/can/rcar/rcar_canfd.c | 53 ++++++++++++++++++++++++------- > 1 file changed, 42 insertions(+), 11 deletions(-) > > diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c > index c37fb85fe478..7e7f3c3307ae 100644 > --- a/drivers/net/can/rcar/rcar_canfd.c > +++ b/drivers/net/can/rcar/rcar_canfd.c > @@ -111,13 +111,13 @@ > > /* RSCFDnCFDCmNCFG - CAN FD only */ > #define RCANFD_NCFG_NTSEG2(gpriv, x) \ > - (((x) & reg_gen4(gpriv, 0x7f, 0x1f)) << reg_gen4(gpriv, 25, 24)) > + (((x) & ((gpriv)->info->nom_bittiming->tseg2_max - 1)) << reg_gen4(gpriv, 25, 24)) > > #define RCANFD_NCFG_NTSEG1(gpriv, x) \ > - (((x) & reg_gen4(gpriv, 0xff, 0x7f)) << reg_gen4(gpriv, 17, 16)) > + (((x) & ((gpriv)->info->nom_bittiming->tseg1_max - 1)) << reg_gen4(gpriv, 17, 16)) > > #define RCANFD_NCFG_NSJW(gpriv, x) \ > - (((x) & reg_gen4(gpriv, 0x7f, 0x1f)) << reg_gen4(gpriv, 10, 11)) > + (((x) & ((gpriv)->info->nom_bittiming->sjw_max - 1)) << reg_gen4(gpriv, 10, 11)) > > #define RCANFD_NCFG_NBRP(x) (((x) & 0x3ff) << 0) > > @@ -179,13 +179,13 @@ > #define RCANFD_CERFL_ERR(x) ((x) & (0x7fff)) /* above bits 14:0 */ > > /* RSCFDnCFDCmDCFG */ > -#define RCANFD_DCFG_DSJW(gpriv, x) (((x) & reg_gen4(gpriv, 0xf, 0x7)) << 24) > +#define RCANFD_DCFG_DSJW(gpriv, x) (((x) & ((gpriv)->info->data_bittiming->sjw_max - 1)) << 24) > > #define RCANFD_DCFG_DTSEG2(gpriv, x) \ > - (((x) & reg_gen4(gpriv, 0x0f, 0x7)) << reg_gen4(gpriv, 16, 20)) > + (((x) & ((gpriv)->info->data_bittiming->tseg2_max - 1)) << reg_gen4(gpriv, 16, 20)) > > #define RCANFD_DCFG_DTSEG1(gpriv, x) \ > - (((x) & reg_gen4(gpriv, 0x1f, 0xf)) << reg_gen4(gpriv, 8, 16)) > + (((x) & ((gpriv)->info->data_bittiming->tseg1_max - 1)) << reg_gen4(gpriv, 8, 16)) > > #define RCANFD_DCFG_DBRP(x) (((x) & 0xff) << 0) > > @@ -504,6 +504,8 @@ > struct rcar_canfd_global; > > struct rcar_canfd_hw_info { > + const struct can_bittiming_const *nom_bittiming; > + const struct can_bittiming_const *data_bittiming; > u16 num_supported_rules; > u8 rnc_stride; > u8 rnc_field_width; > @@ -546,7 +548,7 @@ struct rcar_canfd_global { > }; > > /* CAN FD mode nominal rate constants */ > -static const struct can_bittiming_const rcar_canfd_nom_bittiming_const = { > +static const struct can_bittiming_const rcar_canfd_gen3_nom_bittiming_const = { > .name = RCANFD_DRV_NAME, > .tseg1_min = 2, > .tseg1_max = 128, > @@ -558,8 +560,20 @@ static const struct can_bittiming_const rcar_canfd_nom_bittiming_const = { > .brp_inc = 1, > }; > > +static const struct can_bittiming_const rcar_canfd_gen4_nom_bittiming_const = { > + .name = RCANFD_DRV_NAME, > + .tseg1_min = 2, > + .tseg1_max = 256, > + .tseg2_min = 2, > + .tseg2_max = 128, > + .sjw_max = 128, > + .brp_min = 1, > + .brp_max = 1024, > + .brp_inc = 1, > +}; > + > /* CAN FD mode data rate constants */ > -static const struct can_bittiming_const rcar_canfd_data_bittiming_const = { > +static const struct can_bittiming_const rcar_canfd_gen3_data_bittiming_const = { > .name = RCANFD_DRV_NAME, > .tseg1_min = 2, > .tseg1_max = 16, > @@ -571,6 +585,18 @@ static const struct can_bittiming_const rcar_canfd_data_bittiming_const = { > .brp_inc = 1, > }; > > +static const struct can_bittiming_const rcar_canfd_gen4_data_bittiming_const = { > + .name = RCANFD_DRV_NAME, > + .tseg1_min = 2, > + .tseg1_max = 32, > + .tseg2_min = 2, > + .tseg2_max = 16, > + .sjw_max = 16, > + .brp_min = 1, > + .brp_max = 256, > + .brp_inc = 1, > +}; > + > /* Classical CAN mode bitrate constants */ > static const struct can_bittiming_const rcar_canfd_bittiming_const = { > .name = RCANFD_DRV_NAME, > @@ -585,6 +611,8 @@ static const struct can_bittiming_const rcar_canfd_bittiming_const = { > }; > > static const struct rcar_canfd_hw_info rcar_gen3_hw_info = { > + .nom_bittiming = &rcar_canfd_gen3_nom_bittiming_const, > + .data_bittiming = &rcar_canfd_gen3_data_bittiming_const, > .num_supported_rules = 256, > .rnc_stride = 4, > .rnc_field_width = 8, > @@ -596,6 +624,8 @@ static const struct rcar_canfd_hw_info rcar_gen3_hw_info = { > }; > > static const struct rcar_canfd_hw_info rcar_gen4_hw_info = { > + .nom_bittiming = &rcar_canfd_gen4_nom_bittiming_const, > + .data_bittiming = &rcar_canfd_gen4_data_bittiming_const, > .num_supported_rules = 512, > .rnc_stride = 2, > .rnc_field_width = 16, > @@ -607,6 +637,8 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = { > }; > > static const struct rcar_canfd_hw_info rzg2l_hw_info = { > + .nom_bittiming = &rcar_canfd_gen3_nom_bittiming_const, > + .data_bittiming = &rcar_canfd_gen3_data_bittiming_const, > .num_supported_rules = 256, > .rnc_stride = 4, > .rnc_field_width = 8, > @@ -1795,9 +1827,8 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch, > } > > if (gpriv->fdmode) { > - priv->can.bittiming_const = &rcar_canfd_nom_bittiming_const; > - priv->can.data_bittiming_const = > - &rcar_canfd_data_bittiming_const; > + priv->can.bittiming_const = gpriv->info->nom_bittiming; > + priv->can.data_bittiming_const = gpriv->info->data_bittiming; > > /* Controller starts in CAN FD only mode */ > err = can_set_static_ctrlmode(ndev, CAN_CTRLMODE_FD);
diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c index c37fb85fe478..7e7f3c3307ae 100644 --- a/drivers/net/can/rcar/rcar_canfd.c +++ b/drivers/net/can/rcar/rcar_canfd.c @@ -111,13 +111,13 @@ /* RSCFDnCFDCmNCFG - CAN FD only */ #define RCANFD_NCFG_NTSEG2(gpriv, x) \ - (((x) & reg_gen4(gpriv, 0x7f, 0x1f)) << reg_gen4(gpriv, 25, 24)) + (((x) & ((gpriv)->info->nom_bittiming->tseg2_max - 1)) << reg_gen4(gpriv, 25, 24)) #define RCANFD_NCFG_NTSEG1(gpriv, x) \ - (((x) & reg_gen4(gpriv, 0xff, 0x7f)) << reg_gen4(gpriv, 17, 16)) + (((x) & ((gpriv)->info->nom_bittiming->tseg1_max - 1)) << reg_gen4(gpriv, 17, 16)) #define RCANFD_NCFG_NSJW(gpriv, x) \ - (((x) & reg_gen4(gpriv, 0x7f, 0x1f)) << reg_gen4(gpriv, 10, 11)) + (((x) & ((gpriv)->info->nom_bittiming->sjw_max - 1)) << reg_gen4(gpriv, 10, 11)) #define RCANFD_NCFG_NBRP(x) (((x) & 0x3ff) << 0) @@ -179,13 +179,13 @@ #define RCANFD_CERFL_ERR(x) ((x) & (0x7fff)) /* above bits 14:0 */ /* RSCFDnCFDCmDCFG */ -#define RCANFD_DCFG_DSJW(gpriv, x) (((x) & reg_gen4(gpriv, 0xf, 0x7)) << 24) +#define RCANFD_DCFG_DSJW(gpriv, x) (((x) & ((gpriv)->info->data_bittiming->sjw_max - 1)) << 24) #define RCANFD_DCFG_DTSEG2(gpriv, x) \ - (((x) & reg_gen4(gpriv, 0x0f, 0x7)) << reg_gen4(gpriv, 16, 20)) + (((x) & ((gpriv)->info->data_bittiming->tseg2_max - 1)) << reg_gen4(gpriv, 16, 20)) #define RCANFD_DCFG_DTSEG1(gpriv, x) \ - (((x) & reg_gen4(gpriv, 0x1f, 0xf)) << reg_gen4(gpriv, 8, 16)) + (((x) & ((gpriv)->info->data_bittiming->tseg1_max - 1)) << reg_gen4(gpriv, 8, 16)) #define RCANFD_DCFG_DBRP(x) (((x) & 0xff) << 0) @@ -504,6 +504,8 @@ struct rcar_canfd_global; struct rcar_canfd_hw_info { + const struct can_bittiming_const *nom_bittiming; + const struct can_bittiming_const *data_bittiming; u16 num_supported_rules; u8 rnc_stride; u8 rnc_field_width; @@ -546,7 +548,7 @@ struct rcar_canfd_global { }; /* CAN FD mode nominal rate constants */ -static const struct can_bittiming_const rcar_canfd_nom_bittiming_const = { +static const struct can_bittiming_const rcar_canfd_gen3_nom_bittiming_const = { .name = RCANFD_DRV_NAME, .tseg1_min = 2, .tseg1_max = 128, @@ -558,8 +560,20 @@ static const struct can_bittiming_const rcar_canfd_nom_bittiming_const = { .brp_inc = 1, }; +static const struct can_bittiming_const rcar_canfd_gen4_nom_bittiming_const = { + .name = RCANFD_DRV_NAME, + .tseg1_min = 2, + .tseg1_max = 256, + .tseg2_min = 2, + .tseg2_max = 128, + .sjw_max = 128, + .brp_min = 1, + .brp_max = 1024, + .brp_inc = 1, +}; + /* CAN FD mode data rate constants */ -static const struct can_bittiming_const rcar_canfd_data_bittiming_const = { +static const struct can_bittiming_const rcar_canfd_gen3_data_bittiming_const = { .name = RCANFD_DRV_NAME, .tseg1_min = 2, .tseg1_max = 16, @@ -571,6 +585,18 @@ static const struct can_bittiming_const rcar_canfd_data_bittiming_const = { .brp_inc = 1, }; +static const struct can_bittiming_const rcar_canfd_gen4_data_bittiming_const = { + .name = RCANFD_DRV_NAME, + .tseg1_min = 2, + .tseg1_max = 32, + .tseg2_min = 2, + .tseg2_max = 16, + .sjw_max = 16, + .brp_min = 1, + .brp_max = 256, + .brp_inc = 1, +}; + /* Classical CAN mode bitrate constants */ static const struct can_bittiming_const rcar_canfd_bittiming_const = { .name = RCANFD_DRV_NAME, @@ -585,6 +611,8 @@ static const struct can_bittiming_const rcar_canfd_bittiming_const = { }; static const struct rcar_canfd_hw_info rcar_gen3_hw_info = { + .nom_bittiming = &rcar_canfd_gen3_nom_bittiming_const, + .data_bittiming = &rcar_canfd_gen3_data_bittiming_const, .num_supported_rules = 256, .rnc_stride = 4, .rnc_field_width = 8, @@ -596,6 +624,8 @@ static const struct rcar_canfd_hw_info rcar_gen3_hw_info = { }; static const struct rcar_canfd_hw_info rcar_gen4_hw_info = { + .nom_bittiming = &rcar_canfd_gen4_nom_bittiming_const, + .data_bittiming = &rcar_canfd_gen4_data_bittiming_const, .num_supported_rules = 512, .rnc_stride = 2, .rnc_field_width = 16, @@ -607,6 +637,8 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = { }; static const struct rcar_canfd_hw_info rzg2l_hw_info = { + .nom_bittiming = &rcar_canfd_gen3_nom_bittiming_const, + .data_bittiming = &rcar_canfd_gen3_data_bittiming_const, .num_supported_rules = 256, .rnc_stride = 4, .rnc_field_width = 8, @@ -1795,9 +1827,8 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch, } if (gpriv->fdmode) { - priv->can.bittiming_const = &rcar_canfd_nom_bittiming_const; - priv->can.data_bittiming_const = - &rcar_canfd_data_bittiming_const; + priv->can.bittiming_const = gpriv->info->nom_bittiming; + priv->can.data_bittiming_const = gpriv->info->data_bittiming; /* Controller starts in CAN FD only mode */ err = can_set_static_ctrlmode(ndev, CAN_CTRLMODE_FD);