}
 }
 
+/* forcibly initialize the current mixer value; if GET_CUR fails, set to
+ * the minimum as default
+ */
+static void init_cur_mix_raw(struct usb_mixer_elem_info *cval, int ch, int idx)
+{
+       int val, err;
+
+       err = snd_usb_get_cur_mix_value(cval, ch, idx, &val);
+       if (!err)
+               return;
+       if (!cval->head.mixer->ignore_ctl_error)
+               usb_audio_warn(cval->head.mixer->chip,
+                              "%d:%d: failed to get current value for ch %d (%d)\n",
+                              cval->head.id, mixer_ctrl_intf(cval->head.mixer),
+                              ch, err);
+       snd_usb_set_cur_mix_value(cval, ch, idx, cval->min);
+}
+
 /*
  * retrieve the minimum and maximum values for the specified control
  */
 static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval,
                                   int default_min, struct snd_kcontrol *kctl)
 {
+       int i, idx;
+
        /* for failsafe */
        cval->min = default_min;
        cval->max = cval->min + 1;
        } else {
                int minchn = 0;
                if (cval->cmask) {
-                       int i;
                        for (i = 0; i < MAX_CHANNELS; i++)
                                if (cval->cmask & (1 << i)) {
                                        minchn = i + 1;
                }
        }
 
+       /* initialize all elements */
+       if (!cval->cmask) {
+               init_cur_mix_raw(cval, 0, 0);
+       } else {
+               idx = 0;
+               for (i = 0; i < MAX_CHANNELS; i++) {
+                       if (cval->cmask & (1 << i)) {
+                               init_cur_mix_raw(cval, i + 1, idx);
+                               idx++;
+                       }
+               }
+       }
+
        return 0;
 }