bfin_can.c 18 KB

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