ALSA: hda - Add codec->inv_jack_detect flag
authorTakashi Iwai <tiwai@suse.de>
Fri, 21 Dec 2012 14:31:41 +0000 (15:31 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sat, 12 Jan 2013 07:43:21 +0000 (08:43 +0100)
Yet another broken hardware workaround: there are hardware indicating
the inverted jack detection bit result.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_jack.c

index 369ffafae8a9e111823fefd7f26e61fcd4a5baca..9f241d1af38ccf6c564c74a0de702c2bb99c345f 100644 (file)
@@ -867,6 +867,7 @@ struct hda_codec {
        unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
        unsigned int no_jack_detect:1;  /* Machine has no jack-detection */
        unsigned int inv_eapd:1; /* broken h/w: inverted EAPD control */
+       unsigned int inv_jack_detect:1; /* broken h/w: inverted detection bit */
        unsigned int pcm_format_first:1; /* PCM format must be set first */
        unsigned int epss:1;            /* supporting EPSS? */
        unsigned int cached_write:1;    /* write only to caches */
index 6e9f57bbe6673d3c01371783428287956f8814eb..6479b6501828557a4811f46d4df983d54133629c 100644 (file)
@@ -39,6 +39,7 @@ EXPORT_SYMBOL_HDA(is_jack_detectable);
 static u32 read_pin_sense(struct hda_codec *codec, hda_nid_t nid)
 {
        u32 pincap;
+       u32 val;
 
        if (!codec->no_trigger_sense) {
                pincap = snd_hda_query_pin_caps(codec, nid);
@@ -46,8 +47,11 @@ static u32 read_pin_sense(struct hda_codec *codec, hda_nid_t nid)
                        snd_hda_codec_read(codec, nid, 0,
                                        AC_VERB_SET_PIN_SENSE, 0);
        }
-       return snd_hda_codec_read(codec, nid, 0,
+       val = snd_hda_codec_read(codec, nid, 0,
                                  AC_VERB_GET_PIN_SENSE, 0);
+       if (codec->inv_jack_detect)
+               val ^= AC_PINSENSE_PRESENCE;
+       return val;
 }
 
 /**