sound fixes for 4.20-rc7
Only usual suspects here: a few more fixups for Realtek HD-audio on various PCs, including a regression fix in the previous fix for Lenovo X1 Carbon, as well as a typo fix in the recent Fireface patch. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAlwSEwMOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+Wzg//QJ5MQfbOi4TqAVuk4BSqLd4PPxksiCC92981 JGW/LcNZFw1tj/dH9Y3d99555wc21jBGVjRT9UvA8aQ+R0Hj8+A5jwpybk2Z9JPF RgpR2pboa/PQ0bGdE0CFnotD+sa5//AxC++KoekLSq6BDGOhPUprQfqJxs/pK+kf Wsmh87VIpHuljWXaBARoXdkRSIDeOUAUnI+a2XkxLiJR2/2BGljZLYo5oOJlfVqc YMwsmjffClYlF6yeUjg+MkleE8AIzrsyztHVid3vu3Hbh1HmPVwjMMYT9Zt9Q1lQ gb++XOtUqWh2kFbQH8PgdlhGOz4SGZEygHunViQ30Fl54KpI+xKdWrtr5aPduqwH eLMjURD91QWMwaBpz0V04QDbTr8H5MoCIXiVs46pgSEXyyd2eCoewu3+X9aBKmCZ L/oViKUnIwp1m0EcKBn6QFAHJVEUnUeOBZbLaSNxgKjaHhAyNDaZs2w1goUWpaZL Jy4fvbFj2H1f6fNTZGSyJOpIJ4+DYAYeJFRmJJC0PpZJodr3shOPTjzBI506Lz8U dREQSqZMfmqjfCr52hwcCAwtCfL45zD1OqeLEzN3St1ZUEw5GL3Fvg2eZBLfDFD1 LXxUT/S+ColfiZicqcHpD74JCWiT3hFprAHs118NDUbl54ZARGxdscJ/8AOZ8Qbq SfOTzP0= =3Ked -----END PGP SIGNATURE----- Merge tag 'sound-4.20-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Only usual suspects here: a few more fixups for Realtek HD-audio on various PCs, including a regression fix in the previous fix for Lenovo X1 Carbon, as well as a typo fix in the recent Fireface patch" * tag 'sound-4.20-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda/realtek: Enable audio jacks of ASUS UX433FN/UX333FA with ALC294 ALSA: hda/realtek: Enable audio jacks of ASUS UX533FD with ALC294 ALSA: hda/realtek: ALC294 mic and headset-mode fixups for ASUS X542UN ALSA: fireface: fix reference to wrong register for clock configuration ALSA: hda/realtek - Fix the mute LED regresion on Lenovo X1 Carbon ALSA: hda/realtek - Fixed headphone issue for ALC700
This commit is contained in:
@ -30,7 +30,7 @@ static int ff400_get_clock(struct snd_ff *ff, unsigned int *rate,
|
||||
int err;
|
||||
|
||||
err = snd_fw_transaction(ff->unit, TCODE_READ_QUADLET_REQUEST,
|
||||
FF400_SYNC_STATUS, ®, sizeof(reg), 0);
|
||||
FF400_CLOCK_CONFIG, ®, sizeof(reg), 0);
|
||||
if (err < 0)
|
||||
return err;
|
||||
data = le32_to_cpu(reg);
|
||||
|
@ -5520,6 +5520,9 @@ enum {
|
||||
ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
|
||||
ALC295_FIXUP_HP_AUTO_MUTE,
|
||||
ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
|
||||
ALC294_FIXUP_ASUS_MIC,
|
||||
ALC294_FIXUP_ASUS_HEADSET_MIC,
|
||||
ALC294_FIXUP_ASUS_SPK,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
@ -6392,6 +6395,8 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
[ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc285_fixup_invalidate_dacs,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_THINKPAD_ACPI
|
||||
},
|
||||
[ALC295_FIXUP_HP_AUTO_MUTE] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
@ -6406,6 +6411,36 @@ static const struct hda_fixup alc269_fixups[] = {
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MIC
|
||||
},
|
||||
[ALC294_FIXUP_ASUS_MIC] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x13, 0x90a60160 }, /* use as internal mic */
|
||||
{ 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
|
||||
},
|
||||
[ALC294_FIXUP_ASUS_HEADSET_MIC] = {
|
||||
.type = HDA_FIXUP_PINS,
|
||||
.v.pins = (const struct hda_pintbl[]) {
|
||||
{ 0x19, 0x01a1113c }, /* use as headset mic, without its own jack detect */
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
|
||||
},
|
||||
[ALC294_FIXUP_ASUS_SPK] = {
|
||||
.type = HDA_FIXUP_VERBS,
|
||||
.v.verbs = (const struct hda_verb[]) {
|
||||
/* Set EAPD high */
|
||||
{ 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
|
||||
{ 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
|
||||
{ }
|
||||
},
|
||||
.chained = true,
|
||||
.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
@ -6548,6 +6583,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
|
||||
SND_PCI_QUIRK(0x1043, 0x14a1, "ASUS UX533FD", ALC294_FIXUP_ASUS_SPK),
|
||||
SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
|
||||
SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
|
||||
@ -7155,6 +7191,14 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
||||
SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC292_STANDARD_PINS,
|
||||
{0x13, 0x90a60140}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
|
||||
{0x14, 0x90170110},
|
||||
{0x1b, 0x90a70130},
|
||||
{0x21, 0x04211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
|
||||
{0x12, 0x90a60130},
|
||||
{0x17, 0x90170110},
|
||||
{0x21, 0x04211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
|
||||
ALC295_STANDARD_PINS,
|
||||
{0x17, 0x21014020},
|
||||
@ -7227,6 +7271,37 @@ static void alc269_fill_coef(struct hda_codec *codec)
|
||||
alc_update_coef_idx(codec, 0x4, 0, 1<<11);
|
||||
}
|
||||
|
||||
static void alc294_hp_init(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
|
||||
int i, val;
|
||||
|
||||
if (!hp_pin)
|
||||
return;
|
||||
|
||||
snd_hda_codec_write(codec, hp_pin, 0,
|
||||
AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
|
||||
|
||||
msleep(100);
|
||||
|
||||
snd_hda_codec_write(codec, hp_pin, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
|
||||
|
||||
alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
|
||||
alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
|
||||
|
||||
/* Wait for depop procedure finish */
|
||||
val = alc_read_coefex_idx(codec, 0x58, 0x01);
|
||||
for (i = 0; i < 20 && val & 0x0080; i++) {
|
||||
msleep(50);
|
||||
val = alc_read_coefex_idx(codec, 0x58, 0x01);
|
||||
}
|
||||
/* Set HP depop to auto mode */
|
||||
alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
|
||||
msleep(50);
|
||||
}
|
||||
|
||||
/*
|
||||
*/
|
||||
static int patch_alc269(struct hda_codec *codec)
|
||||
@ -7352,6 +7427,7 @@ static int patch_alc269(struct hda_codec *codec)
|
||||
spec->codec_variant = ALC269_TYPE_ALC294;
|
||||
spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
|
||||
alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
|
||||
alc294_hp_init(codec);
|
||||
break;
|
||||
case 0x10ec0300:
|
||||
spec->codec_variant = ALC269_TYPE_ALC300;
|
||||
@ -7363,6 +7439,7 @@ static int patch_alc269(struct hda_codec *codec)
|
||||
spec->codec_variant = ALC269_TYPE_ALC700;
|
||||
spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
|
||||
alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
|
||||
alc294_hp_init(codec);
|
||||
break;
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user