blob: 0386bed435519eb1509ed02884f4ec5d052a63d8 [file] [log] [blame]
Christian Pellegrine0000162009-11-02 23:07:00 +00001/*
2 * CAN bus driver for Microchip 251x CAN Controller with SPI Interface
3 *
4 * MCP2510 support and bug fixes by Christian Pellegrin
5 * <chripell@evolware.org>
6 *
7 * Copyright 2009 Christian Pellegrin EVOL S.r.l.
8 *
9 * Copyright 2007 Raymarine UK, Ltd. All Rights Reserved.
10 * Written under contract by:
11 * Chris Elston, Katalix Systems, Ltd.
12 *
13 * Based on Microchip MCP251x CAN controller driver written by
14 * David Vrabel, Copyright 2006 Arcom Control Systems Ltd.
15 *
16 * Based on CAN bus driver for the CCAN controller written by
17 * - Sascha Hauer, Marc Kleine-Budde, Pengutronix
18 * - Simon Kallweit, intefo AG
19 * Copyright 2007
20 *
21 * This program is free software; you can redistribute it and/or modify
22 * it under the terms of the version 2 of the GNU General Public License
23 * as published by the Free Software Foundation
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
29 *
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33 *
34 *
35 *
36 * Your platform definition file should specify something like:
37 *
38 * static struct mcp251x_platform_data mcp251x_info = {
39 * .oscillator_frequency = 8000000,
40 * .board_specific_setup = &mcp251x_setup,
Christian Pellegrine0000162009-11-02 23:07:00 +000041 * .power_enable = mcp251x_power_enable,
42 * .transceiver_enable = NULL,
43 * };
44 *
45 * static struct spi_board_info spi_board_info[] = {
46 * {
Marc Kleine-Buddef1f8c6c2010-10-18 15:00:18 +020047 * .modalias = "mcp2510",
48 * // or "mcp2515" depending on your controller
Christian Pellegrine0000162009-11-02 23:07:00 +000049 * .platform_data = &mcp251x_info,
50 * .irq = IRQ_EINT13,
51 * .max_speed_hz = 2*1000*1000,
52 * .chip_select = 2,
53 * },
54 * };
55 *
56 * Please see mcp251x.h for a description of the fields in
57 * struct mcp251x_platform_data.
58 *
59 */
60
Christian Pellegrine0000162009-11-02 23:07:00 +000061#include <linux/can/core.h>
62#include <linux/can/dev.h>
63#include <linux/can/platform/mcp251x.h>
64#include <linux/completion.h>
65#include <linux/delay.h>
66#include <linux/device.h>
67#include <linux/dma-mapping.h>
68#include <linux/freezer.h>
69#include <linux/interrupt.h>
70#include <linux/io.h>
71#include <linux/kernel.h>
72#include <linux/module.h>
73#include <linux/netdevice.h>
74#include <linux/platform_device.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090075#include <linux/slab.h>
Christian Pellegrine0000162009-11-02 23:07:00 +000076#include <linux/spi/spi.h>
77#include <linux/uaccess.h>
78
79/* SPI interface instruction set */
80#define INSTRUCTION_WRITE 0x02
81#define INSTRUCTION_READ 0x03
82#define INSTRUCTION_BIT_MODIFY 0x05
83#define INSTRUCTION_LOAD_TXB(n) (0x40 + 2 * (n))
84#define INSTRUCTION_READ_RXB(n) (((n) == 0) ? 0x90 : 0x94)
85#define INSTRUCTION_RESET 0xC0
86
87/* MPC251x registers */
88#define CANSTAT 0x0e
89#define CANCTRL 0x0f
90# define CANCTRL_REQOP_MASK 0xe0
91# define CANCTRL_REQOP_CONF 0x80
92# define CANCTRL_REQOP_LISTEN_ONLY 0x60
93# define CANCTRL_REQOP_LOOPBACK 0x40
94# define CANCTRL_REQOP_SLEEP 0x20
95# define CANCTRL_REQOP_NORMAL 0x00
96# define CANCTRL_OSM 0x08
97# define CANCTRL_ABAT 0x10
98#define TEC 0x1c
99#define REC 0x1d
100#define CNF1 0x2a
101# define CNF1_SJW_SHIFT 6
102#define CNF2 0x29
103# define CNF2_BTLMODE 0x80
104# define CNF2_SAM 0x40
105# define CNF2_PS1_SHIFT 3
106#define CNF3 0x28
107# define CNF3_SOF 0x08
108# define CNF3_WAKFIL 0x04
109# define CNF3_PHSEG2_MASK 0x07
110#define CANINTE 0x2b
111# define CANINTE_MERRE 0x80
112# define CANINTE_WAKIE 0x40
113# define CANINTE_ERRIE 0x20
114# define CANINTE_TX2IE 0x10
115# define CANINTE_TX1IE 0x08
116# define CANINTE_TX0IE 0x04
117# define CANINTE_RX1IE 0x02
118# define CANINTE_RX0IE 0x01
119#define CANINTF 0x2c
120# define CANINTF_MERRF 0x80
121# define CANINTF_WAKIF 0x40
122# define CANINTF_ERRIF 0x20
123# define CANINTF_TX2IF 0x10
124# define CANINTF_TX1IF 0x08
125# define CANINTF_TX0IF 0x04
126# define CANINTF_RX1IF 0x02
127# define CANINTF_RX0IF 0x01
Marc Kleine-Budded3cd1562010-09-28 10:18:34 +0200128# define CANINTF_ERR_TX \
129 (CANINTF_ERRIF | CANINTF_TX2IF | CANINTF_TX1IF | CANINTF_TX0IF)
Christian Pellegrine0000162009-11-02 23:07:00 +0000130#define EFLG 0x2d
131# define EFLG_EWARN 0x01
132# define EFLG_RXWAR 0x02
133# define EFLG_TXWAR 0x04
134# define EFLG_RXEP 0x08
135# define EFLG_TXEP 0x10
136# define EFLG_TXBO 0x20
137# define EFLG_RX0OVR 0x40
138# define EFLG_RX1OVR 0x80
139#define TXBCTRL(n) (((n) * 0x10) + 0x30 + TXBCTRL_OFF)
140# define TXBCTRL_ABTF 0x40
141# define TXBCTRL_MLOA 0x20
142# define TXBCTRL_TXERR 0x10
143# define TXBCTRL_TXREQ 0x08
144#define TXBSIDH(n) (((n) * 0x10) + 0x30 + TXBSIDH_OFF)
145# define SIDH_SHIFT 3
146#define TXBSIDL(n) (((n) * 0x10) + 0x30 + TXBSIDL_OFF)
147# define SIDL_SID_MASK 7
148# define SIDL_SID_SHIFT 5
149# define SIDL_EXIDE_SHIFT 3
150# define SIDL_EID_SHIFT 16
151# define SIDL_EID_MASK 3
152#define TXBEID8(n) (((n) * 0x10) + 0x30 + TXBEID8_OFF)
153#define TXBEID0(n) (((n) * 0x10) + 0x30 + TXBEID0_OFF)
154#define TXBDLC(n) (((n) * 0x10) + 0x30 + TXBDLC_OFF)
155# define DLC_RTR_SHIFT 6
156#define TXBCTRL_OFF 0
157#define TXBSIDH_OFF 1
158#define TXBSIDL_OFF 2
159#define TXBEID8_OFF 3
160#define TXBEID0_OFF 4
161#define TXBDLC_OFF 5
162#define TXBDAT_OFF 6
163#define RXBCTRL(n) (((n) * 0x10) + 0x60 + RXBCTRL_OFF)
164# define RXBCTRL_BUKT 0x04
165# define RXBCTRL_RXM0 0x20
166# define RXBCTRL_RXM1 0x40
167#define RXBSIDH(n) (((n) * 0x10) + 0x60 + RXBSIDH_OFF)
168# define RXBSIDH_SHIFT 3
169#define RXBSIDL(n) (((n) * 0x10) + 0x60 + RXBSIDL_OFF)
170# define RXBSIDL_IDE 0x08
171# define RXBSIDL_EID 3
172# define RXBSIDL_SHIFT 5
173#define RXBEID8(n) (((n) * 0x10) + 0x60 + RXBEID8_OFF)
174#define RXBEID0(n) (((n) * 0x10) + 0x60 + RXBEID0_OFF)
175#define RXBDLC(n) (((n) * 0x10) + 0x60 + RXBDLC_OFF)
176# define RXBDLC_LEN_MASK 0x0f
177# define RXBDLC_RTR 0x40
178#define RXBCTRL_OFF 0
179#define RXBSIDH_OFF 1
180#define RXBSIDL_OFF 2
181#define RXBEID8_OFF 3
182#define RXBEID0_OFF 4
183#define RXBDLC_OFF 5
184#define RXBDAT_OFF 6
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000185#define RXFSIDH(n) ((n) * 4)
186#define RXFSIDL(n) ((n) * 4 + 1)
187#define RXFEID8(n) ((n) * 4 + 2)
188#define RXFEID0(n) ((n) * 4 + 3)
189#define RXMSIDH(n) ((n) * 4 + 0x20)
190#define RXMSIDL(n) ((n) * 4 + 0x21)
191#define RXMEID8(n) ((n) * 4 + 0x22)
192#define RXMEID0(n) ((n) * 4 + 0x23)
Christian Pellegrine0000162009-11-02 23:07:00 +0000193
194#define GET_BYTE(val, byte) \
195 (((val) >> ((byte) * 8)) & 0xff)
196#define SET_BYTE(val, byte) \
197 (((val) & 0xff) << ((byte) * 8))
198
199/*
200 * Buffer size required for the largest SPI transfer (i.e., reading a
201 * frame)
202 */
203#define CAN_FRAME_MAX_DATA_LEN 8
204#define SPI_TRANSFER_BUF_LEN (6 + CAN_FRAME_MAX_DATA_LEN)
205#define CAN_FRAME_MAX_BITS 128
206
207#define TX_ECHO_SKB_MAX 1
208
209#define DEVICE_NAME "mcp251x"
210
211static int mcp251x_enable_dma; /* Enable SPI DMA. Default: 0 (Off) */
212module_param(mcp251x_enable_dma, int, S_IRUGO);
213MODULE_PARM_DESC(mcp251x_enable_dma, "Enable SPI DMA. Default: 0 (Off)");
214
215static struct can_bittiming_const mcp251x_bittiming_const = {
216 .name = DEVICE_NAME,
217 .tseg1_min = 3,
218 .tseg1_max = 16,
219 .tseg2_min = 2,
220 .tseg2_max = 8,
221 .sjw_max = 4,
222 .brp_min = 1,
223 .brp_max = 64,
224 .brp_inc = 1,
225};
226
Marc Kleine-Buddef1f8c6c2010-10-18 15:00:18 +0200227enum mcp251x_model {
228 CAN_MCP251X_MCP2510 = 0x2510,
229 CAN_MCP251X_MCP2515 = 0x2515,
230};
231
Christian Pellegrine0000162009-11-02 23:07:00 +0000232struct mcp251x_priv {
233 struct can_priv can;
234 struct net_device *net;
235 struct spi_device *spi;
Marc Kleine-Buddef1f8c6c2010-10-18 15:00:18 +0200236 enum mcp251x_model model;
Christian Pellegrine0000162009-11-02 23:07:00 +0000237
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000238 struct mutex mcp_lock; /* SPI device lock */
239
Christian Pellegrine0000162009-11-02 23:07:00 +0000240 u8 *spi_tx_buf;
241 u8 *spi_rx_buf;
242 dma_addr_t spi_tx_dma;
243 dma_addr_t spi_rx_dma;
244
245 struct sk_buff *tx_skb;
246 int tx_len;
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000247
Christian Pellegrine0000162009-11-02 23:07:00 +0000248 struct workqueue_struct *wq;
249 struct work_struct tx_work;
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000250 struct work_struct restart_work;
251
Christian Pellegrine0000162009-11-02 23:07:00 +0000252 int force_quit;
253 int after_suspend;
254#define AFTER_SUSPEND_UP 1
255#define AFTER_SUSPEND_DOWN 2
256#define AFTER_SUSPEND_POWER 4
257#define AFTER_SUSPEND_RESTART 8
258 int restart_tx;
259};
260
261static void mcp251x_clean(struct net_device *net)
262{
263 struct mcp251x_priv *priv = netdev_priv(net);
264
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000265 if (priv->tx_skb || priv->tx_len)
266 net->stats.tx_errors++;
Christian Pellegrine0000162009-11-02 23:07:00 +0000267 if (priv->tx_skb)
268 dev_kfree_skb(priv->tx_skb);
269 if (priv->tx_len)
270 can_free_echo_skb(priv->net, 0);
271 priv->tx_skb = NULL;
272 priv->tx_len = 0;
273}
274
275/*
276 * Note about handling of error return of mcp251x_spi_trans: accessing
277 * registers via SPI is not really different conceptually than using
278 * normal I/O assembler instructions, although it's much more
279 * complicated from a practical POV. So it's not advisable to always
280 * check the return value of this function. Imagine that every
281 * read{b,l}, write{b,l} and friends would be bracketed in "if ( < 0)
282 * error();", it would be a great mess (well there are some situation
283 * when exception handling C++ like could be useful after all). So we
284 * just check that transfers are OK at the beginning of our
285 * conversation with the chip and to avoid doing really nasty things
286 * (like injecting bogus packets in the network stack).
287 */
288static int mcp251x_spi_trans(struct spi_device *spi, int len)
289{
290 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
291 struct spi_transfer t = {
292 .tx_buf = priv->spi_tx_buf,
293 .rx_buf = priv->spi_rx_buf,
294 .len = len,
295 .cs_change = 0,
296 };
297 struct spi_message m;
298 int ret;
299
300 spi_message_init(&m);
301
302 if (mcp251x_enable_dma) {
303 t.tx_dma = priv->spi_tx_dma;
304 t.rx_dma = priv->spi_rx_dma;
305 m.is_dma_mapped = 1;
306 }
307
308 spi_message_add_tail(&t, &m);
309
310 ret = spi_sync(spi, &m);
311 if (ret)
312 dev_err(&spi->dev, "spi transfer failed: ret = %d\n", ret);
313 return ret;
314}
315
316static u8 mcp251x_read_reg(struct spi_device *spi, uint8_t reg)
317{
318 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
319 u8 val = 0;
320
Christian Pellegrine0000162009-11-02 23:07:00 +0000321 priv->spi_tx_buf[0] = INSTRUCTION_READ;
322 priv->spi_tx_buf[1] = reg;
323
324 mcp251x_spi_trans(spi, 3);
325 val = priv->spi_rx_buf[2];
326
Christian Pellegrine0000162009-11-02 23:07:00 +0000327 return val;
328}
329
Sascha Hauerf3a3ed32010-09-28 09:53:35 +0200330static void mcp251x_read_2regs(struct spi_device *spi, uint8_t reg,
331 uint8_t *v1, uint8_t *v2)
332{
333 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
334
335 priv->spi_tx_buf[0] = INSTRUCTION_READ;
336 priv->spi_tx_buf[1] = reg;
337
338 mcp251x_spi_trans(spi, 4);
339
340 *v1 = priv->spi_rx_buf[2];
341 *v2 = priv->spi_rx_buf[3];
342}
343
Christian Pellegrine0000162009-11-02 23:07:00 +0000344static void mcp251x_write_reg(struct spi_device *spi, u8 reg, uint8_t val)
345{
346 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
347
Christian Pellegrine0000162009-11-02 23:07:00 +0000348 priv->spi_tx_buf[0] = INSTRUCTION_WRITE;
349 priv->spi_tx_buf[1] = reg;
350 priv->spi_tx_buf[2] = val;
351
352 mcp251x_spi_trans(spi, 3);
Christian Pellegrine0000162009-11-02 23:07:00 +0000353}
354
355static void mcp251x_write_bits(struct spi_device *spi, u8 reg,
356 u8 mask, uint8_t val)
357{
358 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
359
Christian Pellegrine0000162009-11-02 23:07:00 +0000360 priv->spi_tx_buf[0] = INSTRUCTION_BIT_MODIFY;
361 priv->spi_tx_buf[1] = reg;
362 priv->spi_tx_buf[2] = mask;
363 priv->spi_tx_buf[3] = val;
364
365 mcp251x_spi_trans(spi, 4);
Christian Pellegrine0000162009-11-02 23:07:00 +0000366}
367
368static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf,
369 int len, int tx_buf_idx)
370{
Christian Pellegrine0000162009-11-02 23:07:00 +0000371 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
372
Marc Kleine-Buddef1f8c6c2010-10-18 15:00:18 +0200373 if (priv->model == CAN_MCP251X_MCP2510) {
Christian Pellegrine0000162009-11-02 23:07:00 +0000374 int i;
375
376 for (i = 1; i < TXBDAT_OFF + len; i++)
377 mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx) + i,
378 buf[i]);
379 } else {
Christian Pellegrine0000162009-11-02 23:07:00 +0000380 memcpy(priv->spi_tx_buf, buf, TXBDAT_OFF + len);
381 mcp251x_spi_trans(spi, TXBDAT_OFF + len);
Christian Pellegrine0000162009-11-02 23:07:00 +0000382 }
383}
384
385static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame,
386 int tx_buf_idx)
387{
388 u32 sid, eid, exide, rtr;
389 u8 buf[SPI_TRANSFER_BUF_LEN];
390
391 exide = (frame->can_id & CAN_EFF_FLAG) ? 1 : 0; /* Extended ID Enable */
392 if (exide)
393 sid = (frame->can_id & CAN_EFF_MASK) >> 18;
394 else
395 sid = frame->can_id & CAN_SFF_MASK; /* Standard ID */
396 eid = frame->can_id & CAN_EFF_MASK; /* Extended ID */
397 rtr = (frame->can_id & CAN_RTR_FLAG) ? 1 : 0; /* Remote transmission */
398
399 buf[TXBCTRL_OFF] = INSTRUCTION_LOAD_TXB(tx_buf_idx);
400 buf[TXBSIDH_OFF] = sid >> SIDH_SHIFT;
401 buf[TXBSIDL_OFF] = ((sid & SIDL_SID_MASK) << SIDL_SID_SHIFT) |
402 (exide << SIDL_EXIDE_SHIFT) |
403 ((eid >> SIDL_EID_SHIFT) & SIDL_EID_MASK);
404 buf[TXBEID8_OFF] = GET_BYTE(eid, 1);
405 buf[TXBEID0_OFF] = GET_BYTE(eid, 0);
406 buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc;
407 memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc);
408 mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx);
409 mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx), TXBCTRL_TXREQ);
410}
411
412static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf,
413 int buf_idx)
414{
415 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
Christian Pellegrine0000162009-11-02 23:07:00 +0000416
Marc Kleine-Buddef1f8c6c2010-10-18 15:00:18 +0200417 if (priv->model == CAN_MCP251X_MCP2510) {
Christian Pellegrine0000162009-11-02 23:07:00 +0000418 int i, len;
419
420 for (i = 1; i < RXBDAT_OFF; i++)
421 buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i);
Oliver Hartkoppc7cd6062009-12-12 04:13:21 +0000422
423 len = get_can_dlc(buf[RXBDLC_OFF] & RXBDLC_LEN_MASK);
Christian Pellegrine0000162009-11-02 23:07:00 +0000424 for (; i < (RXBDAT_OFF + len); i++)
425 buf[i] = mcp251x_read_reg(spi, RXBCTRL(buf_idx) + i);
426 } else {
Christian Pellegrine0000162009-11-02 23:07:00 +0000427 priv->spi_tx_buf[RXBCTRL_OFF] = INSTRUCTION_READ_RXB(buf_idx);
428 mcp251x_spi_trans(spi, SPI_TRANSFER_BUF_LEN);
429 memcpy(buf, priv->spi_rx_buf, SPI_TRANSFER_BUF_LEN);
Christian Pellegrine0000162009-11-02 23:07:00 +0000430 }
431}
432
433static void mcp251x_hw_rx(struct spi_device *spi, int buf_idx)
434{
435 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
436 struct sk_buff *skb;
437 struct can_frame *frame;
438 u8 buf[SPI_TRANSFER_BUF_LEN];
439
440 skb = alloc_can_skb(priv->net, &frame);
441 if (!skb) {
442 dev_err(&spi->dev, "cannot allocate RX skb\n");
443 priv->net->stats.rx_dropped++;
444 return;
445 }
446
447 mcp251x_hw_rx_frame(spi, buf, buf_idx);
448 if (buf[RXBSIDL_OFF] & RXBSIDL_IDE) {
449 /* Extended ID format */
450 frame->can_id = CAN_EFF_FLAG;
451 frame->can_id |=
452 /* Extended ID part */
453 SET_BYTE(buf[RXBSIDL_OFF] & RXBSIDL_EID, 2) |
454 SET_BYTE(buf[RXBEID8_OFF], 1) |
455 SET_BYTE(buf[RXBEID0_OFF], 0) |
456 /* Standard ID part */
457 (((buf[RXBSIDH_OFF] << RXBSIDH_SHIFT) |
458 (buf[RXBSIDL_OFF] >> RXBSIDL_SHIFT)) << 18);
459 /* Remote transmission request */
460 if (buf[RXBDLC_OFF] & RXBDLC_RTR)
461 frame->can_id |= CAN_RTR_FLAG;
462 } else {
463 /* Standard ID format */
464 frame->can_id =
465 (buf[RXBSIDH_OFF] << RXBSIDH_SHIFT) |
466 (buf[RXBSIDL_OFF] >> RXBSIDL_SHIFT);
467 }
468 /* Data length */
Oliver Hartkoppc7cd6062009-12-12 04:13:21 +0000469 frame->can_dlc = get_can_dlc(buf[RXBDLC_OFF] & RXBDLC_LEN_MASK);
Christian Pellegrine0000162009-11-02 23:07:00 +0000470 memcpy(frame->data, buf + RXBDAT_OFF, frame->can_dlc);
471
472 priv->net->stats.rx_packets++;
473 priv->net->stats.rx_bytes += frame->can_dlc;
Marc Kleine-Budde57d3c7b2010-10-04 10:50:51 +0200474 netif_rx_ni(skb);
Christian Pellegrine0000162009-11-02 23:07:00 +0000475}
476
477static void mcp251x_hw_sleep(struct spi_device *spi)
478{
479 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_SLEEP);
480}
481
Christian Pellegrine0000162009-11-02 23:07:00 +0000482static netdev_tx_t mcp251x_hard_start_xmit(struct sk_buff *skb,
483 struct net_device *net)
484{
485 struct mcp251x_priv *priv = netdev_priv(net);
486 struct spi_device *spi = priv->spi;
487
488 if (priv->tx_skb || priv->tx_len) {
489 dev_warn(&spi->dev, "hard_xmit called while tx busy\n");
Christian Pellegrine0000162009-11-02 23:07:00 +0000490 return NETDEV_TX_BUSY;
491 }
492
Oliver Hartkopp3ccd4c62010-01-12 02:00:46 -0800493 if (can_dropped_invalid_skb(net, skb))
Christian Pellegrine0000162009-11-02 23:07:00 +0000494 return NETDEV_TX_OK;
Christian Pellegrine0000162009-11-02 23:07:00 +0000495
496 netif_stop_queue(net);
497 priv->tx_skb = skb;
Christian Pellegrine0000162009-11-02 23:07:00 +0000498 queue_work(priv->wq, &priv->tx_work);
499
500 return NETDEV_TX_OK;
501}
502
503static int mcp251x_do_set_mode(struct net_device *net, enum can_mode mode)
504{
505 struct mcp251x_priv *priv = netdev_priv(net);
506
507 switch (mode) {
508 case CAN_MODE_START:
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000509 mcp251x_clean(net);
Christian Pellegrine0000162009-11-02 23:07:00 +0000510 /* We have to delay work since SPI I/O may sleep */
511 priv->can.state = CAN_STATE_ERROR_ACTIVE;
512 priv->restart_tx = 1;
513 if (priv->can.restart_ms == 0)
514 priv->after_suspend = AFTER_SUSPEND_RESTART;
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000515 queue_work(priv->wq, &priv->restart_work);
Christian Pellegrine0000162009-11-02 23:07:00 +0000516 break;
517 default:
518 return -EOPNOTSUPP;
519 }
520
521 return 0;
522}
523
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000524static int mcp251x_set_normal_mode(struct spi_device *spi)
Christian Pellegrine0000162009-11-02 23:07:00 +0000525{
526 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
527 unsigned long timeout;
528
529 /* Enable interrupts */
530 mcp251x_write_reg(spi, CANINTE,
531 CANINTE_ERRIE | CANINTE_TX2IE | CANINTE_TX1IE |
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000532 CANINTE_TX0IE | CANINTE_RX1IE | CANINTE_RX0IE);
Christian Pellegrine0000162009-11-02 23:07:00 +0000533
534 if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK) {
535 /* Put device into loopback mode */
536 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LOOPBACK);
Christian Pellegrinad72c342010-01-14 07:08:34 +0000537 } else if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) {
538 /* Put device into listen-only mode */
539 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_LISTEN_ONLY);
Christian Pellegrine0000162009-11-02 23:07:00 +0000540 } else {
541 /* Put device into normal mode */
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000542 mcp251x_write_reg(spi, CANCTRL, CANCTRL_REQOP_NORMAL);
Christian Pellegrine0000162009-11-02 23:07:00 +0000543
544 /* Wait for the device to enter normal mode */
545 timeout = jiffies + HZ;
546 while (mcp251x_read_reg(spi, CANSTAT) & CANCTRL_REQOP_MASK) {
547 schedule();
548 if (time_after(jiffies, timeout)) {
549 dev_err(&spi->dev, "MCP251x didn't"
550 " enter in normal mode\n");
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000551 return -EBUSY;
Christian Pellegrine0000162009-11-02 23:07:00 +0000552 }
553 }
554 }
555 priv->can.state = CAN_STATE_ERROR_ACTIVE;
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000556 return 0;
Christian Pellegrine0000162009-11-02 23:07:00 +0000557}
558
559static int mcp251x_do_set_bittiming(struct net_device *net)
560{
561 struct mcp251x_priv *priv = netdev_priv(net);
562 struct can_bittiming *bt = &priv->can.bittiming;
563 struct spi_device *spi = priv->spi;
564
565 mcp251x_write_reg(spi, CNF1, ((bt->sjw - 1) << CNF1_SJW_SHIFT) |
566 (bt->brp - 1));
567 mcp251x_write_reg(spi, CNF2, CNF2_BTLMODE |
568 (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES ?
569 CNF2_SAM : 0) |
570 ((bt->phase_seg1 - 1) << CNF2_PS1_SHIFT) |
571 (bt->prop_seg - 1));
572 mcp251x_write_bits(spi, CNF3, CNF3_PHSEG2_MASK,
573 (bt->phase_seg2 - 1));
574 dev_info(&spi->dev, "CNF: 0x%02x 0x%02x 0x%02x\n",
575 mcp251x_read_reg(spi, CNF1),
576 mcp251x_read_reg(spi, CNF2),
577 mcp251x_read_reg(spi, CNF3));
578
579 return 0;
580}
581
582static int mcp251x_setup(struct net_device *net, struct mcp251x_priv *priv,
583 struct spi_device *spi)
584{
Christian Pellegrin615534b2009-11-17 06:20:44 +0000585 mcp251x_do_set_bittiming(net);
Christian Pellegrine0000162009-11-02 23:07:00 +0000586
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000587 mcp251x_write_reg(spi, RXBCTRL(0),
588 RXBCTRL_BUKT | RXBCTRL_RXM0 | RXBCTRL_RXM1);
589 mcp251x_write_reg(spi, RXBCTRL(1),
590 RXBCTRL_RXM0 | RXBCTRL_RXM1);
Christian Pellegrine0000162009-11-02 23:07:00 +0000591 return 0;
592}
593
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000594static int mcp251x_hw_reset(struct spi_device *spi)
Christian Pellegrine0000162009-11-02 23:07:00 +0000595{
596 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
597 int ret;
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000598 unsigned long timeout;
Christian Pellegrine0000162009-11-02 23:07:00 +0000599
600 priv->spi_tx_buf[0] = INSTRUCTION_RESET;
Christian Pellegrine0000162009-11-02 23:07:00 +0000601 ret = spi_write(spi, priv->spi_tx_buf, 1);
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000602 if (ret) {
Christian Pellegrine0000162009-11-02 23:07:00 +0000603 dev_err(&spi->dev, "reset failed: ret = %d\n", ret);
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000604 return -EIO;
605 }
606
Christian Pellegrine0000162009-11-02 23:07:00 +0000607 /* Wait for reset to finish */
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000608 timeout = jiffies + HZ;
Christian Pellegrine0000162009-11-02 23:07:00 +0000609 mdelay(10);
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000610 while ((mcp251x_read_reg(spi, CANSTAT) & CANCTRL_REQOP_MASK)
611 != CANCTRL_REQOP_CONF) {
612 schedule();
613 if (time_after(jiffies, timeout)) {
614 dev_err(&spi->dev, "MCP251x didn't"
615 " enter in conf mode after reset\n");
616 return -EBUSY;
617 }
618 }
619 return 0;
Christian Pellegrine0000162009-11-02 23:07:00 +0000620}
621
622static int mcp251x_hw_probe(struct spi_device *spi)
623{
624 int st1, st2;
625
626 mcp251x_hw_reset(spi);
627
628 /*
629 * Please note that these are "magic values" based on after
630 * reset defaults taken from data sheet which allows us to see
631 * if we really have a chip on the bus (we avoid common all
632 * zeroes or all ones situations)
633 */
634 st1 = mcp251x_read_reg(spi, CANSTAT) & 0xEE;
635 st2 = mcp251x_read_reg(spi, CANCTRL) & 0x17;
636
637 dev_dbg(&spi->dev, "CANSTAT 0x%02x CANCTRL 0x%02x\n", st1, st2);
638
639 /* Check for power up default values */
640 return (st1 == 0x80 && st2 == 0x07) ? 1 : 0;
641}
642
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000643static void mcp251x_open_clean(struct net_device *net)
Christian Pellegrine0000162009-11-02 23:07:00 +0000644{
645 struct mcp251x_priv *priv = netdev_priv(net);
646 struct spi_device *spi = priv->spi;
647 struct mcp251x_platform_data *pdata = spi->dev.platform_data;
Christian Pellegrine0000162009-11-02 23:07:00 +0000648
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000649 free_irq(spi->irq, priv);
650 mcp251x_hw_sleep(spi);
Christian Pellegrine0000162009-11-02 23:07:00 +0000651 if (pdata->transceiver_enable)
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000652 pdata->transceiver_enable(0);
653 close_candev(net);
Christian Pellegrine0000162009-11-02 23:07:00 +0000654}
655
656static int mcp251x_stop(struct net_device *net)
657{
658 struct mcp251x_priv *priv = netdev_priv(net);
659 struct spi_device *spi = priv->spi;
660 struct mcp251x_platform_data *pdata = spi->dev.platform_data;
661
662 close_candev(net);
663
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000664 priv->force_quit = 1;
665 free_irq(spi->irq, priv);
666 destroy_workqueue(priv->wq);
667 priv->wq = NULL;
668
669 mutex_lock(&priv->mcp_lock);
670
Christian Pellegrine0000162009-11-02 23:07:00 +0000671 /* Disable and clear pending interrupts */
672 mcp251x_write_reg(spi, CANINTE, 0x00);
673 mcp251x_write_reg(spi, CANINTF, 0x00);
674
Christian Pellegrine0000162009-11-02 23:07:00 +0000675 mcp251x_write_reg(spi, TXBCTRL(0), 0);
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000676 mcp251x_clean(net);
Christian Pellegrine0000162009-11-02 23:07:00 +0000677
678 mcp251x_hw_sleep(spi);
679
680 if (pdata->transceiver_enable)
681 pdata->transceiver_enable(0);
682
683 priv->can.state = CAN_STATE_STOPPED;
684
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000685 mutex_unlock(&priv->mcp_lock);
686
Christian Pellegrine0000162009-11-02 23:07:00 +0000687 return 0;
688}
689
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000690static void mcp251x_error_skb(struct net_device *net, int can_id, int data1)
691{
692 struct sk_buff *skb;
693 struct can_frame *frame;
694
695 skb = alloc_can_err_skb(net, &frame);
696 if (skb) {
697 frame->can_id = can_id;
698 frame->data[1] = data1;
Marc Kleine-Budde57d3c7b2010-10-04 10:50:51 +0200699 netif_rx_ni(skb);
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000700 } else {
701 dev_err(&net->dev,
702 "cannot allocate error skb\n");
703 }
704}
705
Christian Pellegrine0000162009-11-02 23:07:00 +0000706static void mcp251x_tx_work_handler(struct work_struct *ws)
707{
708 struct mcp251x_priv *priv = container_of(ws, struct mcp251x_priv,
709 tx_work);
710 struct spi_device *spi = priv->spi;
711 struct net_device *net = priv->net;
712 struct can_frame *frame;
713
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000714 mutex_lock(&priv->mcp_lock);
Christian Pellegrine0000162009-11-02 23:07:00 +0000715 if (priv->tx_skb) {
Christian Pellegrine0000162009-11-02 23:07:00 +0000716 if (priv->can.state == CAN_STATE_BUS_OFF) {
717 mcp251x_clean(net);
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000718 } else {
719 frame = (struct can_frame *)priv->tx_skb->data;
720
721 if (frame->can_dlc > CAN_FRAME_MAX_DATA_LEN)
722 frame->can_dlc = CAN_FRAME_MAX_DATA_LEN;
723 mcp251x_hw_tx(spi, frame, 0);
724 priv->tx_len = 1 + frame->can_dlc;
725 can_put_echo_skb(priv->tx_skb, net, 0);
726 priv->tx_skb = NULL;
Christian Pellegrine0000162009-11-02 23:07:00 +0000727 }
Christian Pellegrine0000162009-11-02 23:07:00 +0000728 }
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000729 mutex_unlock(&priv->mcp_lock);
Christian Pellegrine0000162009-11-02 23:07:00 +0000730}
731
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000732static void mcp251x_restart_work_handler(struct work_struct *ws)
Christian Pellegrine0000162009-11-02 23:07:00 +0000733{
734 struct mcp251x_priv *priv = container_of(ws, struct mcp251x_priv,
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000735 restart_work);
Christian Pellegrine0000162009-11-02 23:07:00 +0000736 struct spi_device *spi = priv->spi;
737 struct net_device *net = priv->net;
Christian Pellegrine0000162009-11-02 23:07:00 +0000738
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000739 mutex_lock(&priv->mcp_lock);
Christian Pellegrine0000162009-11-02 23:07:00 +0000740 if (priv->after_suspend) {
741 mdelay(10);
742 mcp251x_hw_reset(spi);
743 mcp251x_setup(net, priv, spi);
744 if (priv->after_suspend & AFTER_SUSPEND_RESTART) {
745 mcp251x_set_normal_mode(spi);
746 } else if (priv->after_suspend & AFTER_SUSPEND_UP) {
747 netif_device_attach(net);
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000748 mcp251x_clean(net);
Christian Pellegrine0000162009-11-02 23:07:00 +0000749 mcp251x_set_normal_mode(spi);
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000750 netif_wake_queue(net);
Christian Pellegrine0000162009-11-02 23:07:00 +0000751 } else {
752 mcp251x_hw_sleep(spi);
753 }
754 priv->after_suspend = 0;
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000755 priv->force_quit = 0;
Christian Pellegrine0000162009-11-02 23:07:00 +0000756 }
757
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000758 if (priv->restart_tx) {
759 priv->restart_tx = 0;
760 mcp251x_write_reg(spi, TXBCTRL(0), 0);
761 mcp251x_clean(net);
762 netif_wake_queue(net);
763 mcp251x_error_skb(net, CAN_ERR_RESTARTED, 0);
764 }
765 mutex_unlock(&priv->mcp_lock);
766}
Christian Pellegrine0000162009-11-02 23:07:00 +0000767
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000768static irqreturn_t mcp251x_can_ist(int irq, void *dev_id)
769{
770 struct mcp251x_priv *priv = dev_id;
771 struct spi_device *spi = priv->spi;
772 struct net_device *net = priv->net;
773
774 mutex_lock(&priv->mcp_lock);
775 while (!priv->force_quit) {
776 enum can_state new_state;
Sascha Hauerf3a3ed32010-09-28 09:53:35 +0200777 u8 intf, eflag;
Marc Kleine-Budded3cd1562010-09-28 10:18:34 +0200778 u8 clear_intf = 0;
Christian Pellegrine0000162009-11-02 23:07:00 +0000779 int can_id = 0, data1 = 0;
780
Sascha Hauerf3a3ed32010-09-28 09:53:35 +0200781 mcp251x_read_2regs(spi, CANINTF, &intf, &eflag);
782
Marc Kleine-Budded3cd1562010-09-28 10:18:34 +0200783 /* receive buffer 0 */
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000784 if (intf & CANINTF_RX0IF) {
785 mcp251x_hw_rx(spi, 0);
786 /* Free one buffer ASAP */
787 mcp251x_write_bits(spi, CANINTF, intf & CANINTF_RX0IF,
788 0x00);
Christian Pellegrine0000162009-11-02 23:07:00 +0000789 }
790
Marc Kleine-Budded3cd1562010-09-28 10:18:34 +0200791 /* receive buffer 1 */
792 if (intf & CANINTF_RX1IF) {
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000793 mcp251x_hw_rx(spi, 1);
Marc Kleine-Budded3cd1562010-09-28 10:18:34 +0200794 clear_intf |= CANINTF_RX1IF;
795 }
Christian Pellegrine0000162009-11-02 23:07:00 +0000796
Marc Kleine-Budded3cd1562010-09-28 10:18:34 +0200797 /* any error or tx interrupt we need to clear? */
798 if (intf & CANINTF_ERR_TX)
799 clear_intf |= intf & CANINTF_ERR_TX;
800 if (clear_intf)
801 mcp251x_write_bits(spi, CANINTF, clear_intf, 0x00);
Christian Pellegrine0000162009-11-02 23:07:00 +0000802
Sascha Hauer7e15de32010-09-28 10:00:47 +0200803 if (eflag)
804 mcp251x_write_bits(spi, EFLG, eflag, 0x00);
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000805
Christian Pellegrine0000162009-11-02 23:07:00 +0000806 /* Update can state */
807 if (eflag & EFLG_TXBO) {
808 new_state = CAN_STATE_BUS_OFF;
809 can_id |= CAN_ERR_BUSOFF;
810 } else if (eflag & EFLG_TXEP) {
811 new_state = CAN_STATE_ERROR_PASSIVE;
812 can_id |= CAN_ERR_CRTL;
813 data1 |= CAN_ERR_CRTL_TX_PASSIVE;
814 } else if (eflag & EFLG_RXEP) {
815 new_state = CAN_STATE_ERROR_PASSIVE;
816 can_id |= CAN_ERR_CRTL;
817 data1 |= CAN_ERR_CRTL_RX_PASSIVE;
818 } else if (eflag & EFLG_TXWAR) {
819 new_state = CAN_STATE_ERROR_WARNING;
820 can_id |= CAN_ERR_CRTL;
821 data1 |= CAN_ERR_CRTL_TX_WARNING;
822 } else if (eflag & EFLG_RXWAR) {
823 new_state = CAN_STATE_ERROR_WARNING;
824 can_id |= CAN_ERR_CRTL;
825 data1 |= CAN_ERR_CRTL_RX_WARNING;
826 } else {
827 new_state = CAN_STATE_ERROR_ACTIVE;
828 }
829
830 /* Update can state statistics */
831 switch (priv->can.state) {
832 case CAN_STATE_ERROR_ACTIVE:
833 if (new_state >= CAN_STATE_ERROR_WARNING &&
834 new_state <= CAN_STATE_BUS_OFF)
835 priv->can.can_stats.error_warning++;
836 case CAN_STATE_ERROR_WARNING: /* fallthrough */
837 if (new_state >= CAN_STATE_ERROR_PASSIVE &&
838 new_state <= CAN_STATE_BUS_OFF)
839 priv->can.can_stats.error_passive++;
840 break;
841 default:
842 break;
843 }
844 priv->can.state = new_state;
845
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000846 if (intf & CANINTF_ERRIF) {
847 /* Handle overflow counters */
848 if (eflag & (EFLG_RX0OVR | EFLG_RX1OVR)) {
Sascha Hauer711e4d62010-09-30 09:46:00 +0200849 if (eflag & EFLG_RX0OVR) {
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000850 net->stats.rx_over_errors++;
Sascha Hauer711e4d62010-09-30 09:46:00 +0200851 net->stats.rx_errors++;
852 }
853 if (eflag & EFLG_RX1OVR) {
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000854 net->stats.rx_over_errors++;
Sascha Hauer711e4d62010-09-30 09:46:00 +0200855 net->stats.rx_errors++;
856 }
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000857 can_id |= CAN_ERR_CRTL;
858 data1 |= CAN_ERR_CRTL_RX_OVERFLOW;
Christian Pellegrine0000162009-11-02 23:07:00 +0000859 }
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000860 mcp251x_error_skb(net, can_id, data1);
Christian Pellegrine0000162009-11-02 23:07:00 +0000861 }
862
863 if (priv->can.state == CAN_STATE_BUS_OFF) {
864 if (priv->can.restart_ms == 0) {
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000865 priv->force_quit = 1;
Christian Pellegrine0000162009-11-02 23:07:00 +0000866 can_bus_off(net);
867 mcp251x_hw_sleep(spi);
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000868 break;
Christian Pellegrine0000162009-11-02 23:07:00 +0000869 }
870 }
871
872 if (intf == 0)
873 break;
874
Christian Pellegrine0000162009-11-02 23:07:00 +0000875 if (intf & (CANINTF_TX2IF | CANINTF_TX1IF | CANINTF_TX0IF)) {
876 net->stats.tx_packets++;
877 net->stats.tx_bytes += priv->tx_len - 1;
878 if (priv->tx_len) {
879 can_get_echo_skb(net, 0);
880 priv->tx_len = 0;
881 }
882 netif_wake_queue(net);
883 }
884
Christian Pellegrine0000162009-11-02 23:07:00 +0000885 }
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000886 mutex_unlock(&priv->mcp_lock);
887 return IRQ_HANDLED;
888}
889
890static int mcp251x_open(struct net_device *net)
891{
892 struct mcp251x_priv *priv = netdev_priv(net);
893 struct spi_device *spi = priv->spi;
894 struct mcp251x_platform_data *pdata = spi->dev.platform_data;
895 int ret;
896
897 ret = open_candev(net);
898 if (ret) {
899 dev_err(&spi->dev, "unable to set initial baudrate!\n");
900 return ret;
901 }
902
903 mutex_lock(&priv->mcp_lock);
904 if (pdata->transceiver_enable)
905 pdata->transceiver_enable(1);
906
907 priv->force_quit = 0;
908 priv->tx_skb = NULL;
909 priv->tx_len = 0;
910
911 ret = request_threaded_irq(spi->irq, NULL, mcp251x_can_ist,
912 IRQF_TRIGGER_FALLING, DEVICE_NAME, priv);
913 if (ret) {
914 dev_err(&spi->dev, "failed to acquire irq %d\n", spi->irq);
915 if (pdata->transceiver_enable)
916 pdata->transceiver_enable(0);
917 close_candev(net);
918 goto open_unlock;
919 }
920
921 priv->wq = create_freezeable_workqueue("mcp251x_wq");
922 INIT_WORK(&priv->tx_work, mcp251x_tx_work_handler);
923 INIT_WORK(&priv->restart_work, mcp251x_restart_work_handler);
924
925 ret = mcp251x_hw_reset(spi);
926 if (ret) {
927 mcp251x_open_clean(net);
928 goto open_unlock;
929 }
930 ret = mcp251x_setup(net, priv, spi);
931 if (ret) {
932 mcp251x_open_clean(net);
933 goto open_unlock;
934 }
935 ret = mcp251x_set_normal_mode(spi);
936 if (ret) {
937 mcp251x_open_clean(net);
938 goto open_unlock;
939 }
940 netif_wake_queue(net);
941
942open_unlock:
943 mutex_unlock(&priv->mcp_lock);
944 return ret;
Christian Pellegrine0000162009-11-02 23:07:00 +0000945}
946
947static const struct net_device_ops mcp251x_netdev_ops = {
948 .ndo_open = mcp251x_open,
949 .ndo_stop = mcp251x_stop,
950 .ndo_start_xmit = mcp251x_hard_start_xmit,
951};
952
953static int __devinit mcp251x_can_probe(struct spi_device *spi)
954{
955 struct net_device *net;
956 struct mcp251x_priv *priv;
957 struct mcp251x_platform_data *pdata = spi->dev.platform_data;
958 int ret = -ENODEV;
959
960 if (!pdata)
961 /* Platform data is required for osc freq */
962 goto error_out;
963
964 /* Allocate can/net device */
965 net = alloc_candev(sizeof(struct mcp251x_priv), TX_ECHO_SKB_MAX);
966 if (!net) {
967 ret = -ENOMEM;
968 goto error_alloc;
969 }
970
971 net->netdev_ops = &mcp251x_netdev_ops;
972 net->flags |= IFF_ECHO;
973
974 priv = netdev_priv(net);
975 priv->can.bittiming_const = &mcp251x_bittiming_const;
976 priv->can.do_set_mode = mcp251x_do_set_mode;
977 priv->can.clock.freq = pdata->oscillator_frequency / 2;
Christian Pellegrinad72c342010-01-14 07:08:34 +0000978 priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES |
979 CAN_CTRLMODE_LOOPBACK | CAN_CTRLMODE_LISTENONLY;
Marc Kleine-Buddef1f8c6c2010-10-18 15:00:18 +0200980 priv->model = spi_get_device_id(spi)->driver_data;
Christian Pellegrine0000162009-11-02 23:07:00 +0000981 priv->net = net;
982 dev_set_drvdata(&spi->dev, priv);
983
984 priv->spi = spi;
Christian Pellegrinbf66f372010-02-03 07:39:54 +0000985 mutex_init(&priv->mcp_lock);
Christian Pellegrine0000162009-11-02 23:07:00 +0000986
987 /* If requested, allocate DMA buffers */
988 if (mcp251x_enable_dma) {
989 spi->dev.coherent_dma_mask = ~0;
990
991 /*
992 * Minimum coherent DMA allocation is PAGE_SIZE, so allocate
993 * that much and share it between Tx and Rx DMA buffers.
994 */
995 priv->spi_tx_buf = dma_alloc_coherent(&spi->dev,
996 PAGE_SIZE,
997 &priv->spi_tx_dma,
998 GFP_DMA);
999
1000 if (priv->spi_tx_buf) {
1001 priv->spi_rx_buf = (u8 *)(priv->spi_tx_buf +
1002 (PAGE_SIZE / 2));
1003 priv->spi_rx_dma = (dma_addr_t)(priv->spi_tx_dma +
1004 (PAGE_SIZE / 2));
1005 } else {
1006 /* Fall back to non-DMA */
1007 mcp251x_enable_dma = 0;
1008 }
1009 }
1010
1011 /* Allocate non-DMA buffers */
1012 if (!mcp251x_enable_dma) {
1013 priv->spi_tx_buf = kmalloc(SPI_TRANSFER_BUF_LEN, GFP_KERNEL);
1014 if (!priv->spi_tx_buf) {
1015 ret = -ENOMEM;
1016 goto error_tx_buf;
1017 }
1018 priv->spi_rx_buf = kmalloc(SPI_TRANSFER_BUF_LEN, GFP_KERNEL);
Julia Lawallce739b42009-12-27 11:27:44 +00001019 if (!priv->spi_rx_buf) {
Christian Pellegrine0000162009-11-02 23:07:00 +00001020 ret = -ENOMEM;
1021 goto error_rx_buf;
1022 }
1023 }
1024
1025 if (pdata->power_enable)
1026 pdata->power_enable(1);
1027
1028 /* Call out to platform specific setup */
1029 if (pdata->board_specific_setup)
1030 pdata->board_specific_setup(spi);
1031
1032 SET_NETDEV_DEV(net, &spi->dev);
1033
Christian Pellegrine0000162009-11-02 23:07:00 +00001034 /* Configure the SPI bus */
1035 spi->mode = SPI_MODE_0;
1036 spi->bits_per_word = 8;
1037 spi_setup(spi);
1038
Christian Pellegrinbf66f372010-02-03 07:39:54 +00001039 /* Here is OK to not lock the MCP, no one knows about it yet */
Christian Pellegrine0000162009-11-02 23:07:00 +00001040 if (!mcp251x_hw_probe(spi)) {
1041 dev_info(&spi->dev, "Probe failed\n");
1042 goto error_probe;
1043 }
1044 mcp251x_hw_sleep(spi);
1045
1046 if (pdata->transceiver_enable)
1047 pdata->transceiver_enable(0);
1048
1049 ret = register_candev(net);
1050 if (!ret) {
1051 dev_info(&spi->dev, "probed\n");
1052 return ret;
1053 }
1054error_probe:
1055 if (!mcp251x_enable_dma)
1056 kfree(priv->spi_rx_buf);
1057error_rx_buf:
1058 if (!mcp251x_enable_dma)
1059 kfree(priv->spi_tx_buf);
1060error_tx_buf:
1061 free_candev(net);
1062 if (mcp251x_enable_dma)
1063 dma_free_coherent(&spi->dev, PAGE_SIZE,
1064 priv->spi_tx_buf, priv->spi_tx_dma);
1065error_alloc:
1066 if (pdata->power_enable)
1067 pdata->power_enable(0);
1068 dev_err(&spi->dev, "probe failed\n");
1069error_out:
1070 return ret;
1071}
1072
1073static int __devexit mcp251x_can_remove(struct spi_device *spi)
1074{
1075 struct mcp251x_platform_data *pdata = spi->dev.platform_data;
1076 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
1077 struct net_device *net = priv->net;
1078
1079 unregister_candev(net);
1080 free_candev(net);
1081
Christian Pellegrine0000162009-11-02 23:07:00 +00001082 if (mcp251x_enable_dma) {
1083 dma_free_coherent(&spi->dev, PAGE_SIZE,
1084 priv->spi_tx_buf, priv->spi_tx_dma);
1085 } else {
1086 kfree(priv->spi_tx_buf);
1087 kfree(priv->spi_rx_buf);
1088 }
1089
1090 if (pdata->power_enable)
1091 pdata->power_enable(0);
1092
1093 return 0;
1094}
1095
1096#ifdef CONFIG_PM
1097static int mcp251x_can_suspend(struct spi_device *spi, pm_message_t state)
1098{
1099 struct mcp251x_platform_data *pdata = spi->dev.platform_data;
1100 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
1101 struct net_device *net = priv->net;
1102
Christian Pellegrinbf66f372010-02-03 07:39:54 +00001103 priv->force_quit = 1;
1104 disable_irq(spi->irq);
1105 /*
1106 * Note: at this point neither IST nor workqueues are running.
1107 * open/stop cannot be called anyway so locking is not needed
1108 */
Christian Pellegrine0000162009-11-02 23:07:00 +00001109 if (netif_running(net)) {
1110 netif_device_detach(net);
1111
1112 mcp251x_hw_sleep(spi);
1113 if (pdata->transceiver_enable)
1114 pdata->transceiver_enable(0);
1115 priv->after_suspend = AFTER_SUSPEND_UP;
1116 } else {
1117 priv->after_suspend = AFTER_SUSPEND_DOWN;
1118 }
1119
1120 if (pdata->power_enable) {
1121 pdata->power_enable(0);
1122 priv->after_suspend |= AFTER_SUSPEND_POWER;
1123 }
1124
1125 return 0;
1126}
1127
1128static int mcp251x_can_resume(struct spi_device *spi)
1129{
1130 struct mcp251x_platform_data *pdata = spi->dev.platform_data;
1131 struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
1132
1133 if (priv->after_suspend & AFTER_SUSPEND_POWER) {
1134 pdata->power_enable(1);
Christian Pellegrinbf66f372010-02-03 07:39:54 +00001135 queue_work(priv->wq, &priv->restart_work);
Christian Pellegrine0000162009-11-02 23:07:00 +00001136 } else {
1137 if (priv->after_suspend & AFTER_SUSPEND_UP) {
1138 if (pdata->transceiver_enable)
1139 pdata->transceiver_enable(1);
Christian Pellegrinbf66f372010-02-03 07:39:54 +00001140 queue_work(priv->wq, &priv->restart_work);
Christian Pellegrine0000162009-11-02 23:07:00 +00001141 } else {
1142 priv->after_suspend = 0;
1143 }
1144 }
Christian Pellegrinbf66f372010-02-03 07:39:54 +00001145 priv->force_quit = 0;
1146 enable_irq(spi->irq);
Christian Pellegrine0000162009-11-02 23:07:00 +00001147 return 0;
1148}
1149#else
1150#define mcp251x_can_suspend NULL
1151#define mcp251x_can_resume NULL
1152#endif
1153
Marc Kleine-Buddef1f8c6c2010-10-18 15:00:18 +02001154static const struct spi_device_id mcp251x_id_table[] = {
Marc Zyngiere4466302010-03-29 08:57:56 +00001155 { "mcp2510", CAN_MCP251X_MCP2510 },
1156 { "mcp2515", CAN_MCP251X_MCP2515 },
1157 { },
1158};
1159
1160MODULE_DEVICE_TABLE(spi, mcp251x_id_table);
1161
Christian Pellegrine0000162009-11-02 23:07:00 +00001162static struct spi_driver mcp251x_can_driver = {
1163 .driver = {
1164 .name = DEVICE_NAME,
1165 .bus = &spi_bus_type,
1166 .owner = THIS_MODULE,
1167 },
1168
Marc Zyngiere4466302010-03-29 08:57:56 +00001169 .id_table = mcp251x_id_table,
Christian Pellegrine0000162009-11-02 23:07:00 +00001170 .probe = mcp251x_can_probe,
1171 .remove = __devexit_p(mcp251x_can_remove),
1172 .suspend = mcp251x_can_suspend,
1173 .resume = mcp251x_can_resume,
1174};
1175
1176static int __init mcp251x_can_init(void)
1177{
1178 return spi_register_driver(&mcp251x_can_driver);
1179}
1180
1181static void __exit mcp251x_can_exit(void)
1182{
1183 spi_unregister_driver(&mcp251x_can_driver);
1184}
1185
1186module_init(mcp251x_can_init);
1187module_exit(mcp251x_can_exit);
1188
1189MODULE_AUTHOR("Chris Elston <celston@katalix.com>, "
1190 "Christian Pellegrin <chripell@evolware.org>");
1191MODULE_DESCRIPTION("Microchip 251x CAN driver");
1192MODULE_LICENSE("GPL v2");