ALSA: usb-audio: Drop keep_interface flag again
This behavior turned out to be invalid from the USB spec POV and shouldn't be applied. As it's an optional flag that is set only via an card control element that must be hardly used, let's drop it again. Tested-by: Keith Milner <kamilner@superlative.org> Tested-by: Dylan Robinson <dylan_robinson@motu.com> Link: https://lore.kernel.org/r/20201123085347.19667-16-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Родитель
54cb31901b
Коммит
982150560c
|
@ -3454,48 +3454,6 @@ static int snd_usb_mixer_status_create(struct usb_mixer_interface *mixer)
|
|||
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)
|
||||
{
|
||||
|
@ -3548,10 +3506,6 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
|
|||
if (err < 0)
|
||||
goto _error;
|
||||
|
||||
err = create_keep_iface_ctl(mixer);
|
||||
if (err < 0)
|
||||
goto _error;
|
||||
|
||||
err = snd_usb_mixer_apply_create_quirk(mixer);
|
||||
if (err < 0)
|
||||
goto _error;
|
||||
|
|
|
@ -648,14 +648,12 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
|
|||
|
||||
/* close the old interface */
|
||||
if (subs->interface >= 0 && (subs->interface != fmt->iface || subs->need_setup_fmt)) {
|
||||
if (!subs->stream->chip->keep_iface) {
|
||||
err = usb_set_interface(subs->dev, subs->interface, 0);
|
||||
if (err < 0) {
|
||||
dev_err(&dev->dev,
|
||||
"%d:%d: return to setting 0 failed (%d)\n",
|
||||
fmt->iface, fmt->altsetting, err);
|
||||
return -EIO;
|
||||
}
|
||||
err = usb_set_interface(subs->dev, subs->interface, 0);
|
||||
if (err < 0) {
|
||||
dev_err(&dev->dev,
|
||||
"%d:%d: return to setting 0 failed (%d)\n",
|
||||
fmt->iface, fmt->altsetting, err);
|
||||
return -EIO;
|
||||
}
|
||||
subs->interface = -1;
|
||||
subs->altset_idx = 0;
|
||||
|
@ -1483,8 +1481,7 @@ static int snd_usb_pcm_close(struct snd_pcm_substream *substream)
|
|||
|
||||
snd_media_stop_pipeline(subs);
|
||||
|
||||
if (!as->chip->keep_iface &&
|
||||
subs->interface >= 0 &&
|
||||
if (subs->interface >= 0 &&
|
||||
!snd_usb_lock_shutdown(subs->stream->chip)) {
|
||||
usb_set_interface(subs->dev, subs->interface, 0);
|
||||
subs->interface = -1;
|
||||
|
|
|
@ -53,9 +53,6 @@ struct snd_usb_audio {
|
|||
|
||||
int setup; /* from the 'device_setup' module param */
|
||||
bool autoclock; /* from the 'autoclock' module param */
|
||||
bool keep_iface; /* keep interface/altset after closing
|
||||
* or parameter change
|
||||
*/
|
||||
|
||||
struct usb_host_interface *ctrl_intf; /* the audio control interface */
|
||||
struct media_device *media_dev;
|
||||
|
|
Загрузка…
Ссылка в новой задаче