Commit dcacc486 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'sound-5.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound

Pull sound fixes from Takashi Iwai:
 "The only significant change is the regression fixes for the jack
  detection at resume on HD-audio, while others are all small or trivial
  fixes like the coverage of missing error code or usual HD-audio quirk"

* tag 'sound-5.1-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
  ALSA: hda/realtek: Enable headset MIC of Acer AIO with ALC286
  ALSA: hda - Enforces runtime_resume after S3 and S4 for each codec
  ALSA: hda - Don't trigger jackpoll_work in azx_resume
  ALSA: opl3: fix mismatch between snd_opl3_drum_switch definition and declaration
  ALSA: hda - add Lenovo IdeaCentre B550 to the power_save_blacklist
  ALSA: firewire-motu: use 'version' field of unit directory to identify model
  ALSA: sb8: add a check for request_region
  ALSA: echoaudio: add a check for ioremap_nocache
parents e4209173 667a8f73
...@@ -41,7 +41,7 @@ void snd_opl3_timer_func(struct timer_list *t); ...@@ -41,7 +41,7 @@ void snd_opl3_timer_func(struct timer_list *t);
/* Prototypes for opl3_drums.c */ /* Prototypes for opl3_drums.c */
void snd_opl3_load_drums(struct snd_opl3 *opl3); void snd_opl3_load_drums(struct snd_opl3 *opl3);
void snd_opl3_drum_switch(struct snd_opl3 *opl3, int note, int on_off, int vel, struct snd_midi_channel *chan); void snd_opl3_drum_switch(struct snd_opl3 *opl3, int note, int vel, int on_off, struct snd_midi_channel *chan);
/* Prototypes for opl3_oss.c */ /* Prototypes for opl3_oss.c */
#if IS_ENABLED(CONFIG_SND_SEQUENCER_OSS) #if IS_ENABLED(CONFIG_SND_SEQUENCER_OSS)
......
...@@ -36,7 +36,7 @@ static void name_card(struct snd_motu *motu) ...@@ -36,7 +36,7 @@ static void name_card(struct snd_motu *motu)
fw_csr_iterator_init(&it, motu->unit->directory); fw_csr_iterator_init(&it, motu->unit->directory);
while (fw_csr_iterator_next(&it, &key, &val)) { while (fw_csr_iterator_next(&it, &key, &val)) {
switch (key) { switch (key) {
case CSR_VERSION: case CSR_MODEL:
version = val; version = val;
break; break;
} }
...@@ -46,7 +46,7 @@ static void name_card(struct snd_motu *motu) ...@@ -46,7 +46,7 @@ static void name_card(struct snd_motu *motu)
strcpy(motu->card->shortname, motu->spec->name); strcpy(motu->card->shortname, motu->spec->name);
strcpy(motu->card->mixername, motu->spec->name); strcpy(motu->card->mixername, motu->spec->name);
snprintf(motu->card->longname, sizeof(motu->card->longname), snprintf(motu->card->longname, sizeof(motu->card->longname),
"MOTU %s (version:%d), GUID %08x%08x at %s, S%d", "MOTU %s (version:%06x), GUID %08x%08x at %s, S%d",
motu->spec->name, version, motu->spec->name, version,
fw_dev->config_rom[3], fw_dev->config_rom[4], fw_dev->config_rom[3], fw_dev->config_rom[4],
dev_name(&motu->unit->device), 100 << fw_dev->max_speed); dev_name(&motu->unit->device), 100 << fw_dev->max_speed);
...@@ -237,20 +237,20 @@ static const struct snd_motu_spec motu_audio_express = { ...@@ -237,20 +237,20 @@ static const struct snd_motu_spec motu_audio_express = {
#define SND_MOTU_DEV_ENTRY(model, data) \ #define SND_MOTU_DEV_ENTRY(model, data) \
{ \ { \
.match_flags = IEEE1394_MATCH_VENDOR_ID | \ .match_flags = IEEE1394_MATCH_VENDOR_ID | \
IEEE1394_MATCH_MODEL_ID | \ IEEE1394_MATCH_SPECIFIER_ID | \
IEEE1394_MATCH_SPECIFIER_ID, \ IEEE1394_MATCH_VERSION, \
.vendor_id = OUI_MOTU, \ .vendor_id = OUI_MOTU, \
.model_id = model, \
.specifier_id = OUI_MOTU, \ .specifier_id = OUI_MOTU, \
.version = model, \
.driver_data = (kernel_ulong_t)data, \ .driver_data = (kernel_ulong_t)data, \
} }
static const struct ieee1394_device_id motu_id_table[] = { static const struct ieee1394_device_id motu_id_table[] = {
SND_MOTU_DEV_ENTRY(0x101800, &motu_828mk2), SND_MOTU_DEV_ENTRY(0x000003, &motu_828mk2),
SND_MOTU_DEV_ENTRY(0x107800, &snd_motu_spec_traveler), SND_MOTU_DEV_ENTRY(0x000009, &snd_motu_spec_traveler),
SND_MOTU_DEV_ENTRY(0x106800, &motu_828mk3), /* FireWire only. */ SND_MOTU_DEV_ENTRY(0x000015, &motu_828mk3), /* FireWire only. */
SND_MOTU_DEV_ENTRY(0x100800, &motu_828mk3), /* Hybrid. */ SND_MOTU_DEV_ENTRY(0x000035, &motu_828mk3), /* Hybrid. */
SND_MOTU_DEV_ENTRY(0x104800, &motu_audio_express), SND_MOTU_DEV_ENTRY(0x000033, &motu_audio_express),
{ } { }
}; };
MODULE_DEVICE_TABLE(ieee1394, motu_id_table); MODULE_DEVICE_TABLE(ieee1394, motu_id_table);
......
...@@ -111,6 +111,10 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev) ...@@ -111,6 +111,10 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev)
/* block the 0x388 port to avoid PnP conflicts */ /* block the 0x388 port to avoid PnP conflicts */
acard->fm_res = request_region(0x388, 4, "SoundBlaster FM"); acard->fm_res = request_region(0x388, 4, "SoundBlaster FM");
if (!acard->fm_res) {
err = -EBUSY;
goto _err;
}
if (port[dev] != SNDRV_AUTO_PORT) { if (port[dev] != SNDRV_AUTO_PORT) {
if ((err = snd_sbdsp_create(card, port[dev], irq[dev], if ((err = snd_sbdsp_create(card, port[dev], irq[dev],
......
...@@ -1952,6 +1952,11 @@ static int snd_echo_create(struct snd_card *card, ...@@ -1952,6 +1952,11 @@ static int snd_echo_create(struct snd_card *card,
} }
chip->dsp_registers = (volatile u32 __iomem *) chip->dsp_registers = (volatile u32 __iomem *)
ioremap_nocache(chip->dsp_registers_phys, sz); ioremap_nocache(chip->dsp_registers_phys, sz);
if (!chip->dsp_registers) {
dev_err(chip->card->dev, "ioremap failed\n");
snd_echo_free(chip);
return -ENOMEM;
}
if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED, if (request_irq(pci->irq, snd_echo_interrupt, IRQF_SHARED,
KBUILD_MODNAME, chip)) { KBUILD_MODNAME, chip)) {
......
...@@ -2939,6 +2939,20 @@ static int hda_codec_runtime_resume(struct device *dev) ...@@ -2939,6 +2939,20 @@ static int hda_codec_runtime_resume(struct device *dev)
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int hda_codec_force_resume(struct device *dev)
{
int ret;
/* The get/put pair below enforces the runtime resume even if the
* device hasn't been used at suspend time. This trick is needed to
* update the jack state change during the sleep.
*/
pm_runtime_get_noresume(dev);
ret = pm_runtime_force_resume(dev);
pm_runtime_put(dev);
return ret;
}
static int hda_codec_pm_suspend(struct device *dev) static int hda_codec_pm_suspend(struct device *dev)
{ {
dev->power.power_state = PMSG_SUSPEND; dev->power.power_state = PMSG_SUSPEND;
...@@ -2948,7 +2962,7 @@ static int hda_codec_pm_suspend(struct device *dev) ...@@ -2948,7 +2962,7 @@ static int hda_codec_pm_suspend(struct device *dev)
static int hda_codec_pm_resume(struct device *dev) static int hda_codec_pm_resume(struct device *dev)
{ {
dev->power.power_state = PMSG_RESUME; dev->power.power_state = PMSG_RESUME;
return pm_runtime_force_resume(dev); return hda_codec_force_resume(dev);
} }
static int hda_codec_pm_freeze(struct device *dev) static int hda_codec_pm_freeze(struct device *dev)
...@@ -2960,13 +2974,13 @@ static int hda_codec_pm_freeze(struct device *dev) ...@@ -2960,13 +2974,13 @@ static int hda_codec_pm_freeze(struct device *dev)
static int hda_codec_pm_thaw(struct device *dev) static int hda_codec_pm_thaw(struct device *dev)
{ {
dev->power.power_state = PMSG_THAW; dev->power.power_state = PMSG_THAW;
return pm_runtime_force_resume(dev); return hda_codec_force_resume(dev);
} }
static int hda_codec_pm_restore(struct device *dev) static int hda_codec_pm_restore(struct device *dev)
{ {
dev->power.power_state = PMSG_RESTORE; dev->power.power_state = PMSG_RESTORE;
return pm_runtime_force_resume(dev); return hda_codec_force_resume(dev);
} }
#endif /* CONFIG_PM_SLEEP */ #endif /* CONFIG_PM_SLEEP */
......
...@@ -947,7 +947,7 @@ static void __azx_runtime_suspend(struct azx *chip) ...@@ -947,7 +947,7 @@ static void __azx_runtime_suspend(struct azx *chip)
display_power(chip, false); display_power(chip, false);
} }
static void __azx_runtime_resume(struct azx *chip) static void __azx_runtime_resume(struct azx *chip, bool from_rt)
{ {
struct hda_intel *hda = container_of(chip, struct hda_intel, chip); struct hda_intel *hda = container_of(chip, struct hda_intel, chip);
struct hdac_bus *bus = azx_bus(chip); struct hdac_bus *bus = azx_bus(chip);
...@@ -964,7 +964,7 @@ static void __azx_runtime_resume(struct azx *chip) ...@@ -964,7 +964,7 @@ static void __azx_runtime_resume(struct azx *chip)
azx_init_pci(chip); azx_init_pci(chip);
hda_intel_init_chip(chip, true); hda_intel_init_chip(chip, true);
if (status) { if (status && from_rt) {
list_for_each_codec(codec, &chip->bus) list_for_each_codec(codec, &chip->bus)
if (status & (1 << codec->addr)) if (status & (1 << codec->addr))
schedule_delayed_work(&codec->jackpoll_work, schedule_delayed_work(&codec->jackpoll_work,
...@@ -1016,7 +1016,7 @@ static int azx_resume(struct device *dev) ...@@ -1016,7 +1016,7 @@ static int azx_resume(struct device *dev)
chip->msi = 0; chip->msi = 0;
if (azx_acquire_irq(chip, 1) < 0) if (azx_acquire_irq(chip, 1) < 0)
return -EIO; return -EIO;
__azx_runtime_resume(chip); __azx_runtime_resume(chip, false);
snd_power_change_state(card, SNDRV_CTL_POWER_D0); snd_power_change_state(card, SNDRV_CTL_POWER_D0);
trace_azx_resume(chip); trace_azx_resume(chip);
...@@ -1081,7 +1081,7 @@ static int azx_runtime_resume(struct device *dev) ...@@ -1081,7 +1081,7 @@ static int azx_runtime_resume(struct device *dev)
chip = card->private_data; chip = card->private_data;
if (!azx_has_pm_runtime(chip)) if (!azx_has_pm_runtime(chip))
return 0; return 0;
__azx_runtime_resume(chip); __azx_runtime_resume(chip, true);
/* disable controller Wake Up event*/ /* disable controller Wake Up event*/
azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) & azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
...@@ -2144,10 +2144,12 @@ static struct snd_pci_quirk power_save_blacklist[] = { ...@@ -2144,10 +2144,12 @@ static struct snd_pci_quirk power_save_blacklist[] = {
SND_PCI_QUIRK(0x8086, 0x2057, "Intel NUC5i7RYB", 0), SND_PCI_QUIRK(0x8086, 0x2057, "Intel NUC5i7RYB", 0),
/* https://bugzilla.redhat.com/show_bug.cgi?id=1520902 */ /* https://bugzilla.redhat.com/show_bug.cgi?id=1520902 */
SND_PCI_QUIRK(0x8086, 0x2068, "Intel NUC7i3BNB", 0), SND_PCI_QUIRK(0x8086, 0x2068, "Intel NUC7i3BNB", 0),
/* https://bugzilla.redhat.com/show_bug.cgi?id=1572975 */
SND_PCI_QUIRK(0x17aa, 0x36a7, "Lenovo C50 All in one", 0),
/* https://bugzilla.kernel.org/show_bug.cgi?id=198611 */ /* https://bugzilla.kernel.org/show_bug.cgi?id=198611 */
SND_PCI_QUIRK(0x17aa, 0x2227, "Lenovo X1 Carbon 3rd Gen", 0), SND_PCI_QUIRK(0x17aa, 0x2227, "Lenovo X1 Carbon 3rd Gen", 0),
/* https://bugzilla.redhat.com/show_bug.cgi?id=1689623 */
SND_PCI_QUIRK(0x17aa, 0x367b, "Lenovo IdeaCentre B550", 0),
/* https://bugzilla.redhat.com/show_bug.cgi?id=1572975 */
SND_PCI_QUIRK(0x17aa, 0x36a7, "Lenovo C50 All in one", 0),
{} {}
}; };
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
......
...@@ -5687,6 +5687,7 @@ enum { ...@@ -5687,6 +5687,7 @@ enum {
ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE, ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
ALC225_FIXUP_WYSE_AUTO_MUTE, ALC225_FIXUP_WYSE_AUTO_MUTE,
ALC225_FIXUP_WYSE_DISABLE_MIC_VREF, ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
}; };
static const struct hda_fixup alc269_fixups[] = { static const struct hda_fixup alc269_fixups[] = {
...@@ -6685,6 +6686,16 @@ static const struct hda_fixup alc269_fixups[] = { ...@@ -6685,6 +6686,16 @@ static const struct hda_fixup alc269_fixups[] = {
.chained = true, .chained = true,
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
}, },
[ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
.type = HDA_FIXUP_VERBS,
.v.verbs = (const struct hda_verb[]) {
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
{ 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
{ }
},
.chained = true,
.chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
},
}; };
static const struct snd_pci_quirk alc269_fixup_tbl[] = { static const struct snd_pci_quirk alc269_fixup_tbl[] = {
...@@ -6701,9 +6712,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { ...@@ -6701,9 +6712,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS), SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK), SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE), SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC), SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS), SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
......
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