aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDong Aisheng <b29396@freescale.com>2014-06-19 06:49:37 -0400
committerDong Aisheng <b29396@freescale.com>2014-06-20 01:59:43 -0400
commit952217c8df70dfcb4e1b04440695014e7cfb5a09 (patch)
tree9670fcda6d26a164386763366eb0758124c7d580
parentc74bb381e1a208096723073e1f3509846f6f8201 (diff)
ENGR00319455-1 can: m_can: add Bosch M_CAN controller support
The patch adds the basic CAN TX/RX function support for Bosch M_CAN controller. For TX, only one dedicated tx buffer is used for sending data. For RX, RXFIFO 0 is used for receiving data to avoid overflow. Rx FIFO 1 and Rx Buffers are not used currently, as well as Tx Event FIFO. Due to the message ram can be shared by multi m_can instances and the fifo element is configurable which is SoC dependant, the design is to parse the message ram related configuration data from device tree rather than hardcode define it in driver which can make the message ram using fully transparently to M_CAN controller driver, then we can gain better driver maintainability and future features upgrade. M_CAN also supports CANFD protocol features like data payload up to 64 bytes and bitrate switch at runtime, however, this patch still does not add the support for these features. Signed-off-by: Dong Aisheng <b29396@freescale.com>
-rw-r--r--Documentation/devicetree/bindings/net/can/m_can.txt29
-rw-r--r--drivers/net/can/Kconfig5
-rw-r--r--drivers/net/can/Makefile1
-rw-r--r--drivers/net/can/m_can.c869
4 files changed, 904 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/net/can/m_can.txt b/Documentation/devicetree/bindings/net/can/m_can.txt
new file mode 100644
index 000000000000..2b22d027e6b6
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/can/m_can.txt
@@ -0,0 +1,29 @@
1Bosch MCAN controller Device Tree Bindings
2-------------------------------------------------
3
4Required properties:
5- compatible : Should be "bosch,m_can" for M_CAN controllers
6- reg : physical base address and size of the M_CAN
7 registers map and message ram
8- interrupts : property with a value describing the interrupt
9 number
10- clocks : clocks used by controller
11- mram-cfg : message ram configuration data, the format is
12 <offset sidf_elems xidf_elems rxf1_elems rxb_elems txe_elems txb_elems>
13 The 'offset' is the address offset inside the message ram. This is usually set
14 if you're using the shared message ram while the other part is used by another
15 m_can controller.
16 The left cell are all the number of each elements inside the message ram.
17 Please refer to 2.4.1 Message RAM Con.guration in Bosch M_CAN user mannual
18 for each elements definition.
19
20Example:
21canfd1: canfd@020e8000 {
22 compatible = "bosch,m_can";
23 reg = <0x020e8000 0x4000>, <0x02298000 0x4000>;
24 reg-names = "canfd", "message_ram";
25 interrupts = <0 114 0x04>;
26 clocks = <&clks IMX6SX_CLK_CANFD>;
27 mram-cfg = <0x0 0 0 32 32 32 0 1>;
28 status = "disabled";
29};
diff --git a/drivers/net/can/Kconfig b/drivers/net/can/Kconfig
index e456b70933c2..15483e2c6e47 100644
--- a/drivers/net/can/Kconfig
+++ b/drivers/net/can/Kconfig
@@ -128,6 +128,11 @@ config CAN_GRCAN
128 endian syntheses of the cores would need some modifications on 128 endian syntheses of the cores would need some modifications on
129 the hardware level to work. 129 the hardware level to work.
130 130
131config CAN_M_CAN
132 tristate "Bosch M_CAN devices"
133 ---help---
134 Say Y here if you want to support for Bosch M_CAN controller.
135
131source "drivers/net/can/mscan/Kconfig" 136source "drivers/net/can/mscan/Kconfig"
132 137
133source "drivers/net/can/sja1000/Kconfig" 138source "drivers/net/can/sja1000/Kconfig"
diff --git a/drivers/net/can/Makefile b/drivers/net/can/Makefile
index c7440392adbb..f5d2fffc4302 100644
--- a/drivers/net/can/Makefile
+++ b/drivers/net/can/Makefile
@@ -16,6 +16,7 @@ obj-y += softing/
16obj-$(CONFIG_CAN_SJA1000) += sja1000/ 16obj-$(CONFIG_CAN_SJA1000) += sja1000/
17obj-$(CONFIG_CAN_MSCAN) += mscan/ 17obj-$(CONFIG_CAN_MSCAN) += mscan/
18obj-$(CONFIG_CAN_C_CAN) += c_can/ 18obj-$(CONFIG_CAN_C_CAN) += c_can/
19obj-$(CONFIG_CAN_M_CAN) += m_can.o
19obj-$(CONFIG_CAN_CC770) += cc770/ 20obj-$(CONFIG_CAN_CC770) += cc770/
20obj-$(CONFIG_CAN_AT91) += at91_can.o 21obj-$(CONFIG_CAN_AT91) += at91_can.o
21obj-$(CONFIG_CAN_TI_HECC) += ti_hecc.o 22obj-$(CONFIG_CAN_TI_HECC) += ti_hecc.o
diff --git a/drivers/net/can/m_can.c b/drivers/net/can/m_can.c
new file mode 100644
index 000000000000..4397cfe2ec31
--- /dev/null
+++ b/drivers/net/can/m_can.c
@@ -0,0 +1,869 @@
1/*
2 * CAN bus driver for Bosch M_CAN controller
3 *
4 * Copyright (C) 2014 Freescale Semiconductor, Inc.
5 * Dong Aisheng <b29396@freescale.com>
6 *
7 * Bosch M_CAN user manual can be obtained from:
8 * http://www.bosch-semiconductors.de/media/pdf_1/ipmodules_1/m_can/
9 * mcan_users_manual_v302.pdf
10 *
11 * This file is licensed under the terms of the GNU General Public
12 * License version 2. This program is licensed "as is" without any
13 * warranty of any kind, whether express or implied.
14 */
15
16#include <linux/clk.h>
17#include <linux/delay.h>
18#include <linux/if_arp.h>
19#include <linux/if_ether.h>
20#include <linux/interrupt.h>
21#include <linux/io.h>
22#include <linux/kernel.h>
23#include <linux/list.h>
24#include <linux/module.h>
25#include <linux/netdevice.h>
26#include <linux/of.h>
27#include <linux/of_device.h>
28#include <linux/pinctrl/consumer.h>
29#include <linux/platform_device.h>
30
31#include <linux/can/dev.h>
32
33/* napi related */
34#define M_CAN_NAPI_WEIGHT 64
35
36/* registers definition */
37enum m_can_reg {
38 M_CAN_CREL = 0x0,
39 M_CAN_ENDN = 0x4,
40 M_CAN_CUST = 0x8,
41 M_CAN_FBTP = 0xc,
42 M_CAN_TEST = 0x10,
43 M_CAN_RWD = 0x14,
44 M_CAN_CCCR = 0x18,
45 M_CAN_BTP = 0x1c,
46 M_CAN_TSCC = 0x20,
47 M_CAN_TSCV = 0x24,
48 M_CAN_TOCC = 0x28,
49 M_CAN_TOCV = 0x2c,
50 M_CAN_ECR = 0x40,
51 M_CAN_PSR = 0x44,
52 M_CAN_IR = 0x50,
53 M_CAN_IE = 0x54,
54 M_CAN_ILS = 0x58,
55 M_CAN_ILE = 0x5c,
56 M_CAN_GFC = 0x80,
57 M_CAN_SIDFC = 0x84,
58 M_CAN_XIDFC = 0x88,
59 M_CAN_XIDAM = 0x90,
60 M_CAN_HPMS = 0x94,
61 M_CAN_NDAT1 = 0x98,
62 M_CAN_NDAT2 = 0x9c,
63 M_CAN_RXF0C = 0xa0,
64 M_CAN_RXF0S = 0xa4,
65 M_CAN_RXF0A = 0xa8,
66 M_CAN_RXBC = 0xac,
67 M_CAN_RXF1C = 0xb0,
68 M_CAN_RXF1S = 0xb4,
69 M_CAN_RXF1A = 0xb8,
70 M_CAN_RXESC = 0xbc,
71 M_CAN_TXBC = 0xc0,
72 M_CAN_TXFQS = 0xc4,
73 M_CAN_TXESC = 0xc8,
74 M_CAN_TXBRP = 0xcc,
75 M_CAN_TXBAR = 0xd0,
76 M_CAN_TXBCR = 0xd4,
77 M_CAN_TXBTO = 0xd8,
78 M_CAN_TXBCF = 0xdc,
79 M_CAN_TXBTIE = 0xe0,
80 M_CAN_TXBCIE = 0xe4,
81 M_CAN_TXEFC = 0xf0,
82 M_CAN_TXEFS = 0xf4,
83 M_CAN_TXEFA = 0xf8,
84};
85
86/* CC Control Register(CCCR) */
87#define CCCR_CCE BIT(1)
88#define CCCR_INIT BIT(0)
89
90/* Bit Timing & Prescaler Register (BTP) */
91#define BTR_BRP_MASK 0x3ff
92#define BTR_BRP_SHIFT 16
93#define BTR_TSEG1_SHIFT 8
94#define BTR_TSEG1_MASK (0x3f << BTR_TSEG1_SHIFT)
95#define BTR_TSEG2_SHIFT 4
96#define BTR_TSEG2_MASK (0xf << BTR_TSEG2_SHIFT)
97#define BTR_SJW_SHIFT 0
98#define BTR_SJW_MASK 0xf
99
100/* Interrupt Register(IR) */
101#define IR_ALL_INT 0xffffffff
102#define IR_STE BIT(31)
103#define IR_FOE BIT(30)
104#define IR_ACKE BIT(29)
105#define IR_BE BIT(28)
106#define IR_CRCE BIT(27)
107#define IR_WDI BIT(26)
108#define IR_BO BIT(25)
109#define IR_EW BIT(24)
110#define IR_EP BIT(23)
111#define IR_ELO BIT(22)
112#define IR_BEU BIT(21)
113#define IR_BEC BIT(20)
114#define IR_DRX BIT(19)
115#define IR_TOO BIT(18)
116#define IR_MRAF BIT(17)
117#define IR_TSW BIT(16)
118#define IR_TEFL BIT(15)
119#define IR_TEFF BIT(14)
120#define IR_TEFW BIT(13)
121#define IR_TEFN BIT(12)
122#define IR_TFE BIT(11)
123#define IR_TCF BIT(10)
124#define IR_TC BIT(9)
125#define IR_HPM BIT(8)
126#define IR_RF1L BIT(7)
127#define IR_RF1F BIT(6)
128#define IR_RF1W BIT(5)
129#define IR_RF1N BIT(4)
130#define IR_RF0L BIT(3)
131#define IR_RF0F BIT(2)
132#define IR_RF0W BIT(1)
133#define IR_RF0N BIT(0)
134#define IR_ERR_ALL (IR_STE | IR_FOE | IR_ACKE | IR_BE | IR_CRCE | \
135 IR_WDI | IR_BO | IR_EW | IR_EP | IR_ELO | IR_BEU | \
136 IR_BEC | IR_TOO | IR_MRAF | IR_TSW | IR_TEFL | IR_RF1L | \
137 IR_RF0L)
138
139/* Rx FIFO 0/1 Configuration (RXF0C/RXF1C) */
140#define RXFC_FWM_OFF 24
141#define RXFC_FWM_MASK 0x7f
142#define RXFC_FWM_1 (1 << RXFC_FWM_OFF)
143#define RXFC_FS_OFF 16
144#define RXFC_FS_MASK 0x7f
145
146/* Rx FIFO 0/1 Status (RXF0S/RXF1S) */
147#define RXFS_RFL BIT(25)
148#define RXFS_FF BIT(24)
149#define RXFS_FPI_OFF 16
150#define RXFS_FPI_MASK 0x3f0000
151#define RXFS_FGI_OFF 8
152#define RXFS_FGI_MASK 0x3f00
153#define RXFS_FFL_MASK 0x7f
154
155/* Tx Buffer Configuration(TXBC) */
156#define TXBC_NDTB_OFF 16
157#define TXBC_NDTB_MASK 0x3f
158
159/* Tx Buffer Element Size Configuration(TXESC) */
160#define TXESC_TBDS_8BYTES 0x0
161/* Tx Buffer Element */
162#define TX_BUF_XTD BIT(30)
163#define TX_BUF_RTR BIT(29)
164
165/* Rx Buffer Element Size Configuration(TXESC) */
166#define M_CAN_RXESC_8BYTES 0x0
167/* Tx Buffer Element */
168#define RX_BUF_ESI BIT(31)
169#define RX_BUF_XTD BIT(30)
170#define RX_BUF_RTR BIT(29)
171
172/* Message RAM Configuration (in bytes) */
173#define SIDF_ELEMENT_SIZE 4
174#define XIDF_ELEMENT_SIZE 8
175#define RXF0_ELEMENT_SIZE 16
176#define RXF1_ELEMENT_SIZE 16
177#define RXB_ELEMENT_SIZE 16
178#define TXE_ELEMENT_SIZE 8
179#define TXB_ELEMENT_SIZE 16
180
181/* m_can private data structure */
182struct m_can_priv {
183 struct can_priv can; /* must be the first member */
184 struct napi_struct napi;
185 struct net_device *dev;
186 struct device *device;
187 struct clk *clk;
188 void __iomem *base;
189 u32 irqstatus;
190
191 /* message ram configuration */
192 void __iomem *mram_base;
193 u32 mram_off;
194 u32 sidf_elems;
195 u32 sidf_off;
196 u32 xidf_elems;
197 u32 xidf_off;
198 u32 rxf0_elems;
199 u32 rxf0_off;
200 u32 rxf1_elems;
201 u32 rxf1_off;
202 u32 rxb_elems;
203 u32 rxb_off;
204 u32 txe_elems;
205 u32 txe_off;
206 u32 txb_elems;
207 u32 txb_off;
208};
209
210static inline u32 m_can_read(const struct m_can_priv *priv, enum m_can_reg reg)
211{
212 return readl(priv->base + reg);
213}
214
215static inline void m_can_write(const struct m_can_priv *priv,
216 enum m_can_reg reg, u32 val)
217{
218 writel(val, priv->base + reg);
219}
220
221static inline void m_can_config_endisable(const struct m_can_priv *priv,
222 bool enable)
223{
224 u32 cccr = m_can_read(priv, M_CAN_CCCR);
225 u32 timeout = 10, val;
226
227 if (enable) {
228 /* enable m_can configuration */
229 m_can_write(priv, M_CAN_CCCR, cccr | CCCR_INIT);
230 /* CCCR.CCE can only be set/reset while CCCR.INIT = '1' */
231 m_can_write(priv, M_CAN_CCCR, cccr | CCCR_INIT | CCCR_CCE);
232 } else {
233 m_can_write(priv, M_CAN_CCCR, cccr & ~(CCCR_INIT | CCCR_CCE));
234 }
235
236 /* there's a delay for module initialization */
237 val = enable ? CCCR_INIT | CCCR_CCE : 0;
238 while ((m_can_read(priv, M_CAN_CCCR) & (CCCR_INIT | CCCR_CCE))
239 != val) {
240 if (timeout == 0) {
241 netdev_warn(priv->dev, "Failed to init module\n");
242 return;
243 }
244 timeout--;
245 udelay(1);
246 }
247}
248
249static void m_can_enable_all_interrupts(struct m_can_priv *priv, bool enable)
250{
251 m_can_write(priv, M_CAN_ILE, enable ? 0x00000003 : 0x0);
252}
253
254static int m_can_do_rx_poll(struct net_device *dev, int quota)
255{
256 struct m_can_priv *priv = netdev_priv(dev);
257 struct net_device_stats *stats = &dev->stats;
258 struct sk_buff *skb;
259 struct can_frame *frame;
260 u32 rxfs, flags, fgi;
261 u32 num_rx_pkts = 0;
262
263 rxfs = m_can_read(priv, M_CAN_RXF0S);
264 if (!(rxfs & RXFS_FFL_MASK)) {
265 netdev_dbg(dev, "no messages in fifo0\n");
266 return 0;
267 }
268
269 while ((rxfs & RXFS_FFL_MASK) && (quota > 0)) {
270 netdev_dbg(dev, "fifo0 status 0x%x\n", rxfs);
271 if (rxfs & RXFS_RFL)
272 netdev_warn(dev, "Rx FIFO 0 Message Lost\n");
273
274 skb = alloc_can_skb(dev, &frame);
275 if (!skb) {
276 stats->rx_dropped++;
277 return -ENOMEM;
278 }
279
280 fgi = (rxfs & RXFS_FGI_MASK) >> RXFS_FGI_OFF;
281 flags = readl(priv->mram_base + priv->rxf0_off + fgi * 16);
282 if (flags & RX_BUF_XTD)
283 frame->can_id = (flags & CAN_EFF_MASK) | CAN_EFF_FLAG;
284 else
285 frame->can_id = (flags >> 18) & CAN_SFF_MASK;
286 netdev_dbg(dev, "R0 0x%x\n", flags);
287
288 if (flags & RX_BUF_RTR) {
289 frame->can_id |= CAN_RTR_FLAG;
290 } else {
291 flags = readl(priv->mram_base +
292 priv->rxf0_off + fgi * 16 + 0x4);
293 frame->can_dlc = get_can_dlc((flags >> 16) & 0x0F);
294 netdev_dbg(dev, "R1 0x%x\n", flags);
295
296 *(u32 *)(frame->data + 0) = readl(priv->mram_base +
297 priv->rxf0_off + fgi * 16 + 0x8);
298 *(u32 *)(frame->data + 4) = readl(priv->mram_base +
299 priv->rxf0_off + fgi * 16 + 0xC);
300 netdev_dbg(dev, "R2 0x%x\n", *(u32 *)(frame->data + 0));
301 netdev_dbg(dev, "R3 0x%x\n", *(u32 *)(frame->data + 4));
302 }
303
304 /* acknowledge rx fifo 0 */
305 m_can_write(priv, M_CAN_RXF0A, fgi);
306
307 netif_receive_skb(skb);
308 netdev_dbg(dev, "new packet received\n");
309
310 stats->rx_packets++;
311 stats->rx_bytes += frame->can_dlc;
312
313 can_led_event(dev, CAN_LED_EVENT_RX);
314
315 quota--;
316 num_rx_pkts++;
317 rxfs = m_can_read(priv, M_CAN_RXF0S);
318 };
319
320 return num_rx_pkts;
321}
322
323static int m_can_poll(struct napi_struct *napi, int quota)
324{
325 struct net_device *dev = napi->dev;
326 struct m_can_priv *priv = netdev_priv(dev);
327 u32 work_done = 0;
328 u32 irqstatus;
329
330 irqstatus = m_can_read(priv, M_CAN_IR);
331 if (irqstatus)
332 netdev_dbg(dev, "irqstatus updated! new 0x%x old 0x%x rxf0s 0x%x\n",
333 irqstatus, priv->irqstatus,
334 m_can_read(priv, M_CAN_RXF0S));
335
336 irqstatus = irqstatus | priv->irqstatus;
337 if (!irqstatus)
338 goto end;
339
340 if (irqstatus & IR_RF0N)
341 /* handle events corresponding to receive message objects */
342 work_done += m_can_do_rx_poll(dev, (quota - work_done));
343
344 if (work_done < quota) {
345 napi_complete(napi);
346 /* enable all IRQs */
347 m_can_enable_all_interrupts(priv, true);
348 }
349
350end:
351 return work_done;
352}
353
354static irqreturn_t m_can_isr(int irq, void *dev_id)
355{
356 struct net_device *dev = (struct net_device *)dev_id;
357 struct m_can_priv *priv = netdev_priv(dev);
358 struct net_device_stats *stats = &dev->stats;
359 u32 ir;
360
361 ir = m_can_read(priv, M_CAN_IR);
362 if (!ir)
363 return IRQ_NONE;
364
365 netdev_dbg(dev, "ir 0x%x rxfs0 0x%x\n", ir,
366 m_can_read(priv, M_CAN_RXF0S));
367
368 /* ACK all irqs */
369 if (ir & IR_ALL_INT)
370 m_can_write(priv, M_CAN_IR, ir);
371
372 if (ir & IR_ERR_ALL) {
373 netdev_dbg(dev, "bus error\n");
374 /* TODO: handle bus error */
375 }
376
377 /* save irqstatus for later using */
378 priv->irqstatus = ir;
379
380 /*
381 * schedule NAPI in case of
382 * - rx IRQ
383 * - state change IRQ(TODO)
384 * - bus error IRQ and bus error reporting (TODO)
385 */
386 if (ir & IR_RF0N) {
387 m_can_enable_all_interrupts(priv, false);
388 napi_schedule(&priv->napi);
389 }
390
391 /* FIFO overflow */
392 if (ir & IR_RF0L) {
393 dev->stats.rx_over_errors++;
394 dev->stats.rx_errors++;
395 }
396
397 /* transmission complete interrupt */
398 if (ir & IR_TC) {
399 netdev_dbg(dev, "tx complete\n");
400 stats->tx_bytes += can_get_echo_skb(dev, 0);
401 stats->tx_packets++;
402 can_led_event(dev, CAN_LED_EVENT_TX);
403 netif_wake_queue(dev);
404 }
405
406 return IRQ_HANDLED;
407}
408
409static const struct can_bittiming_const m_can_bittiming_const = {
410 .name = KBUILD_MODNAME,
411 .tseg1_min = 2, /* Time segment 1 = prop_seg + phase_seg1 */
412 .tseg1_max = 64,
413 .tseg2_min = 1, /* Time segment 2 = phase_seg2 */
414 .tseg2_max = 16,
415 .sjw_max = 16,
416 .brp_min = 1,
417 .brp_max = 1024,
418 .brp_inc = 1,
419};
420
421static int m_can_set_bittiming(struct net_device *dev)
422{
423 struct m_can_priv *priv = netdev_priv(dev);
424 const struct can_bittiming *bt = &priv->can.bittiming;
425 u16 brp, sjw, tseg1, tseg2;
426 u32 reg_btp;
427
428 brp = bt->brp - 1;
429 sjw = bt->sjw - 1;
430 tseg1 = bt->prop_seg + bt->phase_seg1 - 1;
431 tseg2 = bt->phase_seg2 - 1;
432 reg_btp = (brp << BTR_BRP_SHIFT) | (sjw << BTR_SJW_SHIFT) |
433 (tseg1 << BTR_TSEG1_SHIFT) | (tseg2 << BTR_TSEG2_SHIFT);
434 m_can_write(priv, M_CAN_BTP, reg_btp);
435 netdev_dbg(dev, "setting BTP 0x%x\n", reg_btp);
436
437 return 0;
438}
439
440/*
441 * Configure M_CAN chip:
442 * - set rx buffer/fifo element size
443 * - configure rx fifo
444 * - accept non-matching frame into fifo 0
445 * - configure tx buffer
446 * - setup bittiming
447 * - TODO:
448 * 1) other working modes support like monitor, loopback...
449 * 2) lec error status report enable
450 */
451static void m_can_chip_config(struct net_device *dev)
452{
453 struct m_can_priv *priv = netdev_priv(dev);
454
455 m_can_config_endisable(priv, true);
456
457 /* RX Buffer/FIFO Element Size 8 bytes data field */
458 m_can_write(priv, M_CAN_RXESC, M_CAN_RXESC_8BYTES);
459
460 /* Accept Non-matching Frames Into FIFO 0 */
461 m_can_write(priv, M_CAN_GFC, 0x0);
462
463 /* only support one Tx Buffer currently */
464 m_can_write(priv, M_CAN_TXBC, (1 << TXBC_NDTB_OFF) |
465 (priv->mram_off + priv->txb_off));
466
467 /* only support 8 bytes firstly */
468 m_can_write(priv, M_CAN_TXESC, TXESC_TBDS_8BYTES);
469
470 m_can_write(priv, M_CAN_TXEFC, 0x00010000 |
471 (priv->mram_off + priv->txe_off));
472
473 /* rx fifo configuration, blocking mode, fifo size 1 */
474 m_can_write(priv, M_CAN_RXF0C, (priv->rxf0_elems << RXFC_FS_OFF) |
475 RXFC_FWM_1 | (priv->mram_off + priv->rxf0_off));
476
477 m_can_write(priv, M_CAN_RXF1C, (priv->rxf1_elems << RXFC_FS_OFF) |
478 RXFC_FWM_1 | (priv->mram_off + priv->rxf1_off));
479
480 /* enable all interrupts */
481 m_can_write(priv, M_CAN_IR, IR_ALL_INT);
482 m_can_write(priv, M_CAN_IE, IR_ALL_INT);
483 m_can_write(priv, M_CAN_ILS, 0xFFFF0000);
484
485 /* set bittiming params */
486 m_can_set_bittiming(dev);
487
488 m_can_config_endisable(priv, false);
489}
490
491static void m_can_start(struct net_device *dev)
492{
493 struct m_can_priv *priv = netdev_priv(dev);
494
495 /* basic m_can configuration */
496 m_can_chip_config(dev);
497
498 priv->can.state = CAN_STATE_ERROR_ACTIVE;
499
500 /* enable status change, error and module interrupts */
501 m_can_enable_all_interrupts(priv, true);
502}
503
504static int m_can_set_mode(struct net_device *dev, enum can_mode mode)
505{
506 switch (mode) {
507 case CAN_MODE_START:
508 m_can_start(dev);
509 netif_wake_queue(dev);
510 break;
511 default:
512 return -EOPNOTSUPP;
513 }
514
515 return 0;
516}
517
518static int m_can_get_berr_counter(const struct net_device *dev,
519 struct can_berr_counter *bec)
520{
521 /* TODO */
522
523 return 0;
524}
525
526static void free_m_can_dev(struct net_device *dev)
527{
528 free_candev(dev);
529}
530
531static struct net_device *alloc_m_can_dev(void)
532{
533 struct net_device *dev;
534 struct m_can_priv *priv;
535
536 dev = alloc_candev(sizeof(struct m_can_priv), 1);
537 if (!dev)
538 return NULL;
539
540 priv = netdev_priv(dev);
541 netif_napi_add(dev, &priv->napi, m_can_poll, M_CAN_NAPI_WEIGHT);
542
543 priv->dev = dev;
544 priv->can.bittiming_const = &m_can_bittiming_const;
545 priv->can.do_set_mode = m_can_set_mode;
546 priv->can.do_get_berr_counter = m_can_get_berr_counter;
547 priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
548 CAN_CTRLMODE_LISTENONLY |
549 CAN_CTRLMODE_BERR_REPORTING;
550
551 return dev;
552}
553
554
555static int m_can_open(struct net_device *dev)
556{
557 int err;
558 struct m_can_priv *priv = netdev_priv(dev);
559
560 clk_prepare_enable(priv->clk);
561
562 /* open the can device */
563 err = open_candev(dev);
564 if (err) {
565 netdev_err(dev, "failed to open can device\n");
566 goto exit_open_fail;
567 }
568
569 /* register interrupt handler */
570 err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
571 dev);
572 if (err < 0) {
573 netdev_err(dev, "failed to request interrupt\n");
574 goto exit_irq_fail;
575 }
576
577 /* start the m_can controller */
578 m_can_start(dev);
579
580 can_led_event(dev, CAN_LED_EVENT_OPEN);
581 napi_enable(&priv->napi);
582 netif_start_queue(dev);
583
584 return 0;
585
586exit_irq_fail:
587 close_candev(dev);
588exit_open_fail:
589 clk_disable_unprepare(priv->clk);
590 return err;
591}
592
593static void m_can_stop(struct net_device *dev)
594{
595 struct m_can_priv *priv = netdev_priv(dev);
596
597 /* disable all interrupts */
598 m_can_enable_all_interrupts(priv, false);
599
600 /* set the state as STOPPED */
601 priv->can.state = CAN_STATE_STOPPED;
602}
603
604
605static int m_can_close(struct net_device *dev)
606{
607 struct m_can_priv *priv = netdev_priv(dev);
608
609 netif_stop_queue(dev);
610 napi_disable(&priv->napi);
611 m_can_stop(dev);
612 free_irq(dev->irq, dev);
613 close_candev(dev);
614 can_led_event(dev, CAN_LED_EVENT_STOP);
615
616 return 0;
617}
618
619static netdev_tx_t m_can_start_xmit(struct sk_buff *skb,
620 struct net_device *dev)
621{
622 struct m_can_priv *priv = netdev_priv(dev);
623 struct can_frame *frame = (struct can_frame *)skb->data;
624 u32 flags = 0, id;
625
626 if (can_dropped_invalid_skb(dev, skb))
627 return NETDEV_TX_OK;
628
629 netif_stop_queue(dev);
630
631 if (frame->can_id & CAN_RTR_FLAG)
632 flags |= TX_BUF_RTR;
633
634 if (frame->can_id & CAN_EFF_FLAG) {
635 id = frame->can_id & CAN_EFF_MASK;
636 flags |= TX_BUF_XTD;
637 } else {
638 id = ((frame->can_id & CAN_SFF_MASK) << 18);
639 }
640
641 /* message ram configuration */
642 writel(id | flags,
643 priv->mram_base + priv->mram_off + priv->txb_off);
644 writel(frame->can_dlc << 16,
645 priv->mram_base + priv->mram_off + priv->txb_off + 0x4);
646 writel(*(u32 *)(frame->data + 0),
647 priv->mram_base + priv->mram_off + priv->txb_off + 0x8);
648 writel(*(u32 *)(frame->data + 4),
649 priv->mram_base + priv->mram_off + priv->txb_off + 0xc);
650
651 can_put_echo_skb(skb, dev, 0);
652
653 /* enable first TX buffer to start transfer */
654 m_can_write(priv, M_CAN_TXBTIE, 0x00000001);
655 m_can_write(priv, M_CAN_TXBAR, 0x00000001);
656
657 return NETDEV_TX_OK;
658}
659
660static const struct net_device_ops m_can_netdev_ops = {
661 .ndo_open = m_can_open,
662 .ndo_stop = m_can_close,
663 .ndo_start_xmit = m_can_start_xmit,
664};
665
666static int register_m_can_dev(struct net_device *dev)
667{
668 dev->flags |= IFF_ECHO; /* we support local echo */
669 dev->netdev_ops = &m_can_netdev_ops;
670
671 return register_candev(dev);
672}
673
674static const struct of_device_id m_can_of_table[] = {
675 { .compatible = "bosch,m_can", .data = NULL },
676 { /* sentinel */ },
677};
678MODULE_DEVICE_TABLE(of, m_can_of_table);
679
680static int m_can_of_parse_mram(struct platform_device *pdev,
681 struct m_can_priv *priv)
682{
683 struct device_node *np = pdev->dev.of_node;
684 struct resource *res;
685 void __iomem *addr;
686 u32 out_val[8];
687 int ret;
688
689 /* message ram could be shared */
690 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "message_ram");
691 if (!res)
692 return -ENODEV;
693
694 addr = devm_ioremap(&pdev->dev, res->start, resource_size(res));
695 if (!addr)
696 return -ENODEV;
697
698 /* get message ram configuration */
699 ret = of_property_read_u32_array(np, "mram-cfg",
700 out_val, sizeof(out_val) / 4);
701 if (ret) {
702 dev_err(&pdev->dev, "can not get message ram configuration\n");
703 return -ENODEV;
704 }
705
706 priv->mram_base = addr;
707 priv->mram_off = out_val[0];
708 priv->sidf_elems = out_val[1];
709 priv->sidf_off = priv->mram_off;
710 priv->xidf_elems = out_val[2];
711 priv->xidf_off = priv->sidf_off + priv->sidf_elems * SIDF_ELEMENT_SIZE;
712 priv->rxf0_elems = out_val[3] & RXFC_FS_MASK;
713 priv->rxf0_off = priv->xidf_off + priv->xidf_elems * XIDF_ELEMENT_SIZE;
714 priv->rxf1_elems = out_val[4] & RXFC_FS_MASK;
715 priv->rxf1_off = priv->rxf0_off + priv->rxf0_elems * RXF0_ELEMENT_SIZE;
716 priv->rxb_elems = out_val[5];
717 priv->rxb_off = priv->rxf1_off + priv->rxf1_elems * RXF1_ELEMENT_SIZE;
718 priv->txe_elems = out_val[6];
719 priv->txe_off = priv->rxb_off + priv->rxb_elems * RXB_ELEMENT_SIZE;
720 priv->txb_elems = out_val[7] & TXBC_NDTB_MASK;
721 priv->txb_off = priv->txe_off + priv->txe_elems * TXE_ELEMENT_SIZE;
722
723 dev_dbg(&pdev->dev, "mram_base =%p mram_off =0x%x "
724 "sidf %d xidf %d rxf0 %d rxf1 %d rxb %d txe %d txb %d\n",
725 priv->mram_base, priv->mram_off, priv->sidf_elems,
726 priv->xidf_elems, priv->rxf0_elems, priv->rxf1_elems,
727 priv->rxb_elems, priv->txe_elems, priv->txb_elems);
728
729 return 0;
730}
731
732static int m_can_plat_probe(struct platform_device *pdev)
733{
734 struct net_device *dev;
735 struct m_can_priv *priv;
736 struct pinctrl *pinctrl;
737 struct resource *res;
738 void __iomem *addr;
739 struct clk *clk;
740 int irq, ret;
741
742 pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
743 if (IS_ERR(pinctrl))
744 dev_warn(&pdev->dev,
745 "failed to configure pins from driver\n");
746
747 clk = devm_clk_get(&pdev->dev, NULL);
748 if (IS_ERR(clk)) {
749 dev_err(&pdev->dev, "no clock find\n");
750 return PTR_ERR(clk);
751 }
752
753 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "canfd");
754 addr = devm_request_and_ioremap(&pdev->dev, res);
755 irq = platform_get_irq(pdev, 0);
756 if (!addr || irq < 0)
757 return -EINVAL;
758
759 /* allocate the m_can device */
760 dev = alloc_m_can_dev();
761 if (!dev)
762 return -ENOMEM;
763
764 priv = netdev_priv(dev);
765 dev->irq = irq;
766 priv->base = addr;
767 priv->device = &pdev->dev;
768 priv->clk = clk;
769 priv->can.clock.freq = clk_get_rate(clk);
770
771 ret = m_can_of_parse_mram(pdev, priv);
772 if (ret)
773 goto failed_free_dev;
774
775 platform_set_drvdata(pdev, dev);
776 SET_NETDEV_DEV(dev, &pdev->dev);
777
778 ret = register_m_can_dev(dev);
779 if (ret) {
780 dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
781 KBUILD_MODNAME, ret);
782 goto failed_free_dev;
783 }
784
785 devm_can_led_init(dev);
786
787 dev_info(&pdev->dev, "%s device registered (regs=%p, irq=%d)\n",
788 KBUILD_MODNAME, priv->base, dev->irq);
789
790 return 0;
791
792failed_free_dev:
793 free_m_can_dev(dev);
794 return ret;
795}
796
797#ifdef CONFIG_PM
798static int m_can_suspend(struct device *dev)
799{
800 struct net_device *ndev = dev_get_drvdata(dev);
801 struct m_can_priv *priv = netdev_priv(ndev);
802
803 if (netif_running(ndev)) {
804 netif_stop_queue(ndev);
805 netif_device_detach(ndev);
806 }
807
808 /* TODO: enter low power */
809
810 priv->can.state = CAN_STATE_SLEEPING;
811
812 return 0;
813}
814
815static int m_can_resume(struct device *dev)
816{
817 struct net_device *ndev = dev_get_drvdata(dev);
818 struct m_can_priv *priv = netdev_priv(ndev);
819
820 /* TODO: exit low power */
821
822 priv->can.state = CAN_STATE_ERROR_ACTIVE;
823
824 if (netif_running(ndev)) {
825 netif_device_attach(ndev);
826 netif_start_queue(ndev);
827 }
828
829 return 0;
830}
831#endif
832
833static void unregister_m_can_dev(struct net_device *dev)
834{
835 unregister_candev(dev);
836}
837
838static int m_can_plat_remove(struct platform_device *pdev)
839{
840 struct net_device *dev = platform_get_drvdata(pdev);
841
842 unregister_m_can_dev(dev);
843 platform_set_drvdata(pdev, NULL);
844
845 free_m_can_dev(dev);
846
847 return 0;
848}
849
850static const struct dev_pm_ops m_can_pmops = {
851 SET_SYSTEM_SLEEP_PM_OPS(m_can_suspend, m_can_resume)
852};
853
854static struct platform_driver m_can_plat_driver = {
855 .driver = {
856 .name = KBUILD_MODNAME,
857 .owner = THIS_MODULE,
858 .of_match_table = of_match_ptr(m_can_of_table),
859 .pm = &m_can_pmops,
860 },
861 .probe = m_can_plat_probe,
862 .remove = m_can_plat_remove,
863};
864
865module_platform_driver(m_can_plat_driver);
866
867MODULE_AUTHOR("Dong Aisheng <b29396@freescale.com>");
868MODULE_LICENSE("GPL v2");
869MODULE_DESCRIPTION("CAN bus driver for Bosch M_CAN controller");