sound fixes for 4.4-rc6
As usual in rc6, this update contains only a few HD-audio and USB-audio device-specific quirks: yet another Thinkpad noise fixes, Dell headphone mic fixes, and AudioQuest DragonFly fixes. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJWc8fIAAoJEGwxgFQ9KSmkxtMP/0k05GN1EBQyKVhAFgO24N0g zNoLAEzNylXfFD3p8Dq0YVrnebQ8AuA5SaCZmREjikG/r02JozniDhTFKk2igb0d RSo+aRC6TnsIfKw7wNIlNUFM3c7ysuHecMtP7RKux6GSNM4lyfKmUWcUXKZkxq97 CXFEyZ82vX3Y7vc5vrXblx5pr0c61Urzel/b8li+noBec8G91FMgAbAIddjZBFhU J14qSWlWnY92aiclYNeH9CHTk8j5gVkS4Vg2XsDrl1iOSHrKrAc40Tm1+sIjT7RA 2OoAjGyrSdW6v3rxakbqT/Wmz6lZOhfeoRwNCphLbhN5UalNj8QryvoF5ypU/ypr oPDKTmy4AJ1XU9kGmr5OfTIOl4XVMTK4QpcTqkDJQW3sBDCk0vunZdk84YDx/rNf 26GjpeDfqzEGW9CQdPbpKgeaMMIPSdBD62IIuTD0lRQuelz2KH35PYsj6u+kYqJD vgPUeETN5TCaqyafIWaYmUIcXWEfYRLQMUXJK0G+317bKFcBeQQAU9UnHennwmGl AGLggl2zfAafspl/wImbKtvhHWmGAKPBCS2R0YNuO83Wvl5RJG/Jt7hyyUxi7n8h bD5ao9BCpTnIqCqZskuJYGbNV4fVHTthjcqhak0+vAf0ymYBF4VlSAOySE3BrO/m qkkEH2zJ2/IAOjJlvZfg =bf1H -----END PGP SIGNATURE----- Merge tag 'sound-4.4-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "As usual in rc6, this update contains only a few HD-audio and USB-audio device-specific quirks: yet another Thinkpad noise fixes, Dell headphone mic fixes, and AudioQuest DragonFly fixes" * tag 'sound-4.4-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda - Add a fixup for Thinkpad X1 Carbon 2nd ALSA: hda - Set codec to D3 at reboot/shutdown on Thinkpads ALSA: hda - Apply click noise workaround for Thinkpads generically ALSA: hda - Fix headphone mic input on a few Dell ALC293 machines ALSA: usb-audio: Add sample rate inquiry quirk for AudioQuest DragonFly ALSA: usb-audio: Add a more accurate volume quirk for AudioQuest DragonFly
This commit is contained in:
commit
7b612255b9
|
@ -111,6 +111,7 @@ struct alc_spec {
|
||||||
void (*power_hook)(struct hda_codec *codec);
|
void (*power_hook)(struct hda_codec *codec);
|
||||||
#endif
|
#endif
|
||||||
void (*shutup)(struct hda_codec *codec);
|
void (*shutup)(struct hda_codec *codec);
|
||||||
|
void (*reboot_notify)(struct hda_codec *codec);
|
||||||
|
|
||||||
int init_amp;
|
int init_amp;
|
||||||
int codec_variant; /* flag for other variants */
|
int codec_variant; /* flag for other variants */
|
||||||
|
@ -773,6 +774,25 @@ static inline void alc_shutup(struct hda_codec *codec)
|
||||||
snd_hda_shutup_pins(codec);
|
snd_hda_shutup_pins(codec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void alc_reboot_notify(struct hda_codec *codec)
|
||||||
|
{
|
||||||
|
struct alc_spec *spec = codec->spec;
|
||||||
|
|
||||||
|
if (spec && spec->reboot_notify)
|
||||||
|
spec->reboot_notify(codec);
|
||||||
|
else
|
||||||
|
alc_shutup(codec);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* power down codec to D3 at reboot/shutdown; set as reboot_notify ops */
|
||||||
|
static void alc_d3_at_reboot(struct hda_codec *codec)
|
||||||
|
{
|
||||||
|
snd_hda_codec_set_power_to_all(codec, codec->core.afg, AC_PWRST_D3);
|
||||||
|
snd_hda_codec_write(codec, codec->core.afg, 0,
|
||||||
|
AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
|
||||||
|
msleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
#define alc_free snd_hda_gen_free
|
#define alc_free snd_hda_gen_free
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
@ -818,7 +838,7 @@ static const struct hda_codec_ops alc_patch_ops = {
|
||||||
.suspend = alc_suspend,
|
.suspend = alc_suspend,
|
||||||
.check_power_status = snd_hda_gen_check_power_status,
|
.check_power_status = snd_hda_gen_check_power_status,
|
||||||
#endif
|
#endif
|
||||||
.reboot_notify = alc_shutup,
|
.reboot_notify = alc_reboot_notify,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -4198,24 +4218,14 @@ static void alc_fixup_tpt440_dock(struct hda_codec *codec,
|
||||||
struct alc_spec *spec = codec->spec;
|
struct alc_spec *spec = codec->spec;
|
||||||
|
|
||||||
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
|
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
|
||||||
|
spec->shutup = alc_no_shutup; /* reduce click noise */
|
||||||
|
spec->reboot_notify = alc_d3_at_reboot; /* reduce noise */
|
||||||
spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
|
spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
|
||||||
codec->power_save_node = 0; /* avoid click noises */
|
codec->power_save_node = 0; /* avoid click noises */
|
||||||
snd_hda_apply_pincfgs(codec, pincfgs);
|
snd_hda_apply_pincfgs(codec, pincfgs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* additional fixup for Thinkpad T440s noise problem */
|
|
||||||
static void alc_fixup_tpt440(struct hda_codec *codec,
|
|
||||||
const struct hda_fixup *fix, int action)
|
|
||||||
{
|
|
||||||
struct alc_spec *spec = codec->spec;
|
|
||||||
|
|
||||||
if (action == HDA_FIXUP_ACT_PRE_PROBE) {
|
|
||||||
spec->shutup = alc_no_shutup; /* reduce click noise */
|
|
||||||
spec->gen.mixer_nid = 0; /* reduce background noise */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void alc_shutup_dell_xps13(struct hda_codec *codec)
|
static void alc_shutup_dell_xps13(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
struct alc_spec *spec = codec->spec;
|
struct alc_spec *spec = codec->spec;
|
||||||
|
@ -4606,6 +4616,7 @@ enum {
|
||||||
ALC288_FIXUP_DISABLE_AAMIX,
|
ALC288_FIXUP_DISABLE_AAMIX,
|
||||||
ALC292_FIXUP_DELL_E7X,
|
ALC292_FIXUP_DELL_E7X,
|
||||||
ALC292_FIXUP_DISABLE_AAMIX,
|
ALC292_FIXUP_DISABLE_AAMIX,
|
||||||
|
ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
|
||||||
ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
|
ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||||
ALC275_FIXUP_DELL_XPS,
|
ALC275_FIXUP_DELL_XPS,
|
||||||
ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE,
|
ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE,
|
||||||
|
@ -5066,7 +5077,7 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||||
},
|
},
|
||||||
[ALC292_FIXUP_TPT440] = {
|
[ALC292_FIXUP_TPT440] = {
|
||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
.v.func = alc_fixup_tpt440,
|
.v.func = alc_fixup_disable_aamix,
|
||||||
.chained = true,
|
.chained = true,
|
||||||
.chain_id = ALC292_FIXUP_TPT440_DOCK,
|
.chain_id = ALC292_FIXUP_TPT440_DOCK,
|
||||||
},
|
},
|
||||||
|
@ -5169,6 +5180,12 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||||
.chained = true,
|
.chained = true,
|
||||||
.chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
|
.chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
|
||||||
},
|
},
|
||||||
|
[ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
|
||||||
|
.type = HDA_FIXUP_FUNC,
|
||||||
|
.v.func = alc_fixup_disable_aamix,
|
||||||
|
.chained = true,
|
||||||
|
.chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
|
||||||
|
},
|
||||||
[ALC292_FIXUP_DELL_E7X] = {
|
[ALC292_FIXUP_DELL_E7X] = {
|
||||||
.type = HDA_FIXUP_FUNC,
|
.type = HDA_FIXUP_FUNC,
|
||||||
.v.func = alc_fixup_dell_xps13,
|
.v.func = alc_fixup_dell_xps13,
|
||||||
|
@ -5247,11 +5264,11 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||||
SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC292_FIXUP_DISABLE_AAMIX),
|
SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
|
||||||
SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC292_FIXUP_DISABLE_AAMIX),
|
SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
|
||||||
SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC292_FIXUP_DISABLE_AAMIX),
|
SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
|
||||||
SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC292_FIXUP_DISABLE_AAMIX),
|
SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
|
||||||
SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC292_FIXUP_DISABLE_AAMIX),
|
SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
|
||||||
SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
|
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, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
|
||||||
|
@ -5358,6 +5375,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||||
SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
|
SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
|
SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||||
|
SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
|
SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
|
SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
|
||||||
SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
|
SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
|
||||||
|
|
|
@ -1354,6 +1354,8 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
snd_usb_mixer_fu_apply_quirk(state->mixer, cval, unitid, kctl);
|
||||||
|
|
||||||
range = (cval->max - cval->min) / cval->res;
|
range = (cval->max - cval->min) / cval->res;
|
||||||
/*
|
/*
|
||||||
* Are there devices with volume range more than 255? I use a bit more
|
* Are there devices with volume range more than 255? I use a bit more
|
||||||
|
|
|
@ -348,13 +348,6 @@ static struct usbmix_name_map bose_companion5_map[] = {
|
||||||
{ 0 } /* terminator */
|
{ 0 } /* terminator */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Dragonfly DAC 1.2, the dB conversion factor is 1 instead of 256 */
|
|
||||||
static struct usbmix_dB_map dragonfly_1_2_dB = {0, 5000};
|
|
||||||
static struct usbmix_name_map dragonfly_1_2_map[] = {
|
|
||||||
{ 7, NULL, .dB = &dragonfly_1_2_dB },
|
|
||||||
{ 0 } /* terminator */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Control map entries
|
* Control map entries
|
||||||
*/
|
*/
|
||||||
|
@ -470,11 +463,6 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
||||||
.id = USB_ID(0x05a7, 0x1020),
|
.id = USB_ID(0x05a7, 0x1020),
|
||||||
.map = bose_companion5_map,
|
.map = bose_companion5_map,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
/* Dragonfly DAC 1.2 */
|
|
||||||
.id = USB_ID(0x21b4, 0x0081),
|
|
||||||
.map = dragonfly_1_2_map,
|
|
||||||
},
|
|
||||||
{ 0 } /* terminator */
|
{ 0 } /* terminator */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include <sound/control.h>
|
#include <sound/control.h>
|
||||||
#include <sound/hwdep.h>
|
#include <sound/hwdep.h>
|
||||||
#include <sound/info.h>
|
#include <sound/info.h>
|
||||||
|
#include <sound/tlv.h>
|
||||||
|
|
||||||
#include "usbaudio.h"
|
#include "usbaudio.h"
|
||||||
#include "mixer.h"
|
#include "mixer.h"
|
||||||
|
@ -1825,3 +1826,39 @@ void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
|
||||||
|
struct snd_kcontrol *kctl)
|
||||||
|
{
|
||||||
|
/* Approximation using 10 ranges based on output measurement on hw v1.2.
|
||||||
|
* This seems close to the cubic mapping e.g. alsamixer uses. */
|
||||||
|
static const DECLARE_TLV_DB_RANGE(scale,
|
||||||
|
0, 1, TLV_DB_MINMAX_ITEM(-5300, -4970),
|
||||||
|
2, 5, TLV_DB_MINMAX_ITEM(-4710, -4160),
|
||||||
|
6, 7, TLV_DB_MINMAX_ITEM(-3884, -3710),
|
||||||
|
8, 14, TLV_DB_MINMAX_ITEM(-3443, -2560),
|
||||||
|
15, 16, TLV_DB_MINMAX_ITEM(-2475, -2324),
|
||||||
|
17, 19, TLV_DB_MINMAX_ITEM(-2228, -2031),
|
||||||
|
20, 26, TLV_DB_MINMAX_ITEM(-1910, -1393),
|
||||||
|
27, 31, TLV_DB_MINMAX_ITEM(-1322, -1032),
|
||||||
|
32, 40, TLV_DB_MINMAX_ITEM(-968, -490),
|
||||||
|
41, 50, TLV_DB_MINMAX_ITEM(-441, 0),
|
||||||
|
);
|
||||||
|
|
||||||
|
usb_audio_info(mixer->chip, "applying DragonFly dB scale quirk\n");
|
||||||
|
kctl->tlv.p = scale;
|
||||||
|
kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
|
||||||
|
kctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
|
||||||
|
struct usb_mixer_elem_info *cval, int unitid,
|
||||||
|
struct snd_kcontrol *kctl)
|
||||||
|
{
|
||||||
|
switch (mixer->chip->usb_id) {
|
||||||
|
case USB_ID(0x21b4, 0x0081): /* AudioQuest DragonFly */
|
||||||
|
if (unitid == 7 && cval->min == 0 && cval->max == 50)
|
||||||
|
snd_dragonfly_quirk_db_scale(mixer, kctl);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,5 +9,9 @@ void snd_emuusb_set_samplerate(struct snd_usb_audio *chip,
|
||||||
void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer,
|
void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer,
|
||||||
int unitid);
|
int unitid);
|
||||||
|
|
||||||
|
void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
|
||||||
|
struct usb_mixer_elem_info *cval, int unitid,
|
||||||
|
struct snd_kcontrol *kctl);
|
||||||
|
|
||||||
#endif /* SND_USB_MIXER_QUIRKS_H */
|
#endif /* SND_USB_MIXER_QUIRKS_H */
|
||||||
|
|
||||||
|
|
|
@ -1125,6 +1125,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)
|
||||||
case USB_ID(0x045E, 0x0779): /* MS Lifecam HD-3000 */
|
case USB_ID(0x045E, 0x0779): /* MS Lifecam HD-3000 */
|
||||||
case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */
|
case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */
|
||||||
case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */
|
case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */
|
||||||
|
case USB_ID(0x21B4, 0x0081): /* AudioQuest DragonFly */
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue