diff options
| author | Clemens Ladisch <clemens@ladisch.de> | 2009-12-18 09:29:00 +0100 | 
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2009-12-18 12:54:01 +0100 | 
| commit | 681b84e17747e1c208e8e1acc54cc5e612da84d1 (patch) | |
| tree | f82316d8038b17711bdfbfb4e9ea7f2d76b5a9fc /sound/core/pcm_memory.c | |
| parent | 14d44e2c2cb2ef3c88c5090a2d419772e15e7a16 (diff) | |
| download | olio-linux-3.10-681b84e17747e1c208e8e1acc54cc5e612da84d1.tar.xz olio-linux-3.10-681b84e17747e1c208e8e1acc54cc5e612da84d1.zip  | |
sound: pcm: add vmalloc buffer helper functions
There are now five copies of the code to allocate a PCM buffer using
vmalloc().  Add a sixth in the core so that the others can be removed.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core/pcm_memory.c')
| -rw-r--r-- | sound/core/pcm_memory.c | 54 | 
1 files changed, 54 insertions, 0 deletions
diff --git a/sound/core/pcm_memory.c b/sound/core/pcm_memory.c index caa7796bc2f..d9727c74b2e 100644 --- a/sound/core/pcm_memory.c +++ b/sound/core/pcm_memory.c @@ -434,3 +434,57 @@ int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream)  }  EXPORT_SYMBOL(snd_pcm_lib_free_pages); + +int _snd_pcm_lib_alloc_vmalloc_buffer(struct snd_pcm_substream *substream, +				      size_t size, gfp_t gfp_flags) +{ +	struct snd_pcm_runtime *runtime; + +	if (PCM_RUNTIME_CHECK(substream)) +		return -EINVAL; +	runtime = substream->runtime; +	if (runtime->dma_area) { +		if (runtime->dma_bytes >= size) +			return 0; /* already large enough */ +		vfree(runtime->dma_area); +	} +	runtime->dma_area = __vmalloc(size, gfp_flags, PAGE_KERNEL); +	if (!runtime->dma_area) +		return -ENOMEM; +	runtime->dma_bytes = size; +	return 1; +} +EXPORT_SYMBOL(_snd_pcm_lib_alloc_vmalloc_buffer); + +/** + * snd_pcm_lib_free_vmalloc_buffer - free vmalloc buffer + * @substream: the substream with a buffer allocated by + *	snd_pcm_lib_alloc_vmalloc_buffer() + */ +int snd_pcm_lib_free_vmalloc_buffer(struct snd_pcm_substream *substream) +{ +	struct snd_pcm_runtime *runtime; + +	if (PCM_RUNTIME_CHECK(substream)) +		return -EINVAL; +	runtime = substream->runtime; +	vfree(runtime->dma_area); +	runtime->dma_area = NULL; +	return 0; +} +EXPORT_SYMBOL(snd_pcm_lib_free_vmalloc_buffer); + +/** + * snd_pcm_lib_get_vmalloc_page - map vmalloc buffer offset to page struct + * @substream: the substream with a buffer allocated by + *	snd_pcm_lib_alloc_vmalloc_buffer() + * @offset: offset in the buffer + * + * This function is to be used as the page callback in the PCM ops. + */ +struct page *snd_pcm_lib_get_vmalloc_page(struct snd_pcm_substream *substream, +					  unsigned long offset) +{ +	return vmalloc_to_page(substream->runtime->dma_area + offset); +} +EXPORT_SYMBOL(snd_pcm_lib_get_vmalloc_page);  |