Commit b6cbecae authored by Linus Torvalds's avatar Linus Torvalds

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
parents ff8d6fac 76df5296
...@@ -160,6 +160,8 @@ void snd_ctl_notify(struct snd_card *card, unsigned int mask, ...@@ -160,6 +160,8 @@ void snd_ctl_notify(struct snd_card *card, unsigned int mask,
if (snd_BUG_ON(!card || !id)) if (snd_BUG_ON(!card || !id))
return; return;
if (card->shutdown)
return;
read_lock(&card->ctl_files_rwlock); read_lock(&card->ctl_files_rwlock);
#if IS_ENABLED(CONFIG_SND_MIXER_OSS) #if IS_ENABLED(CONFIG_SND_MIXER_OSS)
card->mixer_oss_change_count++; card->mixer_oss_change_count++;
......
...@@ -849,6 +849,14 @@ int snd_pcm_new_internal(struct snd_card *card, const char *id, int device, ...@@ -849,6 +849,14 @@ int snd_pcm_new_internal(struct snd_card *card, const char *id, int device,
} }
EXPORT_SYMBOL(snd_pcm_new_internal); 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) static void snd_pcm_free_stream(struct snd_pcm_str * pstr)
{ {
struct snd_pcm_substream *substream, *substream_next; struct snd_pcm_substream *substream, *substream_next;
...@@ -871,6 +879,7 @@ static void snd_pcm_free_stream(struct snd_pcm_str * pstr) ...@@ -871,6 +879,7 @@ static void snd_pcm_free_stream(struct snd_pcm_str * pstr)
kfree(setup); kfree(setup);
} }
#endif #endif
free_chmap(pstr);
if (pstr->substream_count) if (pstr->substream_count)
put_device(&pstr->dev); put_device(&pstr->dev);
} }
...@@ -1135,10 +1144,7 @@ static int snd_pcm_dev_disconnect(struct snd_device *device) ...@@ -1135,10 +1144,7 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
for (cidx = 0; cidx < 2; cidx++) { for (cidx = 0; cidx < 2; cidx++) {
if (!pcm->internal) if (!pcm->internal)
snd_unregister_device(&pcm->streams[cidx].dev); snd_unregister_device(&pcm->streams[cidx].dev);
if (pcm->streams[cidx].chmap_kctl) { free_chmap(&pcm->streams[cidx]);
snd_ctl_remove(pcm->card, pcm->streams[cidx].chmap_kctl);
pcm->streams[cidx].chmap_kctl = NULL;
}
} }
mutex_unlock(&pcm->open_mutex); mutex_unlock(&pcm->open_mutex);
mutex_unlock(&register_mutex); mutex_unlock(&register_mutex);
......
...@@ -1218,8 +1218,10 @@ static int azx_free(struct azx *chip) ...@@ -1218,8 +1218,10 @@ static int azx_free(struct azx *chip)
if (use_vga_switcheroo(hda)) { if (use_vga_switcheroo(hda)) {
if (chip->disabled && hda->probe_continued) if (chip->disabled && hda->probe_continued)
snd_hda_unlock_devices(&chip->bus); snd_hda_unlock_devices(&chip->bus);
if (hda->vga_switcheroo_registered) if (hda->vga_switcheroo_registered) {
vga_switcheroo_unregister_client(chip->pci); vga_switcheroo_unregister_client(chip->pci);
vga_switcheroo_fini_domain_pm_ops(chip->card->dev);
}
} }
if (bus->chip_init) { if (bus->chip_init) {
...@@ -2267,6 +2269,8 @@ static const struct pci_device_id azx_ids[] = { ...@@ -2267,6 +2269,8 @@ static const struct pci_device_id azx_ids[] = {
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
{ PCI_DEVICE(0x1002, 0x157a), { PCI_DEVICE(0x1002, 0x157a),
.driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS }, .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), { PCI_DEVICE(0x1002, 0x793b),
.driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
{ PCI_DEVICE(0x1002, 0x7919), { PCI_DEVICE(0x1002, 0x7919),
......
...@@ -5738,7 +5738,6 @@ static const struct hda_model_fixup alc269_fixup_models[] = { ...@@ -5738,7 +5738,6 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
{} {}
}; };
#define ALC225_STANDARD_PINS \ #define ALC225_STANDARD_PINS \
{0x12, 0xb7a60130}, \
{0x21, 0x04211020} {0x21, 0x04211020}
#define ALC256_STANDARD_PINS \ #define ALC256_STANDARD_PINS \
...@@ -5763,10 +5762,24 @@ static const struct hda_model_fixup alc269_fixup_models[] = { ...@@ -5763,10 +5762,24 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
ALC225_STANDARD_PINS, ALC225_STANDARD_PINS,
{0x12, 0xb7a60130},
{0x14, 0x901701a0}), {0x14, 0x901701a0}),
SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
ALC225_STANDARD_PINS, ALC225_STANDARD_PINS,
{0x12, 0xb7a60130},
{0x14, 0x901701b0}), {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, SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
{0x14, 0x90170110}, {0x14, 0x90170110},
{0x21, 0x02211020}), {0x21, 0x02211020}),
......
...@@ -556,7 +556,6 @@ static int usb_audio_probe(struct usb_interface *intf, ...@@ -556,7 +556,6 @@ static int usb_audio_probe(struct usb_interface *intf,
goto __error; goto __error;
} }
chip = usb_chip[i]; chip = usb_chip[i];
dev_set_drvdata(&dev->dev, chip);
atomic_inc(&chip->active); /* avoid autopm */ atomic_inc(&chip->active); /* avoid autopm */
break; break;
} }
...@@ -582,6 +581,7 @@ static int usb_audio_probe(struct usb_interface *intf, ...@@ -582,6 +581,7 @@ static int usb_audio_probe(struct usb_interface *intf,
goto __error; goto __error;
} }
} }
dev_set_drvdata(&dev->dev, chip);
/* /*
* For devices with more than one control interface, we assume the * For devices with more than one control interface, we assume the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment