Linus,

please pull sound fixes for v4.19-rc1 from:

  git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git 
tags/sound-fix-4.19-rc1

The topmost commit is 8a328ac1f9ebfc7621f76bbb27aa0382cc5b393d

----------------------------------------------------------------

sound fixes for 4.19-rc1

no surprises here: a regression fix for virmidi code refactoring,
three fixes for the new AC97 bus compat and runtime PM, and a usual
HD-audio quirk.

----------------------------------------------------------------

Kailang Yang (1):
      ALSA: hda/realtek - Fix HP Headset Mic can't record

Lihua Yao (3):
      ALSA: ac97: fix device initialization in the compat layer
      ALSA: ac97: fix check of pm_runtime_get_sync failure
      ALSA: ac97: fix unbalanced pm_runtime_enable

Takashi Iwai (1):
      ALSA: seq: virmidi: Fix discarding the unsubscribed output

---
 sound/ac97/bus.c              |  4 +++-
 sound/ac97/snd_ac97_compat.c  | 19 +++++++++++++++++--
 sound/core/seq/seq_virmidi.c  |  5 +++--
 sound/pci/hda/patch_realtek.c | 18 +++++++++++++++++-
 4 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/sound/ac97/bus.c b/sound/ac97/bus.c
index 7a0dfca03a57..9f0c480489ef 100644
--- a/sound/ac97/bus.c
+++ b/sound/ac97/bus.c
@@ -529,7 +529,7 @@ static int ac97_bus_remove(struct device *dev)
        int ret;
 
        ret = pm_runtime_get_sync(dev);
-       if (ret)
+       if (ret < 0)
                return ret;
 
        ret = adrv->remove(adev);
@@ -537,6 +537,8 @@ static int ac97_bus_remove(struct device *dev)
        if (ret == 0)
                ac97_put_disable_clk(adev);
 
+       pm_runtime_disable(dev);
+
        return ret;
 }
 
diff --git a/sound/ac97/snd_ac97_compat.c b/sound/ac97/snd_ac97_compat.c
index 61544e0d8de4..8bab44f74bb8 100644
--- a/sound/ac97/snd_ac97_compat.c
+++ b/sound/ac97/snd_ac97_compat.c
@@ -15,6 +15,11 @@
 
 #include "ac97_core.h"
 
+static void compat_ac97_release(struct device *dev)
+{
+       kfree(to_ac97_t(dev));
+}
+
 static void compat_ac97_reset(struct snd_ac97 *ac97)
 {
        struct ac97_codec_device *adev = to_ac97_device(ac97->private_data);
@@ -65,21 +70,31 @@ static struct snd_ac97_bus compat_soc_ac97_bus = {
 struct snd_ac97 *snd_ac97_compat_alloc(struct ac97_codec_device *adev)
 {
        struct snd_ac97 *ac97;
+       int ret;
 
        ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL);
        if (ac97 == NULL)
                return ERR_PTR(-ENOMEM);
 
-       ac97->dev = adev->dev;
        ac97->private_data = adev;
        ac97->bus = &compat_soc_ac97_bus;
+
+       ac97->dev.parent = &adev->dev;
+       ac97->dev.release = compat_ac97_release;
+       dev_set_name(&ac97->dev, "%s-compat", dev_name(&adev->dev));
+       ret = device_register(&ac97->dev);
+       if (ret) {
+               put_device(&ac97->dev);
+               return ERR_PTR(ret);
+       }
+
        return ac97;
 }
 EXPORT_SYMBOL_GPL(snd_ac97_compat_alloc);
 
 void snd_ac97_compat_release(struct snd_ac97 *ac97)
 {
-       kfree(ac97);
+       device_unregister(&ac97->dev);
 }
 EXPORT_SYMBOL_GPL(snd_ac97_compat_release);
 
diff --git a/sound/core/seq/seq_virmidi.c b/sound/core/seq/seq_virmidi.c
index a2f1c6b58693..cb988efd1ed0 100644
--- a/sound/core/seq/seq_virmidi.c
+++ b/sound/core/seq/seq_virmidi.c
@@ -149,8 +149,9 @@ static void snd_vmidi_output_work(struct work_struct *work)
        /* discard the outputs in dispatch mode unless subscribed */
        if (vmidi->seq_mode == SNDRV_VIRMIDI_SEQ_DISPATCH &&
            !(vmidi->rdev->flags & SNDRV_VIRMIDI_SUBSCRIBE)) {
-               while (!snd_rawmidi_transmit_empty(substream))
-                       snd_rawmidi_transmit_ack(substream, 1);
+               char buf[32];
+               while (snd_rawmidi_transmit(substream, buf, sizeof(buf)) > 0)
+                       ; /* ignored */
                return;
        }
 
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index b20974ef1e13..1d117f00d04d 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -5494,6 +5494,7 @@ enum {
        ALC255_FIXUP_DUMMY_LINEOUT_VERB,
        ALC255_FIXUP_DELL_HEADSET_MIC,
        ALC295_FIXUP_HP_X360,
+       ALC221_FIXUP_HP_HEADSET_MIC,
 };
 
 static const struct hda_fixup alc269_fixups[] = {
@@ -6351,7 +6352,16 @@ static const struct hda_fixup alc269_fixups[] = {
                .v.func = alc295_fixup_hp_top_speakers,
                .chained = true,
                .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
-       }
+       },
+       [ALC221_FIXUP_HP_HEADSET_MIC] = {
+               .type = HDA_FIXUP_PINS,
+               .v.pins = (const struct hda_pintbl[]) {
+                       { 0x19, 0x0181313f},
+                       { }
+               },
+               .chained = true,
+               .chain_id = ALC269_FIXUP_HEADSET_MIC
+       },
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -6777,6 +6787,12 @@ static const struct hda_model_fixup 
alc269_fixup_models[] = {
        {0x21, 0x03211020}
 
 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
+       SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", 
ALC221_FIXUP_HP_HEADSET_MIC,
+               {0x14, 0x01014020},
+               {0x17, 0x90170110},
+               {0x18, 0x02a11030},
+               {0x19, 0x0181303F},
+               {0x21, 0x0221102f}),
        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", 
ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
                {0x12, 0x90a601c0},
                {0x14, 0x90171120},

Reply via email to