cval->master_readonly = 1;
 
                /* get min/max values */
-               if (type == UAC_PROCESS_UP_DOWNMIX && cval->control == UAC_UD_MODE_SELECT) {
-                       __u8 *control_spec = uac_processing_unit_specific(desc, state->mixer->protocol);
-                       /* FIXME: hard-coded */
-                       cval->min = 1;
-                       cval->max = control_spec[0];
-                       cval->res = 1;
-                       cval->initialized = 1;
-               } else {
-                       if (type == USB_XU_CLOCK_RATE) {
-                               /*
-                                * E-Mu USB 0404/0202/TrackerPre/0204
-                                * samplerate control quirk
-                                */
-                               cval->min = 0;
-                               cval->max = 5;
+               switch (type) {
+               case UAC_PROCESS_UP_DOWNMIX: {
+                       bool mode_sel = false;
+
+                       switch (state->mixer->protocol) {
+                       case UAC_VERSION_1:
+                       case UAC_VERSION_2:
+                       default:
+                               if (cval->control == UAC_UD_MODE_SELECT)
+                                       mode_sel = true;
+                               break;
+                       case UAC_VERSION_3:
+                               if (cval->control == UAC3_UD_MODE_SELECT)
+                                       mode_sel = true;
+                               break;
+                       }
+
+                       if (mode_sel) {
+                               __u8 *control_spec = uac_processing_unit_specific(desc,
+                                                               state->mixer->protocol);
+                               cval->min = 1;
+                               cval->max = control_spec[0];
                                cval->res = 1;
                                cval->initialized = 1;
-                       } else
-                               get_min_max(cval, valinfo->min_value);
+                               break;
+                       }
+
+                       get_min_max(cval, valinfo->min_value);
+                       break;
+               }
+               case USB_XU_CLOCK_RATE:
+                       /*
+                        * E-Mu USB 0404/0202/TrackerPre/0204
+                        * samplerate control quirk
+                        */
+                       cval->min = 0;
+                       cval->max = 5;
+                       cval->res = 1;
+                       cval->initialized = 1;
+                       break;
+               default:
+                       get_min_max(cval, valinfo->min_value);
+                       break;
                }
 
                kctl = snd_ctl_new1(&mixer_procunit_ctl, cval);