diff options
| author | Takashi Iwai <tiwai@suse.de> | 2015-03-16 09:48:20 -0400 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2015-03-16 09:48:20 -0400 |
| commit | 2a557a861ae44e1941452bc2d700f1be58c1325b (patch) | |
| tree | d98a4731e5ead58134d231590047904afa6c37da /sound/core | |
| parent | 8f88f0256f2e8afd83177b3554992009acb98996 (diff) | |
| parent | b2a0bafa758256442e04d1f34d6d0746b846d23d (diff) | |
Merge branch 'topic/hda-unbind' into for-next
Diffstat (limited to 'sound/core')
| -rw-r--r-- | sound/core/device.c | 43 | ||||
| -rw-r--r-- | sound/core/init.c | 5 |
2 files changed, 34 insertions, 14 deletions
diff --git a/sound/core/device.c b/sound/core/device.c index c1a845b42a8b..8918838b1999 100644 --- a/sound/core/device.c +++ b/sound/core/device.c | |||
| @@ -71,7 +71,7 @@ int snd_device_new(struct snd_card *card, enum snd_device_type type, | |||
| 71 | } | 71 | } |
| 72 | EXPORT_SYMBOL(snd_device_new); | 72 | EXPORT_SYMBOL(snd_device_new); |
| 73 | 73 | ||
| 74 | static int __snd_device_disconnect(struct snd_device *dev) | 74 | static void __snd_device_disconnect(struct snd_device *dev) |
| 75 | { | 75 | { |
| 76 | if (dev->state == SNDRV_DEV_REGISTERED) { | 76 | if (dev->state == SNDRV_DEV_REGISTERED) { |
| 77 | if (dev->ops->dev_disconnect && | 77 | if (dev->ops->dev_disconnect && |
| @@ -79,7 +79,6 @@ static int __snd_device_disconnect(struct snd_device *dev) | |||
| 79 | dev_err(dev->card->dev, "device disconnect failure\n"); | 79 | dev_err(dev->card->dev, "device disconnect failure\n"); |
| 80 | dev->state = SNDRV_DEV_DISCONNECTED; | 80 | dev->state = SNDRV_DEV_DISCONNECTED; |
| 81 | } | 81 | } |
| 82 | return 0; | ||
| 83 | } | 82 | } |
| 84 | 83 | ||
| 85 | static void __snd_device_free(struct snd_device *dev) | 84 | static void __snd_device_free(struct snd_device *dev) |
| @@ -107,6 +106,34 @@ static struct snd_device *look_for_dev(struct snd_card *card, void *device_data) | |||
| 107 | } | 106 | } |
| 108 | 107 | ||
| 109 | /** | 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 | * Return: Zero if successful, or a negative error code on failure or if the | ||
| 119 | * device not found. | ||
| 120 | */ | ||
| 121 | void snd_device_disconnect(struct snd_card *card, void *device_data) | ||
| 122 | { | ||
| 123 | struct snd_device *dev; | ||
| 124 | |||
| 125 | if (snd_BUG_ON(!card || !device_data)) | ||
| 126 | return; | ||
| 127 | dev = look_for_dev(card, device_data); | ||
| 128 | if (dev) | ||
| 129 | __snd_device_disconnect(dev); | ||
| 130 | else | ||
| 131 | dev_dbg(card->dev, "device disconnect %p (from %pF), not found\n", | ||
| 132 | device_data, __builtin_return_address(0)); | ||
| 133 | } | ||
| 134 | EXPORT_SYMBOL_GPL(snd_device_disconnect); | ||
| 135 | |||
| 136 | /** | ||
| 110 | * snd_device_free - release the device from the card | 137 | * snd_device_free - release the device from the card |
| 111 | * @card: the card instance | 138 | * @card: the card instance |
| 112 | * @device_data: the data pointer to release | 139 | * @device_data: the data pointer to release |
| @@ -193,18 +220,14 @@ int snd_device_register_all(struct snd_card *card) | |||
| 193 | * disconnect all the devices on the card. | 220 | * disconnect all the devices on the card. |
| 194 | * called from init.c | 221 | * called from init.c |
| 195 | */ | 222 | */ |
| 196 | int snd_device_disconnect_all(struct snd_card *card) | 223 | void snd_device_disconnect_all(struct snd_card *card) |
| 197 | { | 224 | { |
| 198 | struct snd_device *dev; | 225 | struct snd_device *dev; |
| 199 | int err = 0; | ||
| 200 | 226 | ||
| 201 | if (snd_BUG_ON(!card)) | 227 | if (snd_BUG_ON(!card)) |
| 202 | return -ENXIO; | 228 | return; |
| 203 | list_for_each_entry_reverse(dev, &card->devices, list) { | 229 | list_for_each_entry_reverse(dev, &card->devices, list) |
| 204 | if (__snd_device_disconnect(dev) < 0) | 230 | __snd_device_disconnect(dev); |
| 205 | err = -ENXIO; | ||
| 206 | } | ||
| 207 | return err; | ||
| 208 | } | 231 | } |
| 209 | 232 | ||
| 210 | /* | 233 | /* |
diff --git a/sound/core/init.c b/sound/core/init.c index 35419054821c..04734e047bfe 100644 --- a/sound/core/init.c +++ b/sound/core/init.c | |||
| @@ -400,7 +400,6 @@ static const struct file_operations snd_shutdown_f_ops = | |||
| 400 | int snd_card_disconnect(struct snd_card *card) | 400 | int snd_card_disconnect(struct snd_card *card) |
| 401 | { | 401 | { |
| 402 | struct snd_monitor_file *mfile; | 402 | struct snd_monitor_file *mfile; |
| 403 | int err; | ||
| 404 | 403 | ||
| 405 | if (!card) | 404 | if (!card) |
| 406 | return -EINVAL; | 405 | return -EINVAL; |
| @@ -445,9 +444,7 @@ int snd_card_disconnect(struct snd_card *card) | |||
| 445 | #endif | 444 | #endif |
| 446 | 445 | ||
| 447 | /* notify all devices that we are disconnected */ | 446 | /* notify all devices that we are disconnected */ |
| 448 | err = snd_device_disconnect_all(card); | 447 | snd_device_disconnect_all(card); |
| 449 | if (err < 0) | ||
| 450 | dev_err(card->dev, "not all devices for card %i can be disconnected\n", card->number); | ||
| 451 | 448 | ||
| 452 | snd_info_card_disconnect(card); | 449 | snd_info_card_disconnect(card); |
| 453 | if (card->registered) { | 450 | if (card->registered) { |
