Commit e086e303 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: core: Re-add snd_device_disconnect()

Revive snd_device_disconnect() again so that it can be called from the
individual driver.  This time, HD-audio will need it.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 61ca4107
...@@ -278,7 +278,8 @@ int snd_device_new(struct snd_card *card, enum snd_device_type type, ...@@ -278,7 +278,8 @@ int snd_device_new(struct snd_card *card, enum snd_device_type type,
void *device_data, struct snd_device_ops *ops); void *device_data, struct snd_device_ops *ops);
int snd_device_register(struct snd_card *card, void *device_data); int snd_device_register(struct snd_card *card, void *device_data);
int snd_device_register_all(struct snd_card *card); int snd_device_register_all(struct snd_card *card);
int snd_device_disconnect_all(struct snd_card *card); void snd_device_disconnect(struct snd_card *card, void *device_data);
void snd_device_disconnect_all(struct snd_card *card);
void snd_device_free(struct snd_card *card, void *device_data); void snd_device_free(struct snd_card *card, void *device_data);
void snd_device_free_all(struct snd_card *card); void snd_device_free_all(struct snd_card *card);
......
...@@ -73,7 +73,7 @@ int snd_device_new(struct snd_card *card, enum snd_device_type type, ...@@ -73,7 +73,7 @@ int snd_device_new(struct snd_card *card, enum snd_device_type type,
} }
EXPORT_SYMBOL(snd_device_new); EXPORT_SYMBOL(snd_device_new);
static int __snd_device_disconnect(struct snd_device *dev) static void __snd_device_disconnect(struct snd_device *dev)
{ {
if (dev->state == SNDRV_DEV_REGISTERED) { if (dev->state == SNDRV_DEV_REGISTERED) {
if (dev->ops->dev_disconnect && if (dev->ops->dev_disconnect &&
...@@ -81,7 +81,6 @@ static int __snd_device_disconnect(struct snd_device *dev) ...@@ -81,7 +81,6 @@ static int __snd_device_disconnect(struct snd_device *dev)
dev_err(dev->card->dev, "device disconnect failure\n"); dev_err(dev->card->dev, "device disconnect failure\n");
dev->state = SNDRV_DEV_DISCONNECTED; dev->state = SNDRV_DEV_DISCONNECTED;
} }
return 0;
} }
static void __snd_device_free(struct snd_device *dev) static void __snd_device_free(struct snd_device *dev)
...@@ -108,6 +107,34 @@ static struct snd_device *look_for_dev(struct snd_card *card, void *device_data) ...@@ -108,6 +107,34 @@ static struct snd_device *look_for_dev(struct snd_card *card, void *device_data)
return NULL; return NULL;
} }
/**
* snd_device_disconnect - disconnect the device
* @card: the card instance
* @device_data: the data pointer to disconnect
*
* Turns the device into the disconnection state, invoking
* dev_disconnect callback, if the device was already registered.
*
* Usually called from snd_card_disconnect().
*
* Return: Zero if successful, or a negative error code on failure or if the
* device not found.
*/
void snd_device_disconnect(struct snd_card *card, void *device_data)
{
struct snd_device *dev;
if (snd_BUG_ON(!card || !device_data))
return;
dev = look_for_dev(card, device_data);
if (dev)
__snd_device_disconnect(dev);
else
dev_dbg(card->dev, "device disconnect %p (from %pF), not found\n",
device_data, __builtin_return_address(0));
}
EXPORT_SYMBOL_GPL(snd_device_disconnect);
/** /**
* snd_device_free - release the device from the card * snd_device_free - release the device from the card
* @card: the card instance * @card: the card instance
...@@ -195,18 +222,14 @@ int snd_device_register_all(struct snd_card *card) ...@@ -195,18 +222,14 @@ int snd_device_register_all(struct snd_card *card)
* disconnect all the devices on the card. * disconnect all the devices on the card.
* called from init.c * called from init.c
*/ */
int snd_device_disconnect_all(struct snd_card *card) void snd_device_disconnect_all(struct snd_card *card)
{ {
struct snd_device *dev; struct snd_device *dev;
int err = 0;
if (snd_BUG_ON(!card)) if (snd_BUG_ON(!card))
return -ENXIO; return;
list_for_each_entry_reverse(dev, &card->devices, list) { list_for_each_entry_reverse(dev, &card->devices, list)
if (__snd_device_disconnect(dev) < 0) __snd_device_disconnect(dev);
err = -ENXIO;
}
return err;
} }
/* /*
......
...@@ -400,7 +400,6 @@ static const struct file_operations snd_shutdown_f_ops = ...@@ -400,7 +400,6 @@ static const struct file_operations snd_shutdown_f_ops =
int snd_card_disconnect(struct snd_card *card) int snd_card_disconnect(struct snd_card *card)
{ {
struct snd_monitor_file *mfile; struct snd_monitor_file *mfile;
int err;
if (!card) if (!card)
return -EINVAL; return -EINVAL;
...@@ -445,9 +444,7 @@ int snd_card_disconnect(struct snd_card *card) ...@@ -445,9 +444,7 @@ int snd_card_disconnect(struct snd_card *card)
#endif #endif
/* notify all devices that we are disconnected */ /* notify all devices that we are disconnected */
err = snd_device_disconnect_all(card); snd_device_disconnect_all(card);
if (err < 0)
dev_err(card->dev, "not all devices for card %i can be disconnected\n", card->number);
snd_info_card_disconnect(card); snd_info_card_disconnect(card);
if (card->registered) { if (card->registered) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment