*                                                                          *
  ****************************************************************************/
 
-#define SNDRV_CTL_VERSION              SNDRV_PROTOCOL_VERSION(2, 0, 8)
+#define SNDRV_CTL_VERSION              SNDRV_PROTOCOL_VERSION(2, 0, 9)
 
 struct snd_ctl_card_info {
        int card;                       /* card number */
 #define SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE _IOWR('U', 0x40, int)
 #define SNDRV_CTL_IOCTL_RAWMIDI_INFO   _IOWR('U', 0x41, struct snd_rawmidi_info)
 #define SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE _IOW('U', 0x42, int)
+#define SNDRV_CTL_IOCTL_UMP_NEXT_DEVICE        _IOWR('U', 0x43, int)
 #define SNDRV_CTL_IOCTL_POWER          _IOWR('U', 0xd0, int)
 #define SNDRV_CTL_IOCTL_POWER_STATE    _IOR('U', 0xd1, int)
 
 
        return -ENOTTY;
 }
 
+/* ioctl to find the next device; either legacy or UMP depending on @find_ump */
+static int snd_rawmidi_next_device(struct snd_card *card, int __user *argp,
+                                  bool find_ump)
+
+{
+       struct snd_rawmidi *rmidi;
+       int device;
+       bool is_ump;
+
+       if (get_user(device, argp))
+               return -EFAULT;
+       if (device >= SNDRV_RAWMIDI_DEVICES) /* next device is -1 */
+               device = SNDRV_RAWMIDI_DEVICES - 1;
+       mutex_lock(®ister_mutex);
+       device = device < 0 ? 0 : device + 1;
+       for (; device < SNDRV_RAWMIDI_DEVICES; device++) {
+               rmidi = snd_rawmidi_search(card, device);
+               if (!rmidi)
+                       continue;
+               is_ump = rawmidi_is_ump(rmidi);
+               if (find_ump == is_ump)
+                       break;
+       }
+       if (device == SNDRV_RAWMIDI_DEVICES)
+               device = -1;
+       mutex_unlock(®ister_mutex);
+       if (put_user(device, argp))
+               return -EFAULT;
+       return 0;
+}
+
 static int snd_rawmidi_control_ioctl(struct snd_card *card,
                                     struct snd_ctl_file *control,
                                     unsigned int cmd,
 
        switch (cmd) {
        case SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE:
-       {
-               int device;
-
-               if (get_user(device, (int __user *)argp))
-                       return -EFAULT;
-               if (device >= SNDRV_RAWMIDI_DEVICES) /* next device is -1 */
-                       device = SNDRV_RAWMIDI_DEVICES - 1;
-               mutex_lock(®ister_mutex);
-               device = device < 0 ? 0 : device + 1;
-               while (device < SNDRV_RAWMIDI_DEVICES) {
-                       if (snd_rawmidi_search(card, device))
-                               break;
-                       device++;
-               }
-               if (device == SNDRV_RAWMIDI_DEVICES)
-                       device = -1;
-               mutex_unlock(®ister_mutex);
-               if (put_user(device, (int __user *)argp))
-                       return -EFAULT;
-               return 0;
-       }
+               return snd_rawmidi_next_device(card, argp, false);
+#if IS_ENABLED(CONFIG_SND_UMP)
+       case SNDRV_CTL_IOCTL_UMP_NEXT_DEVICE:
+               return snd_rawmidi_next_device(card, argp, true);
+#endif
        case SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE:
        {
                int val;