ALSA: hda - Fix digital-mic mono recording on ASUS Eee PC
The digital-mic unit on ASUS Eee PC gives PDM signals instead of the normal stereo PCM, thus you can't record a mono stream from the stereo stream as is; the summed stereo signal results in almost zero level, and you'll hear only soft noise. As a workaround, use ALC269-specific COEF to manipulate the dmic route for mono, like used for ALC271x. This is implemented as a fix-up, thus it works only with model=auto or without REALTEK_QUIRKS Kconfig. Reported-and-tested-by: Pavel Roskin <proski@gnu.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
9f3b24948f
commit
adabb3ec8b
|
@ -4484,6 +4484,22 @@ static void alc269_fixup_pcm_44k(struct hda_codec *codec,
|
||||||
spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
|
spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
|
||||||
|
const struct alc_fixup *fix, int action)
|
||||||
|
{
|
||||||
|
int coef;
|
||||||
|
|
||||||
|
if (action != ALC_FIXUP_ACT_INIT)
|
||||||
|
return;
|
||||||
|
/* The digital-mic unit sends PDM (differential signal) instead of
|
||||||
|
* the standard PCM, thus you can't record a valid mono stream as is.
|
||||||
|
* Below is a workaround specific to ALC269 to control the dmic
|
||||||
|
* signal source as mono.
|
||||||
|
*/
|
||||||
|
coef = alc_read_coef_idx(codec, 0x07);
|
||||||
|
alc_write_coef_idx(codec, 0x07, coef | 0x80);
|
||||||
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
ALC269_FIXUP_SONY_VAIO,
|
ALC269_FIXUP_SONY_VAIO,
|
||||||
ALC275_FIXUP_SONY_VAIO_GPIO2,
|
ALC275_FIXUP_SONY_VAIO_GPIO2,
|
||||||
|
@ -4494,6 +4510,7 @@ enum {
|
||||||
ALC275_FIXUP_SONY_HWEQ,
|
ALC275_FIXUP_SONY_HWEQ,
|
||||||
ALC271_FIXUP_DMIC,
|
ALC271_FIXUP_DMIC,
|
||||||
ALC269_FIXUP_PCM_44K,
|
ALC269_FIXUP_PCM_44K,
|
||||||
|
ALC269_FIXUP_STEREO_DMIC,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct alc_fixup alc269_fixups[] = {
|
static const struct alc_fixup alc269_fixups[] = {
|
||||||
|
@ -4556,10 +4573,19 @@ static const struct alc_fixup alc269_fixups[] = {
|
||||||
.type = ALC_FIXUP_FUNC,
|
.type = ALC_FIXUP_FUNC,
|
||||||
.v.func = alc269_fixup_pcm_44k,
|
.v.func = alc269_fixup_pcm_44k,
|
||||||
},
|
},
|
||||||
|
[ALC269_FIXUP_STEREO_DMIC] = {
|
||||||
|
.type = ALC_FIXUP_FUNC,
|
||||||
|
.v.func = alc269_fixup_stereo_dmic,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||||
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
|
SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
|
||||||
|
SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
|
||||||
|
SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
|
||||||
|
SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
|
||||||
|
SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
|
||||||
|
SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
|
||||||
SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
|
SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
|
||||||
SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
||||||
SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
|
||||||
|
|
Loading…
Reference in New Issue