dma-sa1100.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:14k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * arch/arm/kernel/dma-sa1100.c
  3.  *
  4.  * Support functions for the SA11x0 internal DMA channels.
  5.  * (see also Documentation/arm/SA1100/DMA)
  6.  *
  7.  * Copyright (C) 2000 Nicolas Pitre
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License version 2 as
  11.  * published by the Free Software Foundation.
  12.  *
  13.  */
  14. #include <linux/module.h>
  15. #include <linux/init.h>
  16. #include <linux/sched.h>
  17. #include <linux/spinlock.h>
  18. #include <linux/slab.h>
  19. #include <linux/errno.h>
  20. #include <asm/system.h>
  21. #include <asm/irq.h>
  22. #include <asm/hardware.h>
  23. #include <asm/io.h>
  24. #include <asm/dma.h>
  25. #include <asm/mach/dma.h>
  26. #undef DEBUG
  27. #ifdef DEBUG
  28. #define DPRINTK( s, arg... )  printk( "dma<%s>: " s, dma->device_id , ##arg )
  29. #else
  30. #define DPRINTK( x... )
  31. #endif
  32. /*
  33.  * DMA control register structure
  34.  */
  35. typedef struct {
  36. volatile u_long DDAR;
  37. volatile u_long SetDCSR;
  38. volatile u_long ClrDCSR;
  39. volatile u_long RdDCSR;
  40. volatile dma_addr_t DBSA;
  41. volatile u_long DBTA;
  42. volatile dma_addr_t DBSB;
  43. volatile u_long DBTB;
  44. } dma_regs_t;
  45. #include "dma.h"
  46. sa1100_dma_t dma_chan[MAX_SA1100_DMA_CHANNELS];
  47. /*
  48.  * Maximum physical DMA buffer size
  49.  */
  50. #define MAX_DMA_SIZE 0x1fff
  51. #define MAX_DMA_ORDER 12
  52. /*
  53.  * DMA processing...
  54.  */
  55. static inline int start_sa1100_dma(sa1100_dma_t * dma, dma_addr_t dma_ptr, int size)
  56. {
  57. dma_regs_t *regs = dma->regs;
  58. int status;
  59. status = regs->RdDCSR;
  60. /* If both DMA buffers are started, there's nothing else we can do. */
  61. if ((status & (DCSR_STRTA | DCSR_STRTB)) == (DCSR_STRTA | DCSR_STRTB)) {
  62. DPRINTK("start: st %#x busyn", status);
  63. return -EBUSY;
  64. }
  65. if (((status & DCSR_BIU) && (status & DCSR_STRTB)) ||
  66.     (!(status & DCSR_BIU) && !(status & DCSR_STRTA))) {
  67. if (status & DCSR_DONEA) {
  68. /* give a chance for the interrupt to be processed */
  69. goto irq_pending;
  70. }
  71. regs->DBSA = dma_ptr;
  72. regs->DBTA = size;
  73. regs->SetDCSR = DCSR_STRTA | DCSR_IE | DCSR_RUN;
  74. DPRINTK("start a=%#x s=%d on An", dma_ptr, size);
  75. } else {
  76. if (status & DCSR_DONEB) {
  77. /* give a chance for the interrupt to be processed */
  78. goto irq_pending;
  79. }
  80. regs->DBSB = dma_ptr;
  81. regs->DBTB = size;
  82. regs->SetDCSR = DCSR_STRTB | DCSR_IE | DCSR_RUN;
  83. DPRINTK("start a=%#x s=%d on Bn", dma_ptr, size);
  84. }
  85. return 0;
  86. irq_pending:
  87. return -EAGAIN;
  88. }
  89. static int start_dma(sa1100_dma_t *dma, dma_addr_t dma_ptr, int size)
  90. {
  91. if (channel_is_sa1111_sac(dma - dma_chan))
  92. return start_sa1111_sac_dma(dma, dma_ptr, size);
  93. return start_sa1100_dma(dma, dma_ptr, size);
  94. }
  95. /* This must be called with IRQ disabled */
  96. static void process_dma(sa1100_dma_t * dma)
  97. {
  98. dma_buf_t *buf;
  99. int chunksize;
  100. for (;;) {
  101. buf = dma->tail;
  102. if (!buf || dma->stopped) {
  103. /* no more data available */
  104. DPRINTK("process: no more buf (dma %s)n",
  105. dma->curr ? "active" : "inactive");
  106. /*
  107.  * Some devices may require DMA still sending data
  108.  * at any time for clock reference, etc.
  109.  * Note: if there is still a data buffer being
  110.  * processed then the ref count is negative.  This
  111.  * allows for the DMA termination to be accounted in
  112.  * the proper order.
  113.  */
  114. if (dma->spin_size && dma->spin_ref >= 0) {
  115. chunksize = dma->spin_size;
  116. if (chunksize > MAX_DMA_SIZE)
  117. chunksize = (1 << MAX_DMA_ORDER);
  118. while (start_dma(dma, dma->spin_addr, chunksize) == 0)
  119. dma->spin_ref++;
  120. if (dma->curr != NULL)
  121. dma->spin_ref = -dma->spin_ref;
  122. }
  123. break;
  124. }
  125. /*
  126.  * This improves latency if there are some active spinning
  127.  * buffers.  We kill them altogether.
  128.  */
  129. if (dma->spin_ref > 0) {
  130. if (channel_is_sa1111_sac(dma - dma_chan))
  131. sa1111_reset_sac_dma(dma - dma_chan);
  132. else
  133. dma->regs->ClrDCSR =
  134.     DCSR_STRTA|DCSR_STRTB|DCSR_DONEA|DCSR_DONEB;
  135. dma->spin_ref = 0;
  136. }
  137. /*
  138.  * Let's try to start DMA on the current buffer.
  139.  * If DMA is busy then we break here.
  140.  */
  141. chunksize = buf->size;
  142. if (chunksize > MAX_DMA_SIZE)
  143. chunksize = (1 << MAX_DMA_ORDER);
  144. DPRINTK("process: b=%#x s=%dn", (int) buf->id, buf->size);
  145. if (start_dma(dma, buf->dma_ptr, chunksize) != 0)
  146. break;
  147. if (!dma->curr)
  148. dma->curr = buf;
  149. buf->ref++;
  150. buf->dma_ptr += chunksize;
  151. buf->size -= chunksize;
  152. if (buf->size == 0) {
  153. /* current buffer is done: move tail to the next one */
  154. dma->tail = buf->next;
  155. DPRINTK("process: next b=%#xn", (int) dma->tail);
  156. }
  157. }
  158. }
  159. /* This must be called with IRQ disabled */
  160. void sa1100_dma_done (sa1100_dma_t *dma)
  161. {
  162. dma_buf_t *buf = dma->curr;
  163. if (dma->spin_ref > 0) {
  164. dma->spin_ref--;
  165. } else if (buf) {
  166. buf->ref--;
  167. if (buf->ref == 0 && buf->size == 0) {
  168. /*
  169.  * Current buffer is done.
  170.  * Move current reference to the next one and send
  171.  * the processed buffer to the callback function,
  172.  * then discard it.
  173.  */
  174. DPRINTK("IRQ: buf donen");
  175. dma->curr = buf->next;
  176. dma->spin_ref = -dma->spin_ref;
  177. if (dma->head == buf)
  178. dma->head = NULL;
  179. if (dma->callback) {
  180. int size = buf->dma_ptr - buf->dma_start;
  181. dma->callback(buf->id, size);
  182. }
  183. kfree(buf);
  184. }
  185. }
  186. process_dma(dma);
  187. }
  188. static void dma_irq_handler(int irq, void *dev_id, struct pt_regs *regs)
  189. {
  190. sa1100_dma_t *dma = (sa1100_dma_t *) dev_id;
  191. int status = dma->regs->RdDCSR;
  192. DPRINTK("IRQ: b=%#x st=%#xn", (int) dma->curr->id, status);
  193. if (status & (DCSR_ERROR)) {
  194. printk(KERN_ERR "DMA on "%s" caused an errorn", dma->device_id);
  195. dma->regs->ClrDCSR = DCSR_ERROR;
  196. }
  197. dma->regs->ClrDCSR = status & (DCSR_DONEA | DCSR_DONEB);
  198. if (status & DCSR_DONEA)
  199. sa1100_dma_done (dma);
  200. if (status & DCSR_DONEB)
  201. sa1100_dma_done (dma);
  202. }
  203. /*
  204.  * DMA interface functions
  205.  */
  206. static spinlock_t dma_list_lock;
  207. int sa1100_request_dma (dmach_t * channel, const char *device_id,
  208. dma_device_t device)
  209. {
  210. sa1100_dma_t *dma = NULL;
  211. dma_regs_t *regs;
  212. int i, err;
  213. *channel = -1; /* to be sure we catch the freeing of a misregistered channel */
  214. err = 0;
  215. spin_lock(&dma_list_lock);
  216. for (i = 0; i < SA1100_DMA_CHANNELS; i++) {
  217. if (dma_chan[i].in_use) {
  218. if (dma_chan[i].device == device) {
  219. err = -EBUSY;
  220. break;
  221. }
  222. } else if (!dma) {
  223. dma = &dma_chan[i];
  224. }
  225. }
  226. if (!err) {
  227.        if (dma)
  228.        dma->in_use = 1;
  229.        else
  230.        err = -ENOSR;
  231. }
  232. spin_unlock(&dma_list_lock);
  233. if (err)
  234. return err;
  235. err = request_irq(dma->irq, dma_irq_handler, SA_INTERRUPT,
  236.   device_id, (void *) dma);
  237. if (err) {
  238. printk(KERN_ERR
  239.        "%s: unable to request IRQ %d for DMA channeln",
  240.        device_id, dma->irq);
  241. return err;
  242. }
  243. *channel = dma - dma_chan;
  244. dma->device_id = device_id;
  245. dma->device = device;
  246. dma->callback = NULL;
  247. dma->spin_size = 0;
  248. regs = dma->regs;
  249. regs->ClrDCSR =
  250. (DCSR_DONEA | DCSR_DONEB | DCSR_STRTA | DCSR_STRTB |
  251.  DCSR_IE | DCSR_ERROR | DCSR_RUN);
  252. regs->DDAR = device;
  253. DPRINTK("requestedn");
  254. return 0;
  255. }
  256. int sa1100_dma_set_callback(dmach_t channel, dma_callback_t cb)
  257. {
  258. sa1100_dma_t *dma = &dma_chan[channel];
  259. if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
  260. return -EINVAL;
  261. dma->callback = cb;
  262. DPRINTK("cb = %pn", cb);
  263. return 0;
  264. }
  265. int sa1100_dma_set_spin(dmach_t channel, dma_addr_t addr, int size)
  266. {
  267. sa1100_dma_t *dma = &dma_chan[channel];
  268. int flags;
  269. if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
  270. return -EINVAL;
  271. DPRINTK("set spin %d at %#xn", size, addr);
  272. local_irq_save(flags);
  273. dma->spin_addr = addr;
  274. dma->spin_size = size;
  275. if (size)
  276. process_dma(dma);
  277. local_irq_restore(flags);
  278. return 0;
  279. }
  280. int sa1100_dma_queue_buffer(dmach_t channel, void *buf_id,
  281.     dma_addr_t data, int size)
  282. {
  283. sa1100_dma_t *dma;
  284. dma_buf_t *buf;
  285. int flags;
  286. dma = &dma_chan[channel];
  287. if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
  288. return -EINVAL;
  289. buf = kmalloc(sizeof(*buf), GFP_ATOMIC);
  290. if (!buf)
  291. return -ENOMEM;
  292. buf->next = NULL;
  293. buf->ref = 0;
  294. buf->dma_ptr = buf->dma_start = data;
  295. buf->size = size;
  296. buf->id = buf_id;
  297. DPRINTK("queueing b=%#x a=%#x s=%dn", (int) buf_id, data, size);
  298. local_irq_save(flags);
  299. if (dma->head)
  300. dma->head->next = buf;
  301. dma->head = buf;
  302. if (!dma->tail)
  303. dma->tail = buf;
  304. process_dma(dma);
  305. local_irq_restore(flags);
  306. return 0;
  307. }
  308. int sa1100_dma_get_current(dmach_t channel, void **buf_id, dma_addr_t *addr)
  309. {
  310. sa1100_dma_t *dma = &dma_chan[channel];
  311. dma_regs_t *regs;
  312. int flags, ret;
  313. if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
  314. return -EINVAL;
  315. if (channel_is_sa1111_sac(channel))
  316. return sa1111_dma_get_current(channel, buf_id, addr);
  317. regs = dma->regs;
  318. local_irq_save(flags);
  319. if (dma->curr && dma->spin_ref <= 0) {
  320. dma_buf_t *buf = dma->curr;
  321. int status, using_bufa;
  322. status = regs->RdDCSR;
  323. /*
  324.  * If we got here, that's because there is, or recently was, a
  325.  * buffer being processed.  We must determine whether buffer
  326.  * A or B is active.  Two possibilities: either we are
  327.  * in the middle of a buffer, or the DMA controller just
  328.  * switched to the next toggle but the interrupt hasn't been
  329.  * serviced yet.  The former case is straight forward.  In
  330.  * the later case, we'll do like if DMA is just at the end
  331.  * of the previous toggle since all registers haven't been
  332.  * reset yet.  This goes around the edge case and since we're
  333.  * always a little behind anyways it shouldn't make a big
  334.  * difference.  If DMA has been stopped prior calling this
  335.  * then the position is always exact.
  336.  */
  337. using_bufa = ((!(status & DCSR_BIU) &&  (status & DCSR_STRTA)) ||
  338.       ( (status & DCSR_BIU) && !(status & DCSR_STRTB)));
  339. if (buf_id)
  340. *buf_id = buf->id;
  341. *addr = (using_bufa) ? regs->DBSA : regs->DBSB;
  342. /*
  343.  * Clamp funky pointers sometimes returned by the hardware
  344.  * on completed DMA transfers
  345.  */
  346. if (*addr < buf->dma_start ||
  347.     *addr > buf->dma_ptr)
  348. *addr = buf->dma_ptr;
  349. DPRINTK("curr_pos: b=%#x a=%#xn", (int)dma->curr->id, *addr);
  350. ret = 0;
  351. } else if (dma->tail && dma->stopped) {
  352. dma_buf_t *buf = dma->tail;
  353. if (buf_id)
  354. *buf_id = buf->id;
  355. *addr = buf->dma_ptr;
  356. ret = 0;
  357. } else {
  358. if (buf_id)
  359. *buf_id = NULL;
  360. *addr = 0;
  361. ret = -ENXIO;
  362. }
  363. local_irq_restore(flags);
  364. return ret;
  365. }
  366. int sa1100_dma_stop(dmach_t channel)
  367. {
  368. sa1100_dma_t *dma = &dma_chan[channel];
  369. int flags;
  370. if (channel_is_sa1111_sac(channel))
  371. return sa1111_dma_stop(channel);
  372. if (dma->stopped)
  373. return 0;
  374. local_irq_save(flags);
  375. dma->stopped = 1;
  376. /*
  377.  * Stop DMA and tweak state variables so everything could restart
  378.  * from there when resume/wakeup occurs.
  379.  */
  380. dma->regs->ClrDCSR = DCSR_RUN | DCSR_IE;
  381. if (dma->curr) {
  382. dma_buf_t *buf = dma->curr;
  383. if (dma->spin_ref <= 0) {
  384. dma_addr_t curpos;
  385. sa1100_dma_get_current(channel, NULL, &curpos);
  386. buf->size += buf->dma_ptr - curpos;
  387. buf->dma_ptr = curpos;
  388. }
  389. buf->ref = 0;
  390. dma->tail = buf;
  391. dma->curr = NULL;
  392. }
  393. dma->spin_ref = 0;
  394. dma->regs->ClrDCSR = DCSR_STRTA|DCSR_STRTB|DCSR_DONEA|DCSR_DONEB;
  395. process_dma(dma);
  396. local_irq_restore(flags);
  397. return 0;
  398. }
  399. int sa1100_dma_resume(dmach_t channel)
  400. {
  401. sa1100_dma_t *dma = &dma_chan[channel];
  402. if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
  403. return -EINVAL;
  404. if (channel_is_sa1111_sac(channel))
  405. return sa1111_dma_resume(channel);
  406. if (dma->stopped) {
  407. int flags;
  408. save_flags_cli(flags);
  409. dma->stopped = 0;
  410. process_dma(dma);
  411. restore_flags(flags);
  412. }
  413. return 0;
  414. }
  415. int sa1100_dma_flush_all(dmach_t channel)
  416. {
  417. sa1100_dma_t *dma = &dma_chan[channel];
  418. dma_buf_t *buf, *next_buf;
  419. int flags;
  420. if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
  421. return -EINVAL;
  422. local_irq_save(flags);
  423. if (channel_is_sa1111_sac(channel))
  424. sa1111_reset_sac_dma(channel);
  425. else
  426. dma->regs->ClrDCSR = DCSR_STRTA|DCSR_STRTB|DCSR_DONEA|DCSR_DONEB|DCSR_RUN|DCSR_IE;
  427. buf = dma->curr;
  428. if (!buf)
  429. buf = dma->tail;
  430. dma->head = dma->tail = dma->curr = NULL;
  431. dma->stopped = 0;
  432. dma->spin_ref = 0;
  433. process_dma(dma);
  434. local_irq_restore(flags);
  435. while (buf) {
  436. next_buf = buf->next;
  437. kfree(buf);
  438. buf = next_buf;
  439. }
  440. DPRINTK("flushedn");
  441. return 0;
  442. }
  443. void sa1100_free_dma(dmach_t channel)
  444. {
  445. sa1100_dma_t *dma;
  446. if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS)
  447. return;
  448. dma = &dma_chan[channel];
  449. if (!dma->in_use) {
  450. printk(KERN_ERR "Trying to free free DMA%dn", channel);
  451. return;
  452. }
  453. sa1100_dma_set_spin(channel, 0, 0);
  454. sa1100_dma_flush_all(channel);
  455. if (channel_is_sa1111_sac(channel)) {
  456. sa1111_cleanup_sac_dma(channel);
  457. } else {
  458. free_irq(IRQ_DMA0 + channel, (void *) dma);
  459. }
  460. dma->in_use = 0;
  461. DPRINTK("freedn");
  462. }
  463. EXPORT_SYMBOL(sa1100_request_dma);
  464. EXPORT_SYMBOL(sa1100_dma_set_callback);
  465. EXPORT_SYMBOL(sa1100_dma_set_spin);
  466. EXPORT_SYMBOL(sa1100_dma_queue_buffer);
  467. EXPORT_SYMBOL(sa1100_dma_get_current);
  468. EXPORT_SYMBOL(sa1100_dma_stop);
  469. EXPORT_SYMBOL(sa1100_dma_resume);
  470. EXPORT_SYMBOL(sa1100_dma_flush_all);
  471. EXPORT_SYMBOL(sa1100_free_dma);
  472. #ifdef CONFIG_PM
  473. /* Drivers should call this from their PM callback function */
  474. int sa1100_dma_sleep(dmach_t channel)
  475. {
  476.         sa1100_dma_t *dma = &dma_chan[channel];
  477. int orig_state;
  478. if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
  479. return -EINVAL;
  480. if (channel_is_sa1111_sac(channel)) {
  481. /* We'll cheat a little until someone actually
  482.  * write the real thing.
  483.  */
  484. sa1111_reset_sac_dma(channel);
  485. return 0;
  486. }
  487. orig_state = dma->stopped;
  488. sa1100_dma_stop(channel);
  489. dma->regs->ClrDCSR = DCSR_RUN | DCSR_IE | DCSR_STRTA | DCSR_STRTB;
  490. dma->stopped = orig_state;
  491. dma->spin_ref = 0;
  492. return 0;
  493. }
  494. int sa1100_dma_wakeup(dmach_t channel)
  495. {
  496.         sa1100_dma_t *dma = &dma_chan[channel];
  497. dma_regs_t *regs;
  498. int flags;
  499. if ((unsigned)channel >= MAX_SA1100_DMA_CHANNELS || !dma->in_use)
  500. return -EINVAL;
  501. if (channel_is_sa1111_sac(channel)) {
  502. /* We'll cheat a little until someone actually
  503.  * write the real thing.
  504.  */
  505. return 0;
  506. }
  507. regs = dma->regs;
  508. regs->ClrDCSR =
  509. (DCSR_DONEA | DCSR_DONEB | DCSR_STRTA | DCSR_STRTB |
  510.  DCSR_IE | DCSR_ERROR | DCSR_RUN);
  511. regs->DDAR = dma->device;
  512. local_irq_save(flags);
  513. process_dma(dma);
  514. local_irq_restore(flags);
  515. return 0;
  516. }
  517. EXPORT_SYMBOL(sa1100_dma_sleep);
  518. EXPORT_SYMBOL(sa1100_dma_wakeup);
  519. #endif
  520. static int __init sa1100_init_dma(void)
  521. {
  522. int channel;
  523. for (channel = 0; channel < SA1100_DMA_CHANNELS; channel++) {
  524. dma_chan[channel].regs =
  525.     (dma_regs_t *) &DDAR(channel);
  526. dma_chan[channel].irq = IRQ_DMA0 + channel;
  527. }
  528. return 0;
  529. }
  530. __initcall(sa1100_init_dma);