forked from Minki/linux
sound fixes #2 for 4.7-final
Now one more regression fix in addition to the previous pull request: two changes in the core part are for unusual error paths, while the rest are the regular HD-audio fixes and one USB-audio regression fix. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIrBAABCAAVBQJXkiDdDhx0aXdhaUBzdXNlLmRlAAoJEGwxgFQ9KSmk47UP/Av8 SASJJk8fhghQr6wKLxsXMV7Grrd3ZyAloZ3JDGlW0ldGz++jS5uC0jlkkd4EEj9T K2yETbb/RninBAlIiCWmQn38HrSXf4CxYPFpFAU7C3AOXkPghuqhom+hKZhu6259 P7SyyO/UpZdXUuI0jKy6xshyYYaGCG8EK5F+wtw5ofmyivKaIL38dO7eMMvJhTMu YBlBtkrTg/wFk7I6jFMpzvlPWFFnOqgjsaGVUun/zlxHp9mQRnc/fV9Nv2gOmKxl I6xht7x8G1WvocqF5qcUr7pPs5NOgRbnwJaZuy9WCPaotHBpJLq3QqaF+rqJKd0u QBHLbRxCe+Nu7uoIr6HUrNxLeOguHjbRO/X8I5mt/KOOp4GjhfFYn4oAf1TtYgdE 1GB1ifVI1WYZnrayXsDsCe4OpIV7W4wvOpPSpIoX2OMaKLO3uGNKyZ3FIlLUxMQ+ 6PUAucyqlp+iEw+OsRLIdE1VV1zOzv22CucSzFW5ZsSFVnRR0ajch2NDnNCm68Nb UqNQ+sxBhUodFoqiNVaquCH7/oLN8+nfQ3FlJh4wqwb9svG6eKYvY6zXlwcHafBe yhSMpeAs+ECgOZQQMyMA6gQ+lePKz1m+d2aDy9U/Xikq0LM36uxCGhQVzo7JNI8w iUInZBihhx9EL+VELXkGIYivRftvr8OCxl6QS6lQ =Ky73 -----END PGP SIGNATURE----- Merge tag 'sound-4.7-fix2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "No surprise, just a few small fixes: a couple of changes are seen in the core part, and both of them are rather for unusual error paths. The rest are the regular HD-audio fixes and one USB-audio regression fix" * tag 'sound-4.7-fix2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: usb-audio: Fix quirks code is not called ALSA: hda: add AMD Stoney PCI ID with proper driver caps ALSA: hda - fix use-after-free after module unload ALSA: pcm: Free chmap at PCM free callback, too ALSA: ctl: Stop notification after disconnection ALSA: hda/realtek - add new pin definition in alc225 pin quirk table
This commit is contained in:
commit
b6cbecaebd
@ -160,6 +160,8 @@ void snd_ctl_notify(struct snd_card *card, unsigned int mask,
|
||||
|
||||
if (snd_BUG_ON(!card || !id))
|
||||
return;
|
||||
if (card->shutdown)
|
||||
return;
|
||||
read_lock(&card->ctl_files_rwlock);
|
||||
#if IS_ENABLED(CONFIG_SND_MIXER_OSS)
|
||||
card->mixer_oss_change_count++;
|
||||
|
@ -849,6 +849,14 @@ int snd_pcm_new_internal(struct snd_card *card, const char *id, int device,
|
||||
}
|
||||
EXPORT_SYMBOL(snd_pcm_new_internal);
|
||||
|
||||
static void free_chmap(struct snd_pcm_str *pstr)
|
||||
{
|
||||
if (pstr->chmap_kctl) {
|
||||
snd_ctl_remove(pstr->pcm->card, pstr->chmap_kctl);
|
||||
pstr->chmap_kctl = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void snd_pcm_free_stream(struct snd_pcm_str * pstr)
|
||||
{
|
||||
struct snd_pcm_substream *substream, *substream_next;
|
||||
@ -871,6 +879,7 @@ static void snd_pcm_free_stream(struct snd_pcm_str * pstr)
|
||||
kfree(setup);
|
||||
}
|
||||
#endif
|
||||
free_chmap(pstr);
|
||||
if (pstr->substream_count)
|
||||
put_device(&pstr->dev);
|
||||
}
|
||||
@ -1135,10 +1144,7 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
|
||||
for (cidx = 0; cidx < 2; cidx++) {
|
||||
if (!pcm->internal)
|
||||
snd_unregister_device(&pcm->streams[cidx].dev);
|
||||
if (pcm->streams[cidx].chmap_kctl) {
|
||||
snd_ctl_remove(pcm->card, pcm->streams[cidx].chmap_kctl);
|
||||
pcm->streams[cidx].chmap_kctl = NULL;
|
||||
}
|
||||
free_chmap(&pcm->streams[cidx]);
|
||||
}
|
||||
mutex_unlock(&pcm->open_mutex);
|
||||
mutex_unlock(®ister_mutex);
|
||||
|
@ -1218,8 +1218,10 @@ static int azx_free(struct azx *chip)
|
||||
if (use_vga_switcheroo(hda)) {
|
||||
if (chip->disabled && hda->probe_continued)
|
||||
snd_hda_unlock_devices(&chip->bus);
|
||||
if (hda->vga_switcheroo_registered)
|
||||
if (hda->vga_switcheroo_registered) {
|
||||
vga_switcheroo_unregister_client(chip->pci);
|
||||
vga_switcheroo_fini_domain_pm_ops(chip->card->dev);
|
||||
}
|
||||
}
|
||||
|
||||
if (bus->chip_init) {
|
||||
@ -2267,6 +2269,8 @@ static const struct pci_device_id azx_ids[] = {
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
|
||||
{ PCI_DEVICE(0x1002, 0x157a),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
|
||||
{ PCI_DEVICE(0x1002, 0x15b3),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
|
||||
{ PCI_DEVICE(0x1002, 0x793b),
|
||||
.driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
|
||||
{ PCI_DEVICE(0x1002, 0x7919),
|
||||
|
@ -5738,7 +5738,6 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
||||
{}
|
||||
};
|
||||
#define ALC225_STANDARD_PINS \
|
||||
{0x12, 0xb7a60130}, \
|
||||
{0x21, 0x04211020}
|
||||
|
||||
#define ALC256_STANDARD_PINS \
|
||||
@ -5763,10 +5762,24 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
|
||||
static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
||||
SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC225_STANDARD_PINS,
|
||||
{0x12, 0xb7a60130},
|
||||
{0x14, 0x901701a0}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC225_STANDARD_PINS,
|
||||
{0x12, 0xb7a60130},
|
||||
{0x14, 0x901701b0}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC225_STANDARD_PINS,
|
||||
{0x12, 0xb7a60150},
|
||||
{0x14, 0x901701a0}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC225_STANDARD_PINS,
|
||||
{0x12, 0xb7a60150},
|
||||
{0x14, 0x901701b0}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC225_STANDARD_PINS,
|
||||
{0x12, 0xb7a60130},
|
||||
{0x1b, 0x90170110}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
|
||||
{0x14, 0x90170110},
|
||||
{0x21, 0x02211020}),
|
||||
|
@ -556,7 +556,6 @@ static int usb_audio_probe(struct usb_interface *intf,
|
||||
goto __error;
|
||||
}
|
||||
chip = usb_chip[i];
|
||||
dev_set_drvdata(&dev->dev, chip);
|
||||
atomic_inc(&chip->active); /* avoid autopm */
|
||||
break;
|
||||
}
|
||||
@ -582,6 +581,7 @@ static int usb_audio_probe(struct usb_interface *intf,
|
||||
goto __error;
|
||||
}
|
||||
}
|
||||
dev_set_drvdata(&dev->dev, chip);
|
||||
|
||||
/*
|
||||
* For devices with more than one control interface, we assume the
|
||||
|
Loading…
Reference in New Issue
Block a user