aboutsummaryrefslogtreecommitdiffstats
path: root/sound/core
diff options
context:
space:
mode:
authorDaniel Glöckner <dg@emlix.com>2010-03-09 12:57:52 -0500
committerTakashi Iwai <tiwai@suse.de>2010-03-10 03:05:03 -0500
commit55c63bd256d41d79adbe1c3fc2325fb328419a18 (patch)
tree82e98a8ee7611f71e56022186fc5d25a889f7422 /sound/core
parent57d54889cd00db2752994b389ba714138652e60c (diff)
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/61230 Signed-off-by: Daniel Glöckner <dg@emlix.com> Signed-off-by: Cliff Cai <cliff.cai@analog.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core')
-rw-r--r--sound/core/pcm_native.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index 87288762403..9681518aa39 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -3434,14 +3434,28 @@ out:
3434#endif /* CONFIG_SND_SUPPORT_OLD_API */ 3434#endif /* CONFIG_SND_SUPPORT_OLD_API */
3435 3435
3436#ifndef CONFIG_MMU 3436#ifndef CONFIG_MMU
3437unsigned long dummy_get_unmapped_area(struct file *file, unsigned long addr, 3437static unsigned long snd_pcm_get_unmapped_area(struct file *file,
3438 unsigned long len, unsigned long pgoff, 3438 unsigned long addr,
3439 unsigned long flags) 3439 unsigned long len,
3440{ 3440 unsigned long pgoff,
3441 return 0; 3441 unsigned long flags)
3442{
3443 struct snd_pcm_file *pcm_file = file->private_data;
3444 struct snd_pcm_substream *substream = pcm_file->substream;
3445 struct snd_pcm_runtime *runtime = substream->runtime;
3446 unsigned long offset = pgoff << PAGE_SHIFT;
3447
3448 switch (offset) {
3449 case SNDRV_PCM_MMAP_OFFSET_STATUS:
3450 return (unsigned long)runtime->status;
3451 case SNDRV_PCM_MMAP_OFFSET_CONTROL:
3452 return (unsigned long)runtime->control;
3453 default:
3454 return (unsigned long)runtime->dma_area + offset;
3455 }
3442} 3456}
3443#else 3457#else
3444# define dummy_get_unmapped_area NULL 3458# define snd_pcm_get_unmapped_area NULL
3445#endif 3459#endif
3446 3460
3447/* 3461/*
@@ -3460,7 +3474,7 @@ const struct file_operations snd_pcm_f_ops[2] = {
3460 .compat_ioctl = snd_pcm_ioctl_compat, 3474 .compat_ioctl = snd_pcm_ioctl_compat,
3461 .mmap = snd_pcm_mmap, 3475 .mmap = snd_pcm_mmap,
3462 .fasync = snd_pcm_fasync, 3476 .fasync = snd_pcm_fasync,
3463 .get_unmapped_area = dummy_get_unmapped_area, 3477 .get_unmapped_area = snd_pcm_get_unmapped_area,
3464 }, 3478 },
3465 { 3479 {
3466 .owner = THIS_MODULE, 3480 .owner = THIS_MODULE,
@@ -3473,6 +3487,6 @@ const struct file_operations snd_pcm_f_ops[2] = {
3473 .compat_ioctl = snd_pcm_ioctl_compat, 3487 .compat_ioctl = snd_pcm_ioctl_compat,
3474 .mmap = snd_pcm_mmap, 3488 .mmap = snd_pcm_mmap,
3475 .fasync = snd_pcm_fasync, 3489 .fasync = snd_pcm_fasync,
3476 .get_unmapped_area = dummy_get_unmapped_area, 3490 .get_unmapped_area = snd_pcm_get_unmapped_area,
3477 } 3491 }
3478}; 3492};