[alsa-devel] patch for Dell 1210 which using stac9221 codec

Takashi Iwai tiwai at suse.de
Thu Oct 18 16:55:53 CEST 2007


At Thu, 18 Oct 2007 10:49:16 +0800,
zhejiang wrote:
> 
> Hi,
> 
> Dell 1210 have three jacks on the front.
> Two of them serve as output jack and one serve as microphone.
> The microphone can be switched to output model too.
> 
> There are some problems with current dell 1210 driver:
> 1.Unable to use the front microphone
> 2.Unable to switch the microphone
> 3.If plug the left hp,another hp will be muted,so it's impossible to
> work as 6-channel
> 
> According to the issue 0003427 on alsa-bugzilla,

Oops is bad.  Does it still happen with the latest HG tree?
This should be fixed urgently at first.

> I wrote a patch and the reporter helped me to test it on his machine.
> It can support the front microphone. When switch the microphone to
> output model, it can mute/unmute the internal speaker with jack-sensing.

Thanks for the patch.  I have little time right now for checking in
details, but the changes appear in fairly deep level.
I think we should rather fix the current code to handle multiple
headphones better than the ad-hoc fixes.  Surely there will be other
models that require similar fixes (if you see Dell has shipped how
many different variants :)


Takashi

> 
> diff -Nur a/alsa-driver-hg20071017/alsa-kernel/pci/hda/patch_sigmatel.c
> b/alsa-driver-hg20071017/alsa-kernel/pci/hda/patch_sigmatel.c
> --- a/alsa-driver-hg20071017/alsa-kernel/pci/hda/patch_sigmatel.c
> 2007-10-17 08:00:08.000000000 +0800
> +++ b/alsa-driver-hg20071017/alsa-kernel/pci/hda/patch_sigmatel.c
> 2007-10-17 17:07:27.000000000 +0800
> @@ -171,6 +171,10 @@
>          0x02,
>  };
>  
> +static hda_nid_t dell_m82_1210_dac_nids[3] = {
> +        0x02, 0x05, 0x03,
> +};
> +
>  static hda_nid_t stac925x_adc_nids[1] = {
>          0x03,
>  };
> @@ -874,10 +878,10 @@
>      102801D7 (Dell XPS M1210)
>  */
>  static unsigned int dell_922x_m82_pin_configs[10] = {
> -	0x0221121f, 0x408103ff, 0x02111212, 0x90100310, 
> -	0x408003f1, 0x02111211, 0x03451340, 0x40c003f2, 
> +	0x02211211, 0x408103ff, 0x02a1123e, 0x90100310, 
> +	0x408003f1, 0x0221121f, 0x03451340, 0x40c003f2, 
>  	0x508003f3, 0x405003f4, 
> -};
> +};	
>  
>  static unsigned int d945gtp3_pin_configs[10] = {
>  	0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
> @@ -1512,6 +1516,15 @@
>  				  AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
>  }
>  
> +static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
> +			      unsigned int event)
> +{
> +	if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)
> +		snd_hda_codec_write_cache(codec, nid, 0,
> +					  AC_VERB_SET_UNSOLICITED_ENABLE,
> +					  (AC_USRSP_EN | event));
> +}
> +
>  #define stac92xx_io_switch_info		snd_ctl_boolean_mono_info
>  
>  static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct
> snd_ctl_elem_value *ucontrol)
> @@ -1542,6 +1555,18 @@
>  			pinctl |= stac92xx_get_vref(codec, nid);
>  		stac92xx_auto_set_pinctl(codec, nid, pinctl);
>  	}
> +
> +	if (spec->board_config == STAC_922X_DELL_M82) {
> +		if (val) {
> +			/*If front mic serves as output,let it mute the internal speaker*/
> +			spec->autocfg.hp_outs = 3;
> +			spec->autocfg.hp_pins[2] = 0x0c;
> +			enable_pin_detect(codec, 0x0c, STAC_HP_EVENT);
> +		} else {
> +			spec->autocfg.hp_outs = 2;	
> +		}
> +		codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
> +	}
>          return 1;
>  }
>  
> @@ -1811,9 +1836,15 @@
>  
>  	struct sigmatel_spec *spec = codec->spec;
>  	unsigned int wid_caps;
> +	int max_controls;
>  
> +	if (spec->board_config == STAC_922X_DELL_M82) {
> +		max_controls = spec->multiout.num_dacs;
> +	} else {
> +		max_controls = cfg->line_outs;
> +	}
>  
> -	for (i = 0; i < cfg->line_outs; i++) {
> +	for (i = 0; i < max_controls; i++) {
>  		if (!spec->multiout.dac_nids[i])
>  			continue;
>  
> @@ -2268,15 +2299,6 @@
>  			    AC_VERB_SET_GPIO_DATA, gpiostate);
>  }
>  
> -static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
> -			      unsigned int event)
> -{
> -	if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)
> -		snd_hda_codec_write_cache(codec, nid, 0,
> -					  AC_VERB_SET_UNSOLICITED_ENABLE,
> -					  (AC_USRSP_EN | event));
> -}
> -
>  static int stac92xx_init(struct hda_codec *codec)
>  {
>  	struct sigmatel_spec *spec = codec->spec;
> @@ -2677,6 +2699,11 @@
>  
>  	spec->multiout.dac_nids = spec->dac_nids;
>  	
> +	if (spec->board_config == STAC_922X_DELL_M82) {
> +		spec->multiout.num_dacs = 3;
> +		spec->multiout.dac_nids = dell_m82_1210_dac_nids;
> +	}
> +
>  	err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
>  	if (!err) {
>  		if (spec->board_config < 0) {
> @@ -2687,6 +2714,14 @@
>  		}
>  		err = -EINVAL;
>  	}
> +	
> +	if ((err >= 0) && (spec->board_config == STAC_922X_DELL_M82)) {
> +		err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, "Front
> Mic as Output Switch", (spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC] <<
> 8) | 1);
> +		/*In case that add_controls realloc the spec->kctl_alloc*/
> +		if ((err >= 0) && (spec->kctl_alloc != spec->mixers[spec->num_mixers
> - 1]))
> +			spec->mixers[spec->num_mixers - 1] = spec->kctl_alloc;
> +	}
> +
>  	if (err < 0) {
>  		stac92xx_free(codec);
>  		return err;
> 


More information about the Alsa-devel mailing list