diff options
Diffstat (limited to 'sound/core/jack.c')
-rw-r--r-- | sound/core/jack.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/sound/core/jack.c b/sound/core/jack.c index bd2d9e6b55e9..dd4a12dc09aa 100644 --- a/sound/core/jack.c +++ b/sound/core/jack.c | |||
@@ -34,6 +34,7 @@ static int snd_jack_dev_free(struct snd_device *device) | |||
34 | else | 34 | else |
35 | input_free_device(jack->input_dev); | 35 | input_free_device(jack->input_dev); |
36 | 36 | ||
37 | kfree(jack->id); | ||
37 | kfree(jack); | 38 | kfree(jack); |
38 | 39 | ||
39 | return 0; | 40 | return 0; |
@@ -87,7 +88,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type, | |||
87 | if (jack == NULL) | 88 | if (jack == NULL) |
88 | return -ENOMEM; | 89 | return -ENOMEM; |
89 | 90 | ||
90 | jack->id = id; | 91 | jack->id = kstrdup(id, GFP_KERNEL); |
91 | 92 | ||
92 | jack->input_dev = input_allocate_device(); | 93 | jack->input_dev = input_allocate_device(); |
93 | if (jack->input_dev == NULL) { | 94 | if (jack->input_dev == NULL) { |
@@ -102,9 +103,15 @@ int snd_jack_new(struct snd_card *card, const char *id, int type, | |||
102 | if (type & SND_JACK_HEADPHONE) | 103 | if (type & SND_JACK_HEADPHONE) |
103 | input_set_capability(jack->input_dev, EV_SW, | 104 | input_set_capability(jack->input_dev, EV_SW, |
104 | SW_HEADPHONE_INSERT); | 105 | SW_HEADPHONE_INSERT); |
106 | if (type & SND_JACK_LINEOUT) | ||
107 | input_set_capability(jack->input_dev, EV_SW, | ||
108 | SW_LINEOUT_INSERT); | ||
105 | if (type & SND_JACK_MICROPHONE) | 109 | if (type & SND_JACK_MICROPHONE) |
106 | input_set_capability(jack->input_dev, EV_SW, | 110 | input_set_capability(jack->input_dev, EV_SW, |
107 | SW_MICROPHONE_INSERT); | 111 | SW_MICROPHONE_INSERT); |
112 | if (type & SND_JACK_MECHANICAL) | ||
113 | input_set_capability(jack->input_dev, EV_SW, | ||
114 | SW_JACK_PHYSICAL_INSERT); | ||
108 | 115 | ||
109 | err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops); | 116 | err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops); |
110 | if (err < 0) | 117 | if (err < 0) |
@@ -153,9 +160,15 @@ void snd_jack_report(struct snd_jack *jack, int status) | |||
153 | if (jack->type & SND_JACK_HEADPHONE) | 160 | if (jack->type & SND_JACK_HEADPHONE) |
154 | input_report_switch(jack->input_dev, SW_HEADPHONE_INSERT, | 161 | input_report_switch(jack->input_dev, SW_HEADPHONE_INSERT, |
155 | status & SND_JACK_HEADPHONE); | 162 | status & SND_JACK_HEADPHONE); |
163 | if (jack->type & SND_JACK_LINEOUT) | ||
164 | input_report_switch(jack->input_dev, SW_LINEOUT_INSERT, | ||
165 | status & SND_JACK_LINEOUT); | ||
156 | if (jack->type & SND_JACK_MICROPHONE) | 166 | if (jack->type & SND_JACK_MICROPHONE) |
157 | input_report_switch(jack->input_dev, SW_MICROPHONE_INSERT, | 167 | input_report_switch(jack->input_dev, SW_MICROPHONE_INSERT, |
158 | status & SND_JACK_MICROPHONE); | 168 | status & SND_JACK_MICROPHONE); |
169 | if (jack->type & SND_JACK_MECHANICAL) | ||
170 | input_report_switch(jack->input_dev, SW_JACK_PHYSICAL_INSERT, | ||
171 | status & SND_JACK_MECHANICAL); | ||
159 | 172 | ||
160 | input_sync(jack->input_dev); | 173 | input_sync(jack->input_dev); |
161 | } | 174 | } |