ALSA provides several different buffer allocation functions
      depending on the bus and the architecture. All these have a
      consistent API. The allocation of physically-contiguous pages is
      done via 
      snd_malloc_xxx_pages() function, where xxx
      is the bus type. 
      
        The allocation of pages with fallback is
      snd_malloc_xxx_pages_fallback(). This
      function tries to allocate the specified pages but if the pages
      are not available, it tries to reduce the page sizes until
      enough space is found.
      
      The release the pages, call
      snd_free_xxx_pages() function. 
      
Usually, ALSA drivers try to allocate and reserve a large contiguous physical space at the time the module is loaded for the later use. This is called “pre-allocation”. As already written, you can call the following function at pcm instance construction time (in the case of PCI bus).
  snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
                                        snd_dma_pci_data(pci), size, max);
          
        where size is the byte size to be
      pre-allocated and the max is the maximum
      size to be changed via the prealloc proc file.
      The allocator will try to get an area as large as possible
      within the given size. 
      
      The second argument (type) and the third argument (device pointer)
      are dependent on the bus.
      In the case of the ISA bus, pass snd_dma_isa_data()
      as the third argument with SNDRV_DMA_TYPE_DEV type.
      For the continuous buffer unrelated to the bus can be pre-allocated
      with SNDRV_DMA_TYPE_CONTINUOUS type and the
      snd_dma_continuous_data(GFP_KERNEL) device pointer,
      where GFP_KERNEL is the kernel allocation flag to
      use.
      For the PCI scatter-gather buffers, use
      SNDRV_DMA_TYPE_DEV_SG with
      snd_dma_pci_data(pci)
      (see the 
          Non-Contiguous Buffers
           section).
      
        Once the buffer is pre-allocated, you can use the
        allocator in the hw_params callback: 
        
  snd_pcm_lib_malloc_pages(substream, size);
          Note that you have to pre-allocate to use this function.