At Thu, 11 Sep 2014 12:07:43 +0200, Takashi Iwai wrote:
Looking at the alsa-info.sh output, the problem is that IDT codec parser creates jack detection for the power-control before the generic parser. There is also a wrong logic in stac_init_power_map()...
An untested fix is below.
BTW, a part of the messes is the restriction of hda_jack stuff: currently it supports only one callback per jack. If we can add multiple callbacks and actions to a jack, the code in patch_sigmatel.c would be come much easier. But this is a step after fixing the bug quickly.
Takashi
Takashi
-- diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index f26ec04a29b5..526b5d39a2cb 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -565,8 +565,8 @@ static void stac_init_power_map(struct hda_codec *codec) if (snd_hda_jack_tbl_get(codec, nid)) continue; if (def_conf == AC_JACK_PORT_COMPLEX &&
!(spec->vref_mute_led_nid == nid ||
is_jack_detectable(codec, nid))) {
spec->vref_mute_led_nid != nid &&
is_jack_detectable(codec, nid)) { snd_hda_jack_detect_enable_callback(codec, nid, STAC_PWR_EVENT, jack_update_power);
@@ -4272,11 +4272,17 @@ static int stac_parse_auto_config(struct hda_codec *codec) return err; }
- stac_init_power_map(codec);
- return 0;
}
+static int stac_build_controls(struct hda_codec *codec) +{
- int err = snd_hda_gen_build_controls(codec);
- if (err < 0)
return err;
- stac_init_power_map(codec);
- return 0;
+}
static int stac_init(struct hda_codec *codec) { @@ -4388,7 +4394,7 @@ static int stac_suspend(struct hda_codec *codec) #endif /* CONFIG_PM */
static const struct hda_codec_ops stac_patch_ops = {
- .build_controls = snd_hda_gen_build_controls,
- .build_controls = stac_build_controls, .build_pcms = snd_hda_gen_build_pcms, .init = stac_init, .free = stac_free,