Lines Matching +full:8 +full:- +full:ch
1 // SPDX-License-Identifier: GPL-2.0+
2 /* Renesas R-Car CAN FD device driver
7 /* The R-Car CAN FD controller can operate in either one of the below two modes
8 * - CAN FD only mode
9 * - Classical CAN (CAN 2.0) only mode
16 * "renesas,no-can-fd" optional property to the device tree node. A h/w reset is
61 #define RCANFD_GCTR_DEIE BIT(8)
73 /* Non-operational status */
78 #define RCANFD_GERFL_EEF(ch) BIT(16 + (ch)) argument
88 ((gpriv)->fdmode ? RCANFD_GERFL_CMPOF : 0)))
95 (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8)))
98 (((x) >> (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8))) & \
102 #define RCANFD_GAFLECTR_AFLDAE BIT(8)
113 /* RSCFDnCmCFG - Classical CAN only */
119 /* RSCFDnCFDCmNCFG - CAN FD only */
149 #define RCANFD_CCTR_BEIE BIT(8)
176 #define RCANFD_CERFL_SERR BIT(8)
195 (((x) & reg_gen4(gpriv, 0x1f, 0xf)) << reg_gen4(gpriv, 8, 16))
203 #define RCANFD_FDCFG_TDCOC BIT(8)
208 #define RCANFD_RFCC_RFDC(x) (((x) & 0x7) << 8)
238 #define RCANFD_CFCC_CFM(gpriv, x) (((x) & 0x3) << reg_gen4(gpriv, 8, 16))
240 #define RCANFD_CFCC_CFDC(gpriv, x) (((x) & 0x7) << reg_gen4(gpriv, 21, 8))
246 #define RCANFD_CFSTS_CFMC(x) (((x) >> 8) & 0xff)
301 #define RCANFD_GAFLCFG(ch) (0x009c + (0x04 * ((ch) / 2))) argument
317 #define RCANFD_CFCC(gpriv, ch, idx) \ argument
318 (reg_gen4(gpriv, 0x0120, 0x0118) + (0x0c * (ch)) + (0x04 * (idx)))
320 #define RCANFD_CFSTS(gpriv, ch, idx) \ argument
321 (reg_gen4(gpriv, 0x01e0, 0x0178) + (0x0c * (ch)) + (0x04 * (idx)))
323 #define RCANFD_CFPCTR(gpriv, ch, idx) \ argument
324 (reg_gen4(gpriv, 0x0240, 0x01d8) + (0x0c * (ch)) + (0x04 * (idx)))
396 /* RSCFDnRMXXXq -> RCANFD_C_RMXXX(q) */
402 /* RSCFDnRFXXx -> RCANFD_C_RFXX(x) */
409 /* RSCFDnCFXXk -> RCANFD_C_CFXX(ch, k) */
412 #define RCANFD_C_CFID(ch, idx) \ argument
413 (RCANFD_C_CFOFFSET + (0x30 * (ch)) + (0x10 * (idx)))
415 #define RCANFD_C_CFPTR(ch, idx) \ argument
416 (RCANFD_C_CFOFFSET + 0x04 + (0x30 * (ch)) + (0x10 * (idx)))
418 #define RCANFD_C_CFDF(ch, idx, df) \ argument
419 (RCANFD_C_CFOFFSET + 0x08 + (0x30 * (ch)) + (0x10 * (idx)) + (0x04 * (df)))
421 /* RSCFDnTMXXp -> RCANFD_C_TMXX(p) */
432 /* R-Car Gen4 Classical and CAN FD mode specific register map */
439 /* RSCFDnCFDCmXXX -> RCANFD_F_XXX(m) */
449 /* RSCFDnCFDRMXXXq -> RCANFD_F_RMXXX(q) */
455 /* RSCFDnCFDRFXXx -> RCANFD_F_RFXX(x) */
463 /* RSCFDnCFDCFXXk -> RCANFD_F_CFXX(ch, k) */
466 #define RCANFD_F_CFID(gpriv, ch, idx) \ argument
467 (RCANFD_F_CFOFFSET(gpriv) + (0x180 * (ch)) + (0x80 * (idx)))
469 #define RCANFD_F_CFPTR(gpriv, ch, idx) \ argument
470 (RCANFD_F_CFOFFSET(gpriv) + 0x04 + (0x180 * (ch)) + (0x80 * (idx)))
472 #define RCANFD_F_CFFDCSTS(gpriv, ch, idx) \ argument
473 (RCANFD_F_CFOFFSET(gpriv) + 0x08 + (0x180 * (ch)) + (0x80 * (idx)))
475 #define RCANFD_F_CFDF(gpriv, ch, idx, df) \ argument
476 (RCANFD_F_CFOFFSET(gpriv) + 0x0c + (0x180 * (ch)) + (0x80 * (idx)) + \
479 /* RSCFDnCFDTMXXp -> RCANFD_F_TMXX(p) */
491 #define RCANFD_FIFO_DEPTH 8 /* Tx FIFO depth */
492 #define RCANFD_NAPI_WEIGHT 8 /* Rx poll quota */
494 #define RCANFD_NUM_CHANNELS 8 /* Eight channels max */
495 #define RCANFD_CHANNELS_MASK BIT((RCANFD_NUM_CHANNELS) - 1)
500 /* Rx FIFO is a global resource of the controller. There are 8 such FIFOs
543 struct rcar_canfd_channel *ch[RCANFD_NUM_CHANNELS]; member
575 .tseg2_max = 8,
576 .sjw_max = 8,
588 .tseg2_max = 8,
602 .max_channels = 8,
616 return gpriv->info == &rcar_gen4_hw_info; in is_gen4()
665 lwords = DIV_ROUND_UP(cf->len, sizeof(u32)); in rcar_canfd_get_data()
667 *((u32 *)cf->data + i) = in rcar_canfd_get_data()
668 rcar_canfd_read(priv->base, off + (i * sizeof(u32))); in rcar_canfd_get_data()
676 lwords = DIV_ROUND_UP(cf->len, sizeof(u32)); in rcar_canfd_put_data()
678 rcar_canfd_write(priv->base, off + (i * sizeof(u32)), in rcar_canfd_put_data()
679 *((u32 *)cf->data + i)); in rcar_canfd_put_data()
693 u32 ch, val = gpriv->fdmode ? RCANFD_GEN4_FDCFG_FDOE in rcar_canfd_set_mode() local
696 for_each_set_bit(ch, &gpriv->channels_mask, in rcar_canfd_set_mode()
697 gpriv->info->max_channels) in rcar_canfd_set_mode()
698 rcar_canfd_set_bit(gpriv->base, RCANFD_GEN4_FDCFG(ch), in rcar_canfd_set_mode()
701 if (gpriv->fdmode) in rcar_canfd_set_mode()
702 rcar_canfd_set_bit(gpriv->base, RCANFD_GRMCFG, in rcar_canfd_set_mode()
705 rcar_canfd_clear_bit(gpriv->base, RCANFD_GRMCFG, in rcar_canfd_set_mode()
712 u32 sts, ch; in rcar_canfd_reset_controller() local
718 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_reset_controller()
721 dev_dbg(&gpriv->pdev->dev, "global raminit failed\n"); in rcar_canfd_reset_controller()
726 rcar_canfd_clear_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GSLPR); in rcar_canfd_reset_controller()
727 rcar_canfd_update_bit(gpriv->base, RCANFD_GCTR, in rcar_canfd_reset_controller()
731 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_reset_controller()
734 dev_dbg(&gpriv->pdev->dev, "global reset failed\n"); in rcar_canfd_reset_controller()
739 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0x0); in rcar_canfd_reset_controller()
745 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_reset_controller()
746 rcar_canfd_clear_bit(gpriv->base, in rcar_canfd_reset_controller()
747 RCANFD_CCTR(ch), RCANFD_CCTR_CSLPR); in rcar_canfd_reset_controller()
749 rcar_canfd_update_bit(gpriv->base, RCANFD_CCTR(ch), in rcar_canfd_reset_controller()
754 err = readl_poll_timeout((gpriv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_reset_controller()
758 dev_dbg(&gpriv->pdev->dev, in rcar_canfd_reset_controller()
759 "channel %u reset failed\n", ch); in rcar_canfd_reset_controller()
768 u32 cfg, ch; in rcar_canfd_configure_controller() local
775 if (gpriv->fdmode) in rcar_canfd_configure_controller()
780 if (gpriv->fcan != RCANFD_CANFDCLK) in rcar_canfd_configure_controller()
783 rcar_canfd_set_bit(gpriv->base, RCANFD_GCFG, cfg); in rcar_canfd_configure_controller()
786 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_configure_controller()
787 rcar_canfd_set_bit(gpriv->base, RCANFD_CCTR(ch), in rcar_canfd_configure_controller()
789 rcar_canfd_update_bit(gpriv->base, RCANFD_CCTR(ch), in rcar_canfd_configure_controller()
796 u32 ch) in rcar_canfd_configure_afl_rules() argument
800 u32 ridx = ch + RCANFD_RFFIFO_IDX; in rcar_canfd_configure_afl_rules()
802 if (ch == 0) { in rcar_canfd_configure_afl_rules()
806 cfg = rcar_canfd_read(gpriv->base, RCANFD_GAFLCFG(ch)); in rcar_canfd_configure_afl_rules()
812 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLECTR, in rcar_canfd_configure_afl_rules()
817 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(ch), in rcar_canfd_configure_afl_rules()
818 RCANFD_GAFLCFG_SETRNC(gpriv, ch, num_rules)); in rcar_canfd_configure_afl_rules()
821 else if (gpriv->fdmode) in rcar_canfd_configure_afl_rules()
827 rcar_canfd_write(gpriv->base, RCANFD_GAFLID(offset, start), 0); in rcar_canfd_configure_afl_rules()
829 rcar_canfd_write(gpriv->base, RCANFD_GAFLM(offset, start), 0); in rcar_canfd_configure_afl_rules()
831 rcar_canfd_write(gpriv->base, RCANFD_GAFLP0(offset, start), 0); in rcar_canfd_configure_afl_rules()
833 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLP1(offset, start), in rcar_canfd_configure_afl_rules()
837 rcar_canfd_clear_bit(gpriv->base, in rcar_canfd_configure_afl_rules()
841 static void rcar_canfd_configure_rx(struct rcar_canfd_global *gpriv, u32 ch) in rcar_canfd_configure_rx() argument
848 u32 ridx = ch + RCANFD_RFFIFO_IDX; in rcar_canfd_configure_rx()
850 rfdc = 2; /* b010 - 8 messages Rx FIFO depth */ in rcar_canfd_configure_rx()
851 if (gpriv->fdmode) in rcar_canfd_configure_rx()
852 rfpls = 7; /* b111 - Max 64 bytes payload */ in rcar_canfd_configure_rx()
854 rfpls = 0; /* b000 - Max 8 bytes payload */ in rcar_canfd_configure_rx()
858 rcar_canfd_write(gpriv->base, RCANFD_RFCC(gpriv, ridx), cfg); in rcar_canfd_configure_rx()
861 static void rcar_canfd_configure_tx(struct rcar_canfd_global *gpriv, u32 ch) in rcar_canfd_configure_tx() argument
873 cfm = 1; /* b01 - Transmit mode */ in rcar_canfd_configure_tx()
874 cfdc = 2; /* b010 - 8 messages Tx FIFO depth */ in rcar_canfd_configure_tx()
875 if (gpriv->fdmode) in rcar_canfd_configure_tx()
876 cfpls = 7; /* b111 - Max 64 bytes payload */ in rcar_canfd_configure_tx()
878 cfpls = 0; /* b000 - Max 8 bytes payload */ in rcar_canfd_configure_tx()
883 rcar_canfd_write(gpriv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX), cfg); in rcar_canfd_configure_tx()
885 if (gpriv->fdmode) in rcar_canfd_configure_tx()
887 rcar_canfd_write(gpriv->base, in rcar_canfd_configure_tx()
888 RCANFD_F_CFFDCSTS(gpriv, ch, RCANFD_CFFIFO_IDX), 0); in rcar_canfd_configure_tx()
896 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0); in rcar_canfd_enable_global_interrupts()
900 if (gpriv->fdmode) in rcar_canfd_enable_global_interrupts()
903 rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, ctr); in rcar_canfd_enable_global_interrupts()
910 rcar_canfd_write(gpriv->base, RCANFD_GCTR, 0); in rcar_canfd_disable_global_interrupts()
913 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0); in rcar_canfd_disable_global_interrupts()
919 u32 ctr, ch = priv->channel; in rcar_canfd_enable_channel_interrupts() local
922 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), 0); in rcar_canfd_enable_channel_interrupts()
930 rcar_canfd_set_bit(priv->base, RCANFD_CCTR(ch), ctr); in rcar_canfd_enable_channel_interrupts()
936 u32 ctr, ch = priv->channel; in rcar_canfd_disable_channel_interrupts() local
943 rcar_canfd_clear_bit(priv->base, RCANFD_CCTR(ch), ctr); in rcar_canfd_disable_channel_interrupts()
946 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), 0); in rcar_canfd_disable_channel_interrupts()
952 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_global_error()
953 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_global_error()
954 u32 ch = priv->channel; in rcar_canfd_global_error() local
956 u32 ridx = ch + RCANFD_RFFIFO_IDX; in rcar_canfd_global_error()
958 gerfl = rcar_canfd_read(priv->base, RCANFD_GERFL); in rcar_canfd_global_error()
959 if (gerfl & RCANFD_GERFL_EEF(ch)) { in rcar_canfd_global_error()
960 netdev_dbg(ndev, "Ch%u: ECC Error flag\n", ch); in rcar_canfd_global_error()
961 stats->tx_dropped++; in rcar_canfd_global_error()
964 sts = rcar_canfd_read(priv->base, in rcar_canfd_global_error()
965 RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX)); in rcar_canfd_global_error()
968 stats->tx_dropped++; in rcar_canfd_global_error()
969 rcar_canfd_write(priv->base, in rcar_canfd_global_error()
970 RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX), in rcar_canfd_global_error()
974 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx)); in rcar_canfd_global_error()
977 stats->rx_dropped++; in rcar_canfd_global_error()
978 rcar_canfd_write(priv->base, RCANFD_RFSTS(gpriv, ridx), in rcar_canfd_global_error()
982 if (gpriv->fdmode && gerfl & RCANFD_GERFL_CMPOF) { in rcar_canfd_global_error()
993 rcar_canfd_write(priv->base, RCANFD_GERFL, 0); in rcar_canfd_global_error()
1000 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_error()
1003 u32 ch = priv->channel; in rcar_canfd_error() local
1005 netdev_dbg(ndev, "ch erfl %x txerr %u rxerr %u\n", cerfl, txerr, rxerr); in rcar_canfd_error()
1010 stats->rx_dropped++; in rcar_canfd_error()
1017 cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; in rcar_canfd_error()
1018 cf->data[2] = CAN_ERR_PROT_UNSPEC; in rcar_canfd_error()
1019 priv->can.can_stats.bus_error++; in rcar_canfd_error()
1023 stats->tx_errors++; in rcar_canfd_error()
1024 cf->data[3] |= CAN_ERR_PROT_LOC_ACK_DEL; in rcar_canfd_error()
1028 stats->tx_errors++; in rcar_canfd_error()
1029 cf->data[2] |= CAN_ERR_PROT_BIT0; in rcar_canfd_error()
1033 stats->tx_errors++; in rcar_canfd_error()
1034 cf->data[2] |= CAN_ERR_PROT_BIT1; in rcar_canfd_error()
1038 stats->rx_errors++; in rcar_canfd_error()
1039 cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; in rcar_canfd_error()
1043 stats->tx_errors++; in rcar_canfd_error()
1044 cf->can_id |= CAN_ERR_ACK; in rcar_canfd_error()
1045 cf->data[3] |= CAN_ERR_PROT_LOC_ACK; in rcar_canfd_error()
1049 stats->rx_errors++; in rcar_canfd_error()
1050 cf->data[2] |= CAN_ERR_PROT_FORM; in rcar_canfd_error()
1054 stats->rx_errors++; in rcar_canfd_error()
1055 cf->data[2] |= CAN_ERR_PROT_STUFF; in rcar_canfd_error()
1059 priv->can.can_stats.arbitration_lost++; in rcar_canfd_error()
1060 cf->can_id |= CAN_ERR_LOSTARB; in rcar_canfd_error()
1061 cf->data[0] |= CAN_ERR_LOSTARB_UNSPEC; in rcar_canfd_error()
1065 stats->rx_errors++; in rcar_canfd_error()
1066 cf->can_id |= CAN_ERR_BUSERROR; in rcar_canfd_error()
1070 priv->can.state = CAN_STATE_ERROR_WARNING; in rcar_canfd_error()
1071 priv->can.can_stats.error_warning++; in rcar_canfd_error()
1072 cf->can_id |= CAN_ERR_CRTL | CAN_ERR_CNT; in rcar_canfd_error()
1073 cf->data[1] = txerr > rxerr ? CAN_ERR_CRTL_TX_WARNING : in rcar_canfd_error()
1075 cf->data[6] = txerr; in rcar_canfd_error()
1076 cf->data[7] = rxerr; in rcar_canfd_error()
1080 priv->can.state = CAN_STATE_ERROR_PASSIVE; in rcar_canfd_error()
1081 priv->can.can_stats.error_passive++; in rcar_canfd_error()
1082 cf->can_id |= CAN_ERR_CRTL | CAN_ERR_CNT; in rcar_canfd_error()
1083 cf->data[1] = txerr > rxerr ? CAN_ERR_CRTL_TX_PASSIVE : in rcar_canfd_error()
1085 cf->data[6] = txerr; in rcar_canfd_error()
1086 cf->data[7] = rxerr; in rcar_canfd_error()
1089 netdev_dbg(ndev, "Bus-off entry interrupt\n"); in rcar_canfd_error()
1091 priv->can.state = CAN_STATE_BUS_OFF; in rcar_canfd_error()
1092 priv->can.can_stats.bus_off++; in rcar_canfd_error()
1094 cf->can_id |= CAN_ERR_BUSOFF; in rcar_canfd_error()
1099 stats->tx_errors++; in rcar_canfd_error()
1100 cf->can_id |= CAN_ERR_PROT; in rcar_canfd_error()
1101 cf->data[2] |= CAN_ERR_PROT_OVERLOAD; in rcar_canfd_error()
1105 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), in rcar_canfd_error()
1113 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_tx_done()
1114 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_tx_done()
1117 u32 ch = priv->channel; in rcar_canfd_tx_done() local
1122 sent = priv->tx_tail % RCANFD_FIFO_DEPTH; in rcar_canfd_tx_done()
1123 stats->tx_packets++; in rcar_canfd_tx_done()
1124 stats->tx_bytes += can_get_echo_skb(ndev, sent, NULL); in rcar_canfd_tx_done()
1126 spin_lock_irqsave(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1127 priv->tx_tail++; in rcar_canfd_tx_done()
1128 sts = rcar_canfd_read(priv->base, in rcar_canfd_tx_done()
1129 RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX)); in rcar_canfd_tx_done()
1136 if (priv->tx_head - priv->tx_tail <= unsent) { in rcar_canfd_tx_done()
1137 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1140 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1145 rcar_canfd_write(priv->base, RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX), in rcar_canfd_tx_done()
1149 static void rcar_canfd_handle_global_err(struct rcar_canfd_global *gpriv, u32 ch) in rcar_canfd_handle_global_err() argument
1151 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_global_err()
1152 struct net_device *ndev = priv->ndev; in rcar_canfd_handle_global_err()
1156 gerfl = rcar_canfd_read(priv->base, RCANFD_GERFL); in rcar_canfd_handle_global_err()
1164 u32 ch; in rcar_canfd_global_err_interrupt() local
1166 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) in rcar_canfd_global_err_interrupt()
1167 rcar_canfd_handle_global_err(gpriv, ch); in rcar_canfd_global_err_interrupt()
1172 static void rcar_canfd_handle_global_receive(struct rcar_canfd_global *gpriv, u32 ch) in rcar_canfd_handle_global_receive() argument
1174 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_global_receive()
1175 u32 ridx = ch + RCANFD_RFFIFO_IDX; in rcar_canfd_handle_global_receive()
1179 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx)); in rcar_canfd_handle_global_receive()
1180 cc = rcar_canfd_read(priv->base, RCANFD_RFCC(gpriv, ridx)); in rcar_canfd_handle_global_receive()
1183 if (napi_schedule_prep(&priv->napi)) { in rcar_canfd_handle_global_receive()
1185 rcar_canfd_clear_bit(priv->base, in rcar_canfd_handle_global_receive()
1188 __napi_schedule(&priv->napi); in rcar_canfd_handle_global_receive()
1196 u32 ch; in rcar_canfd_global_receive_fifo_interrupt() local
1198 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) in rcar_canfd_global_receive_fifo_interrupt()
1199 rcar_canfd_handle_global_receive(gpriv, ch); in rcar_canfd_global_receive_fifo_interrupt()
1207 u32 ch; in rcar_canfd_global_interrupt() local
1212 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_global_interrupt()
1213 rcar_canfd_handle_global_err(gpriv, ch); in rcar_canfd_global_interrupt()
1214 rcar_canfd_handle_global_receive(gpriv, ch); in rcar_canfd_global_interrupt()
1223 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_state_change()
1224 enum can_state rx_state, tx_state, state = priv->can.state; in rcar_canfd_state_change()
1234 if (state != priv->can.state) { in rcar_canfd_state_change()
1236 state, priv->can.state, txerr, rxerr); in rcar_canfd_state_change()
1239 stats->rx_dropped++; in rcar_canfd_state_change()
1250 static void rcar_canfd_handle_channel_tx(struct rcar_canfd_global *gpriv, u32 ch) in rcar_canfd_handle_channel_tx() argument
1252 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_channel_tx()
1253 struct net_device *ndev = priv->ndev; in rcar_canfd_handle_channel_tx()
1257 sts = rcar_canfd_read(priv->base, in rcar_canfd_handle_channel_tx()
1258 RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX)); in rcar_canfd_handle_channel_tx()
1267 rcar_canfd_handle_channel_tx(priv->gpriv, priv->channel); in rcar_canfd_channel_tx_interrupt()
1272 static void rcar_canfd_handle_channel_err(struct rcar_canfd_global *gpriv, u32 ch) in rcar_canfd_handle_channel_err() argument
1274 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_channel_err()
1275 struct net_device *ndev = priv->ndev; in rcar_canfd_handle_channel_err()
1280 cerfl = rcar_canfd_read(priv->base, RCANFD_CERFL(ch)); in rcar_canfd_handle_channel_err()
1281 sts = rcar_canfd_read(priv->base, RCANFD_CSTS(ch)); in rcar_canfd_handle_channel_err()
1288 if (unlikely(priv->can.state != CAN_STATE_ERROR_ACTIVE && in rcar_canfd_handle_channel_err()
1289 priv->can.state != CAN_STATE_BUS_OFF)) in rcar_canfd_handle_channel_err()
1297 rcar_canfd_handle_channel_err(priv->gpriv, priv->channel); in rcar_canfd_channel_err_interrupt()
1305 u32 ch; in rcar_canfd_channel_interrupt() local
1308 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_channel_interrupt()
1309 rcar_canfd_handle_channel_err(gpriv, ch); in rcar_canfd_channel_interrupt()
1310 rcar_canfd_handle_channel_tx(gpriv, ch); in rcar_canfd_channel_interrupt()
1319 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_set_bittiming()
1320 const struct can_bittiming *bt = &priv->can.bittiming; in rcar_canfd_set_bittiming()
1321 const struct can_bittiming *dbt = &priv->can.data_bittiming; in rcar_canfd_set_bittiming()
1324 u32 ch = priv->channel; in rcar_canfd_set_bittiming() local
1327 brp = bt->brp - 1; in rcar_canfd_set_bittiming()
1328 sjw = bt->sjw - 1; in rcar_canfd_set_bittiming()
1329 tseg1 = bt->prop_seg + bt->phase_seg1 - 1; in rcar_canfd_set_bittiming()
1330 tseg2 = bt->phase_seg2 - 1; in rcar_canfd_set_bittiming()
1332 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { in rcar_canfd_set_bittiming()
1337 rcar_canfd_write(priv->base, RCANFD_CCFG(ch), cfg); in rcar_canfd_set_bittiming()
1338 netdev_dbg(priv->ndev, "nrate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n", in rcar_canfd_set_bittiming()
1342 brp = dbt->brp - 1; in rcar_canfd_set_bittiming()
1343 sjw = dbt->sjw - 1; in rcar_canfd_set_bittiming()
1344 tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1; in rcar_canfd_set_bittiming()
1345 tseg2 = dbt->phase_seg2 - 1; in rcar_canfd_set_bittiming()
1350 rcar_canfd_write(priv->base, RCANFD_F_DCFG(gpriv, ch), cfg); in rcar_canfd_set_bittiming()
1351 netdev_dbg(priv->ndev, "drate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n", in rcar_canfd_set_bittiming()
1367 rcar_canfd_write(priv->base, RCANFD_CCFG(ch), cfg); in rcar_canfd_set_bittiming()
1368 netdev_dbg(priv->ndev, in rcar_canfd_set_bittiming()
1377 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_start()
1378 int err = -EOPNOTSUPP; in rcar_canfd_start()
1379 u32 sts, ch = priv->channel; in rcar_canfd_start() local
1380 u32 ridx = ch + RCANFD_RFFIFO_IDX; in rcar_canfd_start()
1387 rcar_canfd_update_bit(priv->base, RCANFD_CCTR(ch), in rcar_canfd_start()
1391 err = readl_poll_timeout((priv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_start()
1394 netdev_err(ndev, "channel %u communication state failed\n", ch); in rcar_canfd_start()
1399 rcar_canfd_set_bit(priv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX), in rcar_canfd_start()
1401 rcar_canfd_set_bit(priv->base, RCANFD_RFCC(gpriv, ridx), RCANFD_RFCC_RFE); in rcar_canfd_start()
1403 priv->can.state = CAN_STATE_ERROR_ACTIVE; in rcar_canfd_start()
1414 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_open()
1417 err = phy_power_on(priv->transceiver); in rcar_canfd_open()
1424 err = clk_prepare_enable(gpriv->can_clk); in rcar_canfd_open()
1436 napi_enable(&priv->napi); in rcar_canfd_open()
1443 napi_disable(&priv->napi); in rcar_canfd_open()
1446 clk_disable_unprepare(gpriv->can_clk); in rcar_canfd_open()
1448 phy_power_off(priv->transceiver); in rcar_canfd_open()
1455 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_stop()
1457 u32 sts, ch = priv->channel; in rcar_canfd_stop() local
1458 u32 ridx = ch + RCANFD_RFFIFO_IDX; in rcar_canfd_stop()
1461 rcar_canfd_update_bit(priv->base, RCANFD_CCTR(ch), in rcar_canfd_stop()
1465 err = readl_poll_timeout((priv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_stop()
1468 netdev_err(ndev, "channel %u reset failed\n", ch); in rcar_canfd_stop()
1473 rcar_canfd_clear_bit(priv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX), in rcar_canfd_stop()
1475 rcar_canfd_clear_bit(priv->base, RCANFD_RFCC(gpriv, ridx), RCANFD_RFCC_RFE); in rcar_canfd_stop()
1478 priv->can.state = CAN_STATE_STOPPED; in rcar_canfd_stop()
1484 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_close()
1488 napi_disable(&priv->napi); in rcar_canfd_close()
1489 clk_disable_unprepare(gpriv->can_clk); in rcar_canfd_close()
1491 phy_power_off(priv->transceiver); in rcar_canfd_close()
1499 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_start_xmit()
1500 struct canfd_frame *cf = (struct canfd_frame *)skb->data; in rcar_canfd_start_xmit()
1503 u32 ch = priv->channel; in rcar_canfd_start_xmit() local
1508 if (cf->can_id & CAN_EFF_FLAG) { in rcar_canfd_start_xmit()
1509 id = cf->can_id & CAN_EFF_MASK; in rcar_canfd_start_xmit()
1512 id = cf->can_id & CAN_SFF_MASK; in rcar_canfd_start_xmit()
1515 if (cf->can_id & CAN_RTR_FLAG) in rcar_canfd_start_xmit()
1518 dlc = RCANFD_CFPTR_CFDLC(can_fd_len2dlc(cf->len)); in rcar_canfd_start_xmit()
1520 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) { in rcar_canfd_start_xmit()
1521 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1522 RCANFD_F_CFID(gpriv, ch, RCANFD_CFFIFO_IDX), id); in rcar_canfd_start_xmit()
1523 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1524 RCANFD_F_CFPTR(gpriv, ch, RCANFD_CFFIFO_IDX), dlc); in rcar_canfd_start_xmit()
1529 if (cf->flags & CANFD_BRS) in rcar_canfd_start_xmit()
1532 if (priv->can.state == CAN_STATE_ERROR_PASSIVE) in rcar_canfd_start_xmit()
1536 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1537 RCANFD_F_CFFDCSTS(gpriv, ch, RCANFD_CFFIFO_IDX), sts); in rcar_canfd_start_xmit()
1540 RCANFD_F_CFDF(gpriv, ch, RCANFD_CFFIFO_IDX, 0)); in rcar_canfd_start_xmit()
1542 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1543 RCANFD_C_CFID(ch, RCANFD_CFFIFO_IDX), id); in rcar_canfd_start_xmit()
1544 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1545 RCANFD_C_CFPTR(ch, RCANFD_CFFIFO_IDX), dlc); in rcar_canfd_start_xmit()
1547 RCANFD_C_CFDF(ch, RCANFD_CFFIFO_IDX, 0)); in rcar_canfd_start_xmit()
1550 can_put_echo_skb(skb, ndev, priv->tx_head % RCANFD_FIFO_DEPTH, 0); in rcar_canfd_start_xmit()
1552 spin_lock_irqsave(&priv->tx_lock, flags); in rcar_canfd_start_xmit()
1553 priv->tx_head++; in rcar_canfd_start_xmit()
1556 if (priv->tx_head - priv->tx_tail >= RCANFD_FIFO_DEPTH) in rcar_canfd_start_xmit()
1559 /* Start Tx: Write 0xff to CFPC to increment the CPU-side in rcar_canfd_start_xmit()
1562 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1563 RCANFD_CFPCTR(gpriv, ch, RCANFD_CFFIFO_IDX), 0xff); in rcar_canfd_start_xmit()
1565 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_start_xmit()
1571 struct net_device_stats *stats = &priv->ndev->stats; in rcar_canfd_rx_pkt()
1572 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_rx_pkt()
1576 u32 ch = priv->channel; in rcar_canfd_rx_pkt() local
1577 u32 ridx = ch + RCANFD_RFFIFO_IDX; in rcar_canfd_rx_pkt()
1579 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) { in rcar_canfd_rx_pkt()
1580 id = rcar_canfd_read(priv->base, RCANFD_F_RFID(gpriv, ridx)); in rcar_canfd_rx_pkt()
1581 dlc = rcar_canfd_read(priv->base, RCANFD_F_RFPTR(gpriv, ridx)); in rcar_canfd_rx_pkt()
1583 sts = rcar_canfd_read(priv->base, RCANFD_F_RFFDSTS(gpriv, ridx)); in rcar_canfd_rx_pkt()
1585 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) && in rcar_canfd_rx_pkt()
1587 skb = alloc_canfd_skb(priv->ndev, &cf); in rcar_canfd_rx_pkt()
1589 skb = alloc_can_skb(priv->ndev, in rcar_canfd_rx_pkt()
1592 id = rcar_canfd_read(priv->base, RCANFD_C_RFID(ridx)); in rcar_canfd_rx_pkt()
1593 dlc = rcar_canfd_read(priv->base, RCANFD_C_RFPTR(ridx)); in rcar_canfd_rx_pkt()
1594 skb = alloc_can_skb(priv->ndev, (struct can_frame **)&cf); in rcar_canfd_rx_pkt()
1598 stats->rx_dropped++; in rcar_canfd_rx_pkt()
1603 cf->can_id = (id & CAN_EFF_MASK) | CAN_EFF_FLAG; in rcar_canfd_rx_pkt()
1605 cf->can_id = id & CAN_SFF_MASK; in rcar_canfd_rx_pkt()
1607 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { in rcar_canfd_rx_pkt()
1609 cf->len = can_fd_dlc2len(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1611 cf->len = can_cc_dlc2len(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1614 cf->flags |= CANFD_ESI; in rcar_canfd_rx_pkt()
1615 netdev_dbg(priv->ndev, "ESI Error\n"); in rcar_canfd_rx_pkt()
1619 cf->can_id |= CAN_RTR_FLAG; in rcar_canfd_rx_pkt()
1622 cf->flags |= CANFD_BRS; in rcar_canfd_rx_pkt()
1627 cf->len = can_cc_dlc2len(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1629 cf->can_id |= CAN_RTR_FLAG; in rcar_canfd_rx_pkt()
1636 /* Write 0xff to RFPC to increment the CPU-side in rcar_canfd_rx_pkt()
1639 rcar_canfd_write(priv->base, RCANFD_RFPCTR(gpriv, ridx), 0xff); in rcar_canfd_rx_pkt()
1641 if (!(cf->can_id & CAN_RTR_FLAG)) in rcar_canfd_rx_pkt()
1642 stats->rx_bytes += cf->len; in rcar_canfd_rx_pkt()
1643 stats->rx_packets++; in rcar_canfd_rx_pkt()
1651 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_rx_poll()
1654 u32 ch = priv->channel; in rcar_canfd_rx_poll() local
1655 u32 ridx = ch + RCANFD_RFFIFO_IDX; in rcar_canfd_rx_poll()
1658 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx)); in rcar_canfd_rx_poll()
1667 rcar_canfd_write(priv->base, RCANFD_RFSTS(gpriv, ridx), in rcar_canfd_rx_poll()
1675 rcar_canfd_set_bit(priv->base, RCANFD_RFCC(gpriv, ridx), in rcar_canfd_rx_poll()
1694 return -EOPNOTSUPP; in rcar_canfd_do_set_mode()
1702 u32 val, ch = priv->channel; in rcar_canfd_get_berr_counter() local
1705 val = rcar_canfd_read(priv->base, RCANFD_CSTS(ch)); in rcar_canfd_get_berr_counter()
1706 bec->txerr = RCANFD_CSTS_TECCNT(val); in rcar_canfd_get_berr_counter()
1707 bec->rxerr = RCANFD_CSTS_RECCNT(val); in rcar_canfd_get_berr_counter()
1722 static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch, in rcar_canfd_channel_probe() argument
1725 const struct rcar_canfd_hw_info *info = gpriv->info; in rcar_canfd_channel_probe()
1726 struct platform_device *pdev = gpriv->pdev; in rcar_canfd_channel_probe()
1727 struct device *dev = &pdev->dev; in rcar_canfd_channel_probe()
1730 int err = -ENODEV; in rcar_canfd_channel_probe()
1734 return -ENOMEM; in rcar_canfd_channel_probe()
1738 ndev->netdev_ops = &rcar_canfd_netdev_ops; in rcar_canfd_channel_probe()
1739 ndev->ethtool_ops = &rcar_canfd_ethtool_ops; in rcar_canfd_channel_probe()
1740 ndev->flags |= IFF_ECHO; in rcar_canfd_channel_probe()
1741 priv->ndev = ndev; in rcar_canfd_channel_probe()
1742 priv->base = gpriv->base; in rcar_canfd_channel_probe()
1743 priv->transceiver = transceiver; in rcar_canfd_channel_probe()
1744 priv->channel = ch; in rcar_canfd_channel_probe()
1745 priv->gpriv = gpriv; in rcar_canfd_channel_probe()
1747 priv->can.bitrate_max = transceiver->attrs.max_link_rate; in rcar_canfd_channel_probe()
1748 priv->can.clock.freq = fcan_freq; in rcar_canfd_channel_probe()
1749 dev_info(dev, "can_clk rate is %u\n", priv->can.clock.freq); in rcar_canfd_channel_probe()
1751 if (info->multi_channel_irqs) { in rcar_canfd_channel_probe()
1756 err_irq = platform_get_irq_byname(pdev, ch == 0 ? "ch0_err" : "ch1_err"); in rcar_canfd_channel_probe()
1762 tx_irq = platform_get_irq_byname(pdev, ch == 0 ? "ch0_trx" : "ch1_trx"); in rcar_canfd_channel_probe()
1768 irq_name = devm_kasprintf(dev, GFP_KERNEL, "canfd.ch%d_err", in rcar_canfd_channel_probe()
1769 ch); in rcar_canfd_channel_probe()
1771 err = -ENOMEM; in rcar_canfd_channel_probe()
1778 dev_err(dev, "devm_request_irq CH Err %d failed: %pe\n", in rcar_canfd_channel_probe()
1782 irq_name = devm_kasprintf(dev, GFP_KERNEL, "canfd.ch%d_trx", in rcar_canfd_channel_probe()
1783 ch); in rcar_canfd_channel_probe()
1785 err = -ENOMEM; in rcar_canfd_channel_probe()
1798 if (gpriv->fdmode) { in rcar_canfd_channel_probe()
1799 priv->can.bittiming_const = &rcar_canfd_nom_bittiming_const; in rcar_canfd_channel_probe()
1800 priv->can.data_bittiming_const = in rcar_canfd_channel_probe()
1807 priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING; in rcar_canfd_channel_probe()
1810 priv->can.bittiming_const = &rcar_canfd_bittiming_const; in rcar_canfd_channel_probe()
1811 priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING; in rcar_canfd_channel_probe()
1814 priv->can.do_set_mode = rcar_canfd_do_set_mode; in rcar_canfd_channel_probe()
1815 priv->can.do_get_berr_counter = rcar_canfd_get_berr_counter; in rcar_canfd_channel_probe()
1818 netif_napi_add_weight(ndev, &priv->napi, rcar_canfd_rx_poll, in rcar_canfd_channel_probe()
1820 spin_lock_init(&priv->tx_lock); in rcar_canfd_channel_probe()
1821 gpriv->ch[priv->channel] = priv; in rcar_canfd_channel_probe()
1827 dev_info(dev, "device registered (channel %u)\n", priv->channel); in rcar_canfd_channel_probe()
1831 netif_napi_del(&priv->napi); in rcar_canfd_channel_probe()
1837 static void rcar_canfd_channel_remove(struct rcar_canfd_global *gpriv, u32 ch) in rcar_canfd_channel_remove() argument
1839 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_channel_remove()
1842 unregister_candev(priv->ndev); in rcar_canfd_channel_remove()
1843 netif_napi_del(&priv->napi); in rcar_canfd_channel_remove()
1844 free_candev(priv->ndev); in rcar_canfd_channel_remove()
1852 struct device *dev = &pdev->dev; in rcar_canfd_probe()
1854 u32 sts, ch, fcan_freq; in rcar_canfd_probe() local
1860 bool fdmode = true; /* CAN FD only mode - default */ in rcar_canfd_probe()
1866 if (of_property_read_bool(dev->of_node, "renesas,no-can-fd")) in rcar_canfd_probe()
1869 for (i = 0; i < info->max_channels; ++i) { in rcar_canfd_probe()
1871 of_child = of_get_child_by_name(dev->of_node, name); in rcar_canfd_probe()
1882 if (info->shared_global_irqs) { in rcar_canfd_probe()
1911 return -ENOMEM; in rcar_canfd_probe()
1913 gpriv->pdev = pdev; in rcar_canfd_probe()
1914 gpriv->channels_mask = channels_mask; in rcar_canfd_probe()
1915 gpriv->fdmode = fdmode; in rcar_canfd_probe()
1916 gpriv->info = info; in rcar_canfd_probe()
1918 gpriv->rstc1 = devm_reset_control_get_optional_exclusive(dev, "rstp_n"); in rcar_canfd_probe()
1919 if (IS_ERR(gpriv->rstc1)) in rcar_canfd_probe()
1920 return dev_err_probe(dev, PTR_ERR(gpriv->rstc1), in rcar_canfd_probe()
1923 gpriv->rstc2 = devm_reset_control_get_optional_exclusive(dev, "rstc_n"); in rcar_canfd_probe()
1924 if (IS_ERR(gpriv->rstc2)) in rcar_canfd_probe()
1925 return dev_err_probe(dev, PTR_ERR(gpriv->rstc2), in rcar_canfd_probe()
1929 gpriv->clkp = devm_clk_get(dev, "fck"); in rcar_canfd_probe()
1930 if (IS_ERR(gpriv->clkp)) in rcar_canfd_probe()
1931 return dev_err_probe(dev, PTR_ERR(gpriv->clkp), in rcar_canfd_probe()
1937 gpriv->can_clk = devm_clk_get(dev, "can_clk"); in rcar_canfd_probe()
1938 if (IS_ERR(gpriv->can_clk) || (clk_get_rate(gpriv->can_clk) == 0)) { in rcar_canfd_probe()
1939 gpriv->can_clk = devm_clk_get(dev, "canfd"); in rcar_canfd_probe()
1940 if (IS_ERR(gpriv->can_clk)) in rcar_canfd_probe()
1941 return dev_err_probe(dev, PTR_ERR(gpriv->can_clk), in rcar_canfd_probe()
1944 gpriv->fcan = RCANFD_CANFDCLK; in rcar_canfd_probe()
1947 gpriv->fcan = RCANFD_EXTCLK; in rcar_canfd_probe()
1949 fcan_freq = clk_get_rate(gpriv->can_clk); in rcar_canfd_probe()
1951 if (gpriv->fcan == RCANFD_CANFDCLK) in rcar_canfd_probe()
1953 fcan_freq /= info->postdiv; in rcar_canfd_probe()
1960 gpriv->base = addr; in rcar_canfd_probe()
1963 if (info->shared_global_irqs) { in rcar_canfd_probe()
2001 err = reset_control_reset(gpriv->rstc1); in rcar_canfd_probe()
2004 err = reset_control_reset(gpriv->rstc2); in rcar_canfd_probe()
2006 reset_control_assert(gpriv->rstc1); in rcar_canfd_probe()
2011 err = clk_prepare_enable(gpriv->clkp); in rcar_canfd_probe()
2028 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) { in rcar_canfd_probe()
2030 rcar_canfd_configure_rx(gpriv, ch); in rcar_canfd_probe()
2033 rcar_canfd_configure_tx(gpriv, ch); in rcar_canfd_probe()
2036 rcar_canfd_configure_afl_rules(gpriv, ch); in rcar_canfd_probe()
2043 rcar_canfd_update_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GMDC_MASK, in rcar_canfd_probe()
2047 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_probe()
2054 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) { in rcar_canfd_probe()
2055 err = rcar_canfd_channel_probe(gpriv, ch, fcan_freq, in rcar_canfd_probe()
2056 transceivers[ch]); in rcar_canfd_probe()
2063 gpriv->fcan, gpriv->fdmode); in rcar_canfd_probe()
2067 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) in rcar_canfd_probe()
2068 rcar_canfd_channel_remove(gpriv, ch); in rcar_canfd_probe()
2072 clk_disable_unprepare(gpriv->clkp); in rcar_canfd_probe()
2074 reset_control_assert(gpriv->rstc1); in rcar_canfd_probe()
2075 reset_control_assert(gpriv->rstc2); in rcar_canfd_probe()
2083 u32 ch; in rcar_canfd_remove() local
2088 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_remove()
2089 rcar_canfd_disable_channel_interrupts(gpriv->ch[ch]); in rcar_canfd_remove()
2090 rcar_canfd_channel_remove(gpriv, ch); in rcar_canfd_remove()
2094 rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GSLPR); in rcar_canfd_remove()
2095 clk_disable_unprepare(gpriv->clkp); in rcar_canfd_remove()
2096 reset_control_assert(gpriv->rstc1); in rcar_canfd_remove()
2097 reset_control_assert(gpriv->rstc2); in rcar_canfd_remove()
2114 { .compatible = "renesas,r8a779a0-canfd", .data = &rcar_gen4_hw_info },
2115 { .compatible = "renesas,rcar-gen3-canfd", .data = &rcar_gen3_hw_info },
2116 { .compatible = "renesas,rcar-gen4-canfd", .data = &rcar_gen4_hw_info },
2117 { .compatible = "renesas,rzg2l-canfd", .data = &rzg2l_hw_info },
2137 MODULE_DESCRIPTION("CAN FD driver for Renesas R-Car SoC");