[alsa-devel] Problem with VIA VT1708S and git versions of alsa-driver.

Mark Goldstein goldstein.mark at gmail.com
Mon Jan 31 13:08:51 CET 2011


Raymond,

On Mon, Jan 31, 2011 at 11:22 AM, Raymond Yau
<superquad.vortex2 at gmail.com> wrote:
> 2011/1/29 Mark Goldstein <goldstein.mark at gmail.com>
>
>> On Sat, Jan 29, 2011 at 12:53 PM, Mark Goldstein
>> <goldstein.mark at gmail.com> wrote:
>> > On Sat, Jan 29, 2011 at 12:42 PM, Mark Goldstein
>> > <goldstein.mark at gmail.com> wrote:
>> >> On Sat, Jan 29, 2011 at 11:37 AM, Mark Goldstein
>> >> <goldstein.mark at gmail.com> wrote:
>> >>> On Fri, Jan 28, 2011 at 2:47 AM, Raymond Yau
>> >>> <superquad.vortex2 at gmail.com> wrote:
>> >>>> 2011/1/27 Mark Goldstein <goldstein.mark at gmail.com>
>> >>>>
>> >>>>> On Thu, Jan 27, 2011 at 11:09 AM, Raymond Yau
>> >>>>> <superquad.vortex2 at gmail.com> wrote:
>> >>>>> > 2011/1/27 Mark Goldstein <goldstein.mark at gmail.com>
>> >>>>> >
>> >>
>> >>> Still trying to figure out why only Rear Mic works while Front Mic does
>> not.
>> >>
>> >> Ok, for some reason Pin-ctls for Front Mic (0x1e) set to VREF Hi-Z.
>> >> After I set it to VREF 50 using hda-analyser, Front Mic started
>> >> working. Have to figure out why it is set to Hi-Z.
>> >>
>> >
>> > static void via_auto_init_analog_input(struct hda_codec *codec)
>> > {
>> >        struct via_spec *spec = codec->spec;
>> >        const struct auto_pin_cfg *cfg = &spec->autocfg;
>> >        unsigned int ctl;
>> >        int i;
>> >
>> >        for (i = 0; i < cfg->num_inputs; i++) {
>> >                hda_nid_t nid = cfg->inputs[i].pin;
>> >                if (spec->smart51_enabled && is_smart51_pins(spec, nid))
>> >                        ctl = PIN_OUT;
>> >                else if (i == AUTO_PIN_MIC)
>> >                          ^^^^^^^^^^^^^^^^^^^^^^^^^
>> >                        ctl = PIN_VREF50;
>> >                else
>> >                        ctl = PIN_IN;
>> >                snd_hda_codec_write(codec, nid, 0,
>> >                                    AC_VERB_SET_PIN_WIDGET_CONTROL, ctl);
>> >        }
>> > }
>> >
>> > Should it probably be
>> > else if (cfg->input[i].type == AUTO_PIN_MIC) ?
>>
>> OK, now it works for me.
>> So totally there were 3 changes:
>> 1) setting of PIN control for Mics
>> 2) shifting the ids in pin_idxs one position to the right
>> 3) using specialized version of vt_auto_create_analog_input_ctls, that
>> passes idx - 1 to snd_hda_add_imux_item.
>>
>> Well, instead of last two changes it was probably possible to use only
>> 3rd, but instead of passing idx - 1 to snd_hda_add_imux_item pass idx
>> + 1 to via_new_analog_input.
>>
>> Of course it should be done in more common way, since not only VT1708S
>> used different indexes for via_new_analog_input and
>> snd_hda_add_imux_item.
>>
>>
> The reason is assign "Stereo Mix"  as first element of input source ,
>
> In snd_hda_input_mux_put() , imux->items[].index is the position of the pin
> in the connection list
>
> snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_CONNECT_SEL,
>                  imux->items[idx].index);
>
> if you look at print_codec_info() in hda_proc.c
>
> you can get the connection list of imux using snd_hda_get_connections()
>
>    conn_len = snd_hda_get_connections(codec, nid, conn,
>                               HDA_MAX_CONNECTIONS);

...
Not sure what do you mean. In case of VT1708S Stereo Mixer is added
with index 5 (and it was so in 1.0.23 also).
I noticed that in part of the codecs Stereo Mixer is passed with index
0 and there the same idx is used for both snd_hda_add_imux_item and
via_new_analog_input. But for VT1708S and some others Stereo Mixer is
passed as the last element in the array.

In any case, using of idx and idx -1 definitely resolved the problem.

Also I think that the issue with Mic Pin configuration is generic for
patch_via.c - if you have more than one Mic, the current git code will
configure correctly only the first one (index 0).
In 1.0.23 the code was checking whether index is < that that of the
FrontMic. Probably it assumed that Front Mic is always the last one in
the connection list.
The new code only checks for index 0.
Since there is now explicit field for input type, I think the change I
did  (cfg->input[i].type == AUTO_PIN_MIC) should be OK.



-- 
Mark Goldstein


More information about the Alsa-devel mailing list