int DMAbuf_release(int dev, int mode) { struct audio_operations *adev = audio_devs[dev]; unsigned long flags; if (adev->open_mode & OPEN_WRITE) adev->dmap_out->closing = 1; if (adev->open_mode & OPEN_READ) adev->dmap_in->closing = 1; if (adev->open_mode & OPEN_WRITE) if (!(adev->dmap_out->mapping_flags & DMA_MAP_MAPPED)) if (!signal_pending(current) && (adev->dmap_out->dma_mode == DMODE_OUTPUT)) DMAbuf_sync(dev); if (adev->dmap_out->dma_mode == DMODE_OUTPUT) memset(adev->dmap_out->raw_buf, adev->dmap_out->neutral_byte, adev->dmap_out->bytes_in_use); save_flags(flags); cli(); DMAbuf_reset(dev); adev->d->close(dev); if (adev->open_mode & OPEN_WRITE) close_dmap(adev, adev->dmap_out); if (adev->open_mode == OPEN_READ || (adev->open_mode != OPEN_WRITE && (adev->flags & DMA_DUPLEX))) close_dmap(adev, adev->dmap_in); adev->open_mode = 0; restore_flags(flags); return 0; }
int DMAbuf_open(int dev, int mode) { struct audio_operations *adev = audio_devs[dev]; int retval; struct dma_buffparms *dmap_in = NULL; struct dma_buffparms *dmap_out = NULL; if (!adev) return -ENXIO; if (!(adev->flags & DMA_DUPLEX)) adev->dmap_in = adev->dmap_out; check_driver(adev->d); if ((retval = adev->d->open(dev, mode)) < 0) return retval; dmap_out = adev->dmap_out; dmap_in = adev->dmap_in; if (dmap_in == dmap_out) adev->flags &= ~DMA_DUPLEX; if (mode & OPEN_WRITE) { if ((retval = open_dmap(adev, mode, dmap_out)) < 0) { adev->d->close(dev); return retval; } } adev->enable_bits = mode; if (mode == OPEN_READ || (mode != OPEN_WRITE && (adev->flags & DMA_DUPLEX))) { if ((retval = open_dmap(adev, mode, dmap_in)) < 0) { adev->d->close(dev); if (mode & OPEN_WRITE) close_dmap(adev, dmap_out); return retval; } } adev->open_mode = mode; adev->go = 1; adev->d->set_bits(dev, 8); adev->d->set_channels(dev, 1); adev->d->set_speed(dev, DSP_DEFAULT_SPEED); if (adev->dmap_out->dma_mode == DMODE_OUTPUT) memset(adev->dmap_out->raw_buf, adev->dmap_out->neutral_byte, adev->dmap_out->bytes_in_use); return 0; }
void DMAbuf_close_dma(int dev) { close_dmap(audio_devs[dev], audio_devs[dev]->dmap_out); }