Lines Matching refs:dmap

46 static long dmabuf_timeout(struct dma_buffparms *dmap)  in dmabuf_timeout()  argument
50 tmout = (dmap->fragment_size * HZ) / dmap->data_rate; in dmabuf_timeout()
59 static int sound_alloc_dmap(struct dma_buffparms *dmap) in sound_alloc_dmap() argument
66 dmap->mapping_flags &= ~DMA_MAP_MAPPED; in sound_alloc_dmap()
68 if (dmap->raw_buf != NULL) in sound_alloc_dmap()
72 dma_pagesize = (dmap->dma < 4) ? (64 * 1024) : (128 * 1024); in sound_alloc_dmap()
81 dmap->raw_buf = NULL; in sound_alloc_dmap()
82 dmap->buffsize = dma_buffsize; in sound_alloc_dmap()
83 if (dmap->buffsize > dma_pagesize) in sound_alloc_dmap()
84 dmap->buffsize = dma_pagesize; in sound_alloc_dmap()
91 while (start_addr == NULL && dmap->buffsize > PAGE_SIZE) { in sound_alloc_dmap()
92 for (sz = 0, size = PAGE_SIZE; size < dmap->buffsize; sz++, size <<= 1); in sound_alloc_dmap()
93 dmap->buffsize = PAGE_SIZE * (1 << sz); in sound_alloc_dmap()
96 dmap->buffsize /= 2; in sound_alloc_dmap()
104 end_addr = start_addr + dmap->buffsize - 1; in sound_alloc_dmap()
113 …printk(KERN_ERR "sound: Got invalid address 0x%lx for %db DMA-buffer\n", (long) start_addr, dmap->… in sound_alloc_dmap()
117 dmap->raw_buf = start_addr; in sound_alloc_dmap()
118 dmap->raw_buf_phys = dma_map_single(NULL, start_addr, dmap->buffsize, DMA_BIDIRECTIONAL); in sound_alloc_dmap()
125 static void sound_free_dmap(struct dma_buffparms *dmap) in sound_free_dmap() argument
131 if (dmap->raw_buf == NULL) in sound_free_dmap()
133 if (dmap->mapping_flags & DMA_MAP_MAPPED) in sound_free_dmap()
135 for (sz = 0, size = PAGE_SIZE; size < dmap->buffsize; sz++, size <<= 1); in sound_free_dmap()
137 start_addr = (unsigned long) dmap->raw_buf; in sound_free_dmap()
138 end_addr = start_addr + dmap->buffsize; in sound_free_dmap()
143 dma_unmap_single(NULL, dmap->raw_buf_phys, dmap->buffsize, DMA_BIDIRECTIONAL); in sound_free_dmap()
144 free_pages((unsigned long) dmap->raw_buf, sz); in sound_free_dmap()
145 dmap->raw_buf = NULL; in sound_free_dmap()
151 static int sound_start_dma(struct dma_buffparms *dmap, unsigned long physaddr, int count, int dma_m… in sound_start_dma() argument
154 int chan = dmap->dma; in sound_start_dma()
170 static void dma_init_buffers(struct dma_buffparms *dmap) in dma_init_buffers() argument
172 dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0; in dma_init_buffers()
173 dmap->byte_counter = 0; in dma_init_buffers()
174 dmap->max_byte_counter = 8000 * 60 * 60; in dma_init_buffers()
175 dmap->bytes_in_use = dmap->buffsize; in dma_init_buffers()
177 dmap->dma_mode = DMODE_NONE; in dma_init_buffers()
178 dmap->mapping_flags = 0; in dma_init_buffers()
179 dmap->neutral_byte = 0x80; in dma_init_buffers()
180 dmap->data_rate = 8000; in dma_init_buffers()
181 dmap->cfrag = -1; in dma_init_buffers()
182 dmap->closing = 0; in dma_init_buffers()
183 dmap->nbufs = 1; in dma_init_buffers()
184 dmap->flags = DMA_BUSY; /* Other flags off */ in dma_init_buffers()
187 static int open_dmap(struct audio_operations *adev, int mode, struct dma_buffparms *dmap) in open_dmap() argument
191 if (dmap->flags & DMA_BUSY) in open_dmap()
193 if ((err = sound_alloc_dmap(dmap)) < 0) in open_dmap()
196 if (dmap->raw_buf == NULL) { in open_dmap()
200 if (dmap->dma >= 0 && sound_open_dma(dmap->dma, adev->name)) { in open_dmap()
201 printk(KERN_WARNING "Unable to grab(2) DMA%d for the audio driver\n", dmap->dma); in open_dmap()
204 dma_init_buffers(dmap); in open_dmap()
205 spin_lock_init(&dmap->lock); in open_dmap()
206 dmap->open_mode = mode; in open_dmap()
207 dmap->subdivision = dmap->underrun_count = 0; in open_dmap()
208 dmap->fragment_size = 0; in open_dmap()
209 dmap->max_fragments = 65536; /* Just a large value */ in open_dmap()
210 dmap->byte_counter = 0; in open_dmap()
211 dmap->max_byte_counter = 8000 * 60 * 60; in open_dmap()
212 dmap->applic_profile = APF_NORMAL; in open_dmap()
213 dmap->needs_reorg = 1; in open_dmap()
214 dmap->audio_callback = NULL; in open_dmap()
215 dmap->callback_parm = 0; in open_dmap()
219 static void close_dmap(struct audio_operations *adev, struct dma_buffparms *dmap) in close_dmap() argument
223 if (dmap->dma >= 0) { in close_dmap()
224 sound_close_dma(dmap->dma); in close_dmap()
226 disable_dma(dmap->dma); in close_dmap()
229 if (dmap->flags & DMA_BUSY) in close_dmap()
230 dmap->dma_mode = DMODE_NONE; in close_dmap()
231 dmap->flags &= ~DMA_BUSY; in close_dmap()
234 sound_free_dmap(dmap); in close_dmap()
340 struct dma_buffparms *dmap = adev->dmap_out; in dma_reset_output() local
342 if (!(dmap->flags & DMA_STARTED)) /* DMA is not active */ in dma_reset_output()
348 spin_lock_irqsave(&dmap->lock,flags); in dma_reset_output()
354 spin_unlock_irqrestore(&dmap->lock,flags); in dma_reset_output()
355 oss_broken_sleep_on(&adev->out_sleeper, dmabuf_timeout(dmap)); in dma_reset_output()
356 spin_lock_irqsave(&dmap->lock,flags); in dma_reset_output()
370 clear_dma_ff(dmap->dma); in dma_reset_output()
371 disable_dma(dmap->dma); in dma_reset_output()
374 dmap->byte_counter = 0; in dma_reset_output()
376 dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0; in dma_reset_output()
377 spin_unlock_irqrestore(&dmap->lock,flags); in dma_reset_output()
384 struct dma_buffparms *dmap = adev->dmap_in; in dma_reset_input() local
386 spin_lock_irqsave(&dmap->lock,flags); in dma_reset_input()
393 dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0; in dma_reset_input()
394 dmap->byte_counter = 0; in dma_reset_input()
396 spin_unlock_irqrestore(&dmap->lock,flags); in dma_reset_input()
399 void DMAbuf_launch_output(int dev, struct dma_buffparms *dmap) in DMAbuf_launch_output() argument
405 dmap->dma_mode = DMODE_OUTPUT; in DMAbuf_launch_output()
407 if (!(dmap->flags & DMA_ACTIVE) || !(adev->flags & DMA_AUTOMODE) || (dmap->flags & DMA_NODMA)) { in DMAbuf_launch_output()
408 if (!(dmap->flags & DMA_STARTED)) { in DMAbuf_launch_output()
409 reorganize_buffers(dev, dmap, 0); in DMAbuf_launch_output()
410 if (adev->d->prepare_for_output(dev, dmap->fragment_size, dmap->nbufs)) in DMAbuf_launch_output()
412 if (!(dmap->flags & DMA_NODMA)) in DMAbuf_launch_output()
413 local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use,DMA_MODE_WRITE); in DMAbuf_launch_output()
414 dmap->flags |= DMA_STARTED; in DMAbuf_launch_output()
416 if (dmap->counts[dmap->qhead] == 0) in DMAbuf_launch_output()
417 dmap->counts[dmap->qhead] = dmap->fragment_size; in DMAbuf_launch_output()
418 dmap->dma_mode = DMODE_OUTPUT; in DMAbuf_launch_output()
419 adev->d->output_block(dev, dmap->raw_buf_phys + dmap->qhead * dmap->fragment_size, in DMAbuf_launch_output()
420 dmap->counts[dmap->qhead], 1); in DMAbuf_launch_output()
424 dmap->flags |= DMA_ACTIVE; in DMAbuf_launch_output()
432 struct dma_buffparms *dmap; in DMAbuf_sync() local
438 dmap = adev->dmap_out; in DMAbuf_sync()
439 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_sync()
440 if (dmap->qlen > 0 && !(dmap->flags & DMA_ACTIVE)) in DMAbuf_sync()
441 DMAbuf_launch_output(dev, dmap); in DMAbuf_sync()
446 long t = dmabuf_timeout(dmap); in DMAbuf_sync()
447 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_sync()
450 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_sync()
453 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_sync()
468 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_sync()
470 dmabuf_timeout(dmap)); in DMAbuf_sync()
471 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_sync()
474 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_sync()
483 struct dma_buffparms *dmap; in DMAbuf_release() local
486 dmap = adev->dmap_out; in DMAbuf_release()
492 dmap = adev->dmap_in; in DMAbuf_release()
502 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_release()
513 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_release()
517 int DMAbuf_activate_recording(int dev, struct dma_buffparms *dmap) in DMAbuf_activate_recording() argument
526 if (dmap->dma_mode == DMODE_OUTPUT) { /* Direction change */ in DMAbuf_activate_recording()
528 spin_unlock_irq(&dmap->lock); in DMAbuf_activate_recording()
531 spin_lock_irq(&dmap->lock); in DMAbuf_activate_recording()
532 dmap->dma_mode = DMODE_NONE; in DMAbuf_activate_recording()
534 if (!dmap->dma_mode) { in DMAbuf_activate_recording()
535 reorganize_buffers(dev, dmap, 1); in DMAbuf_activate_recording()
537 dmap->fragment_size, dmap->nbufs)) < 0) in DMAbuf_activate_recording()
539 dmap->dma_mode = DMODE_INPUT; in DMAbuf_activate_recording()
541 if (!(dmap->flags & DMA_ACTIVE)) { in DMAbuf_activate_recording()
542 if (dmap->needs_reorg) in DMAbuf_activate_recording()
543 reorganize_buffers(dev, dmap, 0); in DMAbuf_activate_recording()
544 local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use, DMA_MODE_READ); in DMAbuf_activate_recording()
545 adev->d->start_input(dev, dmap->raw_buf_phys + dmap->qtail * dmap->fragment_size, in DMAbuf_activate_recording()
546 dmap->fragment_size, 0); in DMAbuf_activate_recording()
547 dmap->flags |= DMA_ACTIVE; in DMAbuf_activate_recording()
559 struct dma_buffparms *dmap = adev->dmap_in; in DMAbuf_getrdbuffer() local
563 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_getrdbuffer()
564 if (dmap->needs_reorg) in DMAbuf_getrdbuffer()
565 reorganize_buffers(dev, dmap, 0); in DMAbuf_getrdbuffer()
568 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_getrdbuffer()
570 } else while (dmap->qlen <= 0 && n++ < 10) { in DMAbuf_getrdbuffer()
573 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_getrdbuffer()
576 if ((err = DMAbuf_activate_recording(dev, dmap)) < 0) { in DMAbuf_getrdbuffer()
577 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_getrdbuffer()
583 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_getrdbuffer()
587 timeout = dmabuf_timeout(dmap); in DMAbuf_getrdbuffer()
589 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_getrdbuffer()
598 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_getrdbuffer()
600 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_getrdbuffer()
602 if (dmap->qlen <= 0) in DMAbuf_getrdbuffer()
604 *buf = &dmap->raw_buf[dmap->qhead * dmap->fragment_size + dmap->counts[dmap->qhead]]; in DMAbuf_getrdbuffer()
605 *len = dmap->fragment_size - dmap->counts[dmap->qhead]; in DMAbuf_getrdbuffer()
607 return dmap->qhead; in DMAbuf_getrdbuffer()
613 struct dma_buffparms *dmap = adev->dmap_in; in DMAbuf_rmchars() local
614 int p = dmap->counts[dmap->qhead] + c; in DMAbuf_rmchars()
616 if (dmap->mapping_flags & DMA_MAP_MAPPED) in DMAbuf_rmchars()
621 else if (dmap->qlen <= 0) in DMAbuf_rmchars()
623 else if (p >= dmap->fragment_size) { /* This buffer is completely empty */ in DMAbuf_rmchars()
624 dmap->counts[dmap->qhead] = 0; in DMAbuf_rmchars()
625 dmap->qlen--; in DMAbuf_rmchars()
626 dmap->qhead = (dmap->qhead + 1) % dmap->nbufs; in DMAbuf_rmchars()
628 else dmap->counts[dmap->qhead] = p; in DMAbuf_rmchars()
633 int DMAbuf_get_buffer_pointer(int dev, struct dma_buffparms *dmap, int direction) in DMAbuf_get_buffer_pointer() argument
643 if (!(dmap->flags & DMA_ACTIVE)) in DMAbuf_get_buffer_pointer()
646 int chan = dmap->dma; in DMAbuf_get_buffer_pointer()
652 disable_dma(dmap->dma); in DMAbuf_get_buffer_pointer()
656 pos = dmap->bytes_in_use - pos; in DMAbuf_get_buffer_pointer()
658 if (!(dmap->mapping_flags & DMA_MAP_MAPPED)) { in DMAbuf_get_buffer_pointer()
660 if (dmap->qhead == 0) in DMAbuf_get_buffer_pointer()
661 if (pos > dmap->fragment_size) in DMAbuf_get_buffer_pointer()
664 if (dmap->qtail == 0) in DMAbuf_get_buffer_pointer()
665 if (pos > dmap->fragment_size) in DMAbuf_get_buffer_pointer()
671 if (pos >= dmap->bytes_in_use) in DMAbuf_get_buffer_pointer()
675 enable_dma(dmap->dma); in DMAbuf_get_buffer_pointer()
714 struct dma_buffparms *dmap = adev->dmap_out; in DMAbuf_space_in_queue() local
715 int lim = dmap->nbufs; in DMAbuf_space_in_queue()
720 if (dmap->qlen >= lim) /* No space at all */ in DMAbuf_space_in_queue()
728 max = dmap->max_fragments; in DMAbuf_space_in_queue()
731 len = dmap->qlen; in DMAbuf_space_in_queue()
739 if (dmap->byte_counter % dmap->fragment_size) /* There is a partial fragment */ in DMAbuf_space_in_queue()
751 struct dma_buffparms *dmap = adev->dmap_out; in output_sleep() local
765 timeout = (adev->go && !(dmap->flags & DMA_NOTIMEOUT)); in output_sleep()
767 timeout_value = dmabuf_timeout(dmap); in output_sleep()
784 struct dma_buffparms *dmap = adev->dmap_out; in find_output_space() local
788 int occupied_bytes = (dmap->user_counter % dmap->fragment_size); in find_output_space()
790 *buf = dmap->raw_buf; in find_output_space()
795 active_offs = dmap->byte_counter + dmap->qhead * dmap->fragment_size; in find_output_space()
797 active_offs = max(DMAbuf_get_buffer_pointer(dev, dmap, DMODE_OUTPUT), 0); in find_output_space()
799 if (active_offs >= dmap->bytes_in_use) in find_output_space()
801 active_offs += dmap->byte_counter; in find_output_space()
804 offs = (dmap->user_counter % dmap->bytes_in_use) & ~SAMPLE_ROUNDUP; in find_output_space()
805 if (offs < 0 || offs >= dmap->bytes_in_use) { in find_output_space()
807 printk("Counter = %ld, bytes=%d\n", dmap->user_counter, dmap->bytes_in_use); in find_output_space()
810 *buf = dmap->raw_buf + offs; in find_output_space()
812 len = active_offs + dmap->bytes_in_use - dmap->user_counter; /* Number of unused bytes in buffer */ in find_output_space()
814 if ((offs + len) > dmap->bytes_in_use) in find_output_space()
815 len = dmap->bytes_in_use - offs; in find_output_space()
819 if (len > ((maxfrags * dmap->fragment_size) - occupied_bytes)) in find_output_space()
820 len = (maxfrags * dmap->fragment_size) - occupied_bytes; in find_output_space()
830 struct dma_buffparms *dmap = adev->dmap_out; in DMAbuf_getwrbuffer() local
832 if (dmap->mapping_flags & DMA_MAP_MAPPED) { in DMAbuf_getwrbuffer()
836 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_getwrbuffer()
837 if (dmap->needs_reorg) in DMAbuf_getwrbuffer()
838 reorganize_buffers(dev, dmap, 0); in DMAbuf_getwrbuffer()
840 if (dmap->dma_mode == DMODE_INPUT) { /* Direction change */ in DMAbuf_getwrbuffer()
841 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_getwrbuffer()
843 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_getwrbuffer()
845 dmap->dma_mode = DMODE_OUTPUT; in DMAbuf_getwrbuffer()
848 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_getwrbuffer()
852 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_getwrbuffer()
855 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_getwrbuffer()
862 struct dma_buffparms *dmap = adev->dmap_out; in DMAbuf_move_wrpointer() local
868 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_move_wrpointer()
869 post= (dmap->flags & DMA_POST); in DMAbuf_move_wrpointer()
870 ptr = (dmap->user_counter / dmap->fragment_size) * dmap->fragment_size; in DMAbuf_move_wrpointer()
872 dmap->flags &= ~DMA_POST; in DMAbuf_move_wrpointer()
873 dmap->cfrag = -1; in DMAbuf_move_wrpointer()
874 dmap->user_counter += l; in DMAbuf_move_wrpointer()
875 dmap->flags |= DMA_DIRTY; in DMAbuf_move_wrpointer()
877 if (dmap->byte_counter >= dmap->max_byte_counter) { in DMAbuf_move_wrpointer()
879 long decr = dmap->byte_counter; in DMAbuf_move_wrpointer()
880 dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use); in DMAbuf_move_wrpointer()
881 decr -= dmap->byte_counter; in DMAbuf_move_wrpointer()
882 dmap->user_counter -= decr; in DMAbuf_move_wrpointer()
884 end_ptr = (dmap->user_counter / dmap->fragment_size) * dmap->fragment_size; in DMAbuf_move_wrpointer()
886 p = (dmap->user_counter - 1) % dmap->bytes_in_use; in DMAbuf_move_wrpointer()
887 dmap->neutral_byte = dmap->raw_buf[p]; in DMAbuf_move_wrpointer()
891 dmap->counts[dmap->qtail] = dmap->fragment_size; in DMAbuf_move_wrpointer()
892 dmap->qtail = (dmap->qtail + 1) % dmap->nbufs; in DMAbuf_move_wrpointer()
893 dmap->qlen++; in DMAbuf_move_wrpointer()
894 ptr += dmap->fragment_size; in DMAbuf_move_wrpointer()
897 dmap->counts[dmap->qtail] = dmap->user_counter - ptr; in DMAbuf_move_wrpointer()
906 if (!(dmap->flags & DMA_ACTIVE)) in DMAbuf_move_wrpointer()
907 if (dmap->qlen > 1 || (dmap->qlen > 0 && (post || dmap->qlen >= dmap->nbufs - 1))) in DMAbuf_move_wrpointer()
908 DMAbuf_launch_output(dev, dmap); in DMAbuf_move_wrpointer()
910 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_move_wrpointer()
917 struct dma_buffparms *dmap = (dma_mode == DMA_MODE_WRITE) ? adev->dmap_out : adev->dmap_in; in DMAbuf_start_dma() local
919 if (dmap->raw_buf == NULL) { in DMAbuf_start_dma()
921 printk("Device %d, chn=%s\n", dev, (dmap == adev->dmap_out) ? "out" : "in"); in DMAbuf_start_dma()
924 if (dmap->dma < 0) in DMAbuf_start_dma()
926 sound_start_dma(dmap, physaddr, count, dma_mode); in DMAbuf_start_dma()
933 struct dma_buffparms *dmap = (dma_mode == DMA_MODE_WRITE) ? adev->dmap_out : adev->dmap_in; in local_start_dma() local
935 if (dmap->raw_buf == NULL) { in local_start_dma()
937 printk(KERN_ERR "Device %s, chn=%s\n", adev->name, (dmap == adev->dmap_out) ? "out" : "in"); in local_start_dma()
940 if (dmap->flags & DMA_NODMA) in local_start_dma()
942 if (dmap->dma < 0) in local_start_dma()
944 sound_start_dma(dmap, dmap->raw_buf_phys, dmap->bytes_in_use, dma_mode | DMA_AUTOINIT); in local_start_dma()
945 dmap->flags |= DMA_STARTED; in local_start_dma()
949 static void finish_output_interrupt(int dev, struct dma_buffparms *dmap) in finish_output_interrupt() argument
953 if (dmap->audio_callback != NULL) in finish_output_interrupt()
954 dmap->audio_callback(dev, dmap->callback_parm); in finish_output_interrupt()
962 struct dma_buffparms *dmap = adev->dmap_out; in do_outputintr() local
965 if (dmap->raw_buf == NULL) { in do_outputintr()
969 if (dmap->mapping_flags & DMA_MAP_MAPPED) { /* Virtual memory mapped access */ in do_outputintr()
971 dmap->qhead = (dmap->qhead + 1) % dmap->nbufs; in do_outputintr()
972 if (dmap->qhead == 0) { /* Wrapped */ in do_outputintr()
973 dmap->byte_counter += dmap->bytes_in_use; in do_outputintr()
974 if (dmap->byte_counter >= dmap->max_byte_counter) { /* Overflow */ in do_outputintr()
975 long decr = dmap->byte_counter; in do_outputintr()
976 dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use); in do_outputintr()
977 decr -= dmap->byte_counter; in do_outputintr()
978 dmap->user_counter -= decr; in do_outputintr()
981 dmap->qlen++; /* Yes increment it (don't decrement) */ in do_outputintr()
983 dmap->flags &= ~DMA_ACTIVE; in do_outputintr()
984 dmap->counts[dmap->qhead] = dmap->fragment_size; in do_outputintr()
985 DMAbuf_launch_output(dev, dmap); in do_outputintr()
986 finish_output_interrupt(dev, dmap); in do_outputintr()
990 dmap->qlen--; in do_outputintr()
991 this_fragment = dmap->qhead; in do_outputintr()
992 dmap->qhead = (dmap->qhead + 1) % dmap->nbufs; in do_outputintr()
994 if (dmap->qhead == 0) { /* Wrapped */ in do_outputintr()
995 dmap->byte_counter += dmap->bytes_in_use; in do_outputintr()
996 if (dmap->byte_counter >= dmap->max_byte_counter) { /* Overflow */ in do_outputintr()
997 long decr = dmap->byte_counter; in do_outputintr()
998 dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use); in do_outputintr()
999 decr -= dmap->byte_counter; in do_outputintr()
1000 dmap->user_counter -= decr; in do_outputintr()
1004 dmap->flags &= ~DMA_ACTIVE; in do_outputintr()
1011 while (dmap->qlen <= -dmap->closing) { in do_outputintr()
1012 dmap->underrun_count++; in do_outputintr()
1013 dmap->qlen++; in do_outputintr()
1014 if ((dmap->flags & DMA_DIRTY) && dmap->applic_profile != APF_CPUINTENS) { in do_outputintr()
1015 dmap->flags &= ~DMA_DIRTY; in do_outputintr()
1019 dmap->user_counter += dmap->fragment_size; in do_outputintr()
1020 dmap->qtail = (dmap->qtail + 1) % dmap->nbufs; in do_outputintr()
1022 if (dmap->qlen > 0) in do_outputintr()
1023 DMAbuf_launch_output(dev, dmap); in do_outputintr()
1024 finish_output_interrupt(dev, dmap); in do_outputintr()
1031 struct dma_buffparms *dmap = adev->dmap_out; in DMAbuf_outputintr() local
1033 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_outputintr()
1034 if (!(dmap->flags & DMA_NODMA)) { in DMAbuf_outputintr()
1035 int chan = dmap->dma, pos, n; in DMAbuf_outputintr()
1041 disable_dma(dmap->dma); in DMAbuf_outputintr()
1043 pos = dmap->bytes_in_use - get_dma_residue(chan); in DMAbuf_outputintr()
1045 enable_dma(dmap->dma); in DMAbuf_outputintr()
1048 pos = pos / dmap->fragment_size; /* Actual qhead */ in DMAbuf_outputintr()
1049 if (pos < 0 || pos >= dmap->nbufs) in DMAbuf_outputintr()
1052 while (dmap->qhead != pos && n++ < dmap->nbufs) in DMAbuf_outputintr()
1057 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_outputintr()
1065 struct dma_buffparms *dmap = adev->dmap_in; in do_inputintr() local
1067 if (dmap->raw_buf == NULL) { in do_inputintr()
1071 if (dmap->mapping_flags & DMA_MAP_MAPPED) { in do_inputintr()
1072 dmap->qtail = (dmap->qtail + 1) % dmap->nbufs; in do_inputintr()
1073 if (dmap->qtail == 0) { /* Wrapped */ in do_inputintr()
1074 dmap->byte_counter += dmap->bytes_in_use; in do_inputintr()
1075 if (dmap->byte_counter >= dmap->max_byte_counter) { /* Overflow */ in do_inputintr()
1076 long decr = dmap->byte_counter; in do_inputintr()
1077 dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use) + dmap->bytes_in_use; in do_inputintr()
1078 decr -= dmap->byte_counter; in do_inputintr()
1079 dmap->user_counter -= decr; in do_inputintr()
1082 dmap->qlen++; in do_inputintr()
1085 if (dmap->needs_reorg) in do_inputintr()
1086 reorganize_buffers(dev, dmap, 0); in do_inputintr()
1087 local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use,DMA_MODE_READ); in do_inputintr()
1088 adev->d->start_input(dev, dmap->raw_buf_phys + dmap->qtail * dmap->fragment_size, in do_inputintr()
1089 dmap->fragment_size, 1); in do_inputintr()
1093 dmap->flags |= DMA_ACTIVE; in do_inputintr()
1094 } else if (dmap->qlen >= (dmap->nbufs - 1)) { in do_inputintr()
1096 dmap->underrun_count++; in do_inputintr()
1099 dmap->qhead = (dmap->qhead + 1) % dmap->nbufs; in do_inputintr()
1100 dmap->qtail = (dmap->qtail + 1) % dmap->nbufs; in do_inputintr()
1101 } else if (dmap->qlen >= 0 && dmap->qlen < dmap->nbufs) { in do_inputintr()
1102 dmap->qlen++; in do_inputintr()
1103 dmap->qtail = (dmap->qtail + 1) % dmap->nbufs; in do_inputintr()
1104 if (dmap->qtail == 0) { /* Wrapped */ in do_inputintr()
1105 dmap->byte_counter += dmap->bytes_in_use; in do_inputintr()
1106 if (dmap->byte_counter >= dmap->max_byte_counter) { /* Overflow */ in do_inputintr()
1107 long decr = dmap->byte_counter; in do_inputintr()
1108 dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use) + dmap->bytes_in_use; in do_inputintr()
1109 decr -= dmap->byte_counter; in do_inputintr()
1110 dmap->user_counter -= decr; in do_inputintr()
1114 if (!(adev->flags & DMA_AUTOMODE) || (dmap->flags & DMA_NODMA)) { in do_inputintr()
1115 local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use, DMA_MODE_READ); in do_inputintr()
1116 …adev->d->start_input(dev, dmap->raw_buf_phys + dmap->qtail * dmap->fragment_size, dmap->fragment_s… in do_inputintr()
1120 dmap->flags |= DMA_ACTIVE; in do_inputintr()
1121 if (dmap->qlen > 0) in do_inputintr()
1131 struct dma_buffparms *dmap = adev->dmap_in; in DMAbuf_inputintr() local
1134 spin_lock_irqsave(&dmap->lock,flags); in DMAbuf_inputintr()
1136 if (!(dmap->flags & DMA_NODMA)) { in DMAbuf_inputintr()
1137 int chan = dmap->dma, pos, n; in DMAbuf_inputintr()
1142 disable_dma(dmap->dma); in DMAbuf_inputintr()
1144 pos = dmap->bytes_in_use - get_dma_residue(chan); in DMAbuf_inputintr()
1146 enable_dma(dmap->dma); in DMAbuf_inputintr()
1149 pos = pos / dmap->fragment_size; /* Actual qhead */ in DMAbuf_inputintr()
1150 if (pos < 0 || pos >= dmap->nbufs) in DMAbuf_inputintr()
1154 while (dmap->qtail != pos && ++n < dmap->nbufs) in DMAbuf_inputintr()
1158 spin_unlock_irqrestore(&dmap->lock,flags); in DMAbuf_inputintr()
1199 struct dma_buffparms *dmap = adev->dmap_in; in poll_input() local
1203 if (dmap->mapping_flags & DMA_MAP_MAPPED) { in poll_input()
1204 if (dmap->qlen) in poll_input()
1208 if (dmap->dma_mode != DMODE_INPUT) { in poll_input()
1209 if (dmap->dma_mode == DMODE_NONE && in poll_input()
1211 !dmap->qlen && adev->go) { in poll_input()
1214 spin_lock_irqsave(&dmap->lock,flags); in poll_input()
1215 DMAbuf_activate_recording(dev, dmap); in poll_input()
1216 spin_unlock_irqrestore(&dmap->lock,flags); in poll_input()
1220 if (!dmap->qlen) in poll_input()
1228 struct dma_buffparms *dmap = adev->dmap_out; in poll_output() local
1232 if (dmap->mapping_flags & DMA_MAP_MAPPED) { in poll_output()
1233 if (dmap->qlen) in poll_output()
1237 if (dmap->dma_mode == DMODE_INPUT) in poll_output()
1239 if (dmap->dma_mode == DMODE_NONE) in poll_output()