[QUANTAL PATCH] ALSA: hda - use both input paths on Conexant auto parser
Colin Ian King
colin.king at canonical.com
Sun Oct 7 19:19:05 UTC 2012
On 06/10/12 13:30, Colin Ian King wrote:
> David,
>
> This patch unfortunately breaks audio on my Lenovo ThinkPad x230. I
> reverted the patch and then audio works again. :-/
>
> Colin
I was wrong. After watching some content audio died with this reverted
too. Seems like its some other issue.
Colin
>
> On 26/09/12 09:55, David Henningsson wrote:
>> On the Thinkpad W520 - and probably several other machines with
>> Conexant 506x chips - the Dock Mic and Mic are connected to the
>> same two selector nodes. This patch will make Dock Mic take one
>> selector node and Mic take the other, when possible.
>>
>> Without the patch, both paths would take the first selector,
>> leading to the normal Mic's volume being controlled by
>> "Dock Mic Boost".
>> (On other machines, this could instead fixup similar problems between
>> Mic and Line In, for example.)
>>
>> BugLink: https://bugs.launchpad.net/bugs/1037642
>> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
>> Signed-off-by: Takashi Iwai <tiwai at suse.de>
>> (cherry picked from commit 739572a545b8ab6faf9e266c3ed83ea202073699,
>> linux/kernel/git/tiwai/sound.git)
>>
>> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
>> ---
>>
>> Motivation:
>> * Bug tagged with regression-release
>> * Takashi did not want to send to stable because it renames some
>> mixer element
>> (change of behaviour). Since we haven't released 12.10 yet, that
>> argument does
>> not apply to us.
>>
>> sound/pci/hda/patch_conexant.c | 20 ++++++++++++++++----
>> 1 file changed, 16 insertions(+), 4 deletions(-)
>>
>> diff --git a/sound/pci/hda/patch_conexant.c
>> b/sound/pci/hda/patch_conexant.c
>> index 41f28c8..0c127cf 100644
>> --- a/sound/pci/hda/patch_conexant.c
>> +++ b/sound/pci/hda/patch_conexant.c
>> @@ -3545,8 +3545,9 @@ static int __select_input_connection(struct
>> hda_codec *codec, hda_nid_t mux,
>> hda_nid_t pin, hda_nid_t *srcp,
>> bool do_select, int depth)
>> {
>> + struct conexant_spec *spec = codec->spec;
>> hda_nid_t conn[HDA_MAX_NUM_INPUTS];
>> - int i, nums;
>> + int startidx, i, nums;
>>
>> switch (get_wcaps_type(get_wcaps(codec, mux))) {
>> case AC_WID_AUD_IN:
>> @@ -3570,14 +3571,25 @@ static int __select_input_connection(struct
>> hda_codec *codec, hda_nid_t mux,
>> depth++;
>> if (depth == 2)
>> return -1;
>> +
>> + /* Try to rotate around connections to avoid one boost controlling
>> + another input path as well */
>> + startidx = 0;
>> + for (i = 0; i < spec->private_imux.num_items; i++)
>> + if (spec->imux_info[i].pin == pin) {
>> + startidx = i;
>> + break;
>> + }
>> +
>> for (i = 0; i < nums; i++) {
>> - int ret = __select_input_connection(codec, conn[i], pin, srcp,
>> + int j = (i + startidx) % nums;
>> + int ret = __select_input_connection(codec, conn[j], pin, srcp,
>> do_select, depth);
>> if (ret >= 0) {
>> if (do_select)
>> snd_hda_codec_write(codec, mux, 0,
>> - AC_VERB_SET_CONNECT_SEL, i);
>> - return i;
>> + AC_VERB_SET_CONNECT_SEL, j);
>> + return j;
>> }
>> }
>> return -1;
>>
>
More information about the kernel-team
mailing list