Lines Matching refs:gpriv

84 #define RCANFD_GERFL_ERR(gpriv, x) \
85 ((x) & (reg_gen4(gpriv, RCANFD_GERFL_EEF0_7, \
88 ((gpriv)->fdmode ? RCANFD_GERFL_CMPOF : 0)))
93 #define RCANFD_GAFLCFG_SETRNC(gpriv, n, x) \
94 (((x) & reg_gen4(gpriv, 0x1ff, 0xff)) << \
95 (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8)))
97 #define RCANFD_GAFLCFG_GETRNC(gpriv, n, x) \
98 (((x) >> (reg_gen4(gpriv, 16, 24) - ((n) & 1) * reg_gen4(gpriv, 16, 8))) & \
99 reg_gen4(gpriv, 0x1ff, 0xff))
103 #define RCANFD_GAFLECTR_AFLPN(gpriv, x) ((x) & reg_gen4(gpriv, 0x7f, 0x1f))
120 #define RCANFD_NCFG_NTSEG2(gpriv, x) \
121 (((x) & reg_gen4(gpriv, 0x7f, 0x1f)) << reg_gen4(gpriv, 25, 24))
123 #define RCANFD_NCFG_NTSEG1(gpriv, x) \
124 (((x) & reg_gen4(gpriv, 0xff, 0x7f)) << reg_gen4(gpriv, 17, 16))
126 #define RCANFD_NCFG_NSJW(gpriv, x) \
127 (((x) & reg_gen4(gpriv, 0x7f, 0x1f)) << reg_gen4(gpriv, 10, 11))
189 #define RCANFD_DCFG_DSJW(gpriv, x) (((x) & reg_gen4(gpriv, 0xf, 0x7)) << 24)
191 #define RCANFD_DCFG_DTSEG2(gpriv, x) \
192 (((x) & reg_gen4(gpriv, 0x0f, 0x7)) << reg_gen4(gpriv, 16, 20))
194 #define RCANFD_DCFG_DTSEG1(gpriv, x) \
195 (((x) & reg_gen4(gpriv, 0x1f, 0xf)) << reg_gen4(gpriv, 8, 16))
236 #define RCANFD_CFCC_CFTML(gpriv, x) \
237 (((x) & reg_gen4(gpriv, 0x1f, 0xf)) << reg_gen4(gpriv, 16, 20))
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))
308 #define RCANFD_RFCC(gpriv, x) (reg_gen4(gpriv, 0x00c0, 0x00b8) + (0x04 * (x)))
310 #define RCANFD_RFSTS(gpriv, x) (RCANFD_RFCC(gpriv, x) + 0x20)
312 #define RCANFD_RFPCTR(gpriv, x) (RCANFD_RFCC(gpriv, x) + 0x40)
317 #define RCANFD_CFCC(gpriv, ch, idx) \
318 (reg_gen4(gpriv, 0x0120, 0x0118) + (0x0c * (ch)) + (0x04 * (idx)))
320 #define RCANFD_CFSTS(gpriv, ch, idx) \
321 (reg_gen4(gpriv, 0x01e0, 0x0178) + (0x0c * (ch)) + (0x04 * (idx)))
323 #define RCANFD_CFPCTR(gpriv, ch, idx) \
324 (reg_gen4(gpriv, 0x0240, 0x01d8) + (0x0c * (ch)) + (0x04 * (idx)))
440 #define RCANFD_F_DCFG(gpriv, m) (reg_gen4(gpriv, 0x1400, 0x0500) + (0x20 * (m)))
456 #define RCANFD_F_RFOFFSET(gpriv) reg_gen4(gpriv, 0x6000, 0x3000)
457 #define RCANFD_F_RFID(gpriv, x) (RCANFD_F_RFOFFSET(gpriv) + (0x80 * (x)))
458 #define RCANFD_F_RFPTR(gpriv, x) (RCANFD_F_RFOFFSET(gpriv) + 0x04 + (0x80 * (x)))
459 #define RCANFD_F_RFFDSTS(gpriv, x) (RCANFD_F_RFOFFSET(gpriv) + 0x08 + (0x80 * (x)))
460 #define RCANFD_F_RFDF(gpriv, x, df) \
461 (RCANFD_F_RFOFFSET(gpriv) + 0x0c + (0x80 * (x)) + (0x04 * (df)))
464 #define RCANFD_F_CFOFFSET(gpriv) reg_gen4(gpriv, 0x6400, 0x3400)
466 #define RCANFD_F_CFID(gpriv, ch, idx) \
467 (RCANFD_F_CFOFFSET(gpriv) + (0x180 * (ch)) + (0x80 * (idx)))
469 #define RCANFD_F_CFPTR(gpriv, ch, idx) \
470 (RCANFD_F_CFOFFSET(gpriv) + 0x04 + (0x180 * (ch)) + (0x80 * (idx)))
472 #define RCANFD_F_CFFDCSTS(gpriv, ch, idx) \
473 (RCANFD_F_CFOFFSET(gpriv) + 0x08 + (0x180 * (ch)) + (0x80 * (idx)))
475 #define RCANFD_F_CFDF(gpriv, ch, idx, df) \
476 (RCANFD_F_CFOFFSET(gpriv) + 0x0c + (0x180 * (ch)) + (0x80 * (idx)) + \
531 struct rcar_canfd_global *gpriv; /* Controller reference */
614 static inline bool is_gen4(struct rcar_canfd_global *gpriv)
616 return gpriv->info == &rcar_gen4_hw_info;
619 static inline u32 reg_gen4(struct rcar_canfd_global *gpriv,
622 return is_gen4(gpriv) ? gen4 : not_gen4;
690 static void rcar_canfd_set_mode(struct rcar_canfd_global *gpriv)
692 if (is_gen4(gpriv)) {
693 u32 ch, val = gpriv->fdmode ? RCANFD_GEN4_FDCFG_FDOE
696 for_each_set_bit(ch, &gpriv->channels_mask,
697 gpriv->info->max_channels)
698 rcar_canfd_set_bit(gpriv->base, RCANFD_GEN4_FDCFG(ch),
701 if (gpriv->fdmode)
702 rcar_canfd_set_bit(gpriv->base, RCANFD_GRMCFG,
705 rcar_canfd_clear_bit(gpriv->base, RCANFD_GRMCFG,
710 static int rcar_canfd_reset_controller(struct rcar_canfd_global *gpriv)
718 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts,
721 dev_dbg(&gpriv->pdev->dev, "global raminit failed\n");
726 rcar_canfd_clear_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GSLPR);
727 rcar_canfd_update_bit(gpriv->base, RCANFD_GCTR,
731 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts,
734 dev_dbg(&gpriv->pdev->dev, "global reset failed\n");
739 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0x0);
742 rcar_canfd_set_mode(gpriv);
745 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) {
746 rcar_canfd_clear_bit(gpriv->base,
749 rcar_canfd_update_bit(gpriv->base, RCANFD_CCTR(ch),
754 err = readl_poll_timeout((gpriv->base + RCANFD_CSTS(ch)), sts,
758 dev_dbg(&gpriv->pdev->dev,
766 static void rcar_canfd_configure_controller(struct rcar_canfd_global *gpriv)
775 if (gpriv->fdmode)
780 if (gpriv->fcan != RCANFD_CANFDCLK)
783 rcar_canfd_set_bit(gpriv->base, RCANFD_GCFG, cfg);
786 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) {
787 rcar_canfd_set_bit(gpriv->base, RCANFD_CCTR(ch),
789 rcar_canfd_update_bit(gpriv->base, RCANFD_CCTR(ch),
795 static void rcar_canfd_configure_afl_rules(struct rcar_canfd_global *gpriv,
806 cfg = rcar_canfd_read(gpriv->base, RCANFD_GAFLCFG(ch));
807 start = RCANFD_GAFLCFG_GETRNC(gpriv, 0, cfg);
812 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLECTR,
813 (RCANFD_GAFLECTR_AFLPN(gpriv, page) |
817 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLCFG(ch),
818 RCANFD_GAFLCFG_SETRNC(gpriv, ch, num_rules));
819 if (is_gen4(gpriv))
821 else if (gpriv->fdmode)
827 rcar_canfd_write(gpriv->base, RCANFD_GAFLID(offset, start), 0);
829 rcar_canfd_write(gpriv->base, RCANFD_GAFLM(offset, start), 0);
831 rcar_canfd_write(gpriv->base, RCANFD_GAFLP0(offset, start), 0);
833 rcar_canfd_set_bit(gpriv->base, RCANFD_GAFLP1(offset, start),
837 rcar_canfd_clear_bit(gpriv->base,
841 static void rcar_canfd_configure_rx(struct rcar_canfd_global *gpriv, u32 ch)
851 if (gpriv->fdmode)
858 rcar_canfd_write(gpriv->base, RCANFD_RFCC(gpriv, ridx), cfg);
861 static void rcar_canfd_configure_tx(struct rcar_canfd_global *gpriv, u32 ch)
875 if (gpriv->fdmode)
880 cfg = (RCANFD_CFCC_CFTML(gpriv, cftml) | RCANFD_CFCC_CFM(gpriv, cfm) |
881 RCANFD_CFCC_CFIM | RCANFD_CFCC_CFDC(gpriv, cfdc) |
883 rcar_canfd_write(gpriv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX), cfg);
885 if (gpriv->fdmode)
887 rcar_canfd_write(gpriv->base,
888 RCANFD_F_CFFDCSTS(gpriv, ch, RCANFD_CFFIFO_IDX), 0);
891 static void rcar_canfd_enable_global_interrupts(struct rcar_canfd_global *gpriv)
896 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0);
900 if (gpriv->fdmode)
903 rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, ctr);
907 *gpriv)
910 rcar_canfd_write(gpriv->base, RCANFD_GCTR, 0);
913 rcar_canfd_write(gpriv->base, RCANFD_GERFL, 0);
952 struct rcar_canfd_global *gpriv = priv->gpriv;
965 RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX));
970 RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX),
974 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx));
978 rcar_canfd_write(priv->base, RCANFD_RFSTS(gpriv, ridx),
982 if (gpriv->fdmode && gerfl & RCANFD_GERFL_CMPOF) {
1113 struct rcar_canfd_global *gpriv = priv->gpriv;
1129 RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX));
1145 rcar_canfd_write(priv->base, RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX),
1149 static void rcar_canfd_handle_global_err(struct rcar_canfd_global *gpriv, u32 ch)
1151 struct rcar_canfd_channel *priv = gpriv->ch[ch];
1157 if (unlikely(RCANFD_GERFL_ERR(gpriv, gerfl)))
1163 struct rcar_canfd_global *gpriv = dev_id;
1166 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels)
1167 rcar_canfd_handle_global_err(gpriv, ch);
1172 static void rcar_canfd_handle_global_receive(struct rcar_canfd_global *gpriv, u32 ch)
1174 struct rcar_canfd_channel *priv = gpriv->ch[ch];
1179 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx));
1180 cc = rcar_canfd_read(priv->base, RCANFD_RFCC(gpriv, ridx));
1186 RCANFD_RFCC(gpriv, ridx),
1195 struct rcar_canfd_global *gpriv = dev_id;
1198 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels)
1199 rcar_canfd_handle_global_receive(gpriv, ch);
1206 struct rcar_canfd_global *gpriv = dev_id;
1212 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) {
1213 rcar_canfd_handle_global_err(gpriv, ch);
1214 rcar_canfd_handle_global_receive(gpriv, ch);
1250 static void rcar_canfd_handle_channel_tx(struct rcar_canfd_global *gpriv, u32 ch)
1252 struct rcar_canfd_channel *priv = gpriv->ch[ch];
1258 RCANFD_CFSTS(gpriv, ch, RCANFD_CFFIFO_IDX));
1267 rcar_canfd_handle_channel_tx(priv->gpriv, priv->channel);
1272 static void rcar_canfd_handle_channel_err(struct rcar_canfd_global *gpriv, u32 ch)
1274 struct rcar_canfd_channel *priv = gpriv->ch[ch];
1297 rcar_canfd_handle_channel_err(priv->gpriv, priv->channel);
1304 struct rcar_canfd_global *gpriv = dev_id;
1308 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) {
1309 rcar_canfd_handle_channel_err(gpriv, ch);
1310 rcar_canfd_handle_channel_tx(gpriv, ch);
1319 struct rcar_canfd_global *gpriv = priv->gpriv;
1334 cfg = (RCANFD_NCFG_NTSEG1(gpriv, tseg1) | RCANFD_NCFG_NBRP(brp) |
1335 RCANFD_NCFG_NSJW(gpriv, sjw) | RCANFD_NCFG_NTSEG2(gpriv, tseg2));
1347 cfg = (RCANFD_DCFG_DTSEG1(gpriv, tseg1) | RCANFD_DCFG_DBRP(brp) |
1348 RCANFD_DCFG_DSJW(gpriv, sjw) | RCANFD_DCFG_DTSEG2(gpriv, tseg2));
1350 rcar_canfd_write(priv->base, RCANFD_F_DCFG(gpriv, ch), cfg);
1355 if (is_gen4(gpriv)) {
1356 cfg = (RCANFD_NCFG_NTSEG1(gpriv, tseg1) |
1358 RCANFD_NCFG_NSJW(gpriv, sjw) |
1359 RCANFD_NCFG_NTSEG2(gpriv, tseg2));
1377 struct rcar_canfd_global *gpriv = priv->gpriv;
1399 rcar_canfd_set_bit(priv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX),
1401 rcar_canfd_set_bit(priv->base, RCANFD_RFCC(gpriv, ridx), RCANFD_RFCC_RFE);
1414 struct rcar_canfd_global *gpriv = priv->gpriv;
1424 err = clk_prepare_enable(gpriv->can_clk);
1446 clk_disable_unprepare(gpriv->can_clk);
1455 struct rcar_canfd_global *gpriv = priv->gpriv;
1473 rcar_canfd_clear_bit(priv->base, RCANFD_CFCC(gpriv, ch, RCANFD_CFFIFO_IDX),
1475 rcar_canfd_clear_bit(priv->base, RCANFD_RFCC(gpriv, ridx), RCANFD_RFCC_RFE);
1484 struct rcar_canfd_global *gpriv = priv->gpriv;
1489 clk_disable_unprepare(gpriv->can_clk);
1499 struct rcar_canfd_global *gpriv = priv->gpriv;
1520 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) {
1522 RCANFD_F_CFID(gpriv, ch, RCANFD_CFFIFO_IDX), id);
1524 RCANFD_F_CFPTR(gpriv, ch, RCANFD_CFFIFO_IDX), dlc);
1537 RCANFD_F_CFFDCSTS(gpriv, ch, RCANFD_CFFIFO_IDX), sts);
1540 RCANFD_F_CFDF(gpriv, ch, RCANFD_CFFIFO_IDX, 0));
1563 RCANFD_CFPCTR(gpriv, ch, RCANFD_CFFIFO_IDX), 0xff);
1572 struct rcar_canfd_global *gpriv = priv->gpriv;
1579 if ((priv->can.ctrlmode & CAN_CTRLMODE_FD) || is_gen4(gpriv)) {
1580 id = rcar_canfd_read(priv->base, RCANFD_F_RFID(gpriv, ridx));
1581 dlc = rcar_canfd_read(priv->base, RCANFD_F_RFPTR(gpriv, ridx));
1583 sts = rcar_canfd_read(priv->base, RCANFD_F_RFFDSTS(gpriv, ridx));
1624 rcar_canfd_get_data(priv, cf, RCANFD_F_RFDF(gpriv, ridx, 0));
1630 else if (is_gen4(gpriv))
1631 rcar_canfd_get_data(priv, cf, RCANFD_F_RFDF(gpriv, ridx, 0));
1639 rcar_canfd_write(priv->base, RCANFD_RFPCTR(gpriv, ridx), 0xff);
1651 struct rcar_canfd_global *gpriv = priv->gpriv;
1658 sts = rcar_canfd_read(priv->base, RCANFD_RFSTS(gpriv, ridx));
1667 rcar_canfd_write(priv->base, RCANFD_RFSTS(gpriv, ridx),
1675 rcar_canfd_set_bit(priv->base, RCANFD_RFCC(gpriv, ridx),
1722 static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
1725 const struct rcar_canfd_hw_info *info = gpriv->info;
1726 struct platform_device *pdev = gpriv->pdev;
1742 priv->base = gpriv->base;
1745 priv->gpriv = gpriv;
1798 if (gpriv->fdmode) {
1821 gpriv->ch[priv->channel] = priv;
1837 static void rcar_canfd_channel_remove(struct rcar_canfd_global *gpriv, u32 ch)
1839 struct rcar_canfd_channel *priv = gpriv->ch[ch];
1855 struct rcar_canfd_global *gpriv;
1909 gpriv = devm_kzalloc(dev, sizeof(*gpriv), GFP_KERNEL);
1910 if (!gpriv)
1913 gpriv->pdev = pdev;
1914 gpriv->channels_mask = channels_mask;
1915 gpriv->fdmode = fdmode;
1916 gpriv->info = info;
1918 gpriv->rstc1 = devm_reset_control_get_optional_exclusive(dev, "rstp_n");
1919 if (IS_ERR(gpriv->rstc1))
1920 return dev_err_probe(dev, PTR_ERR(gpriv->rstc1),
1923 gpriv->rstc2 = devm_reset_control_get_optional_exclusive(dev, "rstc_n");
1924 if (IS_ERR(gpriv->rstc2))
1925 return dev_err_probe(dev, PTR_ERR(gpriv->rstc2),
1929 gpriv->clkp = devm_clk_get(dev, "fck");
1930 if (IS_ERR(gpriv->clkp))
1931 return dev_err_probe(dev, PTR_ERR(gpriv->clkp),
1937 gpriv->can_clk = devm_clk_get(dev, "can_clk");
1938 if (IS_ERR(gpriv->can_clk) || (clk_get_rate(gpriv->can_clk) == 0)) {
1939 gpriv->can_clk = devm_clk_get(dev, "canfd");
1940 if (IS_ERR(gpriv->can_clk))
1941 return dev_err_probe(dev, PTR_ERR(gpriv->can_clk),
1944 gpriv->fcan = RCANFD_CANFDCLK;
1947 gpriv->fcan = RCANFD_EXTCLK;
1949 fcan_freq = clk_get_rate(gpriv->can_clk);
1951 if (gpriv->fcan == RCANFD_CANFDCLK)
1960 gpriv->base = addr;
1966 "canfd.ch_int", gpriv);
1974 0, "canfd.g_int", gpriv);
1983 "canfd.g_recc", gpriv);
1993 "canfd.g_err", gpriv);
2001 err = reset_control_reset(gpriv->rstc1);
2004 err = reset_control_reset(gpriv->rstc2);
2006 reset_control_assert(gpriv->rstc1);
2011 err = clk_prepare_enable(gpriv->clkp);
2018 err = rcar_canfd_reset_controller(gpriv);
2025 rcar_canfd_configure_controller(gpriv);
2028 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) {
2030 rcar_canfd_configure_rx(gpriv, ch);
2033 rcar_canfd_configure_tx(gpriv, ch);
2036 rcar_canfd_configure_afl_rules(gpriv, ch);
2040 rcar_canfd_enable_global_interrupts(gpriv);
2043 rcar_canfd_update_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GMDC_MASK,
2047 err = readl_poll_timeout((gpriv->base + RCANFD_GSTS), sts,
2054 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels) {
2055 err = rcar_canfd_channel_probe(gpriv, ch, fcan_freq,
2061 platform_set_drvdata(pdev, gpriv);
2063 gpriv->fcan, gpriv->fdmode);
2067 for_each_set_bit(ch, &gpriv->channels_mask, info->max_channels)
2068 rcar_canfd_channel_remove(gpriv, ch);
2070 rcar_canfd_disable_global_interrupts(gpriv);
2072 clk_disable_unprepare(gpriv->clkp);
2074 reset_control_assert(gpriv->rstc1);
2075 reset_control_assert(gpriv->rstc2);
2082 struct rcar_canfd_global *gpriv = platform_get_drvdata(pdev);
2085 rcar_canfd_reset_controller(gpriv);
2086 rcar_canfd_disable_global_interrupts(gpriv);
2088 for_each_set_bit(ch, &gpriv->channels_mask, gpriv->info->max_channels) {
2089 rcar_canfd_disable_channel_interrupts(gpriv->ch[ch]);
2090 rcar_canfd_channel_remove(gpriv, ch);
2094 rcar_canfd_set_bit(gpriv->base, RCANFD_GCTR, RCANFD_GCTR_GSLPR);
2095 clk_disable_unprepare(gpriv->clkp);
2096 reset_control_assert(gpriv->rstc1);
2097 reset_control_assert(gpriv->rstc2);