]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
can: rcar_canfd: Add shared_can_regs variable to struct rcar_canfd_hw_info
authorBiju Das <biju.das.jz@bp.renesas.com>
Thu, 17 Apr 2025 05:43:15 +0000 (06:43 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 21 May 2025 12:31:25 +0000 (14:31 +0200)
R-Car Gen4 has shared regs for both CAN-FD and Classical CAN operations.
Add shared_can_regs variable to struct rcar_canfd_hw_info to handle this
difference.

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-15-biju.das.jz@bp.renesas.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/rcar/rcar_canfd.c

index 25c00abee9ccf1c2930562626cfda4cc7f46c3e4..7e0f84596807d62a4828a65baac8a2cb79ad4acd 100644 (file)
@@ -517,6 +517,7 @@ struct rcar_canfd_hw_info {
        unsigned shared_global_irqs:1;  /* Has shared global irqs */
        unsigned multi_channel_irqs:1;  /* Has multiple channel irqs */
        unsigned ch_interface_mode:1;   /* Has channel interface mode */
+       unsigned shared_can_regs:1;     /* Has shared classical can registers */
 };
 
 /* Channel priv data */
@@ -621,6 +622,7 @@ static const struct rcar_canfd_hw_info rcar_gen3_hw_info = {
        .postdiv = 2,
        .shared_global_irqs = 1,
        .ch_interface_mode = 0,
+       .shared_can_regs = 0,
 };
 
 static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
@@ -633,6 +635,7 @@ static const struct rcar_canfd_hw_info rcar_gen4_hw_info = {
        .postdiv = 2,
        .shared_global_irqs = 1,
        .ch_interface_mode = 1,
+       .shared_can_regs = 1,
 };
 
 static const struct rcar_canfd_hw_info rzg2l_hw_info = {
@@ -645,6 +648,7 @@ static const struct rcar_canfd_hw_info rzg2l_hw_info = {
        .postdiv = 1,
        .multi_channel_irqs = 1,
        .ch_interface_mode = 0,
+       .shared_can_regs = 0,
 };
 
 /* Helper functions */
@@ -855,7 +859,7 @@ static void rcar_canfd_configure_afl_rules(struct rcar_canfd_global *gpriv,
 
        /* Write number of rules for channel */
        rcar_canfd_setrnc(gpriv, ch, num_rules);
-       if (is_gen4(gpriv))
+       if (gpriv->info->shared_can_regs)
                offset = RCANFD_GEN4_GAFL_OFFSET;
        else if (gpriv->fdmode)
                offset = RCANFD_F_GAFL_OFFSET;
@@ -1391,7 +1395,7 @@ static void rcar_canfd_set_bittiming(struct net_device *dev)
                           brp, sjw, tseg1, tseg2);
        } else {
                /* Classical CAN only mode */
-               if (is_gen4(gpriv)) {
+               if (gpriv->info->shared_can_regs) {
                        cfg = (RCANFD_NCFG_NTSEG1(gpriv, tseg1) |
                               RCANFD_NCFG_NBRP(brp) |
                               RCANFD_NCFG_NSJW(gpriv, sjw) |
@@ -1556,7 +1560,7 @@ static netdev_tx_t rcar_canfd_start_xmit(struct sk_buff *skb,
 
        dlc = RCANFD_CFPTR_CFDLC(can_fd_len2dlc(cf->len));
 
-       if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) {
+       if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || gpriv->info->shared_can_regs) {
                rcar_canfd_write(priv->base,
                                 RCANFD_F_CFID(gpriv, ch, RCANFD_CFFIFO_IDX), id);
                rcar_canfd_write(priv->base,
@@ -1615,7 +1619,7 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
        u32 ch = priv->channel;
        u32 ridx = ch + RCANFD_RFFIFO_IDX;
 
-       if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) {
+       if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || gpriv->info->shared_can_regs) {
                id = rcar_canfd_read(priv->base, RCANFD_F_RFID(gpriv, ridx));
                dlc = rcar_canfd_read(priv->base, RCANFD_F_RFPTR(gpriv, ridx));
 
@@ -1666,7 +1670,7 @@ static void rcar_canfd_rx_pkt(struct rcar_canfd_channel *priv)
                cf->len = can_cc_dlc2len(RCANFD_RFPTR_RFDLC(dlc));
                if (id & RCANFD_RFID_RFRTR)
                        cf->can_id |= CAN_RTR_FLAG;
-               else if (is_gen4(gpriv))
+               else if (gpriv->info->shared_can_regs)
                        rcar_canfd_get_data(priv, cf, RCANFD_F_RFDF(gpriv, ridx, 0));
                else
                        rcar_canfd_get_data(priv, cf, RCANFD_C_RFDF(ridx, 0));