Lines Matching +full:reg +full:- +full:names

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
20 * to use as it is in the driver. However, those names are added as comments
72 /* Non-operational status */
85 (gpriv->fdmode ?\
91 #define RCANFD_GAFLCFG_SETRNC(n, x) (((x) & 0xff) << (24 - n * 8))
92 #define RCANFD_GAFLCFG_GETRNC(n, x) (((x) >> (24 - n * 8)) & 0xff)
106 /* RSCFDnCmCFG - Classical CAN only */
112 /* RSCFDnCFDCmNCFG - CAN FD only */
247 * These modes are supported in two separate set of register maps & names.
252 * registers are listed separately. Their register names starts with
377 /* RSCFDnRMXXXq -> RCANFD_C_RMXXX(q) */
383 /* RSCFDnRFXXx -> RCANFD_C_RFXX(x) */
391 /* RSCFDnCFXXk -> RCANFD_C_CFXX(ch, k) */
401 /* RSCFDnTMXXp -> RCANFD_C_TMXX(p) */
414 /* RSCFDnCFDCmXXX -> RCANFD_F_XXX(m) */
424 /* RSCFDnCFDRMXXXq -> RCANFD_F_RMXXX(q) */
430 /* RSCFDnCFDRFXXx -> RCANFD_F_RFXX(x) */
440 /* RSCFDnCFDCFXXk -> RCANFD_F_CFXX(ch, k) */
452 /* RSCFDnCFDTMXXp -> RCANFD_F_TMXX(p) */
468 #define RCANFD_CHANNELS_MASK BIT((RCANFD_NUM_CHANNELS) - 1)
558 static inline void rcar_canfd_update(u32 mask, u32 val, u32 __iomem *reg) in rcar_canfd_update() argument
560 u32 data = readl(reg); in rcar_canfd_update()
564 writel(data, reg); in rcar_canfd_update()
577 static void rcar_canfd_set_bit(void __iomem *base, u32 reg, u32 val) in rcar_canfd_set_bit() argument
579 rcar_canfd_update(val, val, base + (reg)); in rcar_canfd_set_bit()
582 static void rcar_canfd_clear_bit(void __iomem *base, u32 reg, u32 val) in rcar_canfd_clear_bit() argument
584 rcar_canfd_update(val, 0, base + (reg)); in rcar_canfd_clear_bit()
587 static void rcar_canfd_update_bit(void __iomem *base, u32 reg, in rcar_canfd_update_bit() argument
590 rcar_canfd_update(mask, val, base + (reg)); in rcar_canfd_update_bit()
598 lwords = DIV_ROUND_UP(cf->len, sizeof(u32)); in rcar_canfd_get_data()
600 *((u32 *)cf->data + i) = in rcar_canfd_get_data()
601 rcar_canfd_read(priv->base, off + (i * sizeof(u32))); in rcar_canfd_get_data()
609 lwords = DIV_ROUND_UP(cf->len, sizeof(u32)); in rcar_canfd_put_data()
611 rcar_canfd_write(priv->base, off + (i * sizeof(u32)), in rcar_canfd_put_data()
612 *((u32 *)cf->data + i)); in rcar_canfd_put_data()
631 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_reset_controller()
634 dev_dbg(&gpriv->pdev->dev, "global raminit failed\n"); in rcar_canfd_reset_controller()
639 rcar_canfd_clear_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GSLPR); in rcar_canfd_reset_controller()
640 rcar_canfd_update_bit(gpriv->base, RCANFD_GCTR, in rcar_canfd_reset_controller()
644 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_reset_controller()
647 dev_dbg(&gpriv->pdev->dev, "global reset failed\n"); in rcar_canfd_reset_controller()
652 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0x0); in rcar_canfd_reset_controller()
655 if (gpriv->fdmode) in rcar_canfd_reset_controller()
656 rcar_canfd_set_bit(gpriv->base, RCANFD_GRMCFG, in rcar_canfd_reset_controller()
659 rcar_canfd_clear_bit(gpriv->base, RCANFD_GRMCFG, in rcar_canfd_reset_controller()
663 for_each_set_bit(ch, &gpriv->channels_mask, RCANFD_NUM_CHANNELS) { in rcar_canfd_reset_controller()
664 rcar_canfd_clear_bit(gpriv->base, in rcar_canfd_reset_controller()
667 rcar_canfd_update_bit(gpriv->base, RCANFD_CCTR(ch), in rcar_canfd_reset_controller()
672 err = readl_poll_timeout((gpriv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_reset_controller()
676 dev_dbg(&gpriv->pdev->dev, in rcar_canfd_reset_controller()
693 if (gpriv->fdmode) in rcar_canfd_configure_controller()
698 if (gpriv->fcan != RCANFD_CANFDCLK) in rcar_canfd_configure_controller()
701 rcar_canfd_set_bit(gpriv->base, RCANFD_GCFG, cfg); in rcar_canfd_configure_controller()
704 for_each_set_bit(ch, &gpriv->channels_mask, RCANFD_NUM_CHANNELS) { in rcar_canfd_configure_controller()
705 rcar_canfd_set_bit(gpriv->base, RCANFD_CCTR(ch), in rcar_canfd_configure_controller()
707 rcar_canfd_update_bit(gpriv->base, RCANFD_CCTR(ch), in rcar_canfd_configure_controller()
724 cfg = rcar_canfd_read(gpriv->base, RCANFD_GAFLCFG0); in rcar_canfd_configure_afl_rules()
730 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLECTR, in rcar_canfd_configure_afl_rules()
735 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG0, in rcar_canfd_configure_afl_rules()
737 if (gpriv->fdmode) in rcar_canfd_configure_afl_rules()
743 rcar_canfd_write(gpriv->base, RCANFD_GAFLID(offset, start), 0); in rcar_canfd_configure_afl_rules()
745 rcar_canfd_write(gpriv->base, RCANFD_GAFLM(offset, start), 0); in rcar_canfd_configure_afl_rules()
747 rcar_canfd_write(gpriv->base, RCANFD_GAFLP0(offset, start), 0); in rcar_canfd_configure_afl_rules()
749 rcar_canfd_write(gpriv->base, RCANFD_GAFLP1(offset, start), in rcar_canfd_configure_afl_rules()
753 rcar_canfd_clear_bit(gpriv->base, in rcar_canfd_configure_afl_rules()
766 rfdc = 2; /* b010 - 8 messages Rx FIFO depth */ in rcar_canfd_configure_rx()
767 if (gpriv->fdmode) in rcar_canfd_configure_rx()
768 rfpls = 7; /* b111 - Max 64 bytes payload */ in rcar_canfd_configure_rx()
770 rfpls = 0; /* b000 - Max 8 bytes payload */ in rcar_canfd_configure_rx()
774 rcar_canfd_write(gpriv->base, RCANFD_RFCC(ridx), cfg); in rcar_canfd_configure_rx()
789 cfm = 1; /* b01 - Transmit mode */ in rcar_canfd_configure_tx()
790 cfdc = 2; /* b010 - 8 messages Tx FIFO depth */ in rcar_canfd_configure_tx()
791 if (gpriv->fdmode) in rcar_canfd_configure_tx()
792 cfpls = 7; /* b111 - Max 64 bytes payload */ in rcar_canfd_configure_tx()
794 cfpls = 0; /* b000 - Max 8 bytes payload */ in rcar_canfd_configure_tx()
799 rcar_canfd_write(gpriv->base, RCANFD_CFCC(ch, RCANFD_CFFIFO_IDX), cfg); in rcar_canfd_configure_tx()
801 if (gpriv->fdmode) in rcar_canfd_configure_tx()
803 rcar_canfd_write(gpriv->base, in rcar_canfd_configure_tx()
812 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0); in rcar_canfd_enable_global_interrupts()
816 if (gpriv->fdmode) in rcar_canfd_enable_global_interrupts()
819 rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, ctr); in rcar_canfd_enable_global_interrupts()
826 rcar_canfd_write(gpriv->base, RCANFD_GCTR, 0); in rcar_canfd_disable_global_interrupts()
829 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0); in rcar_canfd_disable_global_interrupts()
835 u32 ctr, ch = priv->channel; in rcar_canfd_enable_channel_interrupts()
838 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), 0); in rcar_canfd_enable_channel_interrupts()
846 rcar_canfd_set_bit(priv->base, RCANFD_CCTR(ch), ctr); in rcar_canfd_enable_channel_interrupts()
852 u32 ctr, ch = priv->channel; in rcar_canfd_disable_channel_interrupts()
859 rcar_canfd_clear_bit(priv->base, RCANFD_CCTR(ch), ctr); in rcar_canfd_disable_channel_interrupts()
862 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), 0); in rcar_canfd_disable_channel_interrupts()
868 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_global_error()
869 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_global_error()
870 u32 ch = priv->channel; in rcar_canfd_global_error()
874 gerfl = rcar_canfd_read(priv->base, RCANFD_GERFL); in rcar_canfd_global_error()
877 stats->tx_dropped++; in rcar_canfd_global_error()
881 stats->tx_dropped++; in rcar_canfd_global_error()
884 sts = rcar_canfd_read(priv->base, in rcar_canfd_global_error()
888 stats->tx_dropped++; in rcar_canfd_global_error()
889 rcar_canfd_write(priv->base, in rcar_canfd_global_error()
894 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(ridx)); in rcar_canfd_global_error()
897 stats->rx_dropped++; in rcar_canfd_global_error()
898 rcar_canfd_write(priv->base, RCANFD_RFSTS(ridx), in rcar_canfd_global_error()
902 if (gpriv->fdmode && gerfl & RCANFD_GERFL_CMPOF) { in rcar_canfd_global_error()
913 rcar_canfd_write(priv->base, RCANFD_GERFL, 0); in rcar_canfd_global_error()
920 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_error()
923 u32 ch = priv->channel; in rcar_canfd_error()
930 stats->rx_dropped++; in rcar_canfd_error()
937 cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; in rcar_canfd_error()
938 cf->data[2] = CAN_ERR_PROT_UNSPEC; in rcar_canfd_error()
939 priv->can.can_stats.bus_error++; in rcar_canfd_error()
943 stats->tx_errors++; in rcar_canfd_error()
944 cf->data[3] |= CAN_ERR_PROT_LOC_ACK_DEL; in rcar_canfd_error()
948 stats->tx_errors++; in rcar_canfd_error()
949 cf->data[2] |= CAN_ERR_PROT_BIT0; in rcar_canfd_error()
953 stats->tx_errors++; in rcar_canfd_error()
954 cf->data[2] |= CAN_ERR_PROT_BIT1; in rcar_canfd_error()
958 stats->rx_errors++; in rcar_canfd_error()
959 cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ; in rcar_canfd_error()
963 stats->tx_errors++; in rcar_canfd_error()
964 cf->can_id |= CAN_ERR_ACK; in rcar_canfd_error()
965 cf->data[3] |= CAN_ERR_PROT_LOC_ACK; in rcar_canfd_error()
969 stats->rx_errors++; in rcar_canfd_error()
970 cf->data[2] |= CAN_ERR_PROT_FORM; in rcar_canfd_error()
974 stats->rx_errors++; in rcar_canfd_error()
975 cf->data[2] |= CAN_ERR_PROT_STUFF; in rcar_canfd_error()
979 priv->can.can_stats.arbitration_lost++; in rcar_canfd_error()
980 cf->can_id |= CAN_ERR_LOSTARB; in rcar_canfd_error()
981 cf->data[0] |= CAN_ERR_LOSTARB_UNSPEC; in rcar_canfd_error()
985 stats->rx_errors++; in rcar_canfd_error()
986 cf->can_id |= CAN_ERR_BUSERROR; in rcar_canfd_error()
990 priv->can.state = CAN_STATE_ERROR_WARNING; in rcar_canfd_error()
991 priv->can.can_stats.error_warning++; in rcar_canfd_error()
992 cf->can_id |= CAN_ERR_CRTL; in rcar_canfd_error()
993 cf->data[1] = txerr > rxerr ? CAN_ERR_CRTL_TX_WARNING : in rcar_canfd_error()
995 cf->data[6] = txerr; in rcar_canfd_error()
996 cf->data[7] = rxerr; in rcar_canfd_error()
1000 priv->can.state = CAN_STATE_ERROR_PASSIVE; in rcar_canfd_error()
1001 priv->can.can_stats.error_passive++; in rcar_canfd_error()
1002 cf->can_id |= CAN_ERR_CRTL; in rcar_canfd_error()
1003 cf->data[1] = txerr > rxerr ? CAN_ERR_CRTL_TX_PASSIVE : in rcar_canfd_error()
1005 cf->data[6] = txerr; in rcar_canfd_error()
1006 cf->data[7] = rxerr; in rcar_canfd_error()
1009 netdev_dbg(ndev, "Bus-off entry interrupt\n"); in rcar_canfd_error()
1011 priv->can.state = CAN_STATE_BUS_OFF; in rcar_canfd_error()
1012 priv->can.can_stats.bus_off++; in rcar_canfd_error()
1014 cf->can_id |= CAN_ERR_BUSOFF; in rcar_canfd_error()
1019 stats->tx_errors++; in rcar_canfd_error()
1020 cf->can_id |= CAN_ERR_PROT; in rcar_canfd_error()
1021 cf->data[2] |= CAN_ERR_PROT_OVERLOAD; in rcar_canfd_error()
1025 rcar_canfd_write(priv->base, RCANFD_CERFL(ch), in rcar_canfd_error()
1027 stats->rx_packets++; in rcar_canfd_error()
1028 stats->rx_bytes += cf->can_dlc; in rcar_canfd_error()
1035 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_tx_done()
1038 u32 ch = priv->channel; in rcar_canfd_tx_done()
1043 sent = priv->tx_tail % RCANFD_FIFO_DEPTH; in rcar_canfd_tx_done()
1044 stats->tx_packets++; in rcar_canfd_tx_done()
1045 stats->tx_bytes += priv->tx_len[sent]; in rcar_canfd_tx_done()
1046 priv->tx_len[sent] = 0; in rcar_canfd_tx_done()
1049 spin_lock_irqsave(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1050 priv->tx_tail++; in rcar_canfd_tx_done()
1051 sts = rcar_canfd_read(priv->base, in rcar_canfd_tx_done()
1059 if (priv->tx_head - priv->tx_tail <= unsent) { in rcar_canfd_tx_done()
1060 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1063 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_tx_done()
1068 rcar_canfd_write(priv->base, RCANFD_CFSTS(ch, RCANFD_CFFIFO_IDX), in rcar_canfd_tx_done()
1084 for_each_set_bit(ch, &gpriv->channels_mask, RCANFD_NUM_CHANNELS) { in rcar_canfd_global_interrupt()
1085 priv = gpriv->ch[ch]; in rcar_canfd_global_interrupt()
1086 ndev = priv->ndev; in rcar_canfd_global_interrupt()
1090 gerfl = rcar_canfd_read(priv->base, RCANFD_GERFL); in rcar_canfd_global_interrupt()
1095 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(ridx)); in rcar_canfd_global_interrupt()
1097 if (napi_schedule_prep(&priv->napi)) { in rcar_canfd_global_interrupt()
1099 rcar_canfd_clear_bit(priv->base, in rcar_canfd_global_interrupt()
1102 __napi_schedule(&priv->napi); in rcar_canfd_global_interrupt()
1113 struct net_device_stats *stats = &ndev->stats; in rcar_canfd_state_change()
1114 enum can_state rx_state, tx_state, state = priv->can.state; in rcar_canfd_state_change()
1124 if (state != priv->can.state) { in rcar_canfd_state_change()
1126 state, priv->can.state, txerr, rxerr); in rcar_canfd_state_change()
1129 stats->rx_dropped++; in rcar_canfd_state_change()
1136 stats->rx_packets++; in rcar_canfd_state_change()
1137 stats->rx_bytes += cf->can_dlc; in rcar_canfd_state_change()
1151 for_each_set_bit(ch, &gpriv->channels_mask, RCANFD_NUM_CHANNELS) { in rcar_canfd_channel_interrupt()
1152 priv = gpriv->ch[ch]; in rcar_canfd_channel_interrupt()
1153 ndev = priv->ndev; in rcar_canfd_channel_interrupt()
1156 cerfl = rcar_canfd_read(priv->base, RCANFD_CERFL(ch)); in rcar_canfd_channel_interrupt()
1157 sts = rcar_canfd_read(priv->base, RCANFD_CSTS(ch)); in rcar_canfd_channel_interrupt()
1164 if (unlikely((priv->can.state != CAN_STATE_ERROR_ACTIVE) && in rcar_canfd_channel_interrupt()
1165 (priv->can.state != CAN_STATE_BUS_OFF))) in rcar_canfd_channel_interrupt()
1169 sts = rcar_canfd_read(priv->base, in rcar_canfd_channel_interrupt()
1180 const struct can_bittiming *bt = &priv->can.bittiming; in rcar_canfd_set_bittiming()
1181 const struct can_bittiming *dbt = &priv->can.data_bittiming; in rcar_canfd_set_bittiming()
1184 u32 ch = priv->channel; in rcar_canfd_set_bittiming()
1187 brp = bt->brp - 1; in rcar_canfd_set_bittiming()
1188 sjw = bt->sjw - 1; in rcar_canfd_set_bittiming()
1189 tseg1 = bt->prop_seg + bt->phase_seg1 - 1; in rcar_canfd_set_bittiming()
1190 tseg2 = bt->phase_seg2 - 1; in rcar_canfd_set_bittiming()
1192 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { in rcar_canfd_set_bittiming()
1197 rcar_canfd_write(priv->base, RCANFD_CCFG(ch), cfg); in rcar_canfd_set_bittiming()
1198 netdev_dbg(priv->ndev, "nrate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n", in rcar_canfd_set_bittiming()
1202 brp = dbt->brp - 1; in rcar_canfd_set_bittiming()
1203 sjw = dbt->sjw - 1; in rcar_canfd_set_bittiming()
1204 tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1; in rcar_canfd_set_bittiming()
1205 tseg2 = dbt->phase_seg2 - 1; in rcar_canfd_set_bittiming()
1210 rcar_canfd_write(priv->base, RCANFD_F_DCFG(ch), cfg); in rcar_canfd_set_bittiming()
1211 netdev_dbg(priv->ndev, "drate: brp %u, sjw %u, tseg1 %u, tseg2 %u\n", in rcar_canfd_set_bittiming()
1218 rcar_canfd_write(priv->base, RCANFD_CCFG(ch), cfg); in rcar_canfd_set_bittiming()
1219 netdev_dbg(priv->ndev, in rcar_canfd_set_bittiming()
1228 int err = -EOPNOTSUPP; in rcar_canfd_start()
1229 u32 sts, ch = priv->channel; in rcar_canfd_start()
1237 rcar_canfd_update_bit(priv->base, RCANFD_CCTR(ch), in rcar_canfd_start()
1241 err = readl_poll_timeout((priv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_start()
1249 rcar_canfd_set_bit(priv->base, RCANFD_CFCC(ch, RCANFD_CFFIFO_IDX), in rcar_canfd_start()
1251 rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx), RCANFD_RFCC_RFE); in rcar_canfd_start()
1253 priv->can.state = CAN_STATE_ERROR_ACTIVE; in rcar_canfd_start()
1264 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_open()
1268 err = clk_prepare_enable(gpriv->can_clk); in rcar_canfd_open()
1280 napi_enable(&priv->napi); in rcar_canfd_open()
1288 napi_disable(&priv->napi); in rcar_canfd_open()
1291 clk_disable_unprepare(gpriv->can_clk); in rcar_canfd_open()
1300 u32 sts, ch = priv->channel; in rcar_canfd_stop()
1304 rcar_canfd_update_bit(priv->base, RCANFD_CCTR(ch), in rcar_canfd_stop()
1308 err = readl_poll_timeout((priv->base + RCANFD_CSTS(ch)), sts, in rcar_canfd_stop()
1316 rcar_canfd_clear_bit(priv->base, RCANFD_CFCC(ch, RCANFD_CFFIFO_IDX), in rcar_canfd_stop()
1318 rcar_canfd_clear_bit(priv->base, RCANFD_RFCC(ridx), RCANFD_RFCC_RFE); in rcar_canfd_stop()
1321 priv->can.state = CAN_STATE_STOPPED; in rcar_canfd_stop()
1327 struct rcar_canfd_global *gpriv = priv->gpriv; in rcar_canfd_close()
1331 napi_disable(&priv->napi); in rcar_canfd_close()
1332 clk_disable_unprepare(gpriv->can_clk); in rcar_canfd_close()
1342 struct canfd_frame *cf = (struct canfd_frame *)skb->data; in rcar_canfd_start_xmit()
1345 u32 ch = priv->channel; in rcar_canfd_start_xmit()
1350 if (cf->can_id & CAN_EFF_FLAG) { in rcar_canfd_start_xmit()
1351 id = cf->can_id & CAN_EFF_MASK; in rcar_canfd_start_xmit()
1354 id = cf->can_id & CAN_SFF_MASK; in rcar_canfd_start_xmit()
1357 if (cf->can_id & CAN_RTR_FLAG) in rcar_canfd_start_xmit()
1360 dlc = RCANFD_CFPTR_CFDLC(can_len2dlc(cf->len)); in rcar_canfd_start_xmit()
1362 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { in rcar_canfd_start_xmit()
1363 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1365 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1371 if (cf->flags & CANFD_BRS) in rcar_canfd_start_xmit()
1374 if (priv->can.state == CAN_STATE_ERROR_PASSIVE) in rcar_canfd_start_xmit()
1378 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1384 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1386 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1392 priv->tx_len[priv->tx_head % RCANFD_FIFO_DEPTH] = cf->len; in rcar_canfd_start_xmit()
1393 can_put_echo_skb(skb, ndev, priv->tx_head % RCANFD_FIFO_DEPTH); in rcar_canfd_start_xmit()
1395 spin_lock_irqsave(&priv->tx_lock, flags); in rcar_canfd_start_xmit()
1396 priv->tx_head++; in rcar_canfd_start_xmit()
1399 if (priv->tx_head - priv->tx_tail >= RCANFD_FIFO_DEPTH) in rcar_canfd_start_xmit()
1402 /* Start Tx: Write 0xff to CFPC to increment the CPU-side in rcar_canfd_start_xmit()
1405 rcar_canfd_write(priv->base, in rcar_canfd_start_xmit()
1408 spin_unlock_irqrestore(&priv->tx_lock, flags); in rcar_canfd_start_xmit()
1414 struct net_device_stats *stats = &priv->ndev->stats; in rcar_canfd_rx_pkt()
1418 u32 ch = priv->channel; in rcar_canfd_rx_pkt()
1421 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { in rcar_canfd_rx_pkt()
1422 id = rcar_canfd_read(priv->base, RCANFD_F_RFID(ridx)); in rcar_canfd_rx_pkt()
1423 dlc = rcar_canfd_read(priv->base, RCANFD_F_RFPTR(ridx)); in rcar_canfd_rx_pkt()
1425 sts = rcar_canfd_read(priv->base, RCANFD_F_RFFDSTS(ridx)); in rcar_canfd_rx_pkt()
1427 skb = alloc_canfd_skb(priv->ndev, &cf); in rcar_canfd_rx_pkt()
1429 skb = alloc_can_skb(priv->ndev, in rcar_canfd_rx_pkt()
1432 id = rcar_canfd_read(priv->base, RCANFD_C_RFID(ridx)); in rcar_canfd_rx_pkt()
1433 dlc = rcar_canfd_read(priv->base, RCANFD_C_RFPTR(ridx)); in rcar_canfd_rx_pkt()
1434 skb = alloc_can_skb(priv->ndev, (struct can_frame **)&cf); in rcar_canfd_rx_pkt()
1438 stats->rx_dropped++; in rcar_canfd_rx_pkt()
1443 cf->can_id = (id & CAN_EFF_MASK) | CAN_EFF_FLAG; in rcar_canfd_rx_pkt()
1445 cf->can_id = id & CAN_SFF_MASK; in rcar_canfd_rx_pkt()
1447 if (priv->can.ctrlmode & CAN_CTRLMODE_FD) { in rcar_canfd_rx_pkt()
1449 cf->len = can_dlc2len(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1451 cf->len = get_can_dlc(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1454 cf->flags |= CANFD_ESI; in rcar_canfd_rx_pkt()
1455 netdev_dbg(priv->ndev, "ESI Error\n"); in rcar_canfd_rx_pkt()
1459 cf->can_id |= CAN_RTR_FLAG; in rcar_canfd_rx_pkt()
1462 cf->flags |= CANFD_BRS; in rcar_canfd_rx_pkt()
1467 cf->len = get_can_dlc(RCANFD_RFPTR_RFDLC(dlc)); in rcar_canfd_rx_pkt()
1469 cf->can_id |= CAN_RTR_FLAG; in rcar_canfd_rx_pkt()
1474 /* Write 0xff to RFPC to increment the CPU-side in rcar_canfd_rx_pkt()
1477 rcar_canfd_write(priv->base, RCANFD_RFPCTR(ridx), 0xff); in rcar_canfd_rx_pkt()
1479 can_led_event(priv->ndev, CAN_LED_EVENT_RX); in rcar_canfd_rx_pkt()
1481 stats->rx_bytes += cf->len; in rcar_canfd_rx_pkt()
1482 stats->rx_packets++; in rcar_canfd_rx_pkt()
1492 u32 ch = priv->channel; in rcar_canfd_rx_poll()
1496 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(ridx)); in rcar_canfd_rx_poll()
1505 rcar_canfd_write(priv->base, RCANFD_RFSTS(ridx), in rcar_canfd_rx_poll()
1513 rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx), in rcar_canfd_rx_poll()
1532 return -EOPNOTSUPP; in rcar_canfd_do_set_mode()
1540 u32 val, ch = priv->channel; in rcar_canfd_get_berr_counter()
1543 val = rcar_canfd_read(priv->base, RCANFD_CSTS(ch)); in rcar_canfd_get_berr_counter()
1544 bec->txerr = RCANFD_CSTS_TECCNT(val); in rcar_canfd_get_berr_counter()
1545 bec->rxerr = RCANFD_CSTS_RECCNT(val); in rcar_canfd_get_berr_counter()
1559 struct platform_device *pdev = gpriv->pdev; in rcar_canfd_channel_probe()
1562 int err = -ENODEV; in rcar_canfd_channel_probe()
1566 dev_err(&pdev->dev, "alloc_candev() failed\n"); in rcar_canfd_channel_probe()
1567 err = -ENOMEM; in rcar_canfd_channel_probe()
1572 ndev->netdev_ops = &rcar_canfd_netdev_ops; in rcar_canfd_channel_probe()
1573 ndev->flags |= IFF_ECHO; in rcar_canfd_channel_probe()
1574 priv->ndev = ndev; in rcar_canfd_channel_probe()
1575 priv->base = gpriv->base; in rcar_canfd_channel_probe()
1576 priv->channel = ch; in rcar_canfd_channel_probe()
1577 priv->can.clock.freq = fcan_freq; in rcar_canfd_channel_probe()
1578 dev_info(&pdev->dev, "can_clk rate is %u\n", priv->can.clock.freq); in rcar_canfd_channel_probe()
1580 if (gpriv->fdmode) { in rcar_canfd_channel_probe()
1581 priv->can.bittiming_const = &rcar_canfd_nom_bittiming_const; in rcar_canfd_channel_probe()
1582 priv->can.data_bittiming_const = in rcar_canfd_channel_probe()
1587 priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING; in rcar_canfd_channel_probe()
1590 priv->can.bittiming_const = &rcar_canfd_bittiming_const; in rcar_canfd_channel_probe()
1591 priv->can.ctrlmode_supported = CAN_CTRLMODE_BERR_REPORTING; in rcar_canfd_channel_probe()
1594 priv->can.do_set_mode = rcar_canfd_do_set_mode; in rcar_canfd_channel_probe()
1595 priv->can.do_get_berr_counter = rcar_canfd_get_berr_counter; in rcar_canfd_channel_probe()
1596 priv->gpriv = gpriv; in rcar_canfd_channel_probe()
1597 SET_NETDEV_DEV(ndev, &pdev->dev); in rcar_canfd_channel_probe()
1599 netif_napi_add(ndev, &priv->napi, rcar_canfd_rx_poll, in rcar_canfd_channel_probe()
1603 dev_err(&pdev->dev, in rcar_canfd_channel_probe()
1607 spin_lock_init(&priv->tx_lock); in rcar_canfd_channel_probe()
1609 gpriv->ch[priv->channel] = priv; in rcar_canfd_channel_probe()
1610 dev_info(&pdev->dev, "device registered (channel %u)\n", priv->channel); in rcar_canfd_channel_probe()
1614 netif_napi_del(&priv->napi); in rcar_canfd_channel_probe()
1622 struct rcar_canfd_channel *priv = gpriv->ch[ch]; in rcar_canfd_channel_remove()
1625 unregister_candev(priv->ndev); in rcar_canfd_channel_remove()
1626 netif_napi_del(&priv->napi); in rcar_canfd_channel_remove()
1627 free_candev(priv->ndev); in rcar_canfd_channel_remove()
1639 bool fdmode = true; /* CAN FD only mode - default */ in rcar_canfd_probe()
1641 if (of_property_read_bool(pdev->dev.of_node, "renesas,no-can-fd")) in rcar_canfd_probe()
1644 of_child = of_get_child_by_name(pdev->dev.of_node, "channel0"); in rcar_canfd_probe()
1648 of_child = of_get_child_by_name(pdev->dev.of_node, "channel1"); in rcar_canfd_probe()
1665 gpriv = devm_kzalloc(&pdev->dev, sizeof(*gpriv), GFP_KERNEL); in rcar_canfd_probe()
1667 err = -ENOMEM; in rcar_canfd_probe()
1670 gpriv->pdev = pdev; in rcar_canfd_probe()
1671 gpriv->channels_mask = channels_mask; in rcar_canfd_probe()
1672 gpriv->fdmode = fdmode; in rcar_canfd_probe()
1675 gpriv->clkp = devm_clk_get(&pdev->dev, "fck"); in rcar_canfd_probe()
1676 if (IS_ERR(gpriv->clkp)) { in rcar_canfd_probe()
1677 err = PTR_ERR(gpriv->clkp); in rcar_canfd_probe()
1678 dev_err(&pdev->dev, "cannot get peripheral clock, error %d\n", in rcar_canfd_probe()
1686 gpriv->can_clk = devm_clk_get(&pdev->dev, "can_clk"); in rcar_canfd_probe()
1687 if (IS_ERR(gpriv->can_clk) || (clk_get_rate(gpriv->can_clk) == 0)) { in rcar_canfd_probe()
1688 gpriv->can_clk = devm_clk_get(&pdev->dev, "canfd"); in rcar_canfd_probe()
1689 if (IS_ERR(gpriv->can_clk)) { in rcar_canfd_probe()
1690 err = PTR_ERR(gpriv->can_clk); in rcar_canfd_probe()
1691 dev_err(&pdev->dev, in rcar_canfd_probe()
1695 gpriv->fcan = RCANFD_CANFDCLK; in rcar_canfd_probe()
1698 gpriv->fcan = RCANFD_EXTCLK; in rcar_canfd_probe()
1700 fcan_freq = clk_get_rate(gpriv->can_clk); in rcar_canfd_probe()
1702 if (gpriv->fcan == RCANFD_CANFDCLK) in rcar_canfd_probe()
1711 gpriv->base = addr; in rcar_canfd_probe()
1714 err = devm_request_irq(&pdev->dev, ch_irq, in rcar_canfd_probe()
1718 dev_err(&pdev->dev, "devm_request_irq(%d) failed, error %d\n", in rcar_canfd_probe()
1722 err = devm_request_irq(&pdev->dev, g_irq, in rcar_canfd_probe()
1726 dev_err(&pdev->dev, "devm_request_irq(%d) failed, error %d\n", in rcar_canfd_probe()
1732 err = clk_prepare_enable(gpriv->clkp); in rcar_canfd_probe()
1734 dev_err(&pdev->dev, in rcar_canfd_probe()
1741 dev_err(&pdev->dev, "reset controller failed\n"); in rcar_canfd_probe()
1749 for_each_set_bit(ch, &gpriv->channels_mask, RCANFD_NUM_CHANNELS) { in rcar_canfd_probe()
1764 rcar_canfd_update_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GMDC_MASK, in rcar_canfd_probe()
1768 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts, in rcar_canfd_probe()
1771 dev_err(&pdev->dev, "global operational mode failed\n"); in rcar_canfd_probe()
1775 for_each_set_bit(ch, &gpriv->channels_mask, RCANFD_NUM_CHANNELS) { in rcar_canfd_probe()
1782 dev_info(&pdev->dev, "global operational state (clk %d, fdmode %d)\n", in rcar_canfd_probe()
1783 gpriv->fcan, gpriv->fdmode); in rcar_canfd_probe()
1787 for_each_set_bit(ch, &gpriv->channels_mask, RCANFD_NUM_CHANNELS) in rcar_canfd_probe()
1792 clk_disable_unprepare(gpriv->clkp); in rcar_canfd_probe()
1805 for_each_set_bit(ch, &gpriv->channels_mask, RCANFD_NUM_CHANNELS) { in rcar_canfd_remove()
1806 rcar_canfd_disable_channel_interrupts(gpriv->ch[ch]); in rcar_canfd_remove()
1811 rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GSLPR); in rcar_canfd_remove()
1812 clk_disable_unprepare(gpriv->clkp); in rcar_canfd_remove()
1830 { .compatible = "renesas,rcar-gen3-canfd" },
1850 MODULE_DESCRIPTION("CAN FD driver for Renesas R-Car SoC");