Blame view
sound/core/jack.c
6.16 KB
e76d8ceaa ALSA: Add jack re... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * Jack abstraction layer * * Copyright 2008 Wolfson Microelectronics * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include <linux/input.h> |
5a0e3ad6a include cleanup: ... |
23 |
#include <linux/slab.h> |
da155d5b4 sound: Add module... |
24 |
#include <linux/module.h> |
e76d8ceaa ALSA: Add jack re... |
25 26 |
#include <sound/jack.h> #include <sound/core.h> |
1c6e555c3 ALSA: Rename jack... |
27 |
static int jack_switch_types[] = { |
bd8a71a7b ALSA: Reduce boil... |
28 29 30 31 |
SW_HEADPHONE_INSERT, SW_MICROPHONE_INSERT, SW_LINEOUT_INSERT, SW_JACK_PHYSICAL_INSERT, |
d506fc322 ALSA: Add support... |
32 |
SW_VIDEOOUT_INSERT, |
7c2f8e400 ALSA: jack - Add ... |
33 |
SW_LINEIN_INSERT, |
bd8a71a7b ALSA: Reduce boil... |
34 |
}; |
e76d8ceaa ALSA: Add jack re... |
35 36 37 |
static int snd_jack_dev_free(struct snd_device *device) { struct snd_jack *jack = device->device_data; |
9d59065cd ALSA: add private... |
38 39 |
if (jack->private_free) jack->private_free(jack); |
e76d8ceaa ALSA: Add jack re... |
40 41 42 43 44 45 |
/* If the input device is registered with the input subsystem * then we need to use a different deallocator. */ if (jack->registered) input_unregister_device(jack->input_dev); else input_free_device(jack->input_dev); |
282cd76ff ALSA: hda: dynami... |
46 |
kfree(jack->id); |
e76d8ceaa ALSA: Add jack re... |
47 48 49 50 51 52 53 54 55 |
kfree(jack); return 0; } static int snd_jack_dev_register(struct snd_device *device) { struct snd_jack *jack = device->device_data; struct snd_card *card = device->card; |
ebb812cb8 ALSA: Add support... |
56 |
int err, i; |
e76d8ceaa ALSA: Add jack re... |
57 58 |
snprintf(jack->name, sizeof(jack->name), "%s %s", |
2678f60d2 ALSA: jack - Use ... |
59 |
card->shortname, jack->id); |
e76d8ceaa ALSA: Add jack re... |
60 61 62 63 |
jack->input_dev->name = jack->name; /* Default to the sound card device. */ if (!jack->input_dev->dev.parent) |
1f3fff7bd ALSA: use card de... |
64 |
jack->input_dev->dev.parent = snd_card_get_device_link(card); |
e76d8ceaa ALSA: Add jack re... |
65 |
|
ebb812cb8 ALSA: Add support... |
66 67 68 69 70 71 72 73 74 75 76 77 |
/* Add capabilities for any keys that are enabled */ for (i = 0; i < ARRAY_SIZE(jack->key); i++) { int testbit = SND_JACK_BTN_0 >> i; if (!(jack->type & testbit)) continue; if (!jack->key[i]) jack->key[i] = BTN_0 + i; input_set_capability(jack->input_dev, EV_KEY, jack->key[i]); } |
e76d8ceaa ALSA: Add jack re... |
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
err = input_register_device(jack->input_dev); if (err == 0) jack->registered = 1; return err; } /** * snd_jack_new - Create a new jack * @card: the card instance * @id: an identifying string for this jack * @type: a bitmask of enum snd_jack_type values that can be detected by * this jack * @jjack: Used to provide the allocated jack object to the caller. * * Creates a new jack object. * * Returns zero if successful, or a negative error code on failure. * On success jjack will be initialised. */ int snd_jack_new(struct snd_card *card, const char *id, int type, struct snd_jack **jjack) { struct snd_jack *jack; int err; |
bd8a71a7b ALSA: Reduce boil... |
103 |
int i; |
e76d8ceaa ALSA: Add jack re... |
104 105 106 107 108 109 110 111 |
static struct snd_device_ops ops = { .dev_free = snd_jack_dev_free, .dev_register = snd_jack_dev_register, }; jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL); if (jack == NULL) return -ENOMEM; |
282cd76ff ALSA: hda: dynami... |
112 |
jack->id = kstrdup(id, GFP_KERNEL); |
e76d8ceaa ALSA: Add jack re... |
113 114 115 116 117 118 119 120 121 122 |
jack->input_dev = input_allocate_device(); if (jack->input_dev == NULL) { err = -ENOMEM; goto fail_input; } jack->input_dev->phys = "ALSA"; jack->type = type; |
1c6e555c3 ALSA: Rename jack... |
123 |
for (i = 0; i < ARRAY_SIZE(jack_switch_types); i++) |
bd8a71a7b ALSA: Reduce boil... |
124 125 |
if (type & (1 << i)) input_set_capability(jack->input_dev, EV_SW, |
1c6e555c3 ALSA: Rename jack... |
126 |
jack_switch_types[i]); |
e76d8ceaa ALSA: Add jack re... |
127 128 129 130 131 132 133 134 135 136 137 |
err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops); if (err < 0) goto fail_input; *jjack = jack; return 0; fail_input: input_free_device(jack->input_dev); |
eeda276be ALSA: fix one mem... |
138 |
kfree(jack->id); |
e76d8ceaa ALSA: Add jack re... |
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
kfree(jack); return err; } EXPORT_SYMBOL(snd_jack_new); /** * snd_jack_set_parent - Set the parent device for a jack * * @jack: The jack to configure * @parent: The device to set as parent for the jack. * * Set the parent for the jack input device in the device tree. This * function is only valid prior to registration of the jack. If no * parent is configured then the parent device will be the sound card. */ void snd_jack_set_parent(struct snd_jack *jack, struct device *parent) { WARN_ON(jack->registered); jack->input_dev->dev.parent = parent; } EXPORT_SYMBOL(snd_jack_set_parent); /** |
ebb812cb8 ALSA: Add support... |
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
* snd_jack_set_key - Set a key mapping on a jack * * @jack: The jack to configure * @type: Jack report type for this key * @keytype: Input layer key type to be reported * * Map a SND_JACK_BTN_ button type to an input layer key, allowing * reporting of keys on accessories via the jack abstraction. If no * mapping is provided but keys are enabled in the jack type then * BTN_n numeric buttons will be reported. * * Note that this is intended to be use by simple devices with small * numbers of keys that can be reported. It is also possible to * access the input device directly - devices with complex input * capabilities on accessories should consider doing this rather than * using this abstraction. * * This function may only be called prior to registration of the jack. */ int snd_jack_set_key(struct snd_jack *jack, enum snd_jack_types type, int keytype) { int key = fls(SND_JACK_BTN_0) - fls(type); WARN_ON(jack->registered); if (!keytype || key >= ARRAY_SIZE(jack->key)) return -EINVAL; jack->type |= type; jack->key[key] = keytype; return 0; } EXPORT_SYMBOL(snd_jack_set_key); /** |
e76d8ceaa ALSA: Add jack re... |
200 201 202 203 204 205 206 |
* snd_jack_report - Report the current status of a jack * * @jack: The jack to report status for * @status: The current status of the jack */ void snd_jack_report(struct snd_jack *jack, int status) { |
bd8a71a7b ALSA: Reduce boil... |
207 |
int i; |
9a3f371e9 ALSA: Handle NULL... |
208 209 |
if (!jack) return; |
ebb812cb8 ALSA: Add support... |
210 211 212 213 214 215 216 |
for (i = 0; i < ARRAY_SIZE(jack->key); i++) { int testbit = SND_JACK_BTN_0 >> i; if (jack->type & testbit) input_report_key(jack->input_dev, jack->key[i], status & testbit); } |
1c6e555c3 ALSA: Rename jack... |
217 |
for (i = 0; i < ARRAY_SIZE(jack_switch_types); i++) { |
bd8a71a7b ALSA: Reduce boil... |
218 219 |
int testbit = 1 << i; if (jack->type & testbit) |
1c6e555c3 ALSA: Rename jack... |
220 221 |
input_report_switch(jack->input_dev, jack_switch_types[i], |
bd8a71a7b ALSA: Reduce boil... |
222 223 |
status & testbit); } |
e76d8ceaa ALSA: Add jack re... |
224 225 226 227 228 229 230 231 |
input_sync(jack->input_dev); } EXPORT_SYMBOL(snd_jack_report); MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); MODULE_DESCRIPTION("Jack detection support for ALSA"); MODULE_LICENSE("GPL"); |