At Tue, 9 Mar 2010 12:57:52 -0500, Mike Frysinger wrote: > > From: Daniel Glöckner <dg@xxxxxxxxx> > > 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@xxxxxxxxx> > Signed-off-by: Cliff Cai <cliff.cai@xxxxxxxxxx> > Signed-off-by: Mike Frysinger <vapier@xxxxxxxxxx> > --- > this has been posted before but didnt seem to get any feedback ... Looks so. Now I applied the patch. I'll add it for 2.6.34 merge, too. This doesn't work for every case, though. But the irregular cases without dma_area setup don't provide mmap usually, so mostly OK :) thanks, Takashi > > sound/core/pcm_native.c | 30 ++++++++++++++++++++++-------- > 1 files changed, 22 insertions(+), 8 deletions(-) > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index 8728876..9681518 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -3434,14 +3434,28 @@ out: > #endif /* CONFIG_SND_SUPPORT_OLD_API */ > > #ifndef CONFIG_MMU > -unsigned long dummy_get_unmapped_area(struct file *file, unsigned long addr, > - unsigned long len, unsigned long pgoff, > - unsigned long flags) > -{ > - return 0; > +static unsigned long snd_pcm_get_unmapped_area(struct file *file, > + unsigned long addr, > + unsigned long len, > + unsigned long pgoff, > + unsigned long flags) > +{ > + 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 > -# define dummy_get_unmapped_area NULL > +# define snd_pcm_get_unmapped_area NULL > #endif > > /* > @@ -3460,7 +3474,7 @@ const struct file_operations snd_pcm_f_ops[2] = { > .compat_ioctl = snd_pcm_ioctl_compat, > .mmap = snd_pcm_mmap, > .fasync = snd_pcm_fasync, > - .get_unmapped_area = dummy_get_unmapped_area, > + .get_unmapped_area = snd_pcm_get_unmapped_area, > }, > { > .owner = THIS_MODULE, > @@ -3473,6 +3487,6 @@ const struct file_operations snd_pcm_f_ops[2] = { > .compat_ioctl = snd_pcm_ioctl_compat, > .mmap = snd_pcm_mmap, > .fasync = snd_pcm_fasync, > - .get_unmapped_area = dummy_get_unmapped_area, > + .get_unmapped_area = snd_pcm_get_unmapped_area, > } > }; > -- > 1.7.0.2 > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel