[patch] alsa: provide a more useful get_unmapped_area handler for pcm

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Shared memory mappings on nommu machines require a get_unmapped_areafile operation that suggests an address for the mapping. The currentimplementation returns 0 and thus forces the driver to implement anmmap handler that fixes up the start and end address of the vma.
This patch returns the address of the dma buffer, so it should workout of the box for all drivers that use the snd_pcm_runtime->dma_areapointer.
Addresses for mapping the status and control pages are returned aswell, but to make those work the conditional compilation ofsnd_pcm_mmap_{status,control} would need to be revised.
Signed-off-by: Daniel Glöckner <dg@xxxxxxxxx>--- 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.cindex a789efc..09ec8d7 100644--- a/sound/core/pcm_native.c+++ b/sound/core/pcm_native.c@@ -3377,14 +3377,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  /*@@ -3403,7 +3417,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,@@ -3416,6 +3430,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.6.2.107.ge47ee
_______________________________________________Alsa-devel mailing listAlsa-devel@xxxxxxxxxxxxxxxxxxxx://mailman.alsa-project.org/mailman/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux