Merge branch 'topic/nomm' into for-linus
authorTakashi Iwai <tiwai@suse.de>
Thu, 20 May 2010 09:59:09 +0000 (11:59 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 20 May 2010 09:59:09 +0000 (11:59 +0200)
1  2 
sound/core/pcm_native.c

diff --combined sound/core/pcm_native.c
@@@ -36,9 -36,6 +36,9 @@@
  #include <sound/timer.h>
  #include <sound/minors.h>
  #include <asm/io.h>
 +#if defined(CONFIG_MIPS) && defined(CONFIG_DMA_NONCOHERENT)
 +#include <dma-coherence.h>
 +#endif
  
  /*
   *  Compatibility
@@@ -2110,9 -2107,7 +2110,9 @@@ static int snd_pcm_open_file(struct fil
  static int snd_pcm_playback_open(struct inode *inode, struct file *file)
  {
        struct snd_pcm *pcm;
 -
 +      int err = nonseekable_open(inode, file);
 +      if (err < 0)
 +              return err;
        pcm = snd_lookup_minor_data(iminor(inode),
                                    SNDRV_DEVICE_TYPE_PCM_PLAYBACK);
        return snd_pcm_open(file, pcm, SNDRV_PCM_STREAM_PLAYBACK);
  static int snd_pcm_capture_open(struct inode *inode, struct file *file)
  {
        struct snd_pcm *pcm;
 -
 +      int err = nonseekable_open(inode, file);
 +      if (err < 0)
 +              return err;
        pcm = snd_lookup_minor_data(iminor(inode),
                                    SNDRV_DEVICE_TYPE_PCM_CAPTURE);
        return snd_pcm_open(file, pcm, SNDRV_PCM_STREAM_CAPTURE);
@@@ -3191,10 -3184,6 +3191,10 @@@ static int snd_pcm_default_mmap(struct 
                                         substream->runtime->dma_area,
                                         substream->runtime->dma_addr,
                                         area->vm_end - area->vm_start);
 +#elif defined(CONFIG_MIPS) && defined(CONFIG_DMA_NONCOHERENT)
 +      if (substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV &&
 +          !plat_device_is_coherent(substream->dma_buffer.dev.dev))
 +              area->vm_page_prot = pgprot_noncached(area->vm_page_prot);
  #endif /* ARCH_HAS_DMA_MMAP_COHERENT */
        /* mmap with fault handler */
        area->vm_ops = &snd_pcm_vm_ops_data_fault;
@@@ -3314,13 -3303,18 +3314,13 @@@ static int snd_pcm_fasync(int fd, struc
        struct snd_pcm_file * pcm_file;
        struct snd_pcm_substream *substream;
        struct snd_pcm_runtime *runtime;
 -      int err = -ENXIO;
  
 -      lock_kernel();
        pcm_file = file->private_data;
        substream = pcm_file->substream;
        if (PCM_RUNTIME_CHECK(substream))
 -              goto out;
 +              return -ENXIO;
        runtime = substream->runtime;
 -      err = fasync_helper(fd, file, on, &runtime->fasync);
 -out:
 -      unlock_kernel();
 -      return err;
 +      return fasync_helper(fd, file, on, &runtime->fasync);
  }
  
  /*
  #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
  
  /*
@@@ -3461,13 -3469,12 +3475,13 @@@ const struct file_operations snd_pcm_f_
                .aio_write =            snd_pcm_aio_write,
                .open =                 snd_pcm_playback_open,
                .release =              snd_pcm_release,
 +              .llseek =               no_llseek,
                .poll =                 snd_pcm_playback_poll,
                .unlocked_ioctl =       snd_pcm_playback_ioctl,
                .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,
                .aio_read =             snd_pcm_aio_read,
                .open =                 snd_pcm_capture_open,
                .release =              snd_pcm_release,
 +              .llseek =               no_llseek,
                .poll =                 snd_pcm_capture_poll,
                .unlocked_ioctl =       snd_pcm_capture_ioctl,
                .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,
        }
  };