static int open_dmap(struct audio_operations *adev, int mode, struct dma_buffparms *dmap) { int err; if (dmap->flags & DMA_BUSY) return -EBUSY; if ((err = sound_alloc_dmap(dmap)) < 0) return err; if (dmap->raw_buf == NULL) { printk(KERN_WARNING "Sound: DMA buffers not available\n"); return -ENOSPC; /* Memory allocation failed during boot */ } if (dmap->dma >= 0 && sound_open_dma(dmap->dma, adev->name)) { printk(KERN_WARNING "Unable to grab(2) DMA%d for the audio driver\n", dmap->dma); return -EBUSY; } dma_init_buffers(dmap); spin_lock_init(&dmap->lock); dmap->open_mode = mode; dmap->subdivision = dmap->underrun_count = 0; dmap->fragment_size = 0; dmap->max_fragments = 65536; /* Just a large value */ dmap->byte_counter = 0; dmap->max_byte_counter = 8000 * 60 * 60; dmap->applic_profile = APF_NORMAL; dmap->needs_reorg = 1; dmap->audio_callback = NULL; dmap->callback_parm = 0; return 0; }
int DMAbuf_open_dma(int dev) { /* * NOTE! This routine opens only the primary DMA channel (output). */ struct audio_operations *adev = audio_devs[dev]; int err; if ((err = open_dmap(adev, OPEN_READWRITE, adev->dmap_out)) < 0) return -EBUSY; dma_init_buffers(adev->dmap_out); adev->dmap_out->flags |= DMA_ALLOC_DONE; adev->dmap_out->fragment_size = adev->dmap_out->buffsize; if (adev->dmap_out->dma >= 0) { unsigned long flags; flags=claim_dma_lock(); clear_dma_ff(adev->dmap_out->dma); disable_dma(adev->dmap_out->dma); release_dma_lock(flags); } return 0; }