It's possible to use a buffer allocated via
vmalloc
, for example, for an intermediate
buffer. Since the allocated pages are not contiguous, you need
to set the page
callback to obtain
the physical address at every offset.
The implementation of page
callback
would be like this:
#include <linux/vmalloc.h> /* get the physical page pointer on the given offset */ static struct page *mychip_page(struct snd_pcm_substream *substream, unsigned long offset) { void *pageptr = substream->runtime->dma_area + offset; return vmalloc_to_page(pageptr); }