struct snd_bebob *bebob = substream->private_data;
        int err;
 
-       err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
-                                              params_buffer_bytes(hw_params));
+       err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0)
                return err;
 
 
        mutex_unlock(&bebob->mutex);
 
-       return snd_pcm_lib_free_vmalloc_buffer(substream);
+       return snd_pcm_lib_free_pages(substream);
 }
 
 static int
                .trigger        = pcm_capture_trigger,
                .pointer        = pcm_capture_pointer,
                .ack            = pcm_capture_ack,
-               .page           = snd_pcm_lib_get_vmalloc_page,
        };
        static const struct snd_pcm_ops playback_ops = {
                .open           = pcm_open,
                .trigger        = pcm_playback_trigger,
                .pointer        = pcm_playback_pointer,
                .ack            = pcm_playback_ack,
-               .page           = snd_pcm_lib_get_vmalloc_page,
        };
        struct snd_pcm *pcm;
        int err;
                 "%s PCM", bebob->card->shortname);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_ops);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &capture_ops);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_VMALLOC,
+                                             NULL, 0, 0);
 end:
        return err;
 }
 
        struct snd_dice *dice = substream->private_data;
        int err;
 
-       err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
-                                              params_buffer_bytes(hw_params));
+       err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0)
                return err;
 
 
        mutex_unlock(&dice->mutex);
 
-       return snd_pcm_lib_free_vmalloc_buffer(substream);
+       return snd_pcm_lib_free_pages(substream);
 }
 
 static int capture_prepare(struct snd_pcm_substream *substream)
                .trigger   = capture_trigger,
                .pointer   = capture_pointer,
                .ack       = capture_ack,
-               .page      = snd_pcm_lib_get_vmalloc_page,
        };
        static const struct snd_pcm_ops playback_ops = {
                .open      = pcm_open,
                .trigger   = playback_trigger,
                .pointer   = playback_pointer,
                .ack       = playback_ack,
-               .page      = snd_pcm_lib_get_vmalloc_page,
        };
        struct snd_pcm *pcm;
        unsigned int capture, playback;
                if (playback > 0)
                        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
                                        &playback_ops);
+
+               snd_pcm_lib_preallocate_pages_for_all(pcm,
+                                                     SNDRV_DMA_TYPE_VMALLOC,
+                                                     NULL, 0, 0);
        }
 
        return 0;
 
        struct snd_dg00x *dg00x = substream->private_data;
        int err;
 
-       err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
-                                              params_buffer_bytes(hw_params));
+       err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0)
                return err;
 
 
        mutex_unlock(&dg00x->mutex);
 
-       return snd_pcm_lib_free_vmalloc_buffer(substream);
+       return snd_pcm_lib_free_pages(substream);
 }
 
 static int pcm_capture_prepare(struct snd_pcm_substream *substream)
                .trigger        = pcm_capture_trigger,
                .pointer        = pcm_capture_pointer,
                .ack            = pcm_capture_ack,
-               .page           = snd_pcm_lib_get_vmalloc_page,
        };
        static const struct snd_pcm_ops playback_ops = {
                .open           = pcm_open,
                .trigger        = pcm_playback_trigger,
                .pointer        = pcm_playback_pointer,
                .ack            = pcm_playback_ack,
-               .page           = snd_pcm_lib_get_vmalloc_page,
        };
        struct snd_pcm *pcm;
        int err;
                 "%s PCM", dg00x->card->shortname);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_ops);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &capture_ops);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_VMALLOC,
+                                             NULL, 0, 0);
 
        return 0;
 }
 
        struct snd_ff *ff = substream->private_data;
        int err;
 
-       err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
-                                              params_buffer_bytes(hw_params));
+       err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0)
                return err;
 
 
        mutex_unlock(&ff->mutex);
 
-       return snd_pcm_lib_free_vmalloc_buffer(substream);
+       return snd_pcm_lib_free_pages(substream);
 }
 
 static int pcm_capture_prepare(struct snd_pcm_substream *substream)
                .trigger        = pcm_capture_trigger,
                .pointer        = pcm_capture_pointer,
                .ack            = pcm_capture_ack,
-               .page           = snd_pcm_lib_get_vmalloc_page,
        };
        static const struct snd_pcm_ops pcm_playback_ops = {
                .open           = pcm_open,
                .trigger        = pcm_playback_trigger,
                .pointer        = pcm_playback_pointer,
                .ack            = pcm_playback_ack,
-               .page           = snd_pcm_lib_get_vmalloc_page,
        };
        struct snd_pcm *pcm;
        int err;
                 "%s PCM", ff->card->shortname);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &pcm_playback_ops);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &pcm_capture_ops);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_VMALLOC,
+                                             NULL, 0, 0);
 
        return 0;
 }
 
        struct snd_efw *efw = substream->private_data;
        int err;
 
-       err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
-                                              params_buffer_bytes(hw_params));
+       err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0)
                return err;
 
 
        mutex_unlock(&efw->mutex);
 
-       return snd_pcm_lib_free_vmalloc_buffer(substream);
+       return snd_pcm_lib_free_pages(substream);
 }
 
 static int pcm_capture_prepare(struct snd_pcm_substream *substream)
                .trigger        = pcm_capture_trigger,
                .pointer        = pcm_capture_pointer,
                .ack            = pcm_capture_ack,
-               .page           = snd_pcm_lib_get_vmalloc_page,
        };
        static const struct snd_pcm_ops playback_ops = {
                .open           = pcm_open,
                .trigger        = pcm_playback_trigger,
                .pointer        = pcm_playback_pointer,
                .ack            = pcm_playback_ack,
-               .page           = snd_pcm_lib_get_vmalloc_page,
        };
        struct snd_pcm *pcm;
        int err;
        snprintf(pcm->name, sizeof(pcm->name), "%s PCM", efw->card->shortname);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_ops);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &capture_ops);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_VMALLOC,
+                                             NULL, 0, 0);
 end:
        return err;
 }
 
        struct isight *isight = substream->private_data;
        int err;
 
-       err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
-                                              params_buffer_bytes(hw_params));
+       err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0)
                return err;
 
        isight_stop_streaming(isight);
        mutex_unlock(&isight->mutex);
 
-       return snd_pcm_lib_free_vmalloc_buffer(substream);
+       return snd_pcm_lib_free_pages(substream);
 }
 
 static int isight_start_streaming(struct isight *isight)
                .prepare   = isight_prepare,
                .trigger   = isight_trigger,
                .pointer   = isight_pointer,
-               .page      = snd_pcm_lib_get_vmalloc_page,
        };
        struct snd_pcm *pcm;
        int err;
        strcpy(pcm->name, "iSight");
        isight->pcm = pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream;
        isight->pcm->ops = &ops;
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_VMALLOC,
+                                             NULL, 0, 0);
 
        return 0;
 }
 
        struct snd_motu *motu = substream->private_data;
        int err;
 
-       err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
-                                              params_buffer_bytes(hw_params));
+       err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0)
                return err;
 
 
        mutex_unlock(&motu->mutex);
 
-       return snd_pcm_lib_free_vmalloc_buffer(substream);
+       return snd_pcm_lib_free_pages(substream);
 }
 
 static int capture_prepare(struct snd_pcm_substream *substream)
                .trigger   = capture_trigger,
                .pointer   = capture_pointer,
                .ack       = capture_ack,
-               .page      = snd_pcm_lib_get_vmalloc_page,
        };
        static const struct snd_pcm_ops playback_ops = {
                .open      = pcm_open,
                .trigger   = playback_trigger,
                .pointer   = playback_pointer,
                .ack       = playback_ack,
-               .page      = snd_pcm_lib_get_vmalloc_page,
        };
        struct snd_pcm *pcm;
        int err;
 
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &capture_ops);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_ops);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_VMALLOC,
+                                             NULL, 0, 0);
 
        return 0;
 }
 
        struct snd_oxfw *oxfw = substream->private_data;
        int err;
 
-       err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
-                                              params_buffer_bytes(hw_params));
+       err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0)
                return err;
 
        struct snd_oxfw *oxfw = substream->private_data;
        int err;
 
-       err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
-                                              params_buffer_bytes(hw_params));
+       err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0)
                return err;
 
 
        mutex_unlock(&oxfw->mutex);
 
-       return snd_pcm_lib_free_vmalloc_buffer(substream);
+       return snd_pcm_lib_free_pages(substream);
 }
 static int pcm_playback_hw_free(struct snd_pcm_substream *substream)
 {
 
        mutex_unlock(&oxfw->mutex);
 
-       return snd_pcm_lib_free_vmalloc_buffer(substream);
+       return snd_pcm_lib_free_pages(substream);
 }
 
 static int pcm_capture_prepare(struct snd_pcm_substream *substream)
                .trigger   = pcm_capture_trigger,
                .pointer   = pcm_capture_pointer,
                .ack       = pcm_capture_ack,
-               .page      = snd_pcm_lib_get_vmalloc_page,
        };
        static const struct snd_pcm_ops playback_ops = {
                .open      = pcm_open,
                .trigger   = pcm_playback_trigger,
                .pointer   = pcm_playback_pointer,
                .ack       = pcm_playback_ack,
-               .page      = snd_pcm_lib_get_vmalloc_page,
        };
        struct snd_pcm *pcm;
        unsigned int cap = 0;
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_ops);
        if (cap > 0)
                snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &capture_ops);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_VMALLOC,
+                                             NULL, 0, 0);
 
        return 0;
 }
 
        struct snd_tscm *tscm = substream->private_data;
        int err;
 
-       err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
-                                              params_buffer_bytes(hw_params));
+       err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
        if (err < 0)
                return err;
 
 
        mutex_unlock(&tscm->mutex);
 
-       return snd_pcm_lib_free_vmalloc_buffer(substream);
+       return snd_pcm_lib_free_pages(substream);
 }
 
 static int pcm_capture_prepare(struct snd_pcm_substream *substream)
                .trigger        = pcm_capture_trigger,
                .pointer        = pcm_capture_pointer,
                .ack            = pcm_capture_ack,
-               .page           = snd_pcm_lib_get_vmalloc_page,
        };
        static const struct snd_pcm_ops playback_ops = {
                .open           = pcm_open,
                .trigger        = pcm_playback_trigger,
                .pointer        = pcm_playback_pointer,
                .ack            = pcm_playback_ack,
-               .page           = snd_pcm_lib_get_vmalloc_page,
        };
        struct snd_pcm *pcm;
        int err;
                 "%s PCM", tscm->card->shortname);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &playback_ops);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &capture_ops);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_VMALLOC,
+                                             NULL, 0, 0);
 
        return 0;
 }