Commit 55c63bd2 authored by Daniel Glöckner's avatar Daniel Glöckner Committed by Takashi Iwai

ALSA: provide a more useful get_unmapped_area handler for pcm

Shared memory mappings on nommu machines require a get_unmapped_area
file operation that suggests an address for the mapping. The current
implementation returns 0 and thus forces the driver to implement an
mmap handler that fixes up the start and end address of the vma.

This patch returns the address of the dma buffer, so it should work
out of the box for all drivers that use the snd_pcm_runtime->dma_area
pointer.

Addresses for mapping the status and control pages are returned as
well, but to make those work the conditional compilation of
snd_pcm_mmap_{status,control} would need to be revised.

URL: http://thread.gmane.org/gmane.linux.alsa.devel/61230Signed-off-by: default avatarDaniel Glöckner <dg@emlix.com>
Signed-off-by: default avatarCliff Cai <cliff.cai@analog.com>
Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 57d54889
...@@ -3434,14 +3434,28 @@ static int snd_pcm_hw_params_old_user(struct snd_pcm_substream *substream, ...@@ -3434,14 +3434,28 @@ static int snd_pcm_hw_params_old_user(struct snd_pcm_substream *substream,
#endif /* CONFIG_SND_SUPPORT_OLD_API */ #endif /* CONFIG_SND_SUPPORT_OLD_API */
#ifndef CONFIG_MMU #ifndef CONFIG_MMU
unsigned long dummy_get_unmapped_area(struct file *file, unsigned long addr, static unsigned long snd_pcm_get_unmapped_area(struct file *file,
unsigned long len, unsigned long pgoff, unsigned long addr,
unsigned long len,
unsigned long pgoff,
unsigned long flags) unsigned long flags)
{ {
return 0; struct snd_pcm_file *pcm_file = file->private_data;
struct snd_pcm_substream *substream = pcm_file->substream;
struct snd_pcm_runtime *runtime = substream->runtime;
unsigned long offset = pgoff << PAGE_SHIFT;
switch (offset) {
case SNDRV_PCM_MMAP_OFFSET_STATUS:
return (unsigned long)runtime->status;
case SNDRV_PCM_MMAP_OFFSET_CONTROL:
return (unsigned long)runtime->control;
default:
return (unsigned long)runtime->dma_area + offset;
}
} }
#else #else
# define dummy_get_unmapped_area NULL # define snd_pcm_get_unmapped_area NULL
#endif #endif
/* /*
...@@ -3460,7 +3474,7 @@ const struct file_operations snd_pcm_f_ops[2] = { ...@@ -3460,7 +3474,7 @@ const struct file_operations snd_pcm_f_ops[2] = {
.compat_ioctl = snd_pcm_ioctl_compat, .compat_ioctl = snd_pcm_ioctl_compat,
.mmap = snd_pcm_mmap, .mmap = snd_pcm_mmap,
.fasync = snd_pcm_fasync, .fasync = snd_pcm_fasync,
.get_unmapped_area = dummy_get_unmapped_area, .get_unmapped_area = snd_pcm_get_unmapped_area,
}, },
{ {
.owner = THIS_MODULE, .owner = THIS_MODULE,
...@@ -3473,6 +3487,6 @@ const struct file_operations snd_pcm_f_ops[2] = { ...@@ -3473,6 +3487,6 @@ const struct file_operations snd_pcm_f_ops[2] = {
.compat_ioctl = snd_pcm_ioctl_compat, .compat_ioctl = snd_pcm_ioctl_compat,
.mmap = snd_pcm_mmap, .mmap = snd_pcm_mmap,
.fasync = snd_pcm_fasync, .fasync = snd_pcm_fasync,
.get_unmapped_area = dummy_get_unmapped_area, .get_unmapped_area = snd_pcm_get_unmapped_area,
} }
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment