diff options
| author | Biju Das <biju.das.jz@bp.renesas.com> | 2025-11-26 18:59:07 +0300 |
|---|---|---|
| committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2026-01-16 22:50:10 +0300 |
| commit | 9a2b56a48c219d189366dd9bf4c2b42afde2f361 (patch) | |
| tree | 96868becb470597c0858a8735298f45193e83b57 | |
| parent | 1766de15a571662fcd9c0a870de3a06890142a1e (diff) | |
| download | linux-9a2b56a48c219d189366dd9bf4c2b42afde2f361.tar.xz | |
can: rcar_canfd: Add support for FD-Only mode
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 <biju.das.jz@bp.renesas.com>
Link: https://patch.msgid.link/20251126155911.320563-3-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
| -rw-r--r-- | drivers/net/can/rcar/rcar_canfd.c | 14 |
1 files changed, 13 insertions, 1 deletions
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: |
