bfin_can.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. /*
  2. * Blackfin On-Chip CAN Driver
  3. *
  4. * Copyright 2004-2009 Analog Devices Inc.
  5. *
  6. * Enter bugs at http://blackfin.uclinux.org/
  7. *
  8. * Licensed under the GPL-2 or later.
  9. */
  10. #include <linux/module.h>
  11. #include <linux/init.h>
  12. #include <linux/kernel.h>
  13. #include <linux/bitops.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/errno.h>
  16. #include <linux/netdevice.h>
  17. #include <linux/skbuff.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/can.h>
  20. #include <linux/can/dev.h>
  21. #include <linux/can/error.h>
  22. #include <asm/portmux.h>
  23. #define DRV_NAME "bfin_can"
  24. #define BFIN_CAN_TIMEOUT 100
  25. #define TX_ECHO_SKB_MAX 1
  26. /*
  27. * transmit and receive channels
  28. */
  29. #define TRANSMIT_CHL 24
  30. #define RECEIVE_STD_CHL 0
  31. #define RECEIVE_EXT_CHL 4
  32. #define RECEIVE_RTR_CHL 8
  33. #define RECEIVE_EXT_RTR_CHL 12
  34. #define MAX_CHL_NUMBER 32
  35. /*
  36. * bfin can registers layout
  37. */
  38. struct bfin_can_mask_regs {
  39. u16 aml;
  40. u16 dummy1;
  41. u16 amh;
  42. u16 dummy2;
  43. };
  44. struct bfin_can_channel_regs {
  45. u16 data[8];
  46. u16 dlc;
  47. u16 dummy1;
  48. u16 tsv;
  49. u16 dummy2;
  50. u16 id0;
  51. u16 dummy3;
  52. u16 id1;
  53. u16 dummy4;
  54. };
  55. struct bfin_can_regs {
  56. /*
  57. * global control and status registers
  58. */
  59. u16 mc1; /* offset 0 */
  60. u16 dummy1;
  61. u16 md1; /* offset 4 */
  62. u16 rsv1[13];
  63. u16 mbtif1; /* offset 0x20 */
  64. u16 dummy2;
  65. u16 mbrif1; /* offset 0x24 */
  66. u16 dummy3;
  67. u16 mbim1; /* offset 0x28 */
  68. u16 rsv2[11];
  69. u16 mc2; /* offset 0x40 */
  70. u16 dummy4;
  71. u16 md2; /* offset 0x44 */
  72. u16 dummy5;
  73. u16 trs2; /* offset 0x48 */
  74. u16 rsv3[11];
  75. u16 mbtif2; /* offset 0x60 */
  76. u16 dummy6;
  77. u16 mbrif2; /* offset 0x64 */
  78. u16 dummy7;
  79. u16 mbim2; /* offset 0x68 */
  80. u16 rsv4[11];
  81. u16 clk; /* offset 0x80 */
  82. u16 dummy8;
  83. u16 timing; /* offset 0x84 */
  84. u16 rsv5[3];
  85. u16 status; /* offset 0x8c */
  86. u16 dummy9;
  87. u16 cec; /* offset 0x90 */
  88. u16 dummy10;
  89. u16 gis; /* offset 0x94 */
  90. u16 dummy11;
  91. u16 gim; /* offset 0x98 */
  92. u16 rsv6[3];
  93. u16 ctrl; /* offset 0xa0 */
  94. u16 dummy12;
  95. u16 intr; /* offset 0xa4 */
  96. u16 rsv7[7];
  97. u16 esr; /* offset 0xb4 */
  98. u16 rsv8[37];
  99. /*
  100. * channel(mailbox) mask and message registers
  101. */
  102. struct bfin_can_mask_regs msk[MAX_CHL_NUMBER]; /* offset 0x100 */
  103. struct bfin_can_channel_regs chl[MAX_CHL_NUMBER]; /* offset 0x200 */
  104. };
  105. /*
  106. * bfin can private data
  107. */
  108. struct bfin_can_priv {
  109. struct can_priv can; /* must be the first member */
  110. struct net_device *dev;
  111. void __iomem *membase;
  112. int rx_irq;
  113. int tx_irq;
  114. int err_irq;
  115. unsigned short *pin_list;
  116. };
  117. /*
  118. * bfin can timing parameters
  119. */
  120. static struct can_bittiming_const bfin_can_bittiming_const = {
  121. .name = DRV_NAME,
  122. .tseg1_min = 1,
  123. .tseg1_max = 16,
  124. .tseg2_min = 1,
  125. .tseg2_max = 8,
  126. .sjw_max = 4,
  127. /*
  128. * Although the BRP field can be set to any value, it is recommended
  129. * that the value be greater than or equal to 4, as restrictions
  130. * apply to the bit timing configuration when BRP is less than 4.
  131. */
  132. .brp_min = 4,
  133. .brp_max = 1024,
  134. .brp_inc = 1,
  135. };
  136. static int bfin_can_set_bittiming(struct net_device *dev)
  137. {
  138. struct bfin_can_priv *priv = netdev_priv(dev);
  139. struct bfin_can_regs __iomem *reg = priv->membase;
  140. struct can_bittiming *bt = &priv->can.bittiming;
  141. u16 clk, timing;
  142. clk = bt->brp - 1;
  143. timing = ((bt->sjw - 1) << 8) | (bt->prop_seg + bt->phase_seg1 - 1) |
  144. ((bt->phase_seg2 - 1) << 4);
  145. /*
  146. * If the SAM bit is set, the input signal is oversampled three times
  147. * at the SCLK rate.
  148. */
  149. if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)
  150. timing |= SAM;
  151. bfin_write16(&reg->clk, clk);
  152. bfin_write16(&reg->timing, timing);
  153. dev_info(dev->dev.parent, "setting CLOCK=0x%04x TIMING=0x%04x\n",
  154. clk, timing);
  155. return 0;
  156. }
  157. static void bfin_can_set_reset_mode(struct net_device *dev)
  158. {
  159. struct bfin_can_priv *priv = netdev_priv(dev);
  160. struct bfin_can_regs __iomem *reg = priv->membase;
  161. int timeout = BFIN_CAN_TIMEOUT;
  162. int i;
  163. /* disable interrupts */
  164. bfin_write16(&reg->mbim1, 0);
  165. bfin_write16(&reg->mbim2, 0);
  166. bfin_write16(&reg->gim, 0);
  167. /* reset can and enter configuration mode */
  168. bfin_write16(&reg->ctrl, SRS | CCR);
  169. SSYNC();
  170. bfin_write16(&reg->ctrl, CCR);
  171. SSYNC();
  172. while (!(bfin_read16(&reg->ctrl) & CCA)) {
  173. udelay(10);
  174. if (--timeout == 0) {
  175. dev_err(dev->dev.parent,
  176. "fail to enter configuration mode\n");
  177. BUG();
  178. }
  179. }
  180. /*
  181. * All mailbox configurations are marked as inactive
  182. * by writing to CAN Mailbox Configuration Registers 1 and 2
  183. * For all bits: 0 - Mailbox disabled, 1 - Mailbox enabled
  184. */
  185. bfin_write16(&reg->mc1, 0);
  186. bfin_write16(&reg->mc2, 0);
  187. /* Set Mailbox Direction */
  188. bfin_write16(&reg->md1, 0xFFFF); /* mailbox 1-16 are RX */
  189. bfin_write16(&reg->md2, 0); /* mailbox 17-32 are TX */
  190. /* RECEIVE_STD_CHL */
  191. for (i = 0; i < 2; i++) {
  192. bfin_write16(&reg->chl[RECEIVE_STD_CHL + i].id0, 0);
  193. bfin_write16(&reg->chl[RECEIVE_STD_CHL + i].id1, AME);
  194. bfin_write16(&reg->chl[RECEIVE_STD_CHL + i].dlc, 0);
  195. bfin_write16(&reg->msk[RECEIVE_STD_CHL + i].amh, 0x1FFF);
  196. bfin_write16(&reg->msk[RECEIVE_STD_CHL + i].aml, 0xFFFF);
  197. }
  198. /* RECEIVE_EXT_CHL */
  199. for (i = 0; i < 2; i++) {
  200. bfin_write16(&reg->chl[RECEIVE_EXT_CHL + i].id0, 0);
  201. bfin_write16(&reg->chl[RECEIVE_EXT_CHL + i].id1, AME | IDE);
  202. bfin_write16(&reg->chl[RECEIVE_EXT_CHL + i].dlc, 0);
  203. bfin_write16(&reg->msk[RECEIVE_EXT_CHL + i].amh, 0x1FFF);
  204. bfin_write16(&reg->msk[RECEIVE_EXT_CHL + i].aml, 0xFFFF);
  205. }
  206. bfin_write16(&reg->mc2, BIT(TRANSMIT_CHL - 16));
  207. bfin_write16(&reg->mc1, BIT(RECEIVE_STD_CHL) + BIT(RECEIVE_EXT_CHL));
  208. SSYNC();
  209. priv->can.state = CAN_STATE_STOPPED;
  210. }
  211. static void bfin_can_set_normal_mode(struct net_device *dev)
  212. {
  213. struct bfin_can_priv *priv = netdev_priv(dev);
  214. struct bfin_can_regs __iomem *reg = priv->membase;
  215. int timeout = BFIN_CAN_TIMEOUT;
  216. /*
  217. * leave configuration mode
  218. */
  219. bfin_write16(&reg->ctrl, bfin_read16(&reg->ctrl) & ~CCR);
  220. while (bfin_read16(&reg->status) & CCA) {
  221. udelay(10);
  222. if (--timeout == 0) {
  223. dev_err(dev->dev.parent,
  224. "fail to leave configuration mode\n");
  225. BUG();
  226. }
  227. }
  228. /*
  229. * clear _All_ tx and rx interrupts
  230. */
  231. bfin_write16(&reg->mbtif1, 0xFFFF);
  232. bfin_write16(&reg->mbtif2, 0xFFFF);
  233. bfin_write16(&reg->mbrif1, 0xFFFF);
  234. bfin_write16(&reg->mbrif2, 0xFFFF);
  235. /*
  236. * clear global interrupt status register
  237. */
  238. bfin_write16(&reg->gis, 0x7FF); /* overwrites with '1' */
  239. /*
  240. * Initialize Interrupts
  241. * - set bits in the mailbox interrupt mask register
  242. * - global interrupt mask
  243. */
  244. bfin_write16(&reg->mbim1, BIT(RECEIVE_STD_CHL) + BIT(RECEIVE_EXT_CHL));
  245. bfin_write16(&reg->mbim2, BIT(TRANSMIT_CHL - 16));
  246. bfin_write16(&reg->gim, EPIM | BOIM | RMLIM);
  247. SSYNC();
  248. }
  249. static void bfin_can_start(struct net_device *dev)
  250. {
  251. struct bfin_can_priv *priv = netdev_priv(dev);
  252. /* enter reset mode */
  253. if (priv->can.state != CAN_STATE_STOPPED)
  254. bfin_can_set_reset_mode(dev);
  255. /* leave reset mode */
  256. bfin_can_set_normal_mode(dev);
  257. }
  258. static int bfin_can_set_mode(struct net_device *dev, enum can_mode mode)
  259. {
  260. switch (mode) {
  261. case CAN_MODE_START:
  262. bfin_can_start(dev);
  263. if (netif_queue_stopped(dev))
  264. netif_wake_queue(dev);
  265. break;
  266. default:
  267. return -EOPNOTSUPP;
  268. }
  269. return 0;
  270. }
  271. static int bfin_can_start_xmit(struct sk_buff *skb, struct net_device *dev)
  272. {
  273. struct bfin_can_priv *priv = netdev_priv(dev);
  274. struct bfin_can_regs __iomem *reg = priv->membase;
  275. struct can_frame *cf = (struct can_frame *)skb->data;
  276. u8 dlc = cf->can_dlc;
  277. canid_t id = cf->can_id;
  278. u8 *data = cf->data;
  279. u16 val;
  280. int i;
  281. if (can_dropped_invalid_skb(dev, skb))
  282. return NETDEV_TX_OK;
  283. netif_stop_queue(dev);
  284. /* fill id */
  285. if (id & CAN_EFF_FLAG) {
  286. bfin_write16(&reg->chl[TRANSMIT_CHL].id0, id);
  287. if (id & CAN_RTR_FLAG)
  288. writew(((id & 0x1FFF0000) >> 16) | IDE | AME | RTR,
  289. &reg->chl[TRANSMIT_CHL].id1);
  290. else
  291. writew(((id & 0x1FFF0000) >> 16) | IDE | AME,
  292. &reg->chl[TRANSMIT_CHL].id1);
  293. } else {
  294. if (id & CAN_RTR_FLAG)
  295. writew((id << 2) | AME | RTR,
  296. &reg->chl[TRANSMIT_CHL].id1);
  297. else
  298. bfin_write16(&reg->chl[TRANSMIT_CHL].id1,
  299. (id << 2) | AME);
  300. }
  301. /* fill payload */
  302. for (i = 0; i < 8; i += 2) {
  303. val = ((7 - i) < dlc ? (data[7 - i]) : 0) +
  304. ((6 - i) < dlc ? (data[6 - i] << 8) : 0);
  305. bfin_write16(&reg->chl[TRANSMIT_CHL].data[i], val);
  306. }
  307. /* fill data length code */
  308. bfin_write16(&reg->chl[TRANSMIT_CHL].dlc, dlc);
  309. dev->trans_start = jiffies;
  310. can_put_echo_skb(skb, dev, 0);
  311. /* set transmit request */
  312. bfin_write16(&reg->trs2, BIT(TRANSMIT_CHL - 16));
  313. return 0;
  314. }
  315. static void bfin_can_rx(struct net_device *dev, u16 isrc)
  316. {
  317. struct bfin_can_priv *priv = netdev_priv(dev);
  318. struct net_device_stats *stats = &dev->stats;
  319. struct bfin_can_regs __iomem *reg = priv->membase;
  320. struct can_frame *cf;
  321. struct sk_buff *skb;
  322. int obj;
  323. int i;
  324. u16 val;
  325. skb = alloc_can_skb(dev, &cf);
  326. if (skb == NULL)
  327. return;
  328. /* get id */
  329. if (isrc & BIT(RECEIVE_EXT_CHL)) {
  330. /* extended frame format (EFF) */
  331. cf->can_id = ((bfin_read16(&reg->chl[RECEIVE_EXT_CHL].id1)
  332. & 0x1FFF) << 16)
  333. + bfin_read16(&reg->chl[RECEIVE_EXT_CHL].id0);
  334. cf->can_id |= CAN_EFF_FLAG;
  335. obj = RECEIVE_EXT_CHL;
  336. } else {
  337. /* standard frame format (SFF) */
  338. cf->can_id = (bfin_read16(&reg->chl[RECEIVE_STD_CHL].id1)
  339. & 0x1ffc) >> 2;
  340. obj = RECEIVE_STD_CHL;
  341. }
  342. if (bfin_read16(&reg->chl[obj].id1) & RTR)
  343. cf->can_id |= CAN_RTR_FLAG;
  344. /* get data length code */
  345. cf->can_dlc = get_can_dlc(bfin_read16(&reg->chl[obj].dlc) & 0xF);
  346. /* get payload */
  347. for (i = 0; i < 8; i += 2) {
  348. val = bfin_read16(&reg->chl[obj].data[i]);
  349. cf->data[7 - i] = (7 - i) < cf->can_dlc ? val : 0;
  350. cf->data[6 - i] = (6 - i) < cf->can_dlc ? (val >> 8) : 0;
  351. }
  352. netif_rx(skb);
  353. stats->rx_packets++;
  354. stats->rx_bytes += cf->can_dlc;
  355. }
  356. static int bfin_can_err(struct net_device *dev, u16 isrc, u16 status)
  357. {
  358. struct bfin_can_priv *priv = netdev_priv(dev);
  359. struct bfin_can_regs __iomem *reg = priv->membase;
  360. struct net_device_stats *stats = &dev->stats;
  361. struct can_frame *cf;
  362. struct sk_buff *skb;
  363. enum can_state state = priv->can.state;
  364. skb = alloc_can_err_skb(dev, &cf);
  365. if (skb == NULL)
  366. return -ENOMEM;
  367. if (isrc & RMLIS) {
  368. /* data overrun interrupt */
  369. dev_dbg(dev->dev.parent, "data overrun interrupt\n");
  370. cf->can_id |= CAN_ERR_CRTL;
  371. cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW;
  372. stats->rx_over_errors++;
  373. stats->rx_errors++;
  374. }
  375. if (isrc & BOIS) {
  376. dev_dbg(dev->dev.parent, "bus-off mode interrupt\n");
  377. state = CAN_STATE_BUS_OFF;
  378. cf->can_id |= CAN_ERR_BUSOFF;
  379. can_bus_off(dev);
  380. }
  381. if (isrc & EPIS) {
  382. /* error passive interrupt */
  383. dev_dbg(dev->dev.parent, "error passive interrupt\n");
  384. state = CAN_STATE_ERROR_PASSIVE;
  385. }
  386. if ((isrc & EWTIS) || (isrc & EWRIS)) {
  387. dev_dbg(dev->dev.parent,
  388. "Error Warning Transmit/Receive Interrupt\n");
  389. state = CAN_STATE_ERROR_WARNING;
  390. }
  391. if (state != priv->can.state && (state == CAN_STATE_ERROR_WARNING ||
  392. state == CAN_STATE_ERROR_PASSIVE)) {
  393. u16 cec = bfin_read16(&reg->cec);
  394. u8 rxerr = cec;
  395. u8 txerr = cec >> 8;
  396. cf->can_id |= CAN_ERR_CRTL;
  397. if (state == CAN_STATE_ERROR_WARNING) {
  398. priv->can.can_stats.error_warning++;
  399. cf->data[1] = (txerr > rxerr) ?
  400. CAN_ERR_CRTL_TX_WARNING :
  401. CAN_ERR_CRTL_RX_WARNING;
  402. } else {
  403. priv->can.can_stats.error_passive++;
  404. cf->data[1] = (txerr > rxerr) ?
  405. CAN_ERR_CRTL_TX_PASSIVE :
  406. CAN_ERR_CRTL_RX_PASSIVE;
  407. }
  408. }
  409. if (status) {
  410. priv->can.can_stats.bus_error++;
  411. cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR;
  412. if (status & BEF)
  413. cf->data[2] |= CAN_ERR_PROT_BIT;
  414. else if (status & FER)
  415. cf->data[2] |= CAN_ERR_PROT_FORM;
  416. else if (status & SER)
  417. cf->data[2] |= CAN_ERR_PROT_STUFF;
  418. else
  419. cf->data[2] |= CAN_ERR_PROT_UNSPEC;
  420. }
  421. priv->can.state = state;
  422. netif_rx(skb);
  423. stats->rx_packets++;
  424. stats->rx_bytes += cf->can_dlc;
  425. return 0;
  426. }
  427. irqreturn_t bfin_can_interrupt(int irq, void *dev_id)
  428. {
  429. struct net_device *dev = dev_id;
  430. struct bfin_can_priv *priv = netdev_priv(dev);
  431. struct bfin_can_regs __iomem *reg = priv->membase;
  432. struct net_device_stats *stats = &dev->stats;
  433. u16 status, isrc;
  434. if ((irq == priv->tx_irq) && bfin_read16(&reg->mbtif2)) {
  435. /* transmission complete interrupt */
  436. bfin_write16(&reg->mbtif2, 0xFFFF);
  437. stats->tx_packets++;
  438. stats->tx_bytes += bfin_read16(&reg->chl[TRANSMIT_CHL].dlc);
  439. can_get_echo_skb(dev, 0);
  440. netif_wake_queue(dev);
  441. } else if ((irq == priv->rx_irq) && bfin_read16(&reg->mbrif1)) {
  442. /* receive interrupt */
  443. isrc = bfin_read16(&reg->mbrif1);
  444. bfin_write16(&reg->mbrif1, 0xFFFF);
  445. bfin_can_rx(dev, isrc);
  446. } else if ((irq == priv->err_irq) && bfin_read16(&reg->gis)) {
  447. /* error interrupt */
  448. isrc = bfin_read16(&reg->gis);
  449. status = bfin_read16(&reg->esr);
  450. bfin_write16(&reg->gis, 0x7FF);
  451. bfin_can_err(dev, isrc, status);
  452. } else {
  453. return IRQ_NONE;
  454. }
  455. return IRQ_HANDLED;
  456. }
  457. static int bfin_can_open(struct net_device *dev)
  458. {
  459. struct bfin_can_priv *priv = netdev_priv(dev);
  460. int err;
  461. /* set chip into reset mode */
  462. bfin_can_set_reset_mode(dev);
  463. /* common open */
  464. err = open_candev(dev);
  465. if (err)
  466. goto exit_open;
  467. /* register interrupt handler */
  468. err = request_irq(priv->rx_irq, &bfin_can_interrupt, 0,
  469. "bfin-can-rx", dev);
  470. if (err)
  471. goto exit_rx_irq;
  472. err = request_irq(priv->tx_irq, &bfin_can_interrupt, 0,
  473. "bfin-can-tx", dev);
  474. if (err)
  475. goto exit_tx_irq;
  476. err = request_irq(priv->err_irq, &bfin_can_interrupt, 0,
  477. "bfin-can-err", dev);
  478. if (err)
  479. goto exit_err_irq;
  480. bfin_can_start(dev);
  481. netif_start_queue(dev);
  482. return 0;
  483. exit_err_irq:
  484. free_irq(priv->tx_irq, dev);
  485. exit_tx_irq:
  486. free_irq(priv->rx_irq, dev);
  487. exit_rx_irq:
  488. close_candev(dev);
  489. exit_open:
  490. return err;
  491. }
  492. static int bfin_can_close(struct net_device *dev)
  493. {
  494. struct bfin_can_priv *priv = netdev_priv(dev);
  495. netif_stop_queue(dev);
  496. bfin_can_set_reset_mode(dev);
  497. close_candev(dev);
  498. free_irq(priv->rx_irq, dev);
  499. free_irq(priv->tx_irq, dev);
  500. free_irq(priv->err_irq, dev);
  501. return 0;
  502. }
  503. struct net_device *alloc_bfin_candev(void)
  504. {
  505. struct net_device *dev;
  506. struct bfin_can_priv *priv;
  507. dev = alloc_candev(sizeof(*priv), TX_ECHO_SKB_MAX);
  508. if (!dev)
  509. return NULL;
  510. priv = netdev_priv(dev);
  511. priv->dev = dev;
  512. priv->can.bittiming_const = &bfin_can_bittiming_const;
  513. priv->can.do_set_bittiming = bfin_can_set_bittiming;
  514. priv->can.do_set_mode = bfin_can_set_mode;
  515. priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES;
  516. return dev;
  517. }
  518. static const struct net_device_ops bfin_can_netdev_ops = {
  519. .ndo_open = bfin_can_open,
  520. .ndo_stop = bfin_can_close,
  521. .ndo_start_xmit = bfin_can_start_xmit,
  522. };
  523. static int __devinit bfin_can_probe(struct platform_device *pdev)
  524. {
  525. int err;
  526. struct net_device *dev;
  527. struct bfin_can_priv *priv;
  528. struct resource *res_mem, *rx_irq, *tx_irq, *err_irq;
  529. unsigned short *pdata;
  530. pdata = pdev->dev.platform_data;
  531. if (!pdata) {
  532. dev_err(&pdev->dev, "No platform data provided!\n");
  533. err = -EINVAL;
  534. goto exit;
  535. }
  536. res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  537. rx_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
  538. tx_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
  539. err_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 2);
  540. if (!res_mem || !rx_irq || !tx_irq || !err_irq) {
  541. err = -EINVAL;
  542. goto exit;
  543. }
  544. if (!request_mem_region(res_mem->start, resource_size(res_mem),
  545. dev_name(&pdev->dev))) {
  546. err = -EBUSY;
  547. goto exit;
  548. }
  549. /* request peripheral pins */
  550. err = peripheral_request_list(pdata, dev_name(&pdev->dev));
  551. if (err)
  552. goto exit_mem_release;
  553. dev = alloc_bfin_candev();
  554. if (!dev) {
  555. err = -ENOMEM;
  556. goto exit_peri_pin_free;
  557. }
  558. priv = netdev_priv(dev);
  559. priv->membase = (void __iomem *)res_mem->start;
  560. priv->rx_irq = rx_irq->start;
  561. priv->tx_irq = tx_irq->start;
  562. priv->err_irq = err_irq->start;
  563. priv->pin_list = pdata;
  564. priv->can.clock.freq = get_sclk();
  565. dev_set_drvdata(&pdev->dev, dev);
  566. SET_NETDEV_DEV(dev, &pdev->dev);
  567. dev->flags |= IFF_ECHO; /* we support local echo */
  568. dev->netdev_ops = &bfin_can_netdev_ops;
  569. bfin_can_set_reset_mode(dev);
  570. err = register_candev(dev);
  571. if (err) {
  572. dev_err(&pdev->dev, "registering failed (err=%d)\n", err);
  573. goto exit_candev_free;
  574. }
  575. dev_info(&pdev->dev,
  576. "%s device registered"
  577. "(&reg_base=%p, rx_irq=%d, tx_irq=%d, err_irq=%d, sclk=%d)\n",
  578. DRV_NAME, (void *)priv->membase, priv->rx_irq,
  579. priv->tx_irq, priv->err_irq, priv->can.clock.freq);
  580. return 0;
  581. exit_candev_free:
  582. free_candev(dev);
  583. exit_peri_pin_free:
  584. peripheral_free_list(pdata);
  585. exit_mem_release:
  586. release_mem_region(res_mem->start, resource_size(res_mem));
  587. exit:
  588. return err;
  589. }
  590. static int __devexit bfin_can_remove(struct platform_device *pdev)
  591. {
  592. struct net_device *dev = dev_get_drvdata(&pdev->dev);
  593. struct bfin_can_priv *priv = netdev_priv(dev);
  594. struct resource *res;
  595. bfin_can_set_reset_mode(dev);
  596. unregister_candev(dev);
  597. dev_set_drvdata(&pdev->dev, NULL);
  598. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  599. release_mem_region(res->start, resource_size(res));
  600. peripheral_free_list(priv->pin_list);
  601. free_candev(dev);
  602. return 0;
  603. }
  604. #ifdef CONFIG_PM
  605. static int bfin_can_suspend(struct platform_device *pdev, pm_message_t mesg)
  606. {
  607. struct net_device *dev = dev_get_drvdata(&pdev->dev);
  608. struct bfin_can_priv *priv = netdev_priv(dev);
  609. struct bfin_can_regs __iomem *reg = priv->membase;
  610. int timeout = BFIN_CAN_TIMEOUT;
  611. if (netif_running(dev)) {
  612. /* enter sleep mode */
  613. bfin_write16(&reg->ctrl, bfin_read16(&reg->ctrl) | SMR);
  614. SSYNC();
  615. while (!(bfin_read16(&reg->intr) & SMACK)) {
  616. udelay(10);
  617. if (--timeout == 0) {
  618. dev_err(dev->dev.parent,
  619. "fail to enter sleep mode\n");
  620. BUG();
  621. }
  622. }
  623. }
  624. return 0;
  625. }
  626. static int bfin_can_resume(struct platform_device *pdev)
  627. {
  628. struct net_device *dev = dev_get_drvdata(&pdev->dev);
  629. struct bfin_can_priv *priv = netdev_priv(dev);
  630. struct bfin_can_regs __iomem *reg = priv->membase;
  631. if (netif_running(dev)) {
  632. /* leave sleep mode */
  633. bfin_write16(&reg->intr, 0);
  634. SSYNC();
  635. }
  636. return 0;
  637. }
  638. #else
  639. #define bfin_can_suspend NULL
  640. #define bfin_can_resume NULL
  641. #endif /* CONFIG_PM */
  642. static struct platform_driver bfin_can_driver = {
  643. .probe = bfin_can_probe,
  644. .remove = __devexit_p(bfin_can_remove),
  645. .suspend = bfin_can_suspend,
  646. .resume = bfin_can_resume,
  647. .driver = {
  648. .name = DRV_NAME,
  649. .owner = THIS_MODULE,
  650. },
  651. };
  652. static int __init bfin_can_init(void)
  653. {
  654. return platform_driver_register(&bfin_can_driver);
  655. }
  656. module_init(bfin_can_init);
  657. static void __exit bfin_can_exit(void)
  658. {
  659. platform_driver_unregister(&bfin_can_driver);
  660. }
  661. module_exit(bfin_can_exit);
  662. MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
  663. MODULE_LICENSE("GPL");
  664. MODULE_DESCRIPTION("Blackfin on-chip CAN netdevice driver");