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; > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel