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:
- 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.
- 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