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

Takashi Iwai tiwai at suse.de
Tue Oct 30 14:51:42 CET 2007


At Tue, 30 Oct 2007 08:48:06 -0700,
Tobin Davis wrote:
> 
> On Thu, 2007-10-25 at 15:44 +0800, zhejiang wrote:
> 
>     On Tue, 2007-10-23 at 11:11 +0200, Takashi Iwai wrote:
>     > At Mon, 22 Oct 2007 14:08:19 +0800,
>     > zhejiang wrote:
>     
>     > > > Ah, then it's basically similar like 3-stack model but with two
>     > > > headphones instead of a pair of line-out and line-in.
>     > > > 
>     > > > Without your modification of pin config, how the driver detects?
>     > > > Do you have an output of kernel message with debug option about auto
>     > > > pin configs?
>     > > > 
>     > > I don't have the hardware.
>     > > I have asked the bug reporter to do the experiment,
>     > > I will post it here if i get any response.
>     > 
>     > Thanks.
>     > 
>     
>     According to the response from the reporter,here is the pin config of
>     the original driver.
>     
>     ALSA /tmp/alsa-driver-build/alsa-driver-1.0.15/pci/hda/hda_codec.c:2765:
>     autoconfig: line_outs=3 (0xd/0xc/0xf/0x0/0x0)
>     ALSA /tmp/alsa-driver-build/alsa-driver-1.0.15/pci/hda/hda_codec.c:2769:
>     speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
>     ALSA /tmp/alsa-driver-build/alsa-driver-1.0.15/pci/hda/hda_codec.c:2773:
>     hp_outs=1 (0xa/0x0/0x0/0x0/0x0)
>     ALSA /tmp/alsa-driver-build/alsa-driver-1.0.15/pci/hda/hda_codec.c:2781:
>     inputs: mic=0x0, fmic=0x0, line=0x0, fline=0x0, cd=0x0, aux=0x0
>     ALSA /tmp/alsa-driver-build/alsa-driver-1.0.15/pci/hda/../../alsa-kernel/pci/hda/patch_sigmatel.c:1652: stac92xx_add_dyn_out_pins: total dac count=4
>     ALSA /tmp/alsa-driver-build/alsa-driver-1.0.15/pci/hda/../../alsa-kernel/pci/hda/patch_sigmatel.c:1775: dac_nids=3 (0x2/0x3/0x5/0x0/0x0)
> 
>     > > > Looking through the sigmatel code, we have several known use cases:
>     > > > 
>     > > > 1. desktop
>     > > > 1a. 3stack + front panel
>     > > >     front HP, front mic, rear line-out, rear line-in, rear mic
>     > > > 
>     > > > 1b. 6stack + front panel
>     > > >     front HP, front mic, rear line-out, rear surr, rear CLFE
>     > > >     rear side, rear line-in, rear mic
>     > > > and variants without front panel.
>     > > > 
>     > > > In the case 1a, rear line-in and rear mic can be used as surround
>     > > > outputs.
>     > > > 
>     > > > 2. laptop
>     > > > 2a. minimal
>     > > >     HP, speaker, mic, built-in mic
>     > > > 2b. a la desktop
>     > > >     HP, speaker, line-in, mic, built-in mic
>     > > > 2c. dell
>     > > >     HP x 2, speaker(s), mic, built-in mic
>     > > > 
>     > > > Now, the case 2c requires a similar hack.  But, before going more
>     > > > deeply, it's better to recheck patch_sigmatel.c again.  Basically, it
>     > > > has already the code to add output sharing using line-in/mic-in.  The
>     > > > problem is that it checks only limited use-cases (1a) and it adds
>     > > > cfg->line_outs and thus this influences on all other places.
>     > > > 
>     > > 
>     > > The call graph of stac92xx_parse_auto_config() :
>     > > 
>     > > 1.snd_hda_parse_pin_def_config()
>     > > 
>     > > 2.stac92xx_add_dyn_out_pins()
>     > > It check the cfg->line_outs and input_pins[] to add dynamic lineouts.
>     > > 
>     > > 3.stac92xx_auto_fill_dac_nids()
>     > > It only fills the dac_nids from the cfg->line_out_pins[],
>     > > 
>     > > 4.stac92xx_auto_create_multi_out_ctls()
>     > > It add controls according to the cfg->line_outs.
>     > > 
>     > > we can see that they heavily depend on the line_outs[] info.
>     > > 
>     > > How about this method?
>     > > 
>     > > In stac92xx_add_dyn_out_pins(),we check the cfg->hp_outs,IF IT IS 2,then
>     > > we switch the cfg->hp_pins[] with cfg->line_out_pins[].
>     > 
>     > Maybe better to check cfg->line_out_type.  I guess it's
>     > AUTO_PIN_SPEAKER_OUT in the case of this Dell laptop.  The driver
>     > takes speaker in prior to headphone as the primary line-out.
>     > 
>     > > The 2,3,4 may work without change.
>     > > At the end of the stac92xx_parse_auto_config(),we restore the
>     > > cfg->hp_pins[] and cfg->line_out_pins[].
>     > 
>     > Alternatively, instead of saving/restoring informatoin, we can fix
>     > snd_hda_parse_pin_def_config() itself to check cfg->hp_outs and
>     > cfg->speaker_outs to determine the primary output.  If one of them is
>     > greater, take it as the primary output.
>     > It's less hackish but *might* cause some regression in rare cases.
>     > 
> 
>     I think that we need to restore the cfg->hp_pins and cfg->line_out_pins
>     for the rest code,because:
>     
>     1. stac92xx_auto_init_hp_out() need to use the hp_pins to enable the
>     AC_PINCTL_HP_EN
>     2. stac92xx_hp_detect() need to use the hp_outs to detect jack presense
>        and will disable line_out_pins and speaker_pins.
>     3. stac92xx_init() use the hp_pins to enable unsolicited response.
>     
>     If we copy cfg->hp_outs to the line_out_pins, all these codes won't
>     work. ^-^
> 
>     > > Another things to change :
>     > > 1.snd_hda_parse_pin_def_config()
>     > >     Should sort the hp_pins[] by sequence.
>     > 
>     > Yeah, just missing right now.
>     > 
>     > > 2.stac92xx_auto_fill_dac_nids()
>     > >     Support the "Front Mic" switch as well.
>     > > 3.stac92xx_io_switch_put()
>     > >     If Mic work as output for laptop,enable pin detect too.
>     > 
>     > Well, I think the better fix is to fix the "Front Mic".  If there is
>     > only a front mic, it should be basically labelled as "Mic" because
>     > it's the only one.  So, again, snd_hda_parse_pin_def_config(), we can
>     > reassign input_pins[AUTO_PIN_FRONT_MIC] to input_pins[AUTO_PIN_MIC] if
>     > there is only one mic.  Then the rest wouldn't need changes.
>     > 
>     
>     Great.
>     
>     > Of course, another question is what to do when we have both rear and
>     > front mic and if we still want to handle them as outputs.  Well, we
>     > have no such hardware yet, though.
>     > 
>     > 
>     > thanks,
>     > 
>     > Takashi
>     _______________________________________________
>     Alsa-devel mailing list
>     Alsa-devel at alsa-project.org
>     http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 
> Could you try this patch?  I found an updated pin config on Dell'sweb site.  If
> this works, go ahead and check it in.
> 
> Summary:  Update Dell XPS 1210 Pin Config.
> 
> Signed off by Tobin Davis <tdavis at dsl-only.net>                                
> 
> diff -r 60b9916a18b8 pci/hda/patch_sigmatel.c
> --- a/pci/hda/patch_sigmatel.c	Tue Oct 30 15:28:14 2007 +0100
> +++ b/pci/hda/patch_sigmatel.c	Tue Oct 30 08:43:39 2007 -0700
> @@ -884,9 +884,9 @@ static unsigned int dell_922x_m81_pin_co
>      102801D7 (Dell XPS M1210)
>  */
>  static unsigned int dell_922x_m82_pin_configs[10] = {
> -	0x0221121f, 0x408103ff, 0x02111212, 0x90100310, 
> -	0x408003f1, 0x02111211, 0x03451340, 0x40c003f2, 
> -	0x508003f3, 0x405003f4, 
> +	0x0221121e, 0x408103ff, 0x0281123e, 0x90100310, 
> +	0x408003f1, 0x0221122f, 0x03451340, 0x40c003f2, 
> +	0x50a003f3, 0x405003f4, 
>  };
>  
>  static unsigned int d945gtp3_pin_configs[10] = {

Hm, this definition looks slightly different from zhejiang's one.

 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, 
-};
+};	

Line-in and mic-in are assigned to different pins.  Which one to take?


Takashi


More information about the Alsa-devel mailing list