[alsa-devel] [PATCH v2- ALSA 1/3] HDA - Allow hda_jack_tbl to use another nid for pin sense
Raymond Yau
superquad.vortex2 at gmail.com
Wed Sep 23 04:40:45 CEST 2015
- add sense_nid to __snd_hda_jack_add_kctl for pin sense
- update slave pin sense when master pin sense change
- enable unsolicited event when widcap support UNSOL
Signed-off-by: Raymond Yau <superquad.vortex2 at gmail.com>
diff --git a/sound/pci/hda/hda_jack.c b/sound/pci/hda/hda_jack.c
index 366efbf..d81d65f 100644
--- a/sound/pci/hda/hda_jack.c
+++ b/sound/pci/hda/hda_jack.c
@@ -19,6 +19,7 @@
#include "hda_local.h"
#include "hda_auto_parser.h"
#include "hda_jack.h"
+#include "hda_generic.h"
/**
* is_jack_detectable - Check whether the given pin is jack-detectable
@@ -157,7 +158,14 @@ static void jack_detect_update(struct hda_codec *codec,
if (jack->phantom_jack)
jack->pin_sense = AC_PINSENSE_PRESENCE;
else
- jack->pin_sense = read_pin_sense(codec, jack->nid);
+ jack->pin_sense = read_pin_sense(codec,
+ jack->sense_nid ? jack->sense_nid : jack->nid);
+
+ if (jack->slave_nid) {
+ struct hda_jack_tbl *slave = snd_hda_jack_tbl_get(codec,
+ jack->slave_nid);
+ slave->pin_sense = jack->pin_sense;
+ }
/* A gating jack indicates the jack is invalid if gating is unplugged
*/
if (jack->gating_jack && !snd_hda_jack_detect(codec,
jack->gating_jack))
@@ -269,11 +277,13 @@ snd_hda_jack_detect_enable_callback(struct hda_codec
*codec, hda_nid_t nid,
jack->jack_detect = 1;
if (codec->jackpoll_interval > 0)
return callback; /* No unsol if we're polling instead */
- err = snd_hda_codec_write_cache(codec, nid, 0,
+ if (is_jack_detectable(codec, nid)) {
+ err = snd_hda_codec_write_cache(codec, nid, 0,
AC_VERB_SET_UNSOLICITED_ENABLE,
AC_USRSP_EN | jack->tag);
- if (err < 0)
- return ERR_PTR(err);
+ if (err < 0)
+ return ERR_PTR(err);
+ }
return callback;
}
EXPORT_SYMBOL_GPL(snd_hda_jack_detect_enable_callback);
@@ -384,7 +394,7 @@ static void hda_free_jack_priv(struct snd_jack *jack)
* will have the given name and index.
*/
static int __snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid,
- const char *name, bool phantom_jack)
+ const char *name, bool phantom_jack, hda_nid_t sense_nid)
{
struct hda_jack_tbl *jack;
int err, state, type;
@@ -403,6 +413,7 @@ static int __snd_hda_jack_add_kctl(struct hda_codec
*codec, hda_nid_t nid,
jack->phantom_jack = !!phantom_jack;
jack->type = type;
+ jack->sense_nid = sense_nid;
jack->jack->private_data = jack;
jack->jack->private_free = hda_free_jack_priv;
state = snd_hda_jack_detect(codec, nid);
@@ -422,7 +433,7 @@ static int __snd_hda_jack_add_kctl(struct hda_codec
*codec, hda_nid_t nid,
int snd_hda_jack_add_kctl(struct hda_codec *codec, hda_nid_t nid,
const char *name)
{
- return __snd_hda_jack_add_kctl(codec, nid, name, false);
+ return __snd_hda_jack_add_kctl(codec, nid, name, false, nid);
}
EXPORT_SYMBOL_GPL(snd_hda_jack_add_kctl);
@@ -451,7 +462,7 @@ static int add_jack_kctl(struct hda_codec *codec,
hda_nid_t nid,
if (phantom_jack)
/* Example final name: "Internal Mic Phantom Jack" */
strncat(name, " Phantom", sizeof(name) - strlen(name) - 1);
- err = __snd_hda_jack_add_kctl(codec, nid, name, phantom_jack);
+ err = __snd_hda_jack_add_kctl(codec, nid, name, phantom_jack, nid);
if (err < 0)
return err;
diff --git a/sound/pci/hda/hda_jack.h b/sound/pci/hda/hda_jack.h
index 387d309..ef3d162 100644
--- a/sound/pci/hda/hda_jack.h
+++ b/sound/pci/hda/hda_jack.h
@@ -41,6 +41,8 @@ struct hda_jack_tbl {
hda_nid_t gated_jack; /* gated is dependent on this jack */
int type;
struct snd_jack *jack;
+ hda_nid_t sense_nid;
+ hda_nid_t slave_nid;
};
struct hda_jack_tbl *
--
2.5.0
More information about the Alsa-devel
mailing list