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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * sound/dmabuf.c
  3.  *
  4.  * The DMA buffer manager for digitized voice applications
  5.  */
  6. /*
  7.  * Copyright (C) by Hannu Savolainen 1993-1997
  8.  *
  9.  * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
  10.  * Version 2 (June 1991). See the "COPYING" file distributed with this software
  11.  * for more info.
  12.  *
  13.  * Thomas Sailer   : moved several static variables into struct audio_operations
  14.  *                   (which is grossly misnamed btw.) because they have the same
  15.  *                   lifetime as the rest in there and dynamic allocation saves
  16.  *                   12k or so
  17.  * Thomas Sailer   : remove {in,out}_sleep_flag. It was used for the sleeper to
  18.  *                   determine if it was woken up by the expiring timeout or by
  19.  *                   an explicit wake_up. The return value from schedule_timeout
  20.  *      can be used instead; if 0, the wakeup was due to the timeout.
  21.  *
  22.  * Rob Riggs Added persistent DMA buffers (1998/10/17)
  23.  */
  24. #define BE_CONSERVATIVE
  25. #define SAMPLE_ROUNDUP 0
  26. #include "sound_config.h"
  27. #include <linux/wrapper.h>
  28. #define DMAP_FREE_ON_CLOSE      0
  29. #define DMAP_KEEP_ON_CLOSE      1
  30. extern int sound_dmap_flag;
  31. static void dma_reset_output(int dev);
  32. static void dma_reset_input(int dev);
  33. static int local_start_dma(struct audio_operations *adev, unsigned long physaddr, int count, int dma_mode);
  34. static int debugmem = 0; /* switched off by default */
  35. static int dma_buffsize = DSP_BUFFSIZE;
  36. static long dmabuf_timeout(struct dma_buffparms *dmap)
  37. {
  38. long tmout;
  39. tmout = (dmap->fragment_size * HZ) / dmap->data_rate;
  40. tmout += HZ / 5; /* Some safety distance */
  41. if (tmout < (HZ / 2))
  42. tmout = HZ / 2;
  43. if (tmout > 20 * HZ)
  44. tmout = 20 * HZ;
  45. return tmout;
  46. }
  47. static int sound_alloc_dmap(struct dma_buffparms *dmap)
  48. {
  49. char *start_addr, *end_addr;
  50. int dma_pagesize;
  51. int sz, size;
  52. struct page *page;
  53. dmap->mapping_flags &= ~DMA_MAP_MAPPED;
  54. if (dmap->raw_buf != NULL)
  55. return 0; /* Already done */
  56. if (dma_buffsize < 4096)
  57. dma_buffsize = 4096;
  58. dma_pagesize = (dmap->dma < 4) ? (64 * 1024) : (128 * 1024);
  59. /*
  60.  * Now check for the Cyrix problem.
  61.  */
  62.  
  63. if(isa_dma_bridge_buggy==2)
  64. dma_pagesize=32768;
  65.  
  66. dmap->raw_buf = NULL;
  67. dmap->buffsize = dma_buffsize;
  68. if (dmap->buffsize > dma_pagesize)
  69. dmap->buffsize = dma_pagesize;
  70. start_addr = NULL;
  71. /*
  72.  * Now loop until we get a free buffer. Try to get smaller buffer if
  73.  * it fails. Don't accept smaller than 8k buffer for performance
  74.  * reasons.
  75.  */
  76. while (start_addr == NULL && dmap->buffsize > PAGE_SIZE) {
  77. for (sz = 0, size = PAGE_SIZE; size < dmap->buffsize; sz++, size <<= 1);
  78. dmap->buffsize = PAGE_SIZE * (1 << sz);
  79. start_addr = (char *) __get_free_pages(GFP_ATOMIC|GFP_DMA, sz);
  80. if (start_addr == NULL)
  81. dmap->buffsize /= 2;
  82. }
  83. if (start_addr == NULL) {
  84. printk(KERN_WARNING "Sound error: Couldn't allocate DMA buffern");
  85. return -ENOMEM;
  86. } else {
  87. /* make some checks */
  88. end_addr = start_addr + dmap->buffsize - 1;
  89. if (debugmem)
  90. printk(KERN_DEBUG "sound: start 0x%lx, end 0x%lxn", (long) start_addr, (long) end_addr);
  91. /* now check if it fits into the same dma-pagesize */
  92. if (((long) start_addr & ~(dma_pagesize - 1)) != ((long) end_addr & ~(dma_pagesize - 1))
  93.     || end_addr >= (char *) (MAX_DMA_ADDRESS)) {
  94. printk(KERN_ERR "sound: Got invalid address 0x%lx for %db DMA-buffern", (long) start_addr, dmap->buffsize);
  95. return -EFAULT;
  96. }
  97. }
  98. dmap->raw_buf = start_addr;
  99. dmap->raw_buf_phys = virt_to_bus(start_addr);
  100. for (page = virt_to_page(start_addr); page <= virt_to_page(end_addr); page++)
  101. mem_map_reserve(page);
  102. return 0;
  103. }
  104. static void sound_free_dmap(struct dma_buffparms *dmap)
  105. {
  106. int sz, size;
  107. struct page *page;
  108. unsigned long start_addr, end_addr;
  109. if (dmap->raw_buf == NULL)
  110. return;
  111. if (dmap->mapping_flags & DMA_MAP_MAPPED)
  112. return; /* Don't free mmapped buffer. Will use it next time */
  113. for (sz = 0, size = PAGE_SIZE; size < dmap->buffsize; sz++, size <<= 1);
  114. start_addr = (unsigned long) dmap->raw_buf;
  115. end_addr = start_addr + dmap->buffsize;
  116. for (page = virt_to_page(start_addr); page <= virt_to_page(end_addr); page++)
  117. mem_map_unreserve(page);
  118. free_pages((unsigned long) dmap->raw_buf, sz);
  119. dmap->raw_buf = NULL;
  120. }
  121. /* Intel version !!!!!!!!! */
  122. static int sound_start_dma(struct dma_buffparms *dmap, unsigned long physaddr, int count, int dma_mode)
  123. {
  124. unsigned long flags;
  125. int chan = dmap->dma;
  126. /* printk( "Start DMA%d %d, %dn",  chan,  (int)(physaddr-dmap->raw_buf_phys),  count); */
  127. flags = claim_dma_lock();
  128. disable_dma(chan);
  129. clear_dma_ff(chan);
  130. set_dma_mode(chan, dma_mode);
  131. set_dma_addr(chan, physaddr);
  132. set_dma_count(chan, count);
  133. enable_dma(chan);
  134. release_dma_lock(flags);
  135. return 0;
  136. }
  137. static void dma_init_buffers(struct dma_buffparms *dmap)
  138. {
  139. dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0;
  140. dmap->byte_counter = 0;
  141. dmap->max_byte_counter = 8000 * 60 * 60;
  142. dmap->bytes_in_use = dmap->buffsize;
  143. dmap->dma_mode = DMODE_NONE;
  144. dmap->mapping_flags = 0;
  145. dmap->neutral_byte = 0x80;
  146. dmap->data_rate = 8000;
  147. dmap->cfrag = -1;
  148. dmap->closing = 0;
  149. dmap->nbufs = 1;
  150. dmap->flags = DMA_BUSY; /* Other flags off */
  151. }
  152. static int open_dmap(struct audio_operations *adev, int mode, struct dma_buffparms *dmap)
  153. {
  154. int err;
  155. if (dmap->flags & DMA_BUSY)
  156. return -EBUSY;
  157. if ((err = sound_alloc_dmap(dmap)) < 0)
  158. return err;
  159. if (dmap->raw_buf == NULL) {
  160. printk(KERN_WARNING "Sound: DMA buffers not availablen");
  161. return -ENOSPC; /* Memory allocation failed during boot */
  162. }
  163. if (dmap->dma >= 0 && sound_open_dma(dmap->dma, adev->name)) {
  164. printk(KERN_WARNING "Unable to grab(2) DMA%d for the audio drivern", dmap->dma);
  165. return -EBUSY;
  166. }
  167. dma_init_buffers(dmap);
  168. dmap->open_mode = mode;
  169. dmap->subdivision = dmap->underrun_count = 0;
  170. dmap->fragment_size = 0;
  171. dmap->max_fragments = 65536; /* Just a large value */
  172. dmap->byte_counter = 0;
  173. dmap->max_byte_counter = 8000 * 60 * 60;
  174. dmap->applic_profile = APF_NORMAL;
  175. dmap->needs_reorg = 1;
  176. dmap->audio_callback = NULL;
  177. dmap->callback_parm = 0;
  178. return 0;
  179. }
  180. static void close_dmap(struct audio_operations *adev, struct dma_buffparms *dmap)
  181. {
  182. unsigned long flags;
  183. if (dmap->dma >= 0) {
  184. sound_close_dma(dmap->dma);
  185. flags=claim_dma_lock();
  186. disable_dma(dmap->dma);
  187. release_dma_lock(flags);
  188. }
  189. if (dmap->flags & DMA_BUSY)
  190. dmap->dma_mode = DMODE_NONE;
  191. dmap->flags &= ~DMA_BUSY;
  192. if (sound_dmap_flag == DMAP_FREE_ON_CLOSE)
  193. sound_free_dmap(dmap);
  194. }
  195. static unsigned int default_set_bits(int dev, unsigned int bits)
  196. {
  197. mm_segment_t fs = get_fs();
  198. set_fs(get_ds());
  199. audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_SETFMT, (caddr_t)&bits);
  200. set_fs(fs);
  201. return bits;
  202. }
  203. static int default_set_speed(int dev, int speed)
  204. {
  205. mm_segment_t fs = get_fs();
  206. set_fs(get_ds());
  207. audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_SPEED, (caddr_t)&speed);
  208. set_fs(fs);
  209. return speed;
  210. }
  211. static short default_set_channels(int dev, short channels)
  212. {
  213. int c = channels;
  214. mm_segment_t fs = get_fs();
  215. set_fs(get_ds());
  216. audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_CHANNELS, (caddr_t)&c);
  217. set_fs(fs);
  218. return c;
  219. }
  220. static void check_driver(struct audio_driver *d)
  221. {
  222. if (d->set_speed == NULL)
  223. d->set_speed = default_set_speed;
  224. if (d->set_bits == NULL)
  225. d->set_bits = default_set_bits;
  226. if (d->set_channels == NULL)
  227. d->set_channels = default_set_channels;
  228. }
  229. int DMAbuf_open(int dev, int mode)
  230. {
  231. struct audio_operations *adev = audio_devs[dev];
  232. int retval;
  233. struct dma_buffparms *dmap_in = NULL;
  234. struct dma_buffparms *dmap_out = NULL;
  235. if (!adev)
  236.   return -ENXIO;
  237. if (!(adev->flags & DMA_DUPLEX))
  238. adev->dmap_in = adev->dmap_out;
  239. check_driver(adev->d);
  240. if ((retval = adev->d->open(dev, mode)) < 0)
  241. return retval;
  242. dmap_out = adev->dmap_out;
  243. dmap_in = adev->dmap_in;
  244. if (dmap_in == dmap_out)
  245. adev->flags &= ~DMA_DUPLEX;
  246. if (mode & OPEN_WRITE) {
  247. if ((retval = open_dmap(adev, mode, dmap_out)) < 0) {
  248. adev->d->close(dev);
  249. return retval;
  250. }
  251. }
  252. adev->enable_bits = mode;
  253. if (mode == OPEN_READ || (mode != OPEN_WRITE && (adev->flags & DMA_DUPLEX))) {
  254. if ((retval = open_dmap(adev, mode, dmap_in)) < 0) {
  255. adev->d->close(dev);
  256. if (mode & OPEN_WRITE)
  257. close_dmap(adev, dmap_out);
  258. return retval;
  259. }
  260. }
  261. adev->open_mode = mode;
  262. adev->go = 1;
  263. adev->d->set_bits(dev, 8);
  264. adev->d->set_channels(dev, 1);
  265. adev->d->set_speed(dev, DSP_DEFAULT_SPEED);
  266. if (adev->dmap_out->dma_mode == DMODE_OUTPUT) 
  267. memset(adev->dmap_out->raw_buf, adev->dmap_out->neutral_byte,
  268.        adev->dmap_out->bytes_in_use);
  269. return 0;
  270. }
  271. void DMAbuf_reset(int dev)
  272. {
  273. if (audio_devs[dev]->open_mode & OPEN_WRITE)
  274. dma_reset_output(dev);
  275. if (audio_devs[dev]->open_mode & OPEN_READ)
  276. dma_reset_input(dev);
  277. }
  278. static void dma_reset_output(int dev)
  279. {
  280. struct audio_operations *adev = audio_devs[dev];
  281. unsigned long flags,f ;
  282. struct dma_buffparms *dmap = adev->dmap_out;
  283. if (!(dmap->flags & DMA_STARTED)) /* DMA is not active */
  284. return;
  285. /*
  286.  * First wait until the current fragment has been played completely
  287.  */
  288. save_flags(flags);
  289. cli();
  290. adev->dmap_out->flags |= DMA_SYNCING;
  291. adev->dmap_out->underrun_count = 0;
  292. if (!signal_pending(current) && adev->dmap_out->qlen && 
  293.     adev->dmap_out->underrun_count == 0)
  294. interruptible_sleep_on_timeout(&adev->out_sleeper,
  295.        dmabuf_timeout(dmap));
  296. adev->dmap_out->flags &= ~(DMA_SYNCING | DMA_ACTIVE);
  297. /*
  298.  * Finally shut the device off
  299.  */
  300. if (!(adev->flags & DMA_DUPLEX) || !adev->d->halt_output)
  301. adev->d->halt_io(dev);
  302. else
  303. adev->d->halt_output(dev);
  304. adev->dmap_out->flags &= ~DMA_STARTED;
  305. f=claim_dma_lock();
  306. clear_dma_ff(dmap->dma);
  307. disable_dma(dmap->dma);
  308. release_dma_lock(f);
  309. restore_flags(flags);
  310. dmap->byte_counter = 0;
  311. reorganize_buffers(dev, adev->dmap_out, 0);
  312. dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0;
  313. }
  314. static void dma_reset_input(int dev)
  315. {
  316.         struct audio_operations *adev = audio_devs[dev];
  317. unsigned long flags;
  318. struct dma_buffparms *dmap = adev->dmap_in;
  319. save_flags(flags);
  320. cli();
  321. if (!(adev->flags & DMA_DUPLEX) || !adev->d->halt_input)
  322. adev->d->halt_io(dev);
  323. else
  324. adev->d->halt_input(dev);
  325. adev->dmap_in->flags &= ~DMA_STARTED;
  326. restore_flags(flags);
  327. dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0;
  328. dmap->byte_counter = 0;
  329. reorganize_buffers(dev, adev->dmap_in, 1);
  330. }
  331. void DMAbuf_launch_output(int dev, struct dma_buffparms *dmap)
  332. {
  333. struct audio_operations *adev = audio_devs[dev];
  334. if (!((adev->enable_bits * adev->go) & PCM_ENABLE_OUTPUT))
  335. return; /* Don't start DMA yet */
  336. dmap->dma_mode = DMODE_OUTPUT;
  337. if (!(dmap->flags & DMA_ACTIVE) || !(adev->flags & DMA_AUTOMODE) || (dmap->flags & DMA_NODMA)) {
  338. if (!(dmap->flags & DMA_STARTED)) {
  339. reorganize_buffers(dev, dmap, 0);
  340. if (adev->d->prepare_for_output(dev, dmap->fragment_size, dmap->nbufs))
  341. return;
  342. if (!(dmap->flags & DMA_NODMA))
  343. local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use,DMA_MODE_WRITE);
  344. dmap->flags |= DMA_STARTED;
  345. }
  346. if (dmap->counts[dmap->qhead] == 0)
  347. dmap->counts[dmap->qhead] = dmap->fragment_size;
  348. dmap->dma_mode = DMODE_OUTPUT;
  349. adev->d->output_block(dev, dmap->raw_buf_phys + dmap->qhead * dmap->fragment_size,
  350.       dmap->counts[dmap->qhead], 1);
  351. if (adev->d->trigger)
  352. adev->d->trigger(dev,adev->enable_bits * adev->go);
  353. }
  354. dmap->flags |= DMA_ACTIVE;
  355. }
  356. int DMAbuf_sync(int dev)
  357. {
  358. struct audio_operations *adev = audio_devs[dev];
  359. unsigned long flags;
  360. int n = 0;
  361. struct dma_buffparms *dmap;
  362. if (!adev->go && !(adev->enable_bits & PCM_ENABLE_OUTPUT))
  363. return 0;
  364. if (adev->dmap_out->dma_mode == DMODE_OUTPUT) {
  365. dmap = adev->dmap_out;
  366. save_flags(flags);
  367. cli();
  368. if (dmap->qlen > 0 && !(dmap->flags & DMA_ACTIVE))
  369. DMAbuf_launch_output(dev, dmap);
  370. adev->dmap_out->flags |= DMA_SYNCING;
  371. adev->dmap_out->underrun_count = 0;
  372. while (!signal_pending(current) && n++ <= adev->dmap_out->nbufs && 
  373.        adev->dmap_out->qlen && adev->dmap_out->underrun_count == 0) {
  374. long t = dmabuf_timeout(dmap);
  375. t = interruptible_sleep_on_timeout(&adev->out_sleeper,
  376.    t);
  377. if (!t) {
  378. adev->dmap_out->flags &= ~DMA_SYNCING;
  379. restore_flags(flags);
  380. return adev->dmap_out->qlen;
  381. }
  382. }
  383. adev->dmap_out->flags &= ~(DMA_SYNCING | DMA_ACTIVE);
  384. restore_flags(flags);
  385. /*
  386.  * Some devices such as GUS have huge amount of on board RAM for the
  387.  * audio data. We have to wait until the device has finished playing.
  388.  */
  389. save_flags(flags);
  390. cli();
  391. if (adev->d->local_qlen) {   /* Device has hidden buffers */
  392. while (!signal_pending(current) &&
  393.        adev->d->local_qlen(dev))
  394. interruptible_sleep_on_timeout(&adev->out_sleeper,
  395.        dmabuf_timeout(dmap));
  396. }
  397. restore_flags(flags);
  398. }
  399. adev->dmap_out->dma_mode = DMODE_NONE;
  400. return adev->dmap_out->qlen;
  401. }
  402. int DMAbuf_release(int dev, int mode)
  403. {
  404. struct audio_operations *adev = audio_devs[dev];
  405. unsigned long flags;
  406. if (adev->open_mode & OPEN_WRITE)
  407. adev->dmap_out->closing = 1;
  408. if (adev->open_mode & OPEN_READ)
  409. adev->dmap_in->closing = 1;
  410. if (adev->open_mode & OPEN_WRITE)
  411. if (!(adev->dmap_out->mapping_flags & DMA_MAP_MAPPED))
  412. if (!signal_pending(current) && (adev->dmap_out->dma_mode == DMODE_OUTPUT))
  413. DMAbuf_sync(dev);
  414. if (adev->dmap_out->dma_mode == DMODE_OUTPUT)
  415. memset(adev->dmap_out->raw_buf, adev->dmap_out->neutral_byte, adev->dmap_out->bytes_in_use);
  416. save_flags(flags);
  417. cli();
  418. DMAbuf_reset(dev);
  419. adev->d->close(dev);
  420. if (adev->open_mode & OPEN_WRITE)
  421. close_dmap(adev, adev->dmap_out);
  422. if (adev->open_mode == OPEN_READ ||
  423.     (adev->open_mode != OPEN_WRITE &&
  424.      (adev->flags & DMA_DUPLEX)))
  425. close_dmap(adev, adev->dmap_in);
  426. adev->open_mode = 0;
  427. restore_flags(flags);
  428. return 0;
  429. }
  430. int DMAbuf_activate_recording(int dev, struct dma_buffparms *dmap)
  431. {
  432. struct audio_operations *adev = audio_devs[dev];
  433. int  err;
  434. if (!(adev->open_mode & OPEN_READ))
  435. return 0;
  436. if (!(adev->enable_bits & PCM_ENABLE_INPUT))
  437. return 0;
  438. if (dmap->dma_mode == DMODE_OUTPUT) { /* Direction change */
  439. DMAbuf_sync(dev);
  440. DMAbuf_reset(dev);
  441. dmap->dma_mode = DMODE_NONE;
  442. }
  443. if (!dmap->dma_mode) {
  444. reorganize_buffers(dev, dmap, 1);
  445. if ((err = adev->d->prepare_for_input(dev,
  446. dmap->fragment_size, dmap->nbufs)) < 0)
  447. return err;
  448. dmap->dma_mode = DMODE_INPUT;
  449. }
  450. if (!(dmap->flags & DMA_ACTIVE)) {
  451. if (dmap->needs_reorg)
  452. reorganize_buffers(dev, dmap, 0);
  453. local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use, DMA_MODE_READ);
  454. adev->d->start_input(dev, dmap->raw_buf_phys + dmap->qtail * dmap->fragment_size,
  455.      dmap->fragment_size, 0);
  456. dmap->flags |= DMA_ACTIVE;
  457. if (adev->d->trigger)
  458. adev->d->trigger(dev, adev->enable_bits * adev->go);
  459. }
  460. return 0;
  461. }
  462. int DMAbuf_getrdbuffer(int dev, char **buf, int *len, int dontblock)
  463. {
  464. struct audio_operations *adev = audio_devs[dev];
  465. unsigned long flags;
  466. int err = 0, n = 0;
  467. struct dma_buffparms *dmap = adev->dmap_in;
  468. int go;
  469. if (!(adev->open_mode & OPEN_READ))
  470. return -EIO;
  471. if (dmap->needs_reorg)
  472. reorganize_buffers(dev, dmap, 0);
  473. save_flags(flags);
  474. cli();
  475. if (adev->dmap_in->mapping_flags & DMA_MAP_MAPPED) {
  476. /*   printk(KERN_WARNING "Sound: Can't read from mmapped device (1)n");*/
  477.   restore_flags(flags);
  478.   return -EINVAL;
  479. } else while (dmap->qlen <= 0 && n++ < 10) {
  480. long timeout = MAX_SCHEDULE_TIMEOUT;
  481. if (!(adev->enable_bits & PCM_ENABLE_INPUT) || !adev->go) {
  482. restore_flags(flags);
  483. return -EAGAIN;
  484. }
  485. if ((err = DMAbuf_activate_recording(dev, dmap)) < 0) {
  486. restore_flags(flags);
  487. return err;
  488. }
  489. /* Wait for the next block */
  490. if (dontblock) {
  491. restore_flags(flags);
  492. return -EAGAIN;
  493. }
  494. if ((go = adev->go))
  495. timeout = dmabuf_timeout(dmap);
  496. timeout = interruptible_sleep_on_timeout(&adev->in_sleeper,
  497.  timeout);
  498. if (!timeout) {
  499. /* FIXME: include device name */
  500. err = -EIO;
  501. printk(KERN_WARNING "Sound: DMA (input) timed out - IRQ/DRQ config error?n");
  502. dma_reset_input(dev);
  503. } else
  504. err = -EINTR;
  505. }
  506. restore_flags(flags);
  507. if (dmap->qlen <= 0)
  508. return err ? err : -EINTR;
  509. *buf = &dmap->raw_buf[dmap->qhead * dmap->fragment_size + dmap->counts[dmap->qhead]];
  510. *len = dmap->fragment_size - dmap->counts[dmap->qhead];
  511. return dmap->qhead;
  512. }
  513. int DMAbuf_rmchars(int dev, int buff_no, int c)
  514. {
  515. struct audio_operations *adev = audio_devs[dev];
  516. struct dma_buffparms *dmap = adev->dmap_in;
  517. int p = dmap->counts[dmap->qhead] + c;
  518. if (dmap->mapping_flags & DMA_MAP_MAPPED)
  519. {
  520. /*   printk("Sound: Can't read from mmapped device (2)n");*/
  521. return -EINVAL;
  522. }
  523. else if (dmap->qlen <= 0)
  524. return -EIO;
  525. else if (p >= dmap->fragment_size) {  /* This buffer is completely empty */
  526. dmap->counts[dmap->qhead] = 0;
  527. dmap->qlen--;
  528. dmap->qhead = (dmap->qhead + 1) % dmap->nbufs;
  529. }
  530. else dmap->counts[dmap->qhead] = p;
  531. return 0;
  532. }
  533. int DMAbuf_get_buffer_pointer(int dev, struct dma_buffparms *dmap, int direction)
  534. {
  535. /*
  536.  * Try to approximate the active byte position of the DMA pointer within the
  537.  * buffer area as well as possible.
  538.  */
  539. int pos;
  540. unsigned long flags;
  541. unsigned long f;
  542. save_flags(flags);
  543. cli();
  544. if (!(dmap->flags & DMA_ACTIVE))
  545. pos = 0;
  546. else {
  547. int chan = dmap->dma;
  548. f=claim_dma_lock();
  549. clear_dma_ff(chan);
  550. if(!isa_dma_bridge_buggy)
  551. disable_dma(dmap->dma);
  552. pos = get_dma_residue(chan);
  553. pos = dmap->bytes_in_use - pos;
  554. if (!(dmap->mapping_flags & DMA_MAP_MAPPED)) {
  555. if (direction == DMODE_OUTPUT) {
  556. if (dmap->qhead == 0)
  557. if (pos > dmap->fragment_size)
  558. pos = 0;
  559. } else {
  560. if (dmap->qtail == 0)
  561. if (pos > dmap->fragment_size)
  562. pos = 0;
  563. }
  564. }
  565. if (pos < 0)
  566. pos = 0;
  567. if (pos >= dmap->bytes_in_use)
  568. pos = 0;
  569. if(!isa_dma_bridge_buggy)
  570. enable_dma(dmap->dma);
  571. release_dma_lock(f);
  572. }
  573. restore_flags(flags);
  574. /* printk( "%04x ",  pos); */
  575. return pos;
  576. }
  577. /*
  578.  * DMAbuf_start_devices() is called by the /dev/music driver to start
  579.  * one or more audio devices at desired moment.
  580.  */
  581. void DMAbuf_start_devices(unsigned int devmask)
  582. {
  583. struct audio_operations *adev;
  584. int dev;
  585. for (dev = 0; dev < num_audiodevs; dev++) {
  586. if (!(devmask & (1 << dev)))
  587. continue;
  588. if (!(adev = audio_devs[dev]))
  589. continue;
  590. if (adev->open_mode == 0)
  591. continue;
  592. if (adev->go)
  593. continue;
  594. /* OK to start the device */
  595. adev->go = 1;
  596. if (adev->d->trigger)
  597. adev->d->trigger(dev,adev->enable_bits * adev->go);
  598. }
  599. }
  600. int DMAbuf_space_in_queue(int dev)
  601. {
  602. struct audio_operations *adev = audio_devs[dev];
  603. int len, max, tmp;
  604. struct dma_buffparms *dmap = adev->dmap_out;
  605. int lim = dmap->nbufs;
  606. if (lim < 2)
  607. lim = 2;
  608. if (dmap->qlen >= lim) /* No space at all */
  609. return 0;
  610. /*
  611.  * Verify that there are no more pending buffers than the limit
  612.  * defined by the process.
  613.  */
  614. max = dmap->max_fragments;
  615. if (max > lim)
  616. max = lim;
  617. len = dmap->qlen;
  618. if (adev->d->local_qlen) {
  619. tmp = adev->d->local_qlen(dev);
  620. if (tmp && len)
  621. tmp--; /* This buffer has been counted twice */
  622. len += tmp;
  623. }
  624. if (dmap->byte_counter % dmap->fragment_size) /* There is a partial fragment */
  625. len = len + 1;
  626. if (len >= max)
  627. return 0;
  628. return max - len;
  629. }
  630. static int output_sleep(int dev, int dontblock)
  631. {
  632. struct audio_operations *adev = audio_devs[dev];
  633. int err = 0;
  634. struct dma_buffparms *dmap = adev->dmap_out;
  635. long timeout;
  636. long timeout_value;
  637. if (dontblock)
  638. return -EAGAIN;
  639. if (!(adev->enable_bits & PCM_ENABLE_OUTPUT))
  640. return -EAGAIN;
  641. /*
  642.  * Wait for free space
  643.  */
  644. if (signal_pending(current))
  645. return -EINTR;
  646. timeout = (adev->go && !(dmap->flags & DMA_NOTIMEOUT));
  647. if (timeout) 
  648. timeout_value = dmabuf_timeout(dmap);
  649. else
  650. timeout_value = MAX_SCHEDULE_TIMEOUT;
  651. timeout_value = interruptible_sleep_on_timeout(&adev->out_sleeper,
  652.        timeout_value);
  653. if (timeout != MAX_SCHEDULE_TIMEOUT && !timeout_value) {
  654. printk(KERN_WARNING "Sound: DMA (output) timed out - IRQ/DRQ config error?n");
  655. dma_reset_output(dev);
  656. } else {
  657. if (signal_pending(current))
  658. err = -EINTR;
  659. }
  660. return err;
  661. }
  662. static int find_output_space(int dev, char **buf, int *size)
  663. {
  664. struct audio_operations *adev = audio_devs[dev];
  665. struct dma_buffparms *dmap = adev->dmap_out;
  666. unsigned long flags;
  667. unsigned long active_offs;
  668. long len, offs;
  669. int maxfrags;
  670. int occupied_bytes = (dmap->user_counter % dmap->fragment_size);
  671. *buf = dmap->raw_buf;
  672. if (!(maxfrags = DMAbuf_space_in_queue(dev)) && !occupied_bytes)
  673. return 0;
  674. save_flags(flags);
  675. cli();
  676. #ifdef BE_CONSERVATIVE
  677. active_offs = dmap->byte_counter + dmap->qhead * dmap->fragment_size;
  678. #else
  679. active_offs = DMAbuf_get_buffer_pointer(dev, dmap, DMODE_OUTPUT);
  680. /* Check for pointer wrapping situation */
  681. if (active_offs < 0 || active_offs >= dmap->bytes_in_use)
  682. active_offs = 0;
  683. active_offs += dmap->byte_counter;
  684. #endif
  685. offs = (dmap->user_counter % dmap->bytes_in_use) & ~SAMPLE_ROUNDUP;
  686. if (offs < 0 || offs >= dmap->bytes_in_use) {
  687. restore_flags(flags);
  688. printk(KERN_ERR "Sound: Got unexpected offs %ld. Giving up.n", offs);
  689. printk("Counter = %ld, bytes=%dn", dmap->user_counter, dmap->bytes_in_use);
  690. return 0;
  691. }
  692. *buf = dmap->raw_buf + offs;
  693. len = active_offs + dmap->bytes_in_use - dmap->user_counter; /* Number of unused bytes in buffer */
  694. if ((offs + len) > dmap->bytes_in_use)
  695. len = dmap->bytes_in_use - offs;
  696. if (len < 0) {
  697. restore_flags(flags);
  698. return 0;
  699. }
  700. if (len > ((maxfrags * dmap->fragment_size) - occupied_bytes))
  701. len = (maxfrags * dmap->fragment_size) - occupied_bytes;
  702. *size = len & ~SAMPLE_ROUNDUP;
  703. restore_flags(flags);
  704. return (*size > 0);
  705. }
  706. int DMAbuf_getwrbuffer(int dev, char **buf, int *size, int dontblock)
  707. {
  708. struct audio_operations *adev = audio_devs[dev];
  709. unsigned long flags;
  710. int err = -EIO;
  711. struct dma_buffparms *dmap = adev->dmap_out;
  712. if (dmap->needs_reorg)
  713. reorganize_buffers(dev, dmap, 0);
  714. if (dmap->mapping_flags & DMA_MAP_MAPPED) {
  715. /* printk(KERN_DEBUG "Sound: Can't write to mmapped device (3)n");*/
  716. return -EINVAL;
  717. }
  718. if (dmap->dma_mode == DMODE_INPUT) { /* Direction change */
  719. DMAbuf_reset(dev);
  720. dmap->dma_mode = DMODE_NONE;
  721. }
  722. dmap->dma_mode = DMODE_OUTPUT;
  723. save_flags(flags);
  724. cli();
  725. while (find_output_space(dev, buf, size) <= 0) {
  726. if ((err = output_sleep(dev, dontblock)) < 0) {
  727. restore_flags(flags);
  728. return err;
  729. }
  730. }
  731. restore_flags(flags);
  732. return 0;
  733. }
  734. int DMAbuf_move_wrpointer(int dev, int l)
  735. {
  736. struct audio_operations *adev = audio_devs[dev];
  737. struct dma_buffparms *dmap = adev->dmap_out;
  738. unsigned long ptr = (dmap->user_counter / dmap->fragment_size) * dmap->fragment_size;
  739. unsigned long end_ptr, p;
  740. int post = (dmap->flags & DMA_POST);
  741. dmap->flags &= ~DMA_POST;
  742. dmap->cfrag = -1;
  743. dmap->user_counter += l;
  744. dmap->flags |= DMA_DIRTY;
  745. if (dmap->byte_counter >= dmap->max_byte_counter) {
  746. /* Wrap the byte counters */
  747. long decr = dmap->byte_counter;
  748. dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use);
  749. decr -= dmap->byte_counter;
  750. dmap->user_counter -= decr;
  751. }
  752. end_ptr = (dmap->user_counter / dmap->fragment_size) * dmap->fragment_size;
  753. p = (dmap->user_counter - 1) % dmap->bytes_in_use;
  754. dmap->neutral_byte = dmap->raw_buf[p];
  755. /* Update the fragment based bookkeeping too */
  756. while (ptr < end_ptr) {
  757. dmap->counts[dmap->qtail] = dmap->fragment_size;
  758. dmap->qtail = (dmap->qtail + 1) % dmap->nbufs;
  759. dmap->qlen++;
  760. ptr += dmap->fragment_size;
  761. }
  762. dmap->counts[dmap->qtail] = dmap->user_counter - ptr;
  763. /*
  764.  * Let the low level driver to perform some postprocessing to
  765.  * the written data.
  766.  */
  767. if (adev->d->postprocess_write)
  768. adev->d->postprocess_write(dev);
  769. if (!(dmap->flags & DMA_ACTIVE))
  770. if (dmap->qlen > 1 || (dmap->qlen > 0 && (post || dmap->qlen >= dmap->nbufs - 1)))
  771. DMAbuf_launch_output(dev, dmap);
  772. return 0;
  773. }
  774. int DMAbuf_start_dma(int dev, unsigned long physaddr, int count, int dma_mode)
  775. {
  776. struct audio_operations *adev = audio_devs[dev];
  777. struct dma_buffparms *dmap = (dma_mode == DMA_MODE_WRITE) ? adev->dmap_out : adev->dmap_in;
  778. if (dmap->raw_buf == NULL) {
  779. printk(KERN_ERR "sound: DMA buffer(1) == NULLn");
  780. printk("Device %d, chn=%sn", dev, (dmap == adev->dmap_out) ? "out" : "in");
  781. return 0;
  782. }
  783. if (dmap->dma < 0)
  784. return 0;
  785. sound_start_dma(dmap, physaddr, count, dma_mode);
  786. return count;
  787. }
  788. static int local_start_dma(struct audio_operations *adev, unsigned long physaddr, int count, int dma_mode)
  789. {
  790. struct dma_buffparms *dmap = (dma_mode == DMA_MODE_WRITE) ? adev->dmap_out : adev->dmap_in;
  791. if (dmap->raw_buf == NULL) {
  792. printk(KERN_ERR "sound: DMA buffer(2) == NULLn");
  793. printk(KERN_ERR "Device %s, chn=%sn", adev->name, (dmap == adev->dmap_out) ? "out" : "in");
  794. return 0;
  795. }
  796. if (dmap->flags & DMA_NODMA)
  797. return 1;
  798. if (dmap->dma < 0)
  799. return 0;
  800. sound_start_dma(dmap, dmap->raw_buf_phys, dmap->bytes_in_use, dma_mode | DMA_AUTOINIT);
  801. dmap->flags |= DMA_STARTED;
  802. return count;
  803. }
  804. static void finish_output_interrupt(int dev, struct dma_buffparms *dmap)
  805. {
  806. struct audio_operations *adev = audio_devs[dev];
  807. if (dmap->audio_callback != NULL)
  808. dmap->audio_callback(dev, dmap->callback_parm);
  809. wake_up(&adev->out_sleeper);
  810. wake_up(&adev->poll_sleeper);
  811. }
  812. static void do_outputintr(int dev, int dummy)
  813. {
  814. struct audio_operations *adev = audio_devs[dev];
  815. unsigned long flags;
  816. struct dma_buffparms *dmap = adev->dmap_out;
  817. int this_fragment;
  818. if (dmap->raw_buf == NULL) {
  819. printk(KERN_ERR "Sound: Error. Audio interrupt (%d) after freeing buffers.n", dev);
  820. return;
  821. }
  822. if (dmap->mapping_flags & DMA_MAP_MAPPED) { /* Virtual memory mapped access */
  823. /* mmapped access */
  824. dmap->qhead = (dmap->qhead + 1) % dmap->nbufs;
  825. if (dmap->qhead == 0) {     /* Wrapped */
  826. dmap->byte_counter += dmap->bytes_in_use;
  827. if (dmap->byte_counter >= dmap->max_byte_counter) { /* Overflow */
  828. long decr = dmap->byte_counter;
  829. dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use);
  830. decr -= dmap->byte_counter;
  831. dmap->user_counter -= decr;
  832. }
  833. }
  834. dmap->qlen++; /* Yes increment it (don't decrement) */
  835. if (!(adev->flags & DMA_AUTOMODE))
  836. dmap->flags &= ~DMA_ACTIVE;
  837. dmap->counts[dmap->qhead] = dmap->fragment_size;
  838. DMAbuf_launch_output(dev, dmap);
  839. finish_output_interrupt(dev, dmap);
  840. return;
  841. }
  842. save_flags(flags);
  843. cli();
  844. dmap->qlen--;
  845. this_fragment = dmap->qhead;
  846. dmap->qhead = (dmap->qhead + 1) % dmap->nbufs;
  847. if (dmap->qhead == 0) { /* Wrapped */
  848. dmap->byte_counter += dmap->bytes_in_use;
  849. if (dmap->byte_counter >= dmap->max_byte_counter) { /* Overflow */
  850. long decr = dmap->byte_counter;
  851. dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use);
  852. decr -= dmap->byte_counter;
  853. dmap->user_counter -= decr;
  854. }
  855. }
  856. if (!(adev->flags & DMA_AUTOMODE))
  857. dmap->flags &= ~DMA_ACTIVE;
  858. /*
  859.  * This is  dmap->qlen <= 0 except when closing when
  860.  * dmap->qlen < 0
  861.  */
  862.  
  863. while (dmap->qlen <= -dmap->closing) {
  864. dmap->underrun_count++;
  865. dmap->qlen++;
  866. if ((dmap->flags & DMA_DIRTY) && dmap->applic_profile != APF_CPUINTENS) {
  867. dmap->flags &= ~DMA_DIRTY;
  868. memset(adev->dmap_out->raw_buf, adev->dmap_out->neutral_byte,
  869.        adev->dmap_out->buffsize);
  870. }
  871. dmap->user_counter += dmap->fragment_size;
  872. dmap->qtail = (dmap->qtail + 1) % dmap->nbufs;
  873. }
  874. if (dmap->qlen > 0)
  875. DMAbuf_launch_output(dev, dmap);
  876. restore_flags(flags);
  877. finish_output_interrupt(dev, dmap);
  878. }
  879. void DMAbuf_outputintr(int dev, int notify_only)
  880. {
  881. struct audio_operations *adev = audio_devs[dev];
  882. unsigned long flags;
  883. struct dma_buffparms *dmap = adev->dmap_out;
  884. save_flags(flags);
  885. cli();
  886. if (!(dmap->flags & DMA_NODMA)) {
  887. int chan = dmap->dma, pos, n;
  888. unsigned long f;
  889. f=claim_dma_lock();
  890. if(!isa_dma_bridge_buggy)
  891. disable_dma(dmap->dma);
  892. clear_dma_ff(chan);
  893. pos = dmap->bytes_in_use - get_dma_residue(chan);
  894. if(!isa_dma_bridge_buggy)
  895. enable_dma(dmap->dma);
  896. release_dma_lock(f);
  897. pos = pos / dmap->fragment_size; /* Actual qhead */
  898. if (pos < 0 || pos >= dmap->nbufs)
  899. pos = 0;
  900. n = 0;
  901. while (dmap->qhead != pos && n++ < dmap->nbufs)
  902. do_outputintr(dev, notify_only);
  903. }
  904. else
  905. do_outputintr(dev, notify_only);
  906. restore_flags(flags);
  907. }
  908. static void do_inputintr(int dev)
  909. {
  910. struct audio_operations *adev = audio_devs[dev];
  911. struct dma_buffparms *dmap = adev->dmap_in;
  912. if (dmap->raw_buf == NULL) {
  913. printk(KERN_ERR "Sound: Fatal error. Audio interrupt after freeing buffers.n");
  914. return;
  915. }
  916. if (dmap->mapping_flags & DMA_MAP_MAPPED) {
  917. dmap->qtail = (dmap->qtail + 1) % dmap->nbufs;
  918. if (dmap->qtail == 0) { /* Wrapped */
  919. dmap->byte_counter += dmap->bytes_in_use;
  920. if (dmap->byte_counter >= dmap->max_byte_counter) { /* Overflow */
  921. long decr = dmap->byte_counter;
  922. dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use) + dmap->bytes_in_use;
  923. decr -= dmap->byte_counter;
  924. dmap->user_counter -= decr;
  925. }
  926. }
  927. dmap->qlen++;
  928. if (!(adev->flags & DMA_AUTOMODE)) {
  929. if (dmap->needs_reorg)
  930. reorganize_buffers(dev, dmap, 0);
  931. local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use,DMA_MODE_READ);
  932. adev->d->start_input(dev, dmap->raw_buf_phys + dmap->qtail * dmap->fragment_size,
  933.      dmap->fragment_size, 1);
  934. if (adev->d->trigger)
  935. adev->d->trigger(dev, adev->enable_bits * adev->go);
  936. }
  937. dmap->flags |= DMA_ACTIVE;
  938. } else if (dmap->qlen >= (dmap->nbufs - 1)) {
  939. printk(KERN_WARNING "Sound: Recording overrunn");
  940. dmap->underrun_count++;
  941. /* Just throw away the oldest fragment but keep the engine running */
  942. dmap->qhead = (dmap->qhead + 1) % dmap->nbufs;
  943. dmap->qtail = (dmap->qtail + 1) % dmap->nbufs;
  944. } else if (dmap->qlen >= 0 && dmap->qlen < dmap->nbufs) {
  945. dmap->qlen++;
  946. dmap->qtail = (dmap->qtail + 1) % dmap->nbufs;
  947. if (dmap->qtail == 0) { /* Wrapped */
  948. dmap->byte_counter += dmap->bytes_in_use;
  949. if (dmap->byte_counter >= dmap->max_byte_counter) { /* Overflow */
  950. long decr = dmap->byte_counter;
  951. dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use) + dmap->bytes_in_use;
  952. decr -= dmap->byte_counter;
  953. dmap->user_counter -= decr;
  954. }
  955. }
  956. }
  957. if (!(adev->flags & DMA_AUTOMODE) || (dmap->flags & DMA_NODMA)) {
  958. local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use, DMA_MODE_READ);
  959. adev->d->start_input(dev, dmap->raw_buf_phys + dmap->qtail * dmap->fragment_size, dmap->fragment_size, 1);
  960. if (adev->d->trigger)
  961. adev->d->trigger(dev,adev->enable_bits * adev->go);
  962. }
  963. dmap->flags |= DMA_ACTIVE;
  964. if (dmap->qlen > 0)
  965. {
  966. wake_up(&adev->in_sleeper);
  967. wake_up(&adev->poll_sleeper);
  968. }
  969. }
  970. void DMAbuf_inputintr(int dev)
  971. {
  972. struct audio_operations *adev = audio_devs[dev];
  973. struct dma_buffparms *dmap = adev->dmap_in;
  974. unsigned long flags;
  975. save_flags(flags);
  976. cli();
  977. if (!(dmap->flags & DMA_NODMA)) {
  978. int chan = dmap->dma, pos, n;
  979. unsigned long f;
  980. f=claim_dma_lock();
  981. if(!isa_dma_bridge_buggy)
  982. disable_dma(dmap->dma);
  983. clear_dma_ff(chan);
  984. pos = dmap->bytes_in_use - get_dma_residue(chan);
  985. if(!isa_dma_bridge_buggy)
  986. enable_dma(dmap->dma);
  987. release_dma_lock(f);
  988. pos = pos / dmap->fragment_size; /* Actual qhead */
  989. if (pos < 0 || pos >= dmap->nbufs)
  990. pos = 0;
  991. n = 0;
  992. while (dmap->qtail != pos && ++n < dmap->nbufs)
  993. do_inputintr(dev);
  994. } else
  995. do_inputintr(dev);
  996. restore_flags(flags);
  997. }
  998. int DMAbuf_open_dma(int dev)
  999. {
  1000. /*
  1001.  *    NOTE!  This routine opens only the primary DMA channel (output).
  1002.  */
  1003. struct audio_operations *adev = audio_devs[dev];
  1004. int err;
  1005. if ((err = open_dmap(adev, OPEN_READWRITE, adev->dmap_out)) < 0)
  1006. return -EBUSY;
  1007. dma_init_buffers(adev->dmap_out);
  1008. adev->dmap_out->flags |= DMA_ALLOC_DONE;
  1009. adev->dmap_out->fragment_size = adev->dmap_out->buffsize;
  1010. if (adev->dmap_out->dma >= 0) {
  1011. unsigned long flags;
  1012. flags=claim_dma_lock();
  1013. clear_dma_ff(adev->dmap_out->dma);
  1014. disable_dma(adev->dmap_out->dma);
  1015. release_dma_lock(flags);
  1016. }
  1017. return 0;
  1018. }
  1019. void DMAbuf_close_dma(int dev)
  1020. {
  1021. close_dmap(audio_devs[dev], audio_devs[dev]->dmap_out);
  1022. }
  1023. void DMAbuf_init(int dev, int dma1, int dma2)
  1024. {
  1025. struct audio_operations *adev = audio_devs[dev];
  1026. /*
  1027.  * NOTE! This routine could be called several times.
  1028.  */
  1029. /* drag in audio_syms.o */
  1030. {
  1031. extern char audio_syms_symbol;
  1032. audio_syms_symbol = 0;
  1033. }
  1034. if (adev && adev->dmap_out == NULL) {
  1035. if (adev->d == NULL)
  1036. panic("OSS: audio_devs[%d]->d == NULLn", dev);
  1037. if (adev->parent_dev) {  /* Use DMA map of the parent dev */
  1038. int parent = adev->parent_dev - 1;
  1039. adev->dmap_out = audio_devs[parent]->dmap_out;
  1040. adev->dmap_in = audio_devs[parent]->dmap_in;
  1041. } else {
  1042. adev->dmap_out = adev->dmap_in = &adev->dmaps[0];
  1043. adev->dmap_out->dma = dma1;
  1044. if (adev->flags & DMA_DUPLEX) {
  1045. adev->dmap_in = &adev->dmaps[1];
  1046. adev->dmap_in->dma = dma2;
  1047. }
  1048. }
  1049. /* Persistent DMA buffers allocated here */
  1050. if (sound_dmap_flag == DMAP_KEEP_ON_CLOSE) {
  1051. if (adev->dmap_in->raw_buf == NULL)
  1052. sound_alloc_dmap(adev->dmap_in);
  1053. if (adev->dmap_out->raw_buf == NULL)
  1054. sound_alloc_dmap(adev->dmap_out);
  1055. }
  1056. }
  1057. }
  1058. /* No kernel lock - DMAbuf_activate_recording protected by global cli/sti */
  1059. static unsigned int poll_input(struct file * file, int dev, poll_table *wait)
  1060. {
  1061. struct audio_operations *adev = audio_devs[dev];
  1062. struct dma_buffparms *dmap = adev->dmap_in;
  1063. if (!(adev->open_mode & OPEN_READ))
  1064. return 0;
  1065. if (dmap->mapping_flags & DMA_MAP_MAPPED) {
  1066. if (dmap->qlen)
  1067. return POLLIN | POLLRDNORM;
  1068. return 0;
  1069. }
  1070. if (dmap->dma_mode != DMODE_INPUT) {
  1071. if (dmap->dma_mode == DMODE_NONE &&
  1072.     adev->enable_bits & PCM_ENABLE_INPUT &&
  1073.     !dmap->qlen && adev->go) {
  1074. unsigned long flags;
  1075. save_flags(flags);
  1076. cli();
  1077. DMAbuf_activate_recording(dev, dmap);
  1078. restore_flags(flags);
  1079. }
  1080. return 0;
  1081. }
  1082. if (!dmap->qlen)
  1083. return 0;
  1084. return POLLIN | POLLRDNORM;
  1085. }
  1086. static unsigned int poll_output(struct file * file, int dev, poll_table *wait)
  1087. {
  1088. struct audio_operations *adev = audio_devs[dev];
  1089. struct dma_buffparms *dmap = adev->dmap_out;
  1090. if (!(adev->open_mode & OPEN_WRITE))
  1091. return 0;
  1092. if (dmap->mapping_flags & DMA_MAP_MAPPED) {
  1093. if (dmap->qlen)
  1094. return POLLOUT | POLLWRNORM;
  1095. return 0;
  1096. }
  1097. if (dmap->dma_mode == DMODE_INPUT)
  1098. return 0;
  1099. if (dmap->dma_mode == DMODE_NONE)
  1100. return POLLOUT | POLLWRNORM;
  1101. if (!DMAbuf_space_in_queue(dev))
  1102. return 0;
  1103. return POLLOUT | POLLWRNORM;
  1104. }
  1105. unsigned int DMAbuf_poll(struct file * file, int dev, poll_table *wait)
  1106. {
  1107. struct audio_operations *adev = audio_devs[dev];
  1108. poll_wait(file, &adev->poll_sleeper, wait);
  1109. return poll_input(file, dev, wait) | poll_output(file, dev, wait);
  1110. }
  1111. void DMAbuf_deinit(int dev)
  1112. {
  1113. struct audio_operations *adev = audio_devs[dev];
  1114. /* This routine is called when driver is being unloaded */
  1115. if (!adev)
  1116. return;
  1117. /* Persistent DMA buffers deallocated here */
  1118. if (sound_dmap_flag == DMAP_KEEP_ON_CLOSE) {
  1119. sound_free_dmap(adev->dmap_out);
  1120. if (adev->flags & DMA_DUPLEX)
  1121. sound_free_dmap(adev->dmap_in);
  1122. }
  1123. }