ALSA: hda: add support for jack detection on IDT/Sigmatel
authorMatthew Ranostay <mranostay@embeddedalley.com>
Wed, 15 Oct 2008 18:45:38 +0000 (14:45 -0400)
committerTakashi Iwai <tiwai@suse.de>
Thu, 16 Oct 2008 06:43:24 +0000 (08:43 +0200)
Added support for jack detection reporting to userspace for
IDT/Sigmatel codecs.

Signed-off-by: Matthew Ranostay <mranostay@embeddedalley.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/Kconfig
sound/pci/hda/patch_sigmatel.c

index 7003711f4fcc4165d6e5a24f7fb3be2c55ea91cb..7e408908b755451eb5660ffb8ccff9b7e227625d 100644 (file)
@@ -501,6 +501,7 @@ config SND_HDA_INTEL
        tristate "Intel HD Audio"
        select SND_PCM
        select SND_VMASTER
+       select SND_JACK if INPUT=y || INPUT=SND
        help
          Say Y here to include support for Intel "High Definition
          Audio" (Azalia) motherboard devices.
index a2ac7205d45de81706ef520e2c9dca69f5ce503d..ec88ba8814822ebd4825d75125260cd6bb2082e3 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/pci.h>
 #include <sound/core.h>
 #include <sound/asoundef.h>
+#include <sound/jack.h>
 #include "hda_codec.h"
 #include "hda_local.h"
 #include "hda_patch.h"
@@ -216,6 +217,9 @@ struct sigmatel_spec {
 
        struct hda_pcm pcm_rec[2];      /* PCM information */
 
+       /* jack detection */
+       struct snd_jack *jack;
+
        /* dynamic controls and input_mux */
        struct auto_pin_cfg autocfg;
        unsigned int num_kctl_alloc, num_kctl_used;
@@ -3617,7 +3621,7 @@ static int stac92xx_init(struct hda_codec *codec)
 {
        struct sigmatel_spec *spec = codec->spec;
        struct auto_pin_cfg *cfg = &spec->autocfg;
-       int i;
+       int i, err;
 
        snd_hda_sequence_write(codec, spec->init);
 
@@ -3639,6 +3643,12 @@ static int stac92xx_init(struct hda_codec *codec)
                stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
                                         AC_PINCTL_OUT_EN);
                stac92xx_auto_init_hp_out(codec);
+               /* jack detection */
+               err = snd_jack_new(codec->bus->card,
+                       "Headphone Jack",
+                       SND_JACK_HEADPHONE, &spec->jack);
+               if (err < 0)
+                       return err;
                /* fake event to set up pins */
                codec->patch_ops.unsol_event(codec, STAC_HP_EVENT << 26);
        } else {
@@ -3796,6 +3806,8 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
                        break;
                presence = get_hp_pin_presence(codec, cfg->hp_pins[i]);
        }
+       snd_jack_report(spec->jack,
+               presence ? SND_JACK_HEADPHONE : 0);
 
        if (presence) {
                /* disable lineouts, enable hp */