return 0;
 }
 
+static int keep_iface_ctl_get(struct snd_kcontrol *kcontrol,
+                             struct snd_ctl_elem_value *ucontrol)
+{
+       struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
+
+       ucontrol->value.integer.value[0] = mixer->chip->keep_iface;
+       return 0;
+}
+
+static int keep_iface_ctl_put(struct snd_kcontrol *kcontrol,
+                             struct snd_ctl_elem_value *ucontrol)
+{
+       struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
+       bool keep_iface = !!ucontrol->value.integer.value[0];
+
+       if (mixer->chip->keep_iface == keep_iface)
+               return 0;
+       mixer->chip->keep_iface = keep_iface;
+       return 1;
+}
+
+static const struct snd_kcontrol_new keep_iface_ctl = {
+       .iface = SNDRV_CTL_ELEM_IFACE_CARD,
+       .name = "Keep Interface",
+       .info = snd_ctl_boolean_mono_info,
+       .get = keep_iface_ctl_get,
+       .put = keep_iface_ctl_put,
+};
+
+static int create_keep_iface_ctl(struct usb_mixer_interface *mixer)
+{
+       struct snd_kcontrol *kctl = snd_ctl_new1(&keep_iface_ctl, mixer);
+
+       /* need only one control per card */
+       if (snd_ctl_find_id(mixer->chip->card, &kctl->id)) {
+               snd_ctl_free_one(kctl);
+               return 0;
+       }
+
+       return snd_ctl_add(mixer->chip->card, kctl);
+}
+
 int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
                         int ignore_error)
 {
        if ((err = snd_usb_mixer_controls(mixer)) < 0 ||
            (err = snd_usb_mixer_status_create(mixer)) < 0)
                goto _error;
+       err = create_keep_iface_ctl(mixer);
+       if (err < 0)
+               goto _error;
 
        snd_usb_mixer_apply_create_quirk(mixer);