This source file includes following definitions.
- snd_jack_dev_disconnect
- snd_jack_dev_free
- snd_jack_dev_register
- snd_jack_kctl_private_free
- snd_jack_kctl_add
- snd_jack_kctl_new
- snd_jack_add_new_kctl
- snd_jack_new
- snd_jack_set_parent
- snd_jack_set_key
- snd_jack_report
1
2
3
4
5
6
7
8 #include <linux/input.h>
9 #include <linux/slab.h>
10 #include <linux/module.h>
11 #include <sound/jack.h>
12 #include <sound/core.h>
13 #include <sound/control.h>
14
15 struct snd_jack_kctl {
16 struct snd_kcontrol *kctl;
17 struct list_head list;
18 unsigned int mask_bits;
19 };
20
21 #ifdef CONFIG_SND_JACK_INPUT_DEV
22 static int jack_switch_types[SND_JACK_SWITCH_TYPES] = {
23 SW_HEADPHONE_INSERT,
24 SW_MICROPHONE_INSERT,
25 SW_LINEOUT_INSERT,
26 SW_JACK_PHYSICAL_INSERT,
27 SW_VIDEOOUT_INSERT,
28 SW_LINEIN_INSERT,
29 };
30 #endif
31
32 static int snd_jack_dev_disconnect(struct snd_device *device)
33 {
34 #ifdef CONFIG_SND_JACK_INPUT_DEV
35 struct snd_jack *jack = device->device_data;
36
37 if (!jack->input_dev)
38 return 0;
39
40
41
42 if (jack->registered)
43 input_unregister_device(jack->input_dev);
44 else
45 input_free_device(jack->input_dev);
46 jack->input_dev = NULL;
47 #endif
48 return 0;
49 }
50
51 static int snd_jack_dev_free(struct snd_device *device)
52 {
53 struct snd_jack *jack = device->device_data;
54 struct snd_card *card = device->card;
55 struct snd_jack_kctl *jack_kctl, *tmp_jack_kctl;
56
57 list_for_each_entry_safe(jack_kctl, tmp_jack_kctl, &jack->kctl_list, list) {
58 list_del_init(&jack_kctl->list);
59 snd_ctl_remove(card, jack_kctl->kctl);
60 }
61 if (jack->private_free)
62 jack->private_free(jack);
63
64 snd_jack_dev_disconnect(device);
65
66 kfree(jack->id);
67 kfree(jack);
68
69 return 0;
70 }
71
72 #ifdef CONFIG_SND_JACK_INPUT_DEV
73 static int snd_jack_dev_register(struct snd_device *device)
74 {
75 struct snd_jack *jack = device->device_data;
76 struct snd_card *card = device->card;
77 int err, i;
78
79 snprintf(jack->name, sizeof(jack->name), "%s %s",
80 card->shortname, jack->id);
81
82 if (!jack->input_dev)
83 return 0;
84
85 jack->input_dev->name = jack->name;
86
87
88 if (!jack->input_dev->dev.parent)
89 jack->input_dev->dev.parent = snd_card_get_device_link(card);
90
91
92 for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
93 int testbit = SND_JACK_BTN_0 >> i;
94
95 if (!(jack->type & testbit))
96 continue;
97
98 if (!jack->key[i])
99 jack->key[i] = BTN_0 + i;
100
101 input_set_capability(jack->input_dev, EV_KEY, jack->key[i]);
102 }
103
104 err = input_register_device(jack->input_dev);
105 if (err == 0)
106 jack->registered = 1;
107
108 return err;
109 }
110 #endif
111
112 static void snd_jack_kctl_private_free(struct snd_kcontrol *kctl)
113 {
114 struct snd_jack_kctl *jack_kctl;
115
116 jack_kctl = kctl->private_data;
117 if (jack_kctl) {
118 list_del(&jack_kctl->list);
119 kfree(jack_kctl);
120 }
121 }
122
123 static void snd_jack_kctl_add(struct snd_jack *jack, struct snd_jack_kctl *jack_kctl)
124 {
125 list_add_tail(&jack_kctl->list, &jack->kctl_list);
126 }
127
128 static struct snd_jack_kctl * snd_jack_kctl_new(struct snd_card *card, const char *name, unsigned int mask)
129 {
130 struct snd_kcontrol *kctl;
131 struct snd_jack_kctl *jack_kctl;
132 int err;
133
134 kctl = snd_kctl_jack_new(name, card);
135 if (!kctl)
136 return NULL;
137
138 err = snd_ctl_add(card, kctl);
139 if (err < 0)
140 return NULL;
141
142 jack_kctl = kzalloc(sizeof(*jack_kctl), GFP_KERNEL);
143
144 if (!jack_kctl)
145 goto error;
146
147 jack_kctl->kctl = kctl;
148 jack_kctl->mask_bits = mask;
149
150 kctl->private_data = jack_kctl;
151 kctl->private_free = snd_jack_kctl_private_free;
152
153 return jack_kctl;
154 error:
155 snd_ctl_free_one(kctl);
156 return NULL;
157 }
158
159
160
161
162
163
164
165
166
167
168
169
170 int snd_jack_add_new_kctl(struct snd_jack *jack, const char * name, int mask)
171 {
172 struct snd_jack_kctl *jack_kctl;
173
174 jack_kctl = snd_jack_kctl_new(jack->card, name, mask);
175 if (!jack_kctl)
176 return -ENOMEM;
177
178 snd_jack_kctl_add(jack, jack_kctl);
179 return 0;
180 }
181 EXPORT_SYMBOL(snd_jack_add_new_kctl);
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198 int snd_jack_new(struct snd_card *card, const char *id, int type,
199 struct snd_jack **jjack, bool initial_kctl, bool phantom_jack)
200 {
201 struct snd_jack *jack;
202 struct snd_jack_kctl *jack_kctl = NULL;
203 int err;
204 static struct snd_device_ops ops = {
205 .dev_free = snd_jack_dev_free,
206 #ifdef CONFIG_SND_JACK_INPUT_DEV
207 .dev_register = snd_jack_dev_register,
208 .dev_disconnect = snd_jack_dev_disconnect,
209 #endif
210 };
211
212 if (initial_kctl) {
213 jack_kctl = snd_jack_kctl_new(card, id, type);
214 if (!jack_kctl)
215 return -ENOMEM;
216 }
217
218 jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL);
219 if (jack == NULL)
220 return -ENOMEM;
221
222 jack->id = kstrdup(id, GFP_KERNEL);
223
224
225 if (!phantom_jack) {
226 #ifdef CONFIG_SND_JACK_INPUT_DEV
227 int i;
228
229 jack->input_dev = input_allocate_device();
230 if (jack->input_dev == NULL) {
231 err = -ENOMEM;
232 goto fail_input;
233 }
234
235 jack->input_dev->phys = "ALSA";
236
237 jack->type = type;
238
239 for (i = 0; i < SND_JACK_SWITCH_TYPES; i++)
240 if (type & (1 << i))
241 input_set_capability(jack->input_dev, EV_SW,
242 jack_switch_types[i]);
243
244 #endif
245 }
246
247 err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops);
248 if (err < 0)
249 goto fail_input;
250
251 jack->card = card;
252 INIT_LIST_HEAD(&jack->kctl_list);
253
254 if (initial_kctl)
255 snd_jack_kctl_add(jack, jack_kctl);
256
257 *jjack = jack;
258
259 return 0;
260
261 fail_input:
262 #ifdef CONFIG_SND_JACK_INPUT_DEV
263 input_free_device(jack->input_dev);
264 #endif
265 kfree(jack->id);
266 kfree(jack);
267 return err;
268 }
269 EXPORT_SYMBOL(snd_jack_new);
270
271 #ifdef CONFIG_SND_JACK_INPUT_DEV
272
273
274
275
276
277
278
279
280
281
282 void snd_jack_set_parent(struct snd_jack *jack, struct device *parent)
283 {
284 WARN_ON(jack->registered);
285 if (!jack->input_dev)
286 return;
287
288 jack->input_dev->dev.parent = parent;
289 }
290 EXPORT_SYMBOL(snd_jack_set_parent);
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317 int snd_jack_set_key(struct snd_jack *jack, enum snd_jack_types type,
318 int keytype)
319 {
320 int key = fls(SND_JACK_BTN_0) - fls(type);
321
322 WARN_ON(jack->registered);
323
324 if (!keytype || key >= ARRAY_SIZE(jack->key))
325 return -EINVAL;
326
327 jack->type |= type;
328 jack->key[key] = keytype;
329 return 0;
330 }
331 EXPORT_SYMBOL(snd_jack_set_key);
332 #endif
333
334
335
336
337
338
339
340 void snd_jack_report(struct snd_jack *jack, int status)
341 {
342 struct snd_jack_kctl *jack_kctl;
343 #ifdef CONFIG_SND_JACK_INPUT_DEV
344 int i;
345 #endif
346
347 if (!jack)
348 return;
349
350 list_for_each_entry(jack_kctl, &jack->kctl_list, list)
351 snd_kctl_jack_report(jack->card, jack_kctl->kctl,
352 status & jack_kctl->mask_bits);
353
354 #ifdef CONFIG_SND_JACK_INPUT_DEV
355 if (!jack->input_dev)
356 return;
357
358 for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
359 int testbit = SND_JACK_BTN_0 >> i;
360
361 if (jack->type & testbit)
362 input_report_key(jack->input_dev, jack->key[i],
363 status & testbit);
364 }
365
366 for (i = 0; i < ARRAY_SIZE(jack_switch_types); i++) {
367 int testbit = 1 << i;
368 if (jack->type & testbit)
369 input_report_switch(jack->input_dev,
370 jack_switch_types[i],
371 status & testbit);
372 }
373
374 input_sync(jack->input_dev);
375 #endif
376 }
377 EXPORT_SYMBOL(snd_jack_report);