struct snd_pcm_file {
        struct snd_pcm_substream *substream;
        int no_compat_mmap;
+       unsigned int user_pversion;     /* supported protocol version */
 };
 
 struct snd_pcm_hw_rule;
 
  *                                                                           *
  *****************************************************************************/
 
-#define SNDRV_PCM_VERSION              SNDRV_PROTOCOL_VERSION(2, 0, 13)
+#define SNDRV_PCM_VERSION              SNDRV_PROTOCOL_VERSION(2, 0, 14)
 
 typedef unsigned long snd_pcm_uframes_t;
 typedef signed long snd_pcm_sframes_t;
 #define SNDRV_PCM_IOCTL_INFO           _IOR('A', 0x01, struct snd_pcm_info)
 #define SNDRV_PCM_IOCTL_TSTAMP         _IOW('A', 0x02, int)
 #define SNDRV_PCM_IOCTL_TTSTAMP                _IOW('A', 0x03, int)
+#define SNDRV_PCM_IOCTL_USER_PVERSION  _IOW('A', 0x04, int)
 #define SNDRV_PCM_IOCTL_HW_REFINE      _IOWR('A', 0x10, struct snd_pcm_hw_params)
 #define SNDRV_PCM_IOCTL_HW_PARAMS      _IOWR('A', 0x11, struct snd_pcm_hw_params)
 #define SNDRV_PCM_IOCTL_HW_FREE                _IO('A', 0x12)
 
        case SNDRV_PCM_IOCTL_INFO:
        case SNDRV_PCM_IOCTL_TSTAMP:
        case SNDRV_PCM_IOCTL_TTSTAMP:
+       case SNDRV_PCM_IOCTL_USER_PVERSION:
        case SNDRV_PCM_IOCTL_HWSYNC:
        case SNDRV_PCM_IOCTL_PREPARE:
        case SNDRV_PCM_IOCTL_RESET:
 
                                 struct snd_pcm_substream *substream,
                                 unsigned int cmd, void __user *arg)
 {
+       struct snd_pcm_file *pcm_file = file->private_data;
+
        switch (cmd) {
        case SNDRV_PCM_IOCTL_PVERSION:
                return put_user(SNDRV_PCM_VERSION, (int __user *)arg) ? -EFAULT : 0;
                return 0;
        case SNDRV_PCM_IOCTL_TTSTAMP:
                return snd_pcm_tstamp(substream, arg);
+       case SNDRV_PCM_IOCTL_USER_PVERSION:
+               if (get_user(pcm_file->user_pversion,
+                            (unsigned int __user *)arg))
+                       return -EFAULT;
+               return 0;
        case SNDRV_PCM_IOCTL_HW_REFINE:
                return snd_pcm_hw_refine_user(substream, arg);
        case SNDRV_PCM_IOCTL_HW_PARAMS: