At Sun, 27 Apr 2008 01:38:19 -0500, Greg Zornetzer wrote:
Hi all, I recently acquired an ECS GF7100PVT-M3 motherboard, which appears to use the IDT 92HD206 codec for HDA. Unfortunately, it doesn't appear to have full support under ALSA. It gets detected as another Sigmatel chip. Analog stereo output appears to work, but the mixer doesn't find any of the normal inputs.
I found the tech specs for the chip at http://www.idt.com/products/getDoc.cfm?docID=13461840 I've attached an lspci output and the codec file to this email. I'm not much of an driver hacker, but if someone could give me an idea of what needs to go into the patch_sigmatel.c file to make this thing work, I'd be willing to try. I'm also more than willing to test out patches on my setup.
The below is an entirely untested patch quickly made from the codec information you posted. Could you give it a try with the latest ALSA HG version?
thanks,
Takashi
--- diff -r 19b486f73bd8 pci/hda/patch_sigmatel.c --- a/pci/hda/patch_sigmatel.c Fri Apr 25 14:25:04 2008 +0200 +++ b/pci/hda/patch_sigmatel.c Tue Apr 29 19:47:26 2008 +0200 @@ -364,6 +364,20 @@ 0x21, 0x22, };
+#define stac92hd206_pin_nids stac925x_pin_nids + +static hda_nid_t stac92hd206_dac_nids[4] = { + 0x02, 0x03, 0x04, 0x05, +}; + +static hda_nid_t stac92hd206_adc_nids[2] = { + 0x07, 0x08 +}; + +static hda_nid_t stac92hd206_mux_nids[2] = { + 0x15, 0x16 +}; + static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) { @@ -688,6 +702,12 @@ {} };
+static struct hda_verb stac92hd206_core_init[] = { + /* set master volume and direct control */ + { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, + {} +}; + #define STAC_MONO_MUX \ { \ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ @@ -889,6 +909,17 @@ HDA_CODEC_VOLUME_IDX("Capture Volume", 0x2, 0x1A, 0x0, HDA_INPUT), HDA_CODEC_MUTE_IDX("Capture Switch", 0x2, 0x1d, 0x0, HDA_OUTPUT), HDA_CODEC_VOLUME_IDX("Mux Capture Volume", 0x2, 0x17, 0x0, HDA_OUTPUT), + { } /* end */ +}; + +static struct snd_kcontrol_new stac92hd206_mixer[] = { + STAC_INPUT_SOURCE(2), + HDA_CODEC_VOLUME_IDX("Capture Volume", 0, 0x15, 0, HDA_OUTPUT), + HDA_CODEC_MUTE_IDX("Capture Switch", 0, 0x1b, 0, HDA_OUTPUT), + HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 0, 0x18, 0, HDA_INPUT), + HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x16, 0, HDA_OUTPUT), + HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x1c, 0, HDA_OUTPUT), + HDA_CODEC_VOLUME_IDX("Capture Mux Volume", 1, 0x19, 0, HDA_INPUT), { } /* end */ };
@@ -3463,6 +3494,53 @@ return 0; }
+static int patch_stac92hd206(struct hda_codec *codec) +{ + struct sigmatel_spec *spec; + int err; + + spec = kzalloc(sizeof(*spec), GFP_KERNEL); + if (!spec) + return -ENOMEM; + + codec->spec = spec; + spec->num_pins = ARRAY_SIZE(stac92hd206_pin_nids); + spec->pin_nids = stac92hd206_pin_nids; + + /* no preset model yet */ + err = stac92xx_save_bios_config_regs(codec); + if (err < 0) { + stac92xx_free(codec); + return err; + } + spec->pin_configs = spec->bios_pin_configs; + + spec->multiout.max_channels = 2; + spec->multiout.num_dacs = 1; + spec->multiout.dac_nids = stac92hd206_dac_nids; + spec->adc_nids = stac92hd206_adc_nids; + spec->num_adcs = ARRAY_SIZE(stac92hd206_adc_nids); + spec->mux_nids = stac92hd206_mux_nids; + spec->num_muxes = ARRAY_SIZE(stac92hd206_mux_nids); + spec->num_pwrs = 0; + spec->num_dmics = 0; + + spec->init = stac92hd206_core_init; + spec->mixer = stac92hd206_mixer; + + err = stac92xx_parse_auto_config(codec, 0x1e, 0x20); + if (!err) + err = -EINVAL; + if (err < 0) { + stac92xx_free(codec); + return err; + } + + codec->patch_ops = stac92xx_patch_ops; + + return 0; +} + static struct hda_input_mux stac92hd73xx_dmux = { .num_items = 4, .items = { @@ -4289,6 +4367,8 @@ { .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x }, { .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x }, { .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x }, + { .id = 0x83847645, .name = "92HD206X", .patch = patch_stac92hd206 }, + { .id = 0x83847646, .name = "92HD206D", .patch = patch_stac92hd206 }, /* The following does not take into account .id=0x83847661 when subsys = * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are * currently not fully supported.