bfin_can.c 16 KB

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