hda: add mixers for analog mixer on 92hd75xx codecs
PATCH 1/1 hda: add mixers for analog mixer on 92hd75xx codecs
Add support for mixers on the analog mixer on some 92hd75xx codecs, along with adding a 'Mixer' entry for it's connection on the dmux.
---
pci/hda/patch_sigmatel.c +36 -15
@@ -320,8 +320,8 @@ static hda_nid_t stac92hd71bxx_mux_nids[2] = {0x1a ,0x1b }; -static hda_nid_t stac92hd71bxx_dmux_nids[1 ] = { -0x1c , +static hda_nid_t stac92hd71bxx_dmux_nids[2 ] = { +0x1c ,0x1d , }; static hda_nid_t stac92hd71bxx_smux_nids[2] = {
@@ -837,20 +837,18 @@ static struct hda_verb stac92hd71bxx_core_init[] = { { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},/* connect headphone jack to dac1 */ { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, - { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Speaker *//* unmute right and left channels for nodes 0x0a, 0xd, 0x0f */ { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, }; -#define HD_DISABLE_PORTF 3 +#define HD_DISABLE_PORTF 2static struct hda_verb stac92hd71bxx_analog_core_init[] = {/* start of config #1 */ /* connect port 0f to audio mixer */ {0x0f ,AC_VERB_SET_CONNECT_SEL ,0x2 }, - {0x0f ,AC_VERB_SET_PIN_WIDGET_CONTROL ,PIN_OUT },/* Speaker */ /* unmute right and left channels for node 0x0f */ {0x0f ,AC_VERB_SET_AMP_GAIN_MUTE ,AMP_IN_UNMUTE (0 )}, /* start of config #2 */
@@ -859,10 +857,6 @@ static struct hda_verb stac92hd71bxx_analog_core_init[] = { { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},/* connect headphone jack to dac1 */ { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, -/* connect port 0d to audio mixer */ - { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x2}, -/* unmute dac0 input in audio mixer */ - { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},/* unmute right and left channels for nodes 0x0a, 0xd */ { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
@@ -1083,6 +1077,7 @@ static struct snd_kcontrol_new stac92hd83xxx_mixer[] = {static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = {STAC_INPUT_SOURCE (2 ), +STAC_ANALOG_LOOPBACK (0xFA0 ,0x7A0 ,2 ),HDA_CODEC_VOLUME_IDX ("Capture Volume" ,0x0 ,0x1c ,0x0 ,HDA_OUTPUT ),HDA_CODEC_MUTE_IDX ("Capture Switch" ,0x0 ,0x1c ,0x0 ,HDA_OUTPUT ),
@@ -1095,8 +1090,17 @@ static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = {HDA_CODEC_MUTE("PC Beep Switch", 0x17, 0x2, HDA_INPUT), */ - HDA_CODEC_MUTE("Analog Loopback 1", 0x17, 0x3, HDA_INPUT), - HDA_CODEC_MUTE("Analog Loopback 2", 0x17, 0x4, HDA_INPUT), +HDA_CODEC_MUTE ("Import0 Mux Capture Switch" ,0x17 ,0x3 ,HDA_INPUT ), +HDA_CODEC_VOLUME ("Import0 Mux Capture Volume" ,0x17 ,0x3 ,HDA_INPUT ), + +HDA_CODEC_MUTE ("Import1 Mux Capture Switch" ,0x17 ,0x3 ,HDA_INPUT ), +HDA_CODEC_VOLUME ("Import1 Mux Capture Volume" ,0x17 ,0x3 ,HDA_INPUT ), + +HDA_CODEC_MUTE ("DAC0 Capture Switch" ,0x17 ,0x3 ,HDA_INPUT ), +HDA_CODEC_VOLUME ("DAC0 Capture Volume" ,0x17 ,0x3 ,HDA_INPUT ), + +HDA_CODEC_MUTE ("DAC1 Capture Switch" ,0x17 ,0x4 ,HDA_INPUT ), + HDA_CODEC_VOLUME("DAC1 Capture Volume", 0x17, 0x4, HDA_INPUT), { } /* end */ };
@@ -1616,7 +1620,7 @@ static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {static unsigned int ref92hd71bxx_pin_configs[11 ] = {0x02214030 ,0x02a19040 ,0x01a19020 ,0x01014010 , -0x0181302e ,0x01114010 ,0x01019020 ,0x90a000f0 , +0x0181302e ,0x01014010 ,0x01019020 ,0x90a000f0 ,0x90a000f0 ,0x01452050 ,0x01452050 , };
@@ -2961,7 +2965,7 @@ static int stac92xx_auto_create_mono_output_ctls(struct hda_codec *codec)/* labels for amp mux outputs */ static const char *stac92xx_amp_labels[3 ] = { -"Front Microphone" ,"Microphone" ,"Line In" +"Front Microphone" ,"Microphone" ,"Line In" , };/* create amp out controls mux on capable codecs */
@@ -4275,6 +4279,16 @@ static struct hda_codec_ops stac92hd71bxx_patch_ops = {#endif }; +static struct hda_input_mux stac92hd71bxx_dmux = { + .num_items =4 , + .items = { + {"Analog Inputs" ,0x00 }, + {"Mixer" ,0x01 }, + {"Digital Mic 1" ,0x02 }, + {"Digital Mic 2" ,0x03 }, + } +}; +static int patch_stac92hd71bxx (struct hda_codec *codec) {struct sigmatel_spec *spec;
@@ -4289,6 +4303,8 @@ static int patch_stac92hd71bxx(struct hda_codec *codec) spec->num_pins =ARRAY_SIZE (stac92hd71bxx_pin_nids); spec->num_pwrs =ARRAY_SIZE (stac92hd71bxx_pwr_nids); spec->pin_nids = stac92hd71bxx_pin_nids; +memcpy (&spec->private_dimux, &stac92hd71bxx_dmux, +sizeof (stac92hd71bxx_dmux)); spec->board_config = snd_hda_check_board_config(codec, STAC_92HD71BXX_MODELS, stac92hd71bxx_models,
@@ -4329,6 +4345,7 @@ again:/* no output amps */ spec->num_pwrs =0 ; spec->mixer = stac92hd71bxx_analog_mixer; + spec->dinput_mux = &spec->private_dimux;/* disable VSW */ spec->init = &stac92hd71bxx_analog_core_init[HD_DISABLE_PORTF ];
@@ -4346,12 +4363,13 @@ again: spec->num_pwrs =0 ;/* fallthru */ default : + spec->dinput_mux = &spec->private_dimux; spec->mixer = stac92hd71bxx_analog_mixer; spec->init = stac92hd71bxx_analog_core_init; codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; } - spec->aloopback_mask =0x20 ; + spec->aloopback_mask =0x50 ; spec->aloopback_shift =0 ;/* GPIO0 High = EAPD */
@@ -4370,7 +4388,6 @@ again: spec->num_muxes =ARRAY_SIZE (stac92hd71bxx_mux_nids); spec->num_adcs =ARRAY_SIZE (stac92hd71bxx_adc_nids); - spec->num_dmuxes =ARRAY_SIZE (stac92hd71bxx_dmux_nids);switch (spec->board_config) {case STAC_HP_M4 :
@@ -4391,6 +4408,10 @@ again: spec->multiout.num_dacs =1 ; spec->multiout.hp_nid =0x11 ; spec->multiout.dac_nids = stac92hd71bxx_dac_nids; +if (spec->dinput_mux) + spec->private_dimux.num_items += + spec->num_dmics - + (ARRAY_SIZE (stac92hd71bxx_dmic_nids) -1 ); err =stac92xx_parse_auto_config (codec,0x21 ,0x23 );if (!err) {
At Fri, 10 Oct 2008 09:07:23 -0400,
Quoted 5 lines · Matthew Ranostay
Add support for mixers on the analog mixer on some 92hd75xx codecs, along with adding a 'Mixer' entry for it's connection on the dmux.
Signed-off-by Matthew Ranostay <[email protected]>
Thanks, I applied it as is now, but...
Quoted 7 lines
pci/hda/patch_sigmatel.c +1
-2@@ -1095,8 +1090,17 @@ static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = {HDA_CODEC_MUTE("PC Beep Switch", 0x17, 0x2, HDA_INPUT), */ -HDA_CODEC_MUTE ("Analog Loopback 1" ,0x17 ,0x3 ,HDA_INPUT ), - HDA_CODEC_MUTE("Analog Loopback 2", 0x17, 0x4, HDA_INPUT), + HDA_CODEC_MUTE("Import0 Mux Capture Switch", 0x17, 0x3, HDA_INPUT),
pci/hda/patch_sigmatel.c static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { · line 1103
Quoted 10 lines
pci/hda/patch_sigmatel.c +10
-0+HDA_CODEC_VOLUME ("Import0 Mux Capture Volume" ,0x17 ,0x3 ,HDA_INPUT ), + +HDA_CODEC_MUTE ("Import1 Mux Capture Switch" ,0x17 ,0x3 ,HDA_INPUT ), +HDA_CODEC_VOLUME ("Import1 Mux Capture Volume" ,0x17 ,0x3 ,HDA_INPUT ), + +HDA_CODEC_MUTE ("DAC0 Capture Switch" ,0x17 ,0x3 ,HDA_INPUT ), +HDA_CODEC_VOLUME ("DAC0 Capture Volume" ,0x17 ,0x3 ,HDA_INPUT ), + +HDA_CODEC_MUTE ("DAC1 Capture Switch" ,0x17 ,0x4 ,HDA_INPUT ), + HDA_CODEC_VOLUME("DAC1 Capture Volume", 0x17, 0x4, HDA_INPUT),
This rename worries me. One may wonder what the hell is "Import* Mux" at all.
pci/hda/patch_sigmatel.c again: · line 4414
Quoted 8 lines
pci/hda/patch_sigmatel.c +4
-0@@ -4391,6 +4408,10 @@ again: spec->multiout.num_dacs =1 ; spec->multiout.hp_nid =0x11 ; spec->multiout.dac_nids = stac92hd71bxx_dac_nids; +if (spec->dinput_mux) + spec->private_dimux.num_items += + spec->num_dmics - + (ARRAY_SIZE (stac92hd71bxx_dmic_nids) -1 );
And, this looks a bit tricky.
The relation between these variables is unclear in the patch...
thanks,
Takashi
Quoted 13 lines · Takashi Iwai
At Fri, 10 Oct 2008 09:07:23 -0400,
Quoted 4 lines · Matthew Ranostay
Add support for mixers on the analog mixer on some 92hd75xx codecs, along with adding a 'Mixer' entry for it's connection on the dmux.
Signed-off-by Matthew Ranostay <[email protected]>Thanks, I applied it as is now, but...
Quoted 4 lines
pci/hda/patch_sigmatel.c +0
-0@@ -1095,8 +1090,17 @@ static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = {HDA_CODEC_MUTE("PC Beep Switch", 0x17, 0x2, HDA_INPUT), */
Quoted 17 lines
pci/hda/patch_sigmatel.c static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = { · line 1103
Quoted 13 lines
pci/hda/patch_sigmatel.c +11
-2-HDA_CODEC_MUTE ("Analog Loopback 1" ,0x17 ,0x3 ,HDA_INPUT ), - HDA_CODEC_MUTE("Analog Loopback 2", 0x17, 0x4, HDA_INPUT), +HDA_CODEC_MUTE ("Import0 Mux Capture Switch" ,0x17 ,0x3 ,HDA_INPUT ), +HDA_CODEC_VOLUME ("Import0 Mux Capture Volume" ,0x17 ,0x3 ,HDA_INPUT ), + +HDA_CODEC_MUTE ("Import1 Mux Capture Switch" ,0x17 ,0x3 ,HDA_INPUT ), +HDA_CODEC_VOLUME ("Import1 Mux Capture Volume" ,0x17 ,0x3 ,HDA_INPUT ), + +HDA_CODEC_MUTE ("DAC0 Capture Switch" ,0x17 ,0x3 ,HDA_INPUT ), +HDA_CODEC_VOLUME ("DAC0 Capture Volume" ,0x17 ,0x3 ,HDA_INPUT ), + +HDA_CODEC_MUTE ("DAC1 Capture Switch" ,0x17 ,0x4 ,HDA_INPUT ), + HDA_CODEC_VOLUME("DAC1 Capture Volume", 0x17, 0x4, HDA_INPUT),This rename worries me. One may wonder what the hell is "Import* Mux" at all.
Good question, I just noticed the typos in that code. I'll submit the changes shortly. But the Import Mux's are 0x1a and 0x1b which have a path into the analog mixer.
Let me know if I can name the mixers somehow better.
Quoted 12 lines
pci/hda/patch_sigmatel.c again: · line 4414
Quoted 8 lines
pci/hda/patch_sigmatel.c +4
-0@@ -4391,6 +4408,10 @@ again: spec->multiout.num_dacs =1 ; spec->multiout.hp_nid =0x11 ; spec->multiout.dac_nids = stac92hd71bxx_dac_nids; +if (spec->dinput_mux) + spec->private_dimux.num_items += + spec->num_dmics - + (ARRAY_SIZE (stac92hd71bxx_dmic_nids) -1 );And, this looks a bit tricky.
The relation between these variables is unclear in the patch...
Ok I can explain this as well. If there isn't any dmics defined as in some laptops, or if there is only one, this then removes the unneeded items from the mux. I realize there has to be a better way to do this but seems like overkill since only one codec to date has analog mixer.
Thanks,
Matt Ranostay
Quoted 5 lines
thanks,
Takashi