[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