aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2008-12-10 08:55:49 -0500
committerTakashi Iwai <tiwai@suse.de>2008-12-10 09:10:44 -0500
commitcdc693643271b2e6a693cf8f6afb258cce01f058 (patch)
tree35a6ef6bdc894f91fe782732e0536d3a832ec54e
parenta53ccab3ccac9e8676a683df9822a2daec83ef54 (diff)
ALSA: Add support for mechanical jack insertion
Some systems support both mechanical and electrical jack detection, allowing them to report that a jack is physically present but does not have any functioning connections. Add a new jack type for these, allowing user space to report faulty connections. Thanks to Guillem Jover for the suggestion. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--include/linux/input.h1
-rw-r--r--include/sound/jack.h1
-rw-r--r--sound/core/jack.c6
3 files changed, 8 insertions, 0 deletions
diff --git a/include/linux/input.h b/include/linux/input.h
index 7323d2ff5151..abd223b0f586 100644
--- a/include/linux/input.h
+++ b/include/linux/input.h
@@ -645,6 +645,7 @@ struct input_absinfo {
645#define SW_MICROPHONE_INSERT 0x04 /* set = inserted */ 645#define SW_MICROPHONE_INSERT 0x04 /* set = inserted */
646#define SW_DOCK 0x05 /* set = plugged into dock */ 646#define SW_DOCK 0x05 /* set = plugged into dock */
647#define SW_LINEOUT_INSERT 0x06 /* set = inserted */ 647#define SW_LINEOUT_INSERT 0x06 /* set = inserted */
648#define SW_JACK_PHYSICAL_INSERT 0x07 /* set = mechanical switch set */
648#define SW_MAX 0x0f 649#define SW_MAX 0x0f
649#define SW_CNT (SW_MAX+1) 650#define SW_CNT (SW_MAX+1)
650 651
diff --git a/include/sound/jack.h b/include/sound/jack.h
index 7cb25f4b50bb..2e0315cdd0d6 100644
--- a/include/sound/jack.h
+++ b/include/sound/jack.h
@@ -36,6 +36,7 @@ enum snd_jack_types {
36 SND_JACK_MICROPHONE = 0x0002, 36 SND_JACK_MICROPHONE = 0x0002,
37 SND_JACK_HEADSET = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE, 37 SND_JACK_HEADSET = SND_JACK_HEADPHONE | SND_JACK_MICROPHONE,
38 SND_JACK_LINEOUT = 0x0004, 38 SND_JACK_LINEOUT = 0x0004,
39 SND_JACK_MECHANICAL = 0x0008, /* If detected separately */
39}; 40};
40 41
41struct snd_jack { 42struct snd_jack {
diff --git a/sound/core/jack.c b/sound/core/jack.c
index c4bb9bad3133..6ebd5f12bc50 100644
--- a/sound/core/jack.c
+++ b/sound/core/jack.c
@@ -108,6 +108,9 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
108 if (type & SND_JACK_MICROPHONE) 108 if (type & SND_JACK_MICROPHONE)
109 input_set_capability(jack->input_dev, EV_SW, 109 input_set_capability(jack->input_dev, EV_SW,
110 SW_MICROPHONE_INSERT); 110 SW_MICROPHONE_INSERT);
111 if (type & SND_JACK_MECHANICAL)
112 input_set_capability(jack->input_dev, EV_SW,
113 SW_JACK_PHYSICAL_INSERT);
111 114
112 err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops); 115 err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops);
113 if (err < 0) 116 if (err < 0)
@@ -159,6 +162,9 @@ void snd_jack_report(struct snd_jack *jack, int status)
159 if (jack->type & SND_JACK_MICROPHONE) 162 if (jack->type & SND_JACK_MICROPHONE)
160 input_report_switch(jack->input_dev, SW_MICROPHONE_INSERT, 163 input_report_switch(jack->input_dev, SW_MICROPHONE_INSERT,
161 status & SND_JACK_MICROPHONE); 164 status & SND_JACK_MICROPHONE);
165 if (jack->type & SND_JACK_MECHANICAL)
166 input_report_switch(jack->input_dev, SW_JACK_PHYSICAL_INSERT,
167 status & SND_JACK_MECHANICAL);
162 168
163 input_sync(jack->input_dev); 169 input_sync(jack->input_dev);
164} 170}