mirror of
https://github.com/torvalds/linux.git
synced 2026-08-07 07:54:18 +02:00
can: rcar_canfd: Add {nom,data}_bittiming variables to struct rcar_canfd_hw_info
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>
Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20250417054320.14100-13-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
parent
04d7a3a466
commit
b5a9f2ec42
|
|
@ -110,13 +110,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)
|
||||
|
||||
|
|
@ -178,13 +178,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)
|
||||
|
||||
|
|
@ -506,6 +506,8 @@
|
|||
struct rcar_canfd_global;
|
||||
|
||||
struct rcar_canfd_hw_info {
|
||||
const struct can_bittiming_const *nom_bittiming;
|
||||
const struct can_bittiming_const *data_bittiming;
|
||||
u8 rnc_field_width;
|
||||
u8 max_aflpn;
|
||||
u8 max_cftml;
|
||||
|
|
@ -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,
|
||||
.rnc_field_width = 8,
|
||||
.max_aflpn = 31,
|
||||
.max_cftml = 15,
|
||||
|
|
@ -594,6 +622,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,
|
||||
.rnc_field_width = 16,
|
||||
.max_aflpn = 127,
|
||||
.max_cftml = 31,
|
||||
|
|
@ -603,6 +633,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,
|
||||
.rnc_field_width = 8,
|
||||
.max_aflpn = 31,
|
||||
.max_cftml = 15,
|
||||
|
|
@ -1799,9 +1831,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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user