From: Biju Das The RZ/{G2L,G3E} and R-Car Gen4 SoCs support additional CAN FD mode called FD-only mode. In this mode, communication in Classical CAN frame format is disabled. Signed-off-by: Biju Das Link: https://patch.msgid.link/20251126155911.320563-3-biju.das.jz@bp.renesas.com Signed-off-by: Marc Kleine-Budde --- drivers/net/can/rcar/rcar_canfd.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c index 7895e1fdea1c..4a653d8978ba 100644 --- a/drivers/net/can/rcar/rcar_canfd.c +++ b/drivers/net/can/rcar/rcar_canfd.c @@ -472,6 +472,7 @@ struct rcar_canfd_global { unsigned long channels_mask; /* Enabled channels mask */ bool extclk; /* CANFD or Ext clock */ bool fdmode; /* CAN FD or Classical CAN only mode */ + bool fd_only_mode; /* FD-Only mode for CAN-FD */ struct reset_control *rstc1; struct reset_control *rstc2; const struct rcar_canfd_hw_info *info; @@ -829,12 +830,20 @@ static int rcar_canfd_reset_controller(struct rcar_canfd_global *gpriv) RCANFD_GEN4_FDCFG_FDOE); rcar_canfd_set_bit_reg(&gpriv->fcbase[ch].cfdcfg, RCANFD_GEN4_FDCFG_CLOE); + } else if (gpriv->fd_only_mode) { + rcar_canfd_clear_bit_reg(&gpriv->fcbase[ch].cfdcfg, + RCANFD_GEN4_FDCFG_CLOE); + rcar_canfd_set_bit_reg(&gpriv->fcbase[ch].cfdcfg, + RCANFD_GEN4_FDCFG_FDOE); } else { rcar_canfd_clear_bit_reg(&gpriv->fcbase[ch].cfdcfg, RCANFD_GEN4_FDCFG_FDOE); rcar_canfd_clear_bit_reg(&gpriv->fcbase[ch].cfdcfg, RCANFD_GEN4_FDCFG_CLOE); } + } else if (gpriv->fd_only_mode) { + rcar_canfd_set_bit_reg(&gpriv->fcbase[ch].cfdcfg, + RCANFD_GEN4_FDCFG_FDOE); } } @@ -2140,6 +2149,9 @@ static int rcar_canfd_probe(struct platform_device *pdev) gpriv->fdmode = fdmode; gpriv->info = info; + if (of_property_read_bool(dev->of_node, "renesas,fd-only")) + gpriv->fd_only_mode = true; /* FD-Only mode for CAN-FD */ + gpriv->rstc1 = devm_reset_control_get_optional_exclusive(dev, "rstp_n"); if (IS_ERR(gpriv->rstc1)) return dev_err_probe(dev, PTR_ERR(gpriv->rstc1), @@ -2239,7 +2251,7 @@ static int rcar_canfd_probe(struct platform_device *pdev) platform_set_drvdata(pdev, gpriv); dev_info(dev, "global operational state (%s clk, %s mode)\n", gpriv->extclk ? "ext" : "canfd", - gpriv->fdmode ? "fd" : "classical"); + gpriv->fdmode ? (gpriv->fd_only_mode ? "fd-only" : "fd") : "classical"); return 0; fail_channel: -- 2.51.0