diff options
author | Connor McAdams <conmanx360@gmail.com> | 2018-10-21 13:53:03 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2018-10-22 00:14:11 +0200 |
commit | b5a229350b72b929edac5ba77c825f8ebb413533 (patch) | |
tree | 76525c200f30d66ed0477bbfd66ff6b61847bee8 /sound | |
parent | eb7ebfa3c1989aa8e59d5e68ab3cddd7df1bfb27 (diff) |
ALSA: hda/ca0132 - Actually fix microphone issue
This patch fixes the microphone issue for all cards. The previous fix
worked on the ZxR, but not on the AE-5 or Z. This patch has been tested
to work for all cards.
Signed-off-by: Connor McAdams <conmanx360@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/pci/hda/patch_ca0132.c | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index 1a13ceae261e..f0ef52eb22a9 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c @@ -6983,37 +6983,44 @@ static void sbz_chipio_startup_data(struct hda_codec *codec) static void ca0132_alt_dsp_scp_startup(struct hda_codec *codec) { struct ca0132_spec *spec = codec->spec; - unsigned int tmp; + unsigned int tmp, i; - switch (spec->quirk) { - case QUIRK_SBZ: - case QUIRK_AE5: - tmp = 0x00000003; - dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); - tmp = 0x00000000; - dspio_set_uint_param_no_source(codec, 0x80, 0x0A, tmp); - tmp = 0x00000001; - dspio_set_uint_param_no_source(codec, 0x80, 0x0B, tmp); - tmp = 0x00000004; - dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); - tmp = 0x00000005; - dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); - tmp = 0x00000000; - dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); - break; - case QUIRK_R3D: - case QUIRK_R3DI: - tmp = 0x00000000; - dspio_set_uint_param_no_source(codec, 0x80, 0x0A, tmp); - tmp = 0x00000001; - dspio_set_uint_param_no_source(codec, 0x80, 0x0B, tmp); - tmp = 0x00000004; - dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); - tmp = 0x00000005; - dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); - tmp = 0x00000000; - dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); - break; + /* + * Gotta run these twice, or else mic works inconsistently. Not clear + * why this is, but multiple tests have confirmed it. + */ + for (i = 0; i < 2; i++) { + switch (spec->quirk) { + case QUIRK_SBZ: + case QUIRK_AE5: + tmp = 0x00000003; + dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); + tmp = 0x00000000; + dspio_set_uint_param_no_source(codec, 0x80, 0x0A, tmp); + tmp = 0x00000001; + dspio_set_uint_param_no_source(codec, 0x80, 0x0B, tmp); + tmp = 0x00000004; + dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); + tmp = 0x00000005; + dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); + tmp = 0x00000000; + dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); + break; + case QUIRK_R3D: + case QUIRK_R3DI: + tmp = 0x00000000; + dspio_set_uint_param_no_source(codec, 0x80, 0x0A, tmp); + tmp = 0x00000001; + dspio_set_uint_param_no_source(codec, 0x80, 0x0B, tmp); + tmp = 0x00000004; + dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); + tmp = 0x00000005; + dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); + tmp = 0x00000000; + dspio_set_uint_param_no_source(codec, 0x80, 0x0C, tmp); + break; + } + msleep(100); } } @@ -7246,8 +7253,6 @@ static void r3d_setup_defaults(struct hda_codec *codec) int num_fx; int idx, i; - msleep(100); - if (spec->dsp_state != DSP_DOWNLOADED) return; @@ -7292,8 +7297,6 @@ static void sbz_setup_defaults(struct hda_codec *codec) int num_fx; int idx, i; - msleep(100); - if (spec->dsp_state != DSP_DOWNLOADED) return; @@ -7351,8 +7354,6 @@ static void ae5_setup_defaults(struct hda_codec *codec) int num_fx; int idx, i; - msleep(100); - if (spec->dsp_state != DSP_DOWNLOADED) return; |