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. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAlzvmKUOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+hJQ/+Ni6QlktS/PasTXYHikyub6FBvHlRbFXjvKbn blUTxDhIIHNlbugpCYfaZ4EUSX8ZYV39Prlfsgg6Sq8k2z3r99zW3nt1DAI9EoPW OMmaCBE19jEQl49pKQ6rOiBSeMxgtjJRTbNQKiY3uR7TK7/i0wtjtoIDtD9d979d vc3b9S95+chiKww0NqGMf/4kJIOyrA3POE3obvYcutwDm0yjBtS5cQYuKLicEGK2 Q1j811PXmn+LgC8VZdH2cgGrWC9lWeMb3S5X+uJoSr5mLJCLBp1+oGnpxWYQMrzZ sOffACbVO/v106rjOoPKWChPVssgO6OuaFX+kUQ+1P5n73nMgplKsQ1CLGoXSiuN DfPNiF88z8O4KPOia3FDDid/zk4uURHh4DAKhtGSctRCCXiS/ZdUeRHypj63vTsF o85Boo9gss2wDs51vxS3ypoIfl0BnNLEjOcYGQBFA0ci4mrnwXG0PdQCwnYSfJjW 9zCwS9l0oqhPWAG+9wBfaN9SlNIevtXnGy18s/OUM8QZKNaqbfuIvAd/HhCfHSra brQzouplMbT5G2DDCU4wdUhkhHY8i4wOT1PjcENP8QWnQXoBr2FsMmK9Wqj/mG68 Frs07wyqEQcviGMOB3YUyZ1BnGNQujfgBBy5jaz5Ga4HNcsO6Ro9FHhIYlelat/i No0D7t8= =Bj5P -----END PGP SIGNATURE----- Merge tag 'sound-5.2-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "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" * tag 'sound-5.2-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: fireface: Use ULL suffixes for 64-bit constants ALSA: hda/realtek - Improve the headset mic for Acer Aspire laptops ALSA: line6: Assure canceling delayed work at disconnection ALSA: hda - Force polling mode on CNL for fixing codec communication ALSA: hda/realtek - Enable micmute LED for Huawei laptops ALSA: hda/realtek - Set default power save node to 0 ALSA: hda/realtek - Check headset type by unplug and resume
This commit is contained in:
Коммит
c5ba171266
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче