device.c (2fc2991175bf77395e6b15fe6b2304d3bf72da40) | device.c (512bbd6a85230f16389f0dd51925472e72fc8a91) |
---|---|
1/* 2 * Device management routines 3 * Copyright (c) by Jaroslav Kysela <perex@suse.cz> 4 * 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or --- 27 unchanged lines hidden (view full) --- 36 * The device will be assigned to the card and managed together 37 * by the card. 38 * 39 * The data pointer plays a role as the identifier, too, so the 40 * pointer address must be unique and unchanged. 41 * 42 * Returns zero if successful, or a negative error code on failure. 43 */ | 1/* 2 * Device management routines 3 * Copyright (c) by Jaroslav Kysela <perex@suse.cz> 4 * 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or --- 27 unchanged lines hidden (view full) --- 36 * The device will be assigned to the card and managed together 37 * by the card. 38 * 39 * The data pointer plays a role as the identifier, too, so the 40 * pointer address must be unique and unchanged. 41 * 42 * Returns zero if successful, or a negative error code on failure. 43 */ |
44int snd_device_new(snd_card_t *card, snd_device_type_t type, 45 void *device_data, snd_device_ops_t *ops) | 44int snd_device_new(struct snd_card *card, snd_device_type_t type, 45 void *device_data, struct snd_device_ops *ops) |
46{ | 46{ |
47 snd_device_t *dev; | 47 struct snd_device *dev; |
48 49 snd_assert(card != NULL, return -ENXIO); 50 snd_assert(device_data != NULL, return -ENXIO); 51 snd_assert(ops != NULL, return -ENXIO); 52 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 53 if (dev == NULL) 54 return -ENOMEM; 55 dev->card = card; --- 12 unchanged lines hidden (view full) --- 68 * 69 * Removes the device from the list on the card and invokes the 70 * callback, dev_unregister or dev_free, corresponding to the state. 71 * Then release the device. 72 * 73 * Returns zero if successful, or a negative error code on failure or if the 74 * device not found. 75 */ | 48 49 snd_assert(card != NULL, return -ENXIO); 50 snd_assert(device_data != NULL, return -ENXIO); 51 snd_assert(ops != NULL, return -ENXIO); 52 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 53 if (dev == NULL) 54 return -ENOMEM; 55 dev->card = card; --- 12 unchanged lines hidden (view full) --- 68 * 69 * Removes the device from the list on the card and invokes the 70 * callback, dev_unregister or dev_free, corresponding to the state. 71 * Then release the device. 72 * 73 * Returns zero if successful, or a negative error code on failure or if the 74 * device not found. 75 */ |
76int snd_device_free(snd_card_t *card, void *device_data) | 76int snd_device_free(struct snd_card *card, void *device_data) |
77{ 78 struct list_head *list; | 77{ 78 struct list_head *list; |
79 snd_device_t *dev; | 79 struct snd_device *dev; |
80 81 snd_assert(card != NULL, return -ENXIO); 82 snd_assert(device_data != NULL, return -ENXIO); 83 list_for_each(list, &card->devices) { 84 dev = snd_device(list); 85 if (dev->device_data != device_data) 86 continue; 87 /* unlink */ 88 list_del(&dev->list); | 80 81 snd_assert(card != NULL, return -ENXIO); 82 snd_assert(device_data != NULL, return -ENXIO); 83 list_for_each(list, &card->devices) { 84 dev = snd_device(list); 85 if (dev->device_data != device_data) 86 continue; 87 /* unlink */ 88 list_del(&dev->list); |
89 if ((dev->state == SNDRV_DEV_REGISTERED || dev->state == SNDRV_DEV_DISCONNECTED) && | 89 if ((dev->state == SNDRV_DEV_REGISTERED || 90 dev->state == SNDRV_DEV_DISCONNECTED) && |
90 dev->ops->dev_unregister) { 91 if (dev->ops->dev_unregister(dev)) 92 snd_printk(KERN_ERR "device unregister failure\n"); 93 } else { 94 if (dev->ops->dev_free) { 95 if (dev->ops->dev_free(dev)) 96 snd_printk(KERN_ERR "device free failure\n"); 97 } 98 } 99 kfree(dev); 100 return 0; 101 } | 91 dev->ops->dev_unregister) { 92 if (dev->ops->dev_unregister(dev)) 93 snd_printk(KERN_ERR "device unregister failure\n"); 94 } else { 95 if (dev->ops->dev_free) { 96 if (dev->ops->dev_free(dev)) 97 snd_printk(KERN_ERR "device free failure\n"); 98 } 99 } 100 kfree(dev); 101 return 0; 102 } |
102 snd_printd("device free %p (from %p), not found\n", device_data, __builtin_return_address(0)); | 103 snd_printd("device free %p (from %p), not found\n", device_data, 104 __builtin_return_address(0)); |
103 return -ENXIO; 104} 105 106/** 107 * snd_device_disconnect - disconnect the device 108 * @card: the card instance 109 * @device_data: the data pointer to disconnect 110 * 111 * Turns the device into the disconnection state, invoking 112 * dev_disconnect callback, if the device was already registered. 113 * 114 * Usually called from snd_card_disconnect(). 115 * 116 * Returns zero if successful, or a negative error code on failure or if the 117 * device not found. 118 */ | 105 return -ENXIO; 106} 107 108/** 109 * snd_device_disconnect - disconnect the device 110 * @card: the card instance 111 * @device_data: the data pointer to disconnect 112 * 113 * Turns the device into the disconnection state, invoking 114 * dev_disconnect callback, if the device was already registered. 115 * 116 * Usually called from snd_card_disconnect(). 117 * 118 * Returns zero if successful, or a negative error code on failure or if the 119 * device not found. 120 */ |
119int snd_device_disconnect(snd_card_t *card, void *device_data) | 121int snd_device_disconnect(struct snd_card *card, void *device_data) |
120{ 121 struct list_head *list; | 122{ 123 struct list_head *list; |
122 snd_device_t *dev; | 124 struct snd_device *dev; |
123 124 snd_assert(card != NULL, return -ENXIO); 125 snd_assert(device_data != NULL, return -ENXIO); 126 list_for_each(list, &card->devices) { 127 dev = snd_device(list); 128 if (dev->device_data != device_data) 129 continue; | 125 126 snd_assert(card != NULL, return -ENXIO); 127 snd_assert(device_data != NULL, return -ENXIO); 128 list_for_each(list, &card->devices) { 129 dev = snd_device(list); 130 if (dev->device_data != device_data) 131 continue; |
130 if (dev->state == SNDRV_DEV_REGISTERED && dev->ops->dev_disconnect) { | 132 if (dev->state == SNDRV_DEV_REGISTERED && 133 dev->ops->dev_disconnect) { |
131 if (dev->ops->dev_disconnect(dev)) 132 snd_printk(KERN_ERR "device disconnect failure\n"); 133 dev->state = SNDRV_DEV_DISCONNECTED; 134 } 135 return 0; 136 } | 134 if (dev->ops->dev_disconnect(dev)) 135 snd_printk(KERN_ERR "device disconnect failure\n"); 136 dev->state = SNDRV_DEV_DISCONNECTED; 137 } 138 return 0; 139 } |
137 snd_printd("device disconnect %p (from %p), not found\n", device_data, __builtin_return_address(0)); | 140 snd_printd("device disconnect %p (from %p), not found\n", device_data, 141 __builtin_return_address(0)); |
138 return -ENXIO; 139} 140 141/** 142 * snd_device_register - register the device 143 * @card: the card instance 144 * @device_data: the data pointer to register 145 * 146 * Registers the device which was already created via 147 * snd_device_new(). Usually this is called from snd_card_register(), 148 * but it can be called later if any new devices are created after 149 * invocation of snd_card_register(). 150 * 151 * Returns zero if successful, or a negative error code on failure or if the 152 * device not found. 153 */ | 142 return -ENXIO; 143} 144 145/** 146 * snd_device_register - register the device 147 * @card: the card instance 148 * @device_data: the data pointer to register 149 * 150 * Registers the device which was already created via 151 * snd_device_new(). Usually this is called from snd_card_register(), 152 * but it can be called later if any new devices are created after 153 * invocation of snd_card_register(). 154 * 155 * Returns zero if successful, or a negative error code on failure or if the 156 * device not found. 157 */ |
154int snd_device_register(snd_card_t *card, void *device_data) | 158int snd_device_register(struct snd_card *card, void *device_data) |
155{ 156 struct list_head *list; | 159{ 160 struct list_head *list; |
157 snd_device_t *dev; | 161 struct snd_device *dev; |
158 int err; 159 160 snd_assert(card != NULL, return -ENXIO); 161 snd_assert(device_data != NULL, return -ENXIO); 162 list_for_each(list, &card->devices) { 163 dev = snd_device(list); 164 if (dev->device_data != device_data) 165 continue; --- 8 unchanged lines hidden (view full) --- 174 snd_BUG(); 175 return -ENXIO; 176} 177 178/* 179 * register all the devices on the card. 180 * called from init.c 181 */ | 162 int err; 163 164 snd_assert(card != NULL, return -ENXIO); 165 snd_assert(device_data != NULL, return -ENXIO); 166 list_for_each(list, &card->devices) { 167 dev = snd_device(list); 168 if (dev->device_data != device_data) 169 continue; --- 8 unchanged lines hidden (view full) --- 178 snd_BUG(); 179 return -ENXIO; 180} 181 182/* 183 * register all the devices on the card. 184 * called from init.c 185 */ |
182int snd_device_register_all(snd_card_t *card) | 186int snd_device_register_all(struct snd_card *card) |
183{ 184 struct list_head *list; | 187{ 188 struct list_head *list; |
185 snd_device_t *dev; | 189 struct snd_device *dev; |
186 int err; 187 188 snd_assert(card != NULL, return -ENXIO); 189 list_for_each(list, &card->devices) { 190 dev = snd_device(list); 191 if (dev->state == SNDRV_DEV_BUILD && dev->ops->dev_register) { 192 if ((err = dev->ops->dev_register(dev)) < 0) 193 return err; 194 dev->state = SNDRV_DEV_REGISTERED; 195 } 196 } 197 return 0; 198} 199 200/* 201 * disconnect all the devices on the card. 202 * called from init.c 203 */ | 190 int err; 191 192 snd_assert(card != NULL, return -ENXIO); 193 list_for_each(list, &card->devices) { 194 dev = snd_device(list); 195 if (dev->state == SNDRV_DEV_BUILD && dev->ops->dev_register) { 196 if ((err = dev->ops->dev_register(dev)) < 0) 197 return err; 198 dev->state = SNDRV_DEV_REGISTERED; 199 } 200 } 201 return 0; 202} 203 204/* 205 * disconnect all the devices on the card. 206 * called from init.c 207 */ |
204int snd_device_disconnect_all(snd_card_t *card) | 208int snd_device_disconnect_all(struct snd_card *card) |
205{ | 209{ |
206 snd_device_t *dev; | 210 struct snd_device *dev; |
207 struct list_head *list; 208 int err = 0; 209 210 snd_assert(card != NULL, return -ENXIO); 211 list_for_each(list, &card->devices) { 212 dev = snd_device(list); 213 if (snd_device_disconnect(card, dev->device_data) < 0) 214 err = -ENXIO; 215 } 216 return err; 217} 218 219/* 220 * release all the devices on the card. 221 * called from init.c 222 */ | 211 struct list_head *list; 212 int err = 0; 213 214 snd_assert(card != NULL, return -ENXIO); 215 list_for_each(list, &card->devices) { 216 dev = snd_device(list); 217 if (snd_device_disconnect(card, dev->device_data) < 0) 218 err = -ENXIO; 219 } 220 return err; 221} 222 223/* 224 * release all the devices on the card. 225 * called from init.c 226 */ |
223int snd_device_free_all(snd_card_t *card, snd_device_cmd_t cmd) | 227int snd_device_free_all(struct snd_card *card, snd_device_cmd_t cmd) |
224{ | 228{ |
225 snd_device_t *dev; | 229 struct snd_device *dev; |
226 struct list_head *list; 227 int err; 228 unsigned int range_low, range_high; 229 230 snd_assert(card != NULL, return -ENXIO); 231 range_low = cmd * SNDRV_DEV_TYPE_RANGE_SIZE; 232 range_high = range_low + SNDRV_DEV_TYPE_RANGE_SIZE - 1; 233 __again: 234 list_for_each(list, &card->devices) { 235 dev = snd_device(list); 236 if (dev->type >= range_low && dev->type <= range_high) { 237 if ((err = snd_device_free(card, dev->device_data)) < 0) 238 return err; 239 goto __again; 240 } 241 } 242 return 0; 243} | 230 struct list_head *list; 231 int err; 232 unsigned int range_low, range_high; 233 234 snd_assert(card != NULL, return -ENXIO); 235 range_low = cmd * SNDRV_DEV_TYPE_RANGE_SIZE; 236 range_high = range_low + SNDRV_DEV_TYPE_RANGE_SIZE - 1; 237 __again: 238 list_for_each(list, &card->devices) { 239 dev = snd_device(list); 240 if (dev->type >= range_low && dev->type <= range_high) { 241 if ((err = snd_device_free(card, dev->device_data)) < 0) 242 return err; 243 goto __again; 244 } 245 } 246 return 0; 247} |