Lines Matching +full:canfd +full:- +full:2
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
62 #define RCANFD_GCTR_GSLPR BIT(2)
70 #define RCANFD_GSTS_GSLPSTS BIT(2)
73 /* Non-operational status */
74 #define RCANFD_GSTS_GNOPM (BIT(0) | BIT(1) | BIT(2) | BIT(3))
80 #define RCANFD_GERFL_THLES BIT(2)
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))) & \
113 /* RSCFDnCmCFG - Classical CAN only */
119 /* RSCFDnCFDCmNCFG - CAN FD only */
150 #define RCANFD_CCTR_CSLPR BIT(2)
162 #define RCANFD_CSTS_SLPSTS BIT(2)
182 #define RCANFD_CERFL_EPF BIT(2)
215 #define RCANFD_RFSTS_RFMLT BIT(2)
229 #define RCANFD_RFFDSTS_RFFDF BIT(2)
242 #define RCANFD_CFCC_CFTXIE BIT(2)
248 #define RCANFD_CFSTS_CFMLT BIT(2)
263 #define RCANFD_CFFDCSTS_CFFDF BIT(2)
301 #define RCANFD_GAFLCFG(ch) (0x009c + (0x04 * ((ch) / 2)))
396 /* RSCFDnRMXXXq -> RCANFD_C_RMXXX(q) */
402 /* RSCFDnRFXXx -> RCANFD_C_RFXX(x) */
409 /* RSCFDnCFXXk -> RCANFD_C_CFXX(ch, k) */
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) */
479 /* RSCFDnCFDTMXXp -> RCANFD_F_TMXX(p) */
495 #define RCANFD_CHANNELS_MASK BIT((RCANFD_NUM_CHANNELS) - 1)
513 RCANFD_CANFDCLK = 0, /* CANFD clock */
548 enum rcar_canfd_fcanclk fcan; /* CANFD or Ext clock */
559 .tseg1_min = 2,
561 .tseg2_min = 2,
572 .tseg1_min = 2,
574 .tseg2_min = 2,
587 .tseg2_min = 2,
596 .max_channels = 2,
597 .postdiv = 2,
603 .postdiv = 2,
608 .max_channels = 2,
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()
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()
718 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_reset_controller()
719 !(sts & RCANFD_GSTS_GRAMINIT), 2, 500000); 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()
732 (sts & RCANFD_GSTS_GRSTSTS), 2, 500000); 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()
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()
756 2, 500000); in rcar_canfd_reset_controller()
758 dev_dbg(&gpriv->pdev->dev, in rcar_canfd_reset_controller()
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()
804 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLECTR, in rcar_canfd_configure_afl_rules()
809 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(ch), in rcar_canfd_configure_afl_rules()
813 else if (gpriv->fdmode) in rcar_canfd_configure_afl_rules()
819 rcar_canfd_write(gpriv->base, RCANFD_GAFLID(offset, rule_entry_index), 0); in rcar_canfd_configure_afl_rules()
821 rcar_canfd_write(gpriv->base, RCANFD_GAFLM(offset, rule_entry_index), 0); in rcar_canfd_configure_afl_rules()
823 rcar_canfd_write(gpriv->base, RCANFD_GAFLP0(offset, rule_entry_index), 0); in rcar_canfd_configure_afl_rules()
825 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLP1(offset, rule_entry_index), in rcar_canfd_configure_afl_rules()
829 rcar_canfd_clear_bit(gpriv->base, in rcar_canfd_configure_afl_rules()
842 rfdc = 2; /* b010 - 8 messages Rx FIFO depth */ in rcar_canfd_configure_rx()
843 if (gpriv->fdmode) in rcar_canfd_configure_rx()
844 rfpls = 7; /* b111 - Max 64 bytes payload */ in rcar_canfd_configure_rx()
846 rfpls = 0; /* b000 - Max 8 bytes payload */ in rcar_canfd_configure_rx()
850 rcar_canfd_write(gpriv->base, RCANFD_RFCC(gpriv, ridx), cfg); in rcar_canfd_configure_rx()
865 cfm = 1; /* b01 - Transmit mode */ in rcar_canfd_configure_tx()
866 cfdc = 2; /* b010 - 8 messages Tx FIFO depth */ in rcar_canfd_configure_tx()
867 if (gpriv->fdmode) in rcar_canfd_configure_tx()
868 cfpls = 7; /* b111 - Max 64 bytes payload */ in rcar_canfd_configure_tx()
870 cfpls = 0; /* b000 - Max 8 bytes payload */ in rcar_canfd_configure_tx()
875 rcar_canfd_write(gpriv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX), cfg); in rcar_canfd_configure_tx()
877 if (gpriv->fdmode) in rcar_canfd_configure_tx()
879 rcar_canfd_write(gpriv->base, in rcar_canfd_configure_tx()
888 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0); in rcar_canfd_enable_global_interrupts()
892 if (gpriv->fdmode) in rcar_canfd_enable_global_interrupts()
895 rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, ctr); in rcar_canfd_enable_global_interrupts()
902 rcar_canfd_write(gpriv->base, RCANFD_GCTR, 0); in rcar_canfd_disable_global_interrupts()
905 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0); in rcar_canfd_disable_global_interrupts()
911 u32 ctr, ch = priv->channel; in rcar_canfd_enable_channel_interrupts()
914 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), 0); in rcar_canfd_enable_channel_interrupts()
922 rcar_canfd_set_bit(priv->base, RCANFD_CCTR(ch), ctr); in rcar_canfd_enable_channel_interrupts()
928 u32 ctr, ch = priv->channel; in rcar_canfd_disable_channel_interrupts()
935 rcar_canfd_clear_bit(priv->base, RCANFD_CCTR(ch), ctr); in rcar_canfd_disable_channel_interrupts()
938 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), 0); in rcar_canfd_disable_channel_interrupts()
944 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_global_error()
945 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_global_error()
946 u32 ch = priv->channel; in rcar_canfd_global_error()
950 gerfl = rcar_canfd_read(priv->base, RCANFD_GERFL); in rcar_canfd_global_error()
953 stats->tx_dropped++; in rcar_canfd_global_error()
956 sts = rcar_canfd_read(priv->base, in rcar_canfd_global_error()
960 stats->tx_dropped++; in rcar_canfd_global_error()
961 rcar_canfd_write(priv->base, in rcar_canfd_global_error()
966 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx)); in rcar_canfd_global_error()
969 stats->rx_dropped++; in rcar_canfd_global_error()
970 rcar_canfd_write(priv->base, RCANFD_RFSTS(gpriv, ridx), in rcar_canfd_global_error()
974 if (gpriv->fdmode && gerfl & RCANFD_GERFL_CMPOF) { in rcar_canfd_global_error()
985 rcar_canfd_write(priv->base, RCANFD_GERFL, 0); in rcar_canfd_global_error()
992 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_error()
995 u32 ch = priv->channel; in rcar_canfd_error()
1002 stats->rx_dropped++; in rcar_canfd_error()
1009 cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; in rcar_canfd_error()
1010 cf->data[2] = CAN_ERR_PROT_UNSPEC; in rcar_canfd_error()
1011 priv->can.can_stats.bus_error++; in rcar_canfd_error()
1015 stats->tx_errors++; in rcar_canfd_error()
1016 cf->data[3] |= CAN_ERR_PROT_LOC_ACK_DEL; in rcar_canfd_error()
1020 stats->tx_errors++; in rcar_canfd_error()
1021 cf->data[2] |= CAN_ERR_PROT_BIT0; in rcar_canfd_error()
1025 stats->tx_errors++; in rcar_canfd_error()
1026 cf->data[2] |= CAN_ERR_PROT_BIT1; in rcar_canfd_error()
1030 stats->rx_errors++; in rcar_canfd_error()
1031 cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; in rcar_canfd_error()
1035 stats->tx_errors++; in rcar_canfd_error()
1036 cf->can_id |= CAN_ERR_ACK; in rcar_canfd_error()
1037 cf->data[3] |= CAN_ERR_PROT_LOC_ACK; in rcar_canfd_error()
1041 stats->rx_errors++; in rcar_canfd_error()
1042 cf->data[2] |= CAN_ERR_PROT_FORM; in rcar_canfd_error()
1046 stats->rx_errors++; in rcar_canfd_error()
1047 cf->data[2] |= CAN_ERR_PROT_STUFF; in rcar_canfd_error()
1051 priv->can.can_stats.arbitration_lost++; in rcar_canfd_error()
1052 cf->can_id |= CAN_ERR_LOSTARB; in rcar_canfd_error()
1053 cf->data[0] |= CAN_ERR_LOSTARB_UNSPEC; in rcar_canfd_error()
1057 stats->rx_errors++; in rcar_canfd_error()
1058 cf->can_id |= CAN_ERR_BUSERROR; in rcar_canfd_error()
1062 priv->can.state = CAN_STATE_ERROR_WARNING; in rcar_canfd_error()
1063 priv->can.can_stats.error_warning++; in rcar_canfd_error()
1064 cf->can_id |= CAN_ERR_CRTL | CAN_ERR_CNT; in rcar_canfd_error()
1065 cf->data[1] = txerr > rxerr ? CAN_ERR_CRTL_TX_WARNING : in rcar_canfd_error()
1067 cf->data[6] = txerr; in rcar_canfd_error()
1068 cf->data[7] = rxerr; in rcar_canfd_error()
1072 priv->can.state = CAN_STATE_ERROR_PASSIVE; in rcar_canfd_error()
1073 priv->can.can_stats.error_passive++; in rcar_canfd_error()
1074 cf->can_id |= CAN_ERR_CRTL | CAN_ERR_CNT; in rcar_canfd_error()
1075 cf->data[1] = txerr > rxerr ? CAN_ERR_CRTL_TX_PASSIVE : in rcar_canfd_error()
1077 cf->data[6] = txerr; in rcar_canfd_error()
1078 cf->data[7] = rxerr; in rcar_canfd_error()
1081 netdev_dbg(ndev, "Bus-off entry interrupt\n"); in rcar_canfd_error()
1083 priv->can.state = CAN_STATE_BUS_OFF; in rcar_canfd_error()
1084 priv->can.can_stats.bus_off++; in rcar_canfd_error()
1086 cf->can_id |= CAN_ERR_BUSOFF; in rcar_canfd_error()
1091 stats->tx_errors++; in rcar_canfd_error()
1092 cf->can_id |= CAN_ERR_PROT; in rcar_canfd_error()
1093 cf->data[2] |= CAN_ERR_PROT_OVERLOAD; in rcar_canfd_error()
1097 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), in rcar_canfd_error()
1105 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_tx_done()
1106 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_tx_done()
1109 u32 ch = priv->channel; in rcar_canfd_tx_done()
1114 sent = priv->tx_tail % RCANFD_FIFO_DEPTH; in rcar_canfd_tx_done()
1115 stats->tx_packets++; in rcar_canfd_tx_done()
1116 stats->tx_bytes += can_get_echo_skb(ndev, sent, NULL); in rcar_canfd_tx_done()
1118 spin_lock_irqsave(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1119 priv->tx_tail++; in rcar_canfd_tx_done()
1120 sts = rcar_canfd_read(priv->base, in rcar_canfd_tx_done()
1128 if (priv->tx_head - priv->tx_tail <= unsent) { in rcar_canfd_tx_done()
1129 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1132 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1137 rcar_canfd_write(priv->base, RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX), in rcar_canfd_tx_done()
1143 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_global_err()
1144 struct net_device *ndev = priv->ndev; in rcar_canfd_handle_global_err()
1148 gerfl = rcar_canfd_read(priv->base, RCANFD_GERFL); in rcar_canfd_handle_global_err()
1158 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) in rcar_canfd_global_err_interrupt()
1166 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_global_receive()
1171 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx)); in rcar_canfd_handle_global_receive()
1172 cc = rcar_canfd_read(priv->base, RCANFD_RFCC(gpriv, ridx)); in rcar_canfd_handle_global_receive()
1175 if (napi_schedule_prep(&priv->napi)) { in rcar_canfd_handle_global_receive()
1177 rcar_canfd_clear_bit(priv->base, in rcar_canfd_handle_global_receive()
1180 __napi_schedule(&priv->napi); in rcar_canfd_handle_global_receive()
1190 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) in rcar_canfd_global_receive_fifo_interrupt()
1204 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_global_interrupt()
1215 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_state_change()
1216 enum can_state rx_state, tx_state, state = priv->can.state; in rcar_canfd_state_change()
1226 if (state != priv->can.state) { in rcar_canfd_state_change()
1228 state, priv->can.state, txerr, rxerr); in rcar_canfd_state_change()
1231 stats->rx_dropped++; in rcar_canfd_state_change()
1244 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_channel_tx()
1245 struct net_device *ndev = priv->ndev; in rcar_canfd_handle_channel_tx()
1249 sts = rcar_canfd_read(priv->base, in rcar_canfd_handle_channel_tx()
1259 rcar_canfd_handle_channel_tx(priv->gpriv, priv->channel); in rcar_canfd_channel_tx_interrupt()
1266 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_handle_channel_err()
1267 struct net_device *ndev = priv->ndev; in rcar_canfd_handle_channel_err()
1272 cerfl = rcar_canfd_read(priv->base, RCANFD_CERFL(ch)); in rcar_canfd_handle_channel_err()
1273 sts = rcar_canfd_read(priv->base, RCANFD_CSTS(ch)); in rcar_canfd_handle_channel_err()
1280 if (unlikely(priv->can.state != CAN_STATE_ERROR_ACTIVE && in rcar_canfd_handle_channel_err()
1281 priv->can.state != CAN_STATE_BUS_OFF)) in rcar_canfd_handle_channel_err()
1289 rcar_canfd_handle_channel_err(priv->gpriv, priv->channel); in rcar_canfd_channel_err_interrupt()
1300 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_channel_interrupt()
1311 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_set_bittiming()
1312 const struct can_bittiming *bt = &priv->can.bittiming; in rcar_canfd_set_bittiming()
1313 const struct can_bittiming *dbt = &priv->can.data_bittiming; in rcar_canfd_set_bittiming()
1316 u32 ch = priv->channel; in rcar_canfd_set_bittiming()
1319 brp = bt->brp - 1; in rcar_canfd_set_bittiming()
1320 sjw = bt->sjw - 1; in rcar_canfd_set_bittiming()
1321 tseg1 = bt->prop_seg + bt->phase_seg1 - 1; in rcar_canfd_set_bittiming()
1322 tseg2 = bt->phase_seg2 - 1; in rcar_canfd_set_bittiming()
1324 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { in rcar_canfd_set_bittiming()
1329 rcar_canfd_write(priv->base, RCANFD_CCFG(ch), cfg); in rcar_canfd_set_bittiming()
1330 netdev_dbg(priv->ndev, "nrate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n", in rcar_canfd_set_bittiming()
1334 brp = dbt->brp - 1; in rcar_canfd_set_bittiming()
1335 sjw = dbt->sjw - 1; in rcar_canfd_set_bittiming()
1336 tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1; in rcar_canfd_set_bittiming()
1337 tseg2 = dbt->phase_seg2 - 1; in rcar_canfd_set_bittiming()
1342 rcar_canfd_write(priv->base, RCANFD_F_DCFG(gpriv, ch), cfg); in rcar_canfd_set_bittiming()
1343 netdev_dbg(priv->ndev, "drate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n", in rcar_canfd_set_bittiming()
1359 rcar_canfd_write(priv->base, RCANFD_CCFG(ch), cfg); in rcar_canfd_set_bittiming()
1360 netdev_dbg(priv->ndev, in rcar_canfd_set_bittiming()
1369 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_start()
1370 int err = -EOPNOTSUPP; in rcar_canfd_start()
1371 u32 sts, ch = priv->channel; in rcar_canfd_start()
1379 rcar_canfd_update_bit(priv->base, RCANFD_CCTR(ch), in rcar_canfd_start()
1383 err = readl_poll_timeout((priv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_start()
1384 (sts & RCANFD_CSTS_COMSTS), 2, 500000); in rcar_canfd_start()
1391 rcar_canfd_set_bit(priv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX), in rcar_canfd_start()
1393 rcar_canfd_set_bit(priv->base, RCANFD_RFCC(gpriv, ridx), RCANFD_RFCC_RFE); in rcar_canfd_start()
1395 priv->can.state = CAN_STATE_ERROR_ACTIVE; in rcar_canfd_start()
1406 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_open()
1409 err = phy_power_on(priv->transceiver); in rcar_canfd_open()
1416 err = clk_prepare_enable(gpriv->can_clk); in rcar_canfd_open()
1428 napi_enable(&priv->napi); in rcar_canfd_open()
1435 napi_disable(&priv->napi); in rcar_canfd_open()
1438 clk_disable_unprepare(gpriv->can_clk); in rcar_canfd_open()
1440 phy_power_off(priv->transceiver); in rcar_canfd_open()
1447 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_stop()
1449 u32 sts, ch = priv->channel; in rcar_canfd_stop()
1453 rcar_canfd_update_bit(priv->base, RCANFD_CCTR(ch), in rcar_canfd_stop()
1457 err = readl_poll_timeout((priv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_stop()
1458 (sts & RCANFD_CSTS_CRSTSTS), 2, 500000); in rcar_canfd_stop()
1465 rcar_canfd_clear_bit(priv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX), in rcar_canfd_stop()
1467 rcar_canfd_clear_bit(priv->base, RCANFD_RFCC(gpriv, ridx), RCANFD_RFCC_RFE); in rcar_canfd_stop()
1470 priv->can.state = CAN_STATE_STOPPED; in rcar_canfd_stop()
1476 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_close()
1480 napi_disable(&priv->napi); in rcar_canfd_close()
1481 clk_disable_unprepare(gpriv->can_clk); in rcar_canfd_close()
1483 phy_power_off(priv->transceiver); in rcar_canfd_close()
1491 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_start_xmit()
1492 struct canfd_frame *cf = (struct canfd_frame *)skb->data; in rcar_canfd_start_xmit()
1495 u32 ch = priv->channel; in rcar_canfd_start_xmit()
1500 if (cf->can_id & CAN_EFF_FLAG) { in rcar_canfd_start_xmit()
1501 id = cf->can_id & CAN_EFF_MASK; in rcar_canfd_start_xmit()
1504 id = cf->can_id & CAN_SFF_MASK; in rcar_canfd_start_xmit()
1507 if (cf->can_id & CAN_RTR_FLAG) in rcar_canfd_start_xmit()
1510 dlc = RCANFD_CFPTR_CFDLC(can_fd_len2dlc(cf->len)); in rcar_canfd_start_xmit()
1512 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) { in rcar_canfd_start_xmit()
1513 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1515 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1521 if (cf->flags & CANFD_BRS) in rcar_canfd_start_xmit()
1524 if (priv->can.state == CAN_STATE_ERROR_PASSIVE) in rcar_canfd_start_xmit()
1528 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1534 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1536 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1542 can_put_echo_skb(skb, ndev, priv->tx_head % RCANFD_FIFO_DEPTH, 0); in rcar_canfd_start_xmit()
1544 spin_lock_irqsave(&priv->tx_lock, flags); in rcar_canfd_start_xmit()
1545 priv->tx_head++; in rcar_canfd_start_xmit()
1548 if (priv->tx_head - priv->tx_tail >= RCANFD_FIFO_DEPTH) in rcar_canfd_start_xmit()
1551 /* Start Tx: Write 0xff to CFPC to increment the CPU-side in rcar_canfd_start_xmit()
1554 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1557 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_start_xmit()
1563 struct net_device_stats *stats = &priv->ndev->stats; in rcar_canfd_rx_pkt()
1564 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_rx_pkt()
1568 u32 ch = priv->channel; in rcar_canfd_rx_pkt()
1571 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) { in rcar_canfd_rx_pkt()
1572 id = rcar_canfd_read(priv->base, RCANFD_F_RFID(gpriv, ridx)); in rcar_canfd_rx_pkt()
1573 dlc = rcar_canfd_read(priv->base, RCANFD_F_RFPTR(gpriv, ridx)); in rcar_canfd_rx_pkt()
1575 sts = rcar_canfd_read(priv->base, RCANFD_F_RFFDSTS(gpriv, ridx)); in rcar_canfd_rx_pkt()
1577 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) && in rcar_canfd_rx_pkt()
1579 skb = alloc_canfd_skb(priv->ndev, &cf); in rcar_canfd_rx_pkt()
1581 skb = alloc_can_skb(priv->ndev, in rcar_canfd_rx_pkt()
1584 id = rcar_canfd_read(priv->base, RCANFD_C_RFID(ridx)); in rcar_canfd_rx_pkt()
1585 dlc = rcar_canfd_read(priv->base, RCANFD_C_RFPTR(ridx)); in rcar_canfd_rx_pkt()
1586 skb = alloc_can_skb(priv->ndev, (struct can_frame **)&cf); in rcar_canfd_rx_pkt()
1590 stats->rx_dropped++; in rcar_canfd_rx_pkt()
1595 cf->can_id = (id & CAN_EFF_MASK) | CAN_EFF_FLAG; in rcar_canfd_rx_pkt()
1597 cf->can_id = id & CAN_SFF_MASK; in rcar_canfd_rx_pkt()
1599 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { in rcar_canfd_rx_pkt()
1601 cf->len = can_fd_dlc2len(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1603 cf->len = can_cc_dlc2len(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1606 cf->flags |= CANFD_ESI; in rcar_canfd_rx_pkt()
1607 netdev_dbg(priv->ndev, "ESI Error\n"); in rcar_canfd_rx_pkt()
1611 cf->can_id |= CAN_RTR_FLAG; in rcar_canfd_rx_pkt()
1614 cf->flags |= CANFD_BRS; in rcar_canfd_rx_pkt()
1619 cf->len = can_cc_dlc2len(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1621 cf->can_id |= CAN_RTR_FLAG; in rcar_canfd_rx_pkt()
1628 /* Write 0xff to RFPC to increment the CPU-side in rcar_canfd_rx_pkt()
1631 rcar_canfd_write(priv->base, RCANFD_RFPCTR(gpriv, ridx), 0xff); in rcar_canfd_rx_pkt()
1633 if (!(cf->can_id & CAN_RTR_FLAG)) in rcar_canfd_rx_pkt()
1634 stats->rx_bytes += cf->len; in rcar_canfd_rx_pkt()
1635 stats->rx_packets++; in rcar_canfd_rx_pkt()
1643 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_rx_poll()
1646 u32 ch = priv->channel; in rcar_canfd_rx_poll()
1650 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx)); in rcar_canfd_rx_poll()
1659 rcar_canfd_write(priv->base, RCANFD_RFSTS(gpriv, ridx), in rcar_canfd_rx_poll()
1667 rcar_canfd_set_bit(priv->base, RCANFD_RFCC(gpriv, ridx), in rcar_canfd_rx_poll()
1686 return -EOPNOTSUPP; in rcar_canfd_do_set_mode()
1694 u32 val, ch = priv->channel; in rcar_canfd_get_berr_counter()
1697 val = rcar_canfd_read(priv->base, RCANFD_CSTS(ch)); in rcar_canfd_get_berr_counter()
1698 bec->txerr = RCANFD_CSTS_TECCNT(val); in rcar_canfd_get_berr_counter()
1699 bec->rxerr = RCANFD_CSTS_RECCNT(val); in rcar_canfd_get_berr_counter()
1717 const struct rcar_canfd_hw_info *info = gpriv->info; in rcar_canfd_channel_probe()
1718 struct platform_device *pdev = gpriv->pdev; in rcar_canfd_channel_probe()
1719 struct device *dev = &pdev->dev; in rcar_canfd_channel_probe()
1722 int err = -ENODEV; in rcar_canfd_channel_probe()
1726 return -ENOMEM; in rcar_canfd_channel_probe()
1730 ndev->netdev_ops = &rcar_canfd_netdev_ops; in rcar_canfd_channel_probe()
1731 ndev->ethtool_ops = &rcar_canfd_ethtool_ops; in rcar_canfd_channel_probe()
1732 ndev->flags |= IFF_ECHO; in rcar_canfd_channel_probe()
1733 priv->ndev = ndev; in rcar_canfd_channel_probe()
1734 priv->base = gpriv->base; in rcar_canfd_channel_probe()
1735 priv->transceiver = transceiver; in rcar_canfd_channel_probe()
1736 priv->channel = ch; in rcar_canfd_channel_probe()
1737 priv->gpriv = gpriv; in rcar_canfd_channel_probe()
1739 priv->can.bitrate_max = transceiver->attrs.max_link_rate; in rcar_canfd_channel_probe()
1740 priv->can.clock.freq = fcan_freq; in rcar_canfd_channel_probe()
1741 dev_info(dev, "can_clk rate is %u\n", priv->can.clock.freq); in rcar_canfd_channel_probe()
1743 if (info->multi_channel_irqs) { in rcar_canfd_channel_probe()
1760 irq_name = devm_kasprintf(dev, GFP_KERNEL, "canfd.ch%d_err", in rcar_canfd_channel_probe()
1763 err = -ENOMEM; in rcar_canfd_channel_probe()
1774 irq_name = devm_kasprintf(dev, GFP_KERNEL, "canfd.ch%d_trx", in rcar_canfd_channel_probe()
1777 err = -ENOMEM; in rcar_canfd_channel_probe()
1790 if (gpriv->fdmode) { in rcar_canfd_channel_probe()
1791 priv->can.bittiming_const = &rcar_canfd_nom_bittiming_const; in rcar_canfd_channel_probe()
1792 priv->can.data_bittiming_const = in rcar_canfd_channel_probe()
1799 priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING; in rcar_canfd_channel_probe()
1802 priv->can.bittiming_const = &rcar_canfd_bittiming_const; in rcar_canfd_channel_probe()
1803 priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING; in rcar_canfd_channel_probe()
1806 priv->can.do_set_mode = rcar_canfd_do_set_mode; in rcar_canfd_channel_probe()
1807 priv->can.do_get_berr_counter = rcar_canfd_get_berr_counter; in rcar_canfd_channel_probe()
1810 netif_napi_add_weight(ndev, &priv->napi, rcar_canfd_rx_poll, in rcar_canfd_channel_probe()
1812 spin_lock_init(&priv->tx_lock); in rcar_canfd_channel_probe()
1813 gpriv->ch[priv->channel] = priv; in rcar_canfd_channel_probe()
1819 dev_info(dev, "device registered (channel %u)\n", priv->channel); in rcar_canfd_channel_probe()
1823 netif_napi_del(&priv->napi); in rcar_canfd_channel_probe()
1831 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_channel_remove()
1834 unregister_candev(priv->ndev); in rcar_canfd_channel_remove()
1835 netif_napi_del(&priv->napi); in rcar_canfd_channel_remove()
1836 free_candev(priv->ndev); in rcar_canfd_channel_remove()
1844 struct device *dev = &pdev->dev; in rcar_canfd_probe()
1853 bool fdmode = true; /* CAN FD only mode - default */ in rcar_canfd_probe()
1859 if (of_property_read_bool(dev->of_node, "renesas,no-can-fd")) in rcar_canfd_probe()
1862 for (i = 0; i < info->max_channels; ++i) { in rcar_canfd_probe()
1864 of_child = of_get_child_by_name(dev->of_node, name); in rcar_canfd_probe()
1875 if (info->shared_global_irqs) { in rcar_canfd_probe()
1904 return -ENOMEM; in rcar_canfd_probe()
1906 gpriv->pdev = pdev; in rcar_canfd_probe()
1907 gpriv->channels_mask = channels_mask; in rcar_canfd_probe()
1908 gpriv->fdmode = fdmode; in rcar_canfd_probe()
1909 gpriv->info = info; in rcar_canfd_probe()
1911 gpriv->rstc1 = devm_reset_control_get_optional_exclusive(dev, "rstp_n"); in rcar_canfd_probe()
1912 if (IS_ERR(gpriv->rstc1)) in rcar_canfd_probe()
1913 return dev_err_probe(dev, PTR_ERR(gpriv->rstc1), in rcar_canfd_probe()
1916 gpriv->rstc2 = devm_reset_control_get_optional_exclusive(dev, "rstc_n"); in rcar_canfd_probe()
1917 if (IS_ERR(gpriv->rstc2)) in rcar_canfd_probe()
1918 return dev_err_probe(dev, PTR_ERR(gpriv->rstc2), in rcar_canfd_probe()
1922 gpriv->clkp = devm_clk_get(dev, "fck"); in rcar_canfd_probe()
1923 if (IS_ERR(gpriv->clkp)) in rcar_canfd_probe()
1924 return dev_err_probe(dev, PTR_ERR(gpriv->clkp), in rcar_canfd_probe()
1928 * CANFD clock in rcar_canfd_probe()
1930 gpriv->can_clk = devm_clk_get(dev, "can_clk"); in rcar_canfd_probe()
1931 if (IS_ERR(gpriv->can_clk) || (clk_get_rate(gpriv->can_clk) == 0)) { in rcar_canfd_probe()
1932 gpriv->can_clk = devm_clk_get(dev, "canfd"); in rcar_canfd_probe()
1933 if (IS_ERR(gpriv->can_clk)) in rcar_canfd_probe()
1934 return dev_err_probe(dev, PTR_ERR(gpriv->can_clk), in rcar_canfd_probe()
1935 "cannot get canfd clock\n"); in rcar_canfd_probe()
1937 gpriv->fcan = RCANFD_CANFDCLK; in rcar_canfd_probe()
1940 gpriv->fcan = RCANFD_EXTCLK; in rcar_canfd_probe()
1942 fcan_freq = clk_get_rate(gpriv->can_clk); in rcar_canfd_probe()
1944 if (gpriv->fcan == RCANFD_CANFDCLK) in rcar_canfd_probe()
1945 /* CANFD clock is further divided by (1/2) within the IP */ in rcar_canfd_probe()
1946 fcan_freq /= info->postdiv; in rcar_canfd_probe()
1953 gpriv->base = addr; in rcar_canfd_probe()
1956 if (info->shared_global_irqs) { in rcar_canfd_probe()
1959 "canfd.ch_int", gpriv); in rcar_canfd_probe()
1967 0, "canfd.g_int", gpriv); in rcar_canfd_probe()
1976 "canfd.g_recc", gpriv); in rcar_canfd_probe()
1986 "canfd.g_err", gpriv); in rcar_canfd_probe()
1994 err = reset_control_reset(gpriv->rstc1); in rcar_canfd_probe()
1997 err = reset_control_reset(gpriv->rstc2); in rcar_canfd_probe()
1999 reset_control_assert(gpriv->rstc1); in rcar_canfd_probe()
2004 err = clk_prepare_enable(gpriv->clkp); in rcar_canfd_probe()
2021 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) { in rcar_canfd_probe()
2037 rcar_canfd_update_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GMDC_MASK, in rcar_canfd_probe()
2041 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_probe()
2042 !(sts & RCANFD_GSTS_GNOPM), 2, 500000); in rcar_canfd_probe()
2048 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) { in rcar_canfd_probe()
2057 gpriv->fcan, gpriv->fdmode); in rcar_canfd_probe()
2061 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) in rcar_canfd_probe()
2066 clk_disable_unprepare(gpriv->clkp); in rcar_canfd_probe()
2068 reset_control_assert(gpriv->rstc1); in rcar_canfd_probe()
2069 reset_control_assert(gpriv->rstc2); in rcar_canfd_probe()
2082 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) { in rcar_canfd_remove()
2083 rcar_canfd_disable_channel_interrupts(gpriv->ch[ch]); in rcar_canfd_remove()
2088 rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GSLPR); in rcar_canfd_remove()
2089 clk_disable_unprepare(gpriv->clkp); in rcar_canfd_remove()
2090 reset_control_assert(gpriv->rstc1); in rcar_canfd_remove()
2091 reset_control_assert(gpriv->rstc2); in rcar_canfd_remove()
2108 { .compatible = "renesas,r8a779a0-canfd", .data = &rcar_gen4_hw_info },
2109 { .compatible = "renesas,rcar-gen3-canfd", .data = &rcar_gen3_hw_info },
2110 { .compatible = "renesas,rcar-gen4-canfd", .data = &rcar_gen4_hw_info },
2111 { .compatible = "renesas,rzg2l-canfd", .data = &rzg2l_hw_info },
2131 MODULE_DESCRIPTION("CAN FD driver for Renesas R-Car SoC");