Lines Matching refs:sq
414 static int sq_allocate_buffers(struct sound_queue *sq, int num, int size) in sq_allocate_buffers() argument
418 if (sq->buffers) in sq_allocate_buffers()
420 sq->numBufs = num; in sq_allocate_buffers()
421 sq->bufSize = size; in sq_allocate_buffers()
422 sq->buffers = kmalloc (num * sizeof(char *), GFP_KERNEL); in sq_allocate_buffers()
423 if (!sq->buffers) in sq_allocate_buffers()
426 sq->buffers[i] = dmasound.mach.dma_alloc(size, GFP_KERNEL); in sq_allocate_buffers()
427 if (!sq->buffers[i]) { in sq_allocate_buffers()
429 dmasound.mach.dma_free(sq->buffers[i], size); in sq_allocate_buffers()
430 kfree(sq->buffers); in sq_allocate_buffers()
431 sq->buffers = NULL; in sq_allocate_buffers()
438 static void sq_release_buffers(struct sound_queue *sq) in sq_release_buffers() argument
442 if (sq->buffers) { in sq_release_buffers()
443 for (i = 0; i < sq->numBufs; i++) in sq_release_buffers()
444 dmasound.mach.dma_free(sq->buffers[i], sq->bufSize); in sq_release_buffers()
445 kfree(sq->buffers); in sq_release_buffers()
446 sq->buffers = NULL; in sq_release_buffers()
451 static int sq_setup(struct sound_queue *sq) in sq_setup() argument
456 if (sq->locked) { /* are we already set? - and not changeable */ in sq_setup()
462 sq->locked = 1 ; /* don't think we have a race prob. here _check_ */ in sq_setup()
482 if (sq->user_frags <= 0) { in sq_setup()
483 sq->max_count = sq->numBufs ; in sq_setup()
484 sq->max_active = sq->numBufs ; in sq_setup()
485 sq->block_size = sq->bufSize; in sq_setup()
487 sq->user_frags = sq->numBufs ; in sq_setup()
488 sq->user_frag_size = sq->bufSize ; in sq_setup()
489 sq->user_frag_size *= in sq_setup()
491 sq->user_frag_size /= in sq_setup()
495 sq->block_size = sq->user_frag_size ; in sq_setup()
496 sq->block_size *= in sq_setup()
498 sq->block_size /= in sq_setup()
501 sq->block_size *= dmasound.hard.speed ; in sq_setup()
502 sq->block_size /= dmasound.soft.speed ; in sq_setup()
506 sq->block_size += (hard_frame - 1) ; in sq_setup()
507 sq->block_size &= ~(hard_frame - 1) ; /* make sure we are aligned */ in sq_setup()
509 if ( sq->block_size <= 0 || sq->block_size > sq->bufSize) { in sq_setup()
511 printk("dmasound_core: invalid frag size (user set %d)\n", sq->user_frag_size) ; in sq_setup()
513 sq->block_size = sq->bufSize ; in sq_setup()
515 if ( sq->user_frags <= sq->numBufs ) { in sq_setup()
516 sq->max_count = sq->user_frags ; in sq_setup()
518 sq->max_active = (sq->max_active <= sq->max_count) ? in sq_setup()
519 sq->max_active : sq->max_count ; in sq_setup()
522 printk("dmasound_core: invalid frag count (user set %d)\n", sq->user_frags) ; in sq_setup()
524 sq->max_count = in sq_setup()
525 sq->max_active = sq->numBufs ; in sq_setup()
528 sq->front = sq->count = sq->rear_size = 0; in sq_setup()
529 sq->syncing = 0; in sq_setup()
530 sq->active = 0; in sq_setup()
532 if (sq == &write_sq) { in sq_setup()
533 sq->rear = -1; in sq_setup()
691 static inline void sq_init_waitqueue(struct sound_queue *sq) in sq_init_waitqueue() argument
693 init_waitqueue_head(&sq->action_queue); in sq_init_waitqueue()
694 init_waitqueue_head(&sq->open_queue); in sq_init_waitqueue()
695 init_waitqueue_head(&sq->sync_queue); in sq_init_waitqueue()
696 sq->busy = 0; in sq_init_waitqueue()
700 static inline void sq_wake_up(struct sound_queue *sq, struct file *file,
704 sq->busy = 0; /* CHECK: IS THIS OK??? */
705 WAKE_UP(sq->open_queue);
710 static int sq_open2(struct sound_queue *sq, struct file *file, fmode_t mode, in sq_open2() argument
716 if (sq->busy) { in sq_open2()
722 if (wait_event_interruptible(sq->open_queue, !sq->busy)) in sq_open2()
732 sq->busy = 1; /* Let's play spot-the-race-condition */ in sq_open2()
739 if (( rc = sq_allocate_buffers(sq, numbufs, bufsize))) { in sq_open2()
741 sq_wake_up(sq, file, mode); in sq_open2()
743 sq->busy = 0 ; in sq_open2()
748 sq->non_blocking = file->f_flags & O_NONBLOCK; in sq_open2()
956 static int set_queue_frags(struct sound_queue *sq, int bufs, int size) in set_queue_frags() argument
958 if (sq->locked) { in set_queue_frags()
968 if (size > sq->bufSize) in set_queue_frags()
973 if (bufs > sq->numBufs) /* the user is allowed say "don't care" with 0x7fff */ in set_queue_frags()
974 bufs = sq->numBufs ; in set_queue_frags()
981 sq->user_frags = in set_queue_frags()
982 sq->max_active = bufs ; in set_queue_frags()
983 sq->user_frag_size = size ; in set_queue_frags()