mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 09:40:58 +07:00
sound fixes for 4.4-rc3
Here are no big surprises but just all small fixes, mostly device-specific quirks for HD-audio and USB-audio: - Fix for detection of FireWire DICE Loud devices - Intel Broxton HDMI/DP PCI IDs and relevant quirks - Noise fixes: Dell XPS13 2015 model, Dell Latitude E6440, Gigabyte Z170X mobo - Fix the headphone mixer assignment on HP laptops for PulseAudio - USB-MIDI fixes for Medeli DD305 and CH345 - Apply fixup for Acer Aspire One Cloudbook 14 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJWWBBoAAoJEGwxgFQ9KSmk6yAQAIy5Ogu6MWQsaVpC0HcSKO4H 3PrDLUi7T6/1O9yo/CEULwcGDKKS0Vj/Il1wddsfT6oTFrSrz0LtRN0tVr/5IJhi GqWv0WTH9Icu/7oRUs/0bZPa5Xr6DB8/0d5PBA9q8P0aFCQs4+K/az3L5GGUjSdb n/VeceTx9Faqcp3XzchvZ9qBHMhAyNmsCA83f47szSBRL1XnxZH7H8AsncxDAxeK B9f23FlBuETG1YK1mY4Bsa6jlskTp0DBAN5kmFsEjDQYCjWpW5DdVDj0KIXic33Q NcZc5jgZ2qVejwt7i9q5WCy5cGRpFMfF5d5Ro6iR1wLpSELnG9I2+zbToUxQQNCy Ilr17KJu0Gb123srjDreS/01seqx/J+WAyuVL4UFKmzc6SvJCSEVac8P2UdE3P46 uFENe3HGUv+EJqL+TOwip9XFU0byFoO4brkXs86Jl8fhj0y+7Jgbn92GowHiVoi1 z6m2ob1EX3Rtk1w52echLiqw8sz+EO4sV750olqG3x/4R0j2kdNF6saGxtU1JUN7 bLBHuiX6I63fw4wAuNTp+g+Q9oQ1v7blQNIVD9SJaFyAArG2I6zW2f6JpRs+zL+b h7bLfVgzQmPhSok2/pGUKMagsL4JGXEIy5TUasPJPKhRx6cegC5kjj7N2ajTjmII 7D0VpDrYLWmPKTE7C5g+ =ab9W -----END PGP SIGNATURE----- Merge tag 'sound-4.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Here are no big surprises but just all small fixes, mostly device-specific quirks for HD-audio and USB-audio: - Fix for detection of FireWire DICE Loud devices - Intel Broxton HDMI/DP PCI IDs and relevant quirks - Noise fixes: Dell XPS13 2015 model, Dell Latitude E6440, Gigabyte Z170X mobo - Fix the headphone mixer assignment on HP laptops for PulseAudio - USB-MIDI fixes for Medeli DD305 and CH345 - Apply fixup for Acer Aspire One Cloudbook 14" * tag 'sound-4.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Fix noise on Gigabyte Z170X mobo ALSA: hda - Fix headphone noise after Dell XPS 13 resume back from S3 ALSA: hda - Apply HP headphone fixups more generically ALSA: hda - Add fixup for Acer Aspire One Cloudbook 14 ALSA: hda - apply SKL display power request/release patch to BXT ALSA: hda - add PCI IDs for Intel Broxton ALSA: usb-audio: work around CH345 input SysEx corruption ALSA: usb-audio: prevent CH345 multiport output SysEx corruption ALSA: usb-audio: add packet size quirk for the Medeli DD305 ALSA: dice: fix detection of Loud devices ALSA: hda - Fix noise on Dell Latitude E6440
This commit is contained in:
commit
1724734079
@ -12,9 +12,11 @@ MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
#define OUI_WEISS 0x001c6a
|
||||
#define OUI_LOUD 0x000ff2
|
||||
|
||||
#define DICE_CATEGORY_ID 0x04
|
||||
#define WEISS_CATEGORY_ID 0x00
|
||||
#define LOUD_CATEGORY_ID 0x10
|
||||
|
||||
static int dice_interface_check(struct fw_unit *unit)
|
||||
{
|
||||
@ -57,6 +59,8 @@ static int dice_interface_check(struct fw_unit *unit)
|
||||
}
|
||||
if (vendor == OUI_WEISS)
|
||||
category = WEISS_CATEGORY_ID;
|
||||
else if (vendor == OUI_LOUD)
|
||||
category = LOUD_CATEGORY_ID;
|
||||
else
|
||||
category = DICE_CATEGORY_ID;
|
||||
if (device->config_rom[3] != ((vendor << 8) | category) ||
|
||||
|
@ -312,6 +312,10 @@ enum {
|
||||
(AZX_DCAPS_INTEL_PCH | AZX_DCAPS_SEPARATE_STREAM_TAG |\
|
||||
AZX_DCAPS_I915_POWERWELL)
|
||||
|
||||
#define AZX_DCAPS_INTEL_BROXTON \
|
||||
(AZX_DCAPS_INTEL_PCH | AZX_DCAPS_SEPARATE_STREAM_TAG |\
|
||||
AZX_DCAPS_I915_POWERWELL)
|
||||
|
||||
/* quirks for ATI SB / AMD Hudson */
|
||||
#define AZX_DCAPS_PRESET_ATI_SB \
|
||||
(AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB |\
|
||||
@ -2124,6 +2128,9 @@ static const struct pci_device_id azx_ids[] = {
|
||||
/* Sunrise Point-LP */
|
||||
{ PCI_DEVICE(0x8086, 0x9d70),
|
||||
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE },
|
||||
/* Broxton-P(Apollolake) */
|
||||
{ PCI_DEVICE(0x8086, 0x5a98),
|
||||
.driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BROXTON },
|
||||
/* Haswell */
|
||||
{ PCI_DEVICE(0x8086, 0x0a0c),
|
||||
.driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
|
||||
|
@ -2378,7 +2378,8 @@ static int patch_generic_hdmi(struct hda_codec *codec)
|
||||
* can cover the codec power request, and so need not set this flag.
|
||||
* For previous platforms, there is no such power well feature.
|
||||
*/
|
||||
if (is_valleyview_plus(codec) || is_skylake(codec))
|
||||
if (is_valleyview_plus(codec) || is_skylake(codec) ||
|
||||
is_broxton(codec))
|
||||
codec->core.link_power_control = 1;
|
||||
|
||||
if (is_haswell_plus(codec) || is_valleyview_plus(codec)) {
|
||||
|
@ -1759,6 +1759,7 @@ enum {
|
||||
ALC882_FIXUP_NO_PRIMARY_HP,
|
||||
ALC887_FIXUP_ASUS_BASS,
|
||||
ALC887_FIXUP_BASS_CHMAP,
|
||||
ALC882_FIXUP_DISABLE_AAMIX,
|
||||
};
|
||||
|
||||
static void alc889_fixup_coef(struct hda_codec *codec,
|
||||
@ -1920,6 +1921,8 @@ static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
|
||||
|
||||
static void alc_fixup_bass_chmap(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action);
|
||||
static void alc_fixup_disable_aamix(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action);
|
||||
|
||||
static const struct hda_fixup alc882_fixups[] = {
|
||||
[ALC882_FIXUP_ABIT_AW9D_MAX] = {
|
||||
@ -2151,6 +2154,10 @@ static const struct hda_fixup alc882_fixups[] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc_fixup_bass_chmap,
|
||||
},
|
||||
[ALC882_FIXUP_DISABLE_AAMIX] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc_fixup_disable_aamix,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
||||
@ -2218,6 +2225,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
|
||||
SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
|
||||
SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1458, 0xa182, "Gigabyte Z170X-UD3", ALC882_FIXUP_DISABLE_AAMIX),
|
||||
SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
|
||||
SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
|
||||
SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
|
||||
@ -4587,6 +4595,7 @@ enum {
|
||||
ALC292_FIXUP_DISABLE_AAMIX,
|
||||
ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC275_FIXUP_DELL_XPS,
|
||||
ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
@ -5167,6 +5176,17 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
{}
|
||||
}
|
||||
},
|
||||
[ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
/* Disable pass-through path for FRONT 14h */
|
||||
{0x20, AC_VERB_SET_COEF_INDEX, 0x36},
|
||||
{0x20, AC_VERB_SET_PROC_COEF, 0x1737},
|
||||
{}
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
@ -5180,8 +5200,10 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
|
||||
SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
|
||||
SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
|
||||
SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
|
||||
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, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
|
||||
SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
|
||||
SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
|
||||
SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
|
||||
@ -5204,6 +5226,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC292_FIXUP_DISABLE_AAMIX),
|
||||
SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC292_FIXUP_DISABLE_AAMIX),
|
||||
SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC292_FIXUP_DISABLE_AAMIX),
|
||||
SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
|
||||
SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
|
||||
|
@ -3110,6 +3110,29 @@ static void stac92hd71bxx_fixup_hp_hdx(struct hda_codec *codec,
|
||||
spec->gpio_led = 0x08;
|
||||
}
|
||||
|
||||
static bool is_hp_output(struct hda_codec *codec, hda_nid_t pin)
|
||||
{
|
||||
unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin);
|
||||
|
||||
/* count line-out, too, as BIOS sets often so */
|
||||
return get_defcfg_connect(pin_cfg) != AC_JACK_PORT_NONE &&
|
||||
(get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT ||
|
||||
get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT);
|
||||
}
|
||||
|
||||
static void fixup_hp_headphone(struct hda_codec *codec, hda_nid_t pin)
|
||||
{
|
||||
unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin);
|
||||
|
||||
/* It was changed in the BIOS to just satisfy MS DTM.
|
||||
* Lets turn it back into slaved HP
|
||||
*/
|
||||
pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE)) |
|
||||
(AC_JACK_HP_OUT << AC_DEFCFG_DEVICE_SHIFT);
|
||||
pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC | AC_DEFCFG_SEQUENCE))) |
|
||||
0x1f;
|
||||
snd_hda_codec_set_pincfg(codec, pin, pin_cfg);
|
||||
}
|
||||
|
||||
static void stac92hd71bxx_fixup_hp(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
@ -3119,22 +3142,12 @@ static void stac92hd71bxx_fixup_hp(struct hda_codec *codec,
|
||||
if (action != HDA_FIXUP_ACT_PRE_PROBE)
|
||||
return;
|
||||
|
||||
if (hp_blike_system(codec->core.subsystem_id)) {
|
||||
unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, 0x0f);
|
||||
if (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT ||
|
||||
get_defcfg_device(pin_cfg) == AC_JACK_SPEAKER ||
|
||||
get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT) {
|
||||
/* It was changed in the BIOS to just satisfy MS DTM.
|
||||
* Lets turn it back into slaved HP
|
||||
*/
|
||||
pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE))
|
||||
| (AC_JACK_HP_OUT <<
|
||||
AC_DEFCFG_DEVICE_SHIFT);
|
||||
pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC
|
||||
| AC_DEFCFG_SEQUENCE)))
|
||||
| 0x1f;
|
||||
snd_hda_codec_set_pincfg(codec, 0x0f, pin_cfg);
|
||||
}
|
||||
/* when both output A and F are assigned, these are supposedly
|
||||
* dock and built-in headphones; fix both pin configs
|
||||
*/
|
||||
if (is_hp_output(codec, 0x0a) && is_hp_output(codec, 0x0f)) {
|
||||
fixup_hp_headphone(codec, 0x0a);
|
||||
fixup_hp_headphone(codec, 0x0f);
|
||||
}
|
||||
|
||||
if (find_mute_led_cfg(codec, 1))
|
||||
|
@ -174,6 +174,8 @@ struct snd_usb_midi_in_endpoint {
|
||||
u8 running_status_length;
|
||||
} ports[0x10];
|
||||
u8 seen_f5;
|
||||
bool in_sysex;
|
||||
u8 last_cin;
|
||||
u8 error_resubmit;
|
||||
int current_port;
|
||||
};
|
||||
@ -467,6 +469,39 @@ static void snd_usbmidi_maudio_broken_running_status_input(
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* QinHeng CH345 is buggy: every second packet inside a SysEx has not CIN 4
|
||||
* but the previously seen CIN, but still with three data bytes.
|
||||
*/
|
||||
static void ch345_broken_sysex_input(struct snd_usb_midi_in_endpoint *ep,
|
||||
uint8_t *buffer, int buffer_length)
|
||||
{
|
||||
unsigned int i, cin, length;
|
||||
|
||||
for (i = 0; i + 3 < buffer_length; i += 4) {
|
||||
if (buffer[i] == 0 && i > 0)
|
||||
break;
|
||||
cin = buffer[i] & 0x0f;
|
||||
if (ep->in_sysex &&
|
||||
cin == ep->last_cin &&
|
||||
(buffer[i + 1 + (cin == 0x6)] & 0x80) == 0)
|
||||
cin = 0x4;
|
||||
#if 0
|
||||
if (buffer[i + 1] == 0x90) {
|
||||
/*
|
||||
* Either a corrupted running status or a real note-on
|
||||
* message; impossible to detect reliably.
|
||||
*/
|
||||
}
|
||||
#endif
|
||||
length = snd_usbmidi_cin_length[cin];
|
||||
snd_usbmidi_input_data(ep, 0, &buffer[i + 1], length);
|
||||
ep->in_sysex = cin == 0x4;
|
||||
if (!ep->in_sysex)
|
||||
ep->last_cin = cin;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* CME protocol: like the standard protocol, but SysEx commands are sent as a
|
||||
* single USB packet preceded by a 0x0F byte.
|
||||
@ -660,6 +695,12 @@ static struct usb_protocol_ops snd_usbmidi_cme_ops = {
|
||||
.output_packet = snd_usbmidi_output_standard_packet,
|
||||
};
|
||||
|
||||
static struct usb_protocol_ops snd_usbmidi_ch345_broken_sysex_ops = {
|
||||
.input = ch345_broken_sysex_input,
|
||||
.output = snd_usbmidi_standard_output,
|
||||
.output_packet = snd_usbmidi_output_standard_packet,
|
||||
};
|
||||
|
||||
/*
|
||||
* AKAI MPD16 protocol:
|
||||
*
|
||||
@ -1341,6 +1382,7 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi *umidi,
|
||||
* Various chips declare a packet size larger than 4 bytes, but
|
||||
* do not actually work with larger packets:
|
||||
*/
|
||||
case USB_ID(0x0a67, 0x5011): /* Medeli DD305 */
|
||||
case USB_ID(0x0a92, 0x1020): /* ESI M4U */
|
||||
case USB_ID(0x1430, 0x474b): /* RedOctane GH MIDI INTERFACE */
|
||||
case USB_ID(0x15ca, 0x0101): /* Textech USB Midi Cable */
|
||||
@ -2376,6 +2418,10 @@ int snd_usbmidi_create(struct snd_card *card,
|
||||
if (err < 0)
|
||||
break;
|
||||
|
||||
err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
|
||||
break;
|
||||
case QUIRK_MIDI_CH345:
|
||||
umidi->usb_protocol_ops = &snd_usbmidi_ch345_broken_sysex_ops;
|
||||
err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
|
||||
break;
|
||||
default:
|
||||
|
@ -2829,6 +2829,17 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
||||
.idProduct = 0x1020,
|
||||
},
|
||||
|
||||
/* QinHeng devices */
|
||||
{
|
||||
USB_DEVICE(0x1a86, 0x752d),
|
||||
.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
|
||||
.vendor_name = "QinHeng",
|
||||
.product_name = "CH345",
|
||||
.ifnum = 1,
|
||||
.type = QUIRK_MIDI_CH345
|
||||
}
|
||||
},
|
||||
|
||||
/* KeithMcMillen Stringport */
|
||||
{
|
||||
USB_DEVICE(0x1f38, 0x0001),
|
||||
|
@ -538,6 +538,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
|
||||
[QUIRK_MIDI_CME] = create_any_midi_quirk,
|
||||
[QUIRK_MIDI_AKAI] = create_any_midi_quirk,
|
||||
[QUIRK_MIDI_FTDI] = create_any_midi_quirk,
|
||||
[QUIRK_MIDI_CH345] = create_any_midi_quirk,
|
||||
[QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk,
|
||||
[QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk,
|
||||
[QUIRK_AUDIO_EDIROL_UAXX] = create_uaxx_quirk,
|
||||
|
@ -95,6 +95,7 @@ enum quirk_type {
|
||||
QUIRK_MIDI_AKAI,
|
||||
QUIRK_MIDI_US122L,
|
||||
QUIRK_MIDI_FTDI,
|
||||
QUIRK_MIDI_CH345,
|
||||
QUIRK_AUDIO_STANDARD_INTERFACE,
|
||||
QUIRK_AUDIO_FIXED_ENDPOINT,
|
||||
QUIRK_AUDIO_EDIROL_UAXX,
|
||||
|
Loading…
Reference in New Issue
Block a user