Linus,

please pull sound fixes for v5.2-rc3 from:

  git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git 
tags/sound-5.2-rc3

The topmost commit is 6954158a16404e7091cea494cd0a435ca2f90388

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

sound fixes for 5.2-rc3

No big surprises here, just a few device-specific fixes.

HD-audio received several fixes for Acer, Dell, Huawei and other
laptops as well as the workaround for the new Intel chipset.
One significant one-liner fix is the disablement of the node-power
saving on Realtek codecs, which may potentially cover annoying bugs
like the background noises or click noises on many devices.

Other than that, a fix for FireWire bit definitions, and another fix
for LINE6 USB audio bug that was discovered by syzkaller.

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

Ayman Bagabas (1):
      ALSA: hda/realtek - Enable micmute LED for Huawei laptops

Bard Liao (1):
      ALSA: hda - Force polling mode on CNL for fixing codec communication

Geert Uytterhoeven (1):
      ALSA: fireface: Use ULL suffixes for 64-bit constants

Hui Wang (1):
      ALSA: hda/realtek - Improve the headset mic for Acer Aspire laptops

Kailang Yang (2):
      ALSA: hda/realtek - Check headset type by unplug and resume
      ALSA: hda/realtek - Set default power save node to 0

Takashi Iwai (1):
      ALSA: line6: Assure canceling delayed work at disconnection

---
 sound/firewire/fireface/ff-protocol-latter.c | 10 ++++----
 sound/pci/hda/hda_intel.c                    |  5 ++--
 sound/pci/hda/patch_realtek.c                | 38 ++++++++++++++++++----------
 sound/usb/line6/driver.c                     | 12 +++++++++
 sound/usb/line6/driver.h                     |  4 +++
 sound/usb/line6/toneport.c                   | 15 +++--------
 6 files changed, 51 insertions(+), 33 deletions(-)

diff --git a/sound/firewire/fireface/ff-protocol-latter.c 
b/sound/firewire/fireface/ff-protocol-latter.c
index c8236ff89b7f..b30d02d359b1 100644
--- a/sound/firewire/fireface/ff-protocol-latter.c
+++ b/sound/firewire/fireface/ff-protocol-latter.c
@@ -9,11 +9,11 @@
 
 #include "ff.h"
 
-#define LATTER_STF             0xffff00000004
-#define LATTER_ISOC_CHANNELS   0xffff00000008
-#define LATTER_ISOC_START      0xffff0000000c
-#define LATTER_FETCH_MODE      0xffff00000010
-#define LATTER_SYNC_STATUS     0x0000801c0000
+#define LATTER_STF             0xffff00000004ULL
+#define LATTER_ISOC_CHANNELS   0xffff00000008ULL
+#define LATTER_ISOC_START      0xffff0000000cULL
+#define LATTER_FETCH_MODE      0xffff00000010ULL
+#define LATTER_SYNC_STATUS     0x0000801c0000ULL
 
 static int parse_clock_bits(u32 data, unsigned int *rate,
                            enum snd_ff_clock_src *src)
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 0741eae23f10..a4b0414dda3b 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -375,6 +375,7 @@ enum {
 
 #define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
 #define IS_CFL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa348)
+#define IS_CNL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9dc8)
 
 static char *driver_short_names[] = {
        [AZX_DRIVER_ICH] = "HDA Intel",
@@ -1700,8 +1701,8 @@ static int azx_create(struct snd_card *card, struct 
pci_dev *pci,
        else
                chip->bdl_pos_adj = bdl_pos_adj[dev];
 
-       /* Workaround for a communication error on CFL (bko#199007) */
-       if (IS_CFL(pci))
+       /* Workaround for a communication error on CFL (bko#199007) and CNL */
+       if (IS_CFL(pci) || IS_CNL(pci))
                chip->polling_mode = 1;
 
        err = azx_bus_init(chip, model[dev], &pci_hda_io_ops);
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 2c1942dc6147..974244978509 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -821,6 +821,8 @@ static void alc_pre_init(struct hda_codec *codec)
        alc_fill_eapd_coef(codec);
 }
 
+#define is_s3_resume(codec) \
+       ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
 #define is_s4_resume(codec) \
        ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
 
@@ -4888,6 +4890,8 @@ static void alc_update_headset_mode(struct hda_codec 
*codec)
        switch (new_headset_mode) {
        case ALC_HEADSET_MODE_UNPLUGGED:
                alc_headset_mode_unplugged(codec);
+               spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
+               spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
                spec->gen.hp_jack_present = false;
                break;
        case ALC_HEADSET_MODE_HEADSET:
@@ -4930,8 +4934,6 @@ static void alc_update_headset_mode_hook(struct hda_codec 
*codec,
 static void alc_update_headset_jack_cb(struct hda_codec *codec,
                                       struct hda_jack_callback *jack)
 {
-       struct alc_spec *spec = codec->spec;
-       spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
        snd_hda_gen_hp_automute(codec, jack);
 }
 
@@ -4968,7 +4970,10 @@ static void alc_fixup_headset_mode(struct hda_codec 
*codec,
                alc_probe_headset_mode(codec);
                break;
        case HDA_FIXUP_ACT_INIT:
-               spec->current_headset_mode = 0;
+               if (is_s3_resume(codec) || is_s4_resume(codec)) {
+                       spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
+                       spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
+               }
                alc_update_headset_mode(codec);
                break;
        }
@@ -5734,7 +5739,7 @@ enum {
        ALC298_FIXUP_TPT470_DOCK,
        ALC255_FIXUP_DUMMY_LINEOUT_VERB,
        ALC255_FIXUP_DELL_HEADSET_MIC,
-       ALC256_FIXUP_HUAWEI_MBXP_PINS,
+       ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
        ALC295_FIXUP_HP_X360,
        ALC221_FIXUP_HP_HEADSET_MIC,
        ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
@@ -6025,7 +6030,7 @@ static const struct hda_fixup alc269_fixups[] = {
                .chained = true,
                .chain_id = ALC269_FIXUP_HEADSET_MIC
        },
-       [ALC256_FIXUP_HUAWEI_MBXP_PINS] = {
+       [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
                .type = HDA_FIXUP_PINS,
                .v.pins = (const struct hda_pintbl[]) {
                        {0x12, 0x90a60130},
@@ -6205,13 +6210,15 @@ static const struct hda_fixup alc269_fixups[] = {
                .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
        },
        [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
-               .type = HDA_FIXUP_PINS,
-               .v.pins = (const struct hda_pintbl[]) {
-                       { 0x19, 0x01a1913c }, /* use as headset mic, without 
its own jack detect */
-                       { }
+               .type = HDA_FIXUP_VERBS,
+               .v.verbs = (const struct hda_verb[]) {
+                       /* Enable the Mic */
+                       { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
+                       { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
+                       {}
                },
                .chained = true,
-               .chain_id = ALC255_FIXUP_HEADSET_MODE
+               .chain_id = ALC269_FIXUP_LIFEBOOK_EXTMIC
        },
        [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
                .type = HDA_FIXUP_PINS,
@@ -7050,9 +7057,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
        SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
        SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
-       SND_PCI_QUIRK(0x19e5, 0x3200, "Huawei MBX", ALC255_FIXUP_MIC_MUTE_LED),
-       SND_PCI_QUIRK(0x19e5, 0x3201, "Huawei MBX", ALC255_FIXUP_MIC_MUTE_LED),
-       SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MBXP", 
ALC256_FIXUP_HUAWEI_MBXP_PINS),
+       SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", 
ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
        SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", 
ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
 
 #if 0
@@ -7111,6 +7116,7 @@ static const struct snd_pci_quirk 
alc269_fixup_vendor_tbl[] = {
        SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
        SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
        SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
+       SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", 
ALC255_FIXUP_MIC_MUTE_LED),
        {}
 };
 
@@ -7256,6 +7262,10 @@ static const struct snd_hda_pin_quirk 
alc269_pin_fixup_tbl[] = {
                {0x18, 0x02a11030},
                {0x19, 0x0181303F},
                {0x21, 0x0221102f}),
+       SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", 
ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
+               {0x12, 0x90a60140},
+               {0x14, 0x90170120},
+               {0x21, 0x02211030}),
        SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", 
ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
                {0x12, 0x90a601c0},
                {0x14, 0x90171120},
@@ -7693,7 +7703,7 @@ static int patch_alc269(struct hda_codec *codec)
 
        spec = codec->spec;
        spec->gen.shared_mic_vref_pin = 0x18;
-       codec->power_save_node = 1;
+       codec->power_save_node = 0;
 
 #ifdef CONFIG_PM
        codec->patch_ops.suspend = alc269_suspend;
diff --git a/sound/usb/line6/driver.c b/sound/usb/line6/driver.c
index b61f65bed4e4..2b57854335b3 100644
--- a/sound/usb/line6/driver.c
+++ b/sound/usb/line6/driver.c
@@ -720,6 +720,15 @@ static int line6_init_cap_control(struct usb_line6 *line6)
        return 0;
 }
 
+static void line6_startup_work(struct work_struct *work)
+{
+       struct usb_line6 *line6 =
+               container_of(work, struct usb_line6, startup_work.work);
+
+       if (line6->startup)
+               line6->startup(line6);
+}
+
 /*
        Probe USB device.
 */
@@ -755,6 +764,7 @@ int line6_probe(struct usb_interface *interface,
        line6->properties = properties;
        line6->usbdev = usbdev;
        line6->ifcdev = &interface->dev;
+       INIT_DELAYED_WORK(&line6->startup_work, line6_startup_work);
 
        strcpy(card->id, properties->id);
        strcpy(card->driver, driver_name);
@@ -825,6 +835,8 @@ void line6_disconnect(struct usb_interface *interface)
        if (WARN_ON(usbdev != line6->usbdev))
                return;
 
+       cancel_delayed_work(&line6->startup_work);
+
        if (line6->urb_listen != NULL)
                line6_stop_listen(line6);
 
diff --git a/sound/usb/line6/driver.h b/sound/usb/line6/driver.h
index 61425597eb61..650d909c9c4f 100644
--- a/sound/usb/line6/driver.h
+++ b/sound/usb/line6/driver.h
@@ -178,11 +178,15 @@ struct usb_line6 {
                        fifo;
        } messages;
 
+       /* Work for delayed PCM startup */
+       struct delayed_work startup_work;
+
        /* If MIDI is supported, buffer_message contains the pre-processed data;
         * otherwise the data is only in urb_listen (buffer_incoming).
         */
        void (*process_message)(struct usb_line6 *);
        void (*disconnect)(struct usb_line6 *line6);
+       void (*startup)(struct usb_line6 *line6);
 };
 
 extern char *line6_alloc_sysex_buffer(struct usb_line6 *line6, int code1,
diff --git a/sound/usb/line6/toneport.c b/sound/usb/line6/toneport.c
index e28368d8eba2..55865f7e437d 100644
--- a/sound/usb/line6/toneport.c
+++ b/sound/usb/line6/toneport.c
@@ -54,9 +54,6 @@ struct usb_line6_toneport {
        /* Firmware version (x 100) */
        u8 firmware_version;
 
-       /* Work for delayed PCM startup */
-       struct delayed_work pcm_work;
-
        /* Device type */
        enum line6_device_type type;
 
@@ -241,12 +238,8 @@ static int snd_toneport_source_put(struct snd_kcontrol 
*kcontrol,
        return 1;
 }
 
-static void toneport_start_pcm(struct work_struct *work)
+static void toneport_startup(struct usb_line6 *line6)
 {
-       struct usb_line6_toneport *toneport =
-               container_of(work, struct usb_line6_toneport, pcm_work.work);
-       struct usb_line6 *line6 = &toneport->line6;
-
        line6_pcm_acquire(line6->line6pcm, LINE6_STREAM_MONITOR, true);
 }
 
@@ -394,7 +387,7 @@ static int toneport_setup(struct usb_line6_toneport 
*toneport)
        if (toneport_has_led(toneport))
                toneport_update_led(toneport);
 
-       schedule_delayed_work(&toneport->pcm_work,
+       schedule_delayed_work(&toneport->line6.startup_work,
                              msecs_to_jiffies(TONEPORT_PCM_DELAY * 1000));
        return 0;
 }
@@ -407,8 +400,6 @@ static void line6_toneport_disconnect(struct usb_line6 
*line6)
        struct usb_line6_toneport *toneport =
                (struct usb_line6_toneport *)line6;
 
-       cancel_delayed_work_sync(&toneport->pcm_work);
-
        if (toneport_has_led(toneport))
                toneport_remove_leds(toneport);
 }
@@ -424,9 +415,9 @@ static int toneport_init(struct usb_line6 *line6,
        struct usb_line6_toneport *toneport =  (struct usb_line6_toneport *) 
line6;
 
        toneport->type = id->driver_info;
-       INIT_DELAYED_WORK(&toneport->pcm_work, toneport_start_pcm);
 
        line6->disconnect = line6_toneport_disconnect;
+       line6->startup = toneport_startup;
 
        /* initialize PCM subsystem: */
        err = line6_init_pcm(line6, &toneport_pcm_properties);

Reply via email to