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);
  }