/** * snd_dma_program - program an ISA DMA transfer * @dma: the dma number * @addr: the physical address of the buffer * @size: the DMA transfer size * @mode: the DMA transfer mode, DMA_MODE_XXX * * Programs an ISA DMA transfer for the given buffer.
*/ void snd_dma_program(unsignedlong dma, unsignedlong addr, unsignedint size, unsignedshort mode)
{ unsignedlong flags;
/** * snd_dma_disable - stop the ISA DMA transfer * @dma: the dma number * * Stops the ISA DMA transfer.
*/ void snd_dma_disable(unsignedlong dma)
{ unsignedlong flags;
/** * snd_dma_pointer - return the current pointer to DMA transfer buffer in bytes * @dma: the dma number * @size: the dma transfer size * * Return: The current pointer in DMA transfer buffer in bytes.
*/ unsignedint snd_dma_pointer(unsignedlong dma, unsignedint size)
{ unsignedlong flags; unsignedint result, result1;
flags = claim_dma_lock();
clear_dma_ff(dma); if (!isa_dma_bridge_buggy)
disable_dma(dma);
result = get_dma_residue(dma); /* * HACK - read the counter again and choose higher value in order to * avoid reading during counter lower byte roll over if the * isa_dma_bridge_buggy is set.
*/
result1 = get_dma_residue(dma); if (!isa_dma_bridge_buggy)
enable_dma(dma);
release_dma_lock(flags); if (unlikely(result < result1))
result = result1; #ifdef CONFIG_SND_DEBUG if (result > size)
pr_err("ALSA: pointer (0x%x) for DMA #%ld is greater than transfer size (0x%x)\n", result, dma, size); #endif if (result >= size || result == 0) return 0; else return size - result;
}
EXPORT_SYMBOL(snd_dma_pointer);
/** * snd_devm_request_dma - the managed version of request_dma() * @dev: the device pointer * @dma: the dma number * @name: the name string of the requester * * The requested DMA will be automatically released at unbinding via devres. * * Return: zero on success, or a negative error code
*/ int snd_devm_request_dma(struct device *dev, int dma, constchar *name)
{ struct snd_dma_data *p;
if (request_dma(dma, name)) return -EBUSY;
p = devres_alloc(__snd_release_dma, sizeof(*p), GFP_KERNEL); if (!p) {
free_dma(dma); return -ENOMEM;
}
p->dma = dma;
devres_add(dev, p); return 0;
}
EXPORT_SYMBOL_GPL(snd_devm_request_dma);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.