summaryrefslogtreecommitdiffstats
path: root/sound/core/pcm.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/core/pcm.c')
-rw-r--r--sound/core/pcm.c50
1 files changed, 13 insertions, 37 deletions
diff --git a/sound/core/pcm.c b/sound/core/pcm.c
index 24271a3bd90..ece25c718e9 100644
--- a/sound/core/pcm.c
+++ b/sound/core/pcm.c
@@ -42,7 +42,7 @@ static int snd_pcm_dev_free(struct snd_device *device);
static int snd_pcm_dev_register(struct snd_device *device);
static int snd_pcm_dev_disconnect(struct snd_device *device);
-static inline struct snd_pcm *snd_pcm_get(struct snd_card *card, int device)
+static struct snd_pcm *snd_pcm_search(struct snd_card *card, int device)
{
struct snd_pcm *pcm;
@@ -53,37 +53,6 @@ static inline struct snd_pcm *snd_pcm_get(struct snd_card *card, int device)
return NULL;
}
-static inline int snd_pcm_next(struct snd_card *card, int device)
-{
- struct snd_pcm *pcm;
-
- list_for_each_entry(pcm, &snd_pcm_devices, list) {
- if (pcm->card == card && pcm->device > device)
- return pcm->device;
- else if (pcm->card->number > card->number)
- return -1;
- }
- return -1;
-}
-
-static inline int snd_pcm_add(struct snd_pcm *newpcm)
-{
- struct snd_pcm *pcm;
-
- list_for_each_entry(pcm, &snd_pcm_devices, list) {
- if (pcm->card == newpcm->card && pcm->device == newpcm->device)
- return -EBUSY;
- if (pcm->card->number > newpcm->card->number ||
- (pcm->card == newpcm->card &&
- pcm->device > newpcm->device)) {
- list_add(&newpcm->list, pcm->list.prev);
- return 0;
- }
- }
- list_add_tail(&newpcm->list, &snd_pcm_devices);
- return 0;
-}
-
static int snd_pcm_control_ioctl(struct snd_card *card,
struct snd_ctl_file *control,
unsigned int cmd, unsigned long arg)
@@ -96,7 +65,14 @@ static int snd_pcm_control_ioctl(struct snd_card *card,
if (get_user(device, (int __user *)arg))
return -EFAULT;
mutex_lock(&register_mutex);
- device = snd_pcm_next(card, device);
+ device = device < 0 ? 0 : device + 1;
+ while (device < SNDRV_PCM_DEVICES) {
+ if (snd_pcm_search(card, device))
+ break;
+ device++;
+ }
+ if (device == SNDRV_PCM_DEVICES)
+ device = -1;
mutex_unlock(&register_mutex);
if (put_user(device, (int __user *)arg))
return -EFAULT;
@@ -122,7 +98,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card,
if (get_user(subdevice, &info->subdevice))
return -EFAULT;
mutex_lock(&register_mutex);
- pcm = snd_pcm_get(card, device);
+ pcm = snd_pcm_search(card, device);
if (pcm == NULL) {
err = -ENXIO;
goto _error;
@@ -955,11 +931,11 @@ static int snd_pcm_dev_register(struct snd_device *device)
snd_assert(pcm != NULL && device != NULL, return -ENXIO);
mutex_lock(&register_mutex);
- err = snd_pcm_add(pcm);
- if (err) {
+ if (snd_pcm_search(pcm->card, pcm->device)) {
mutex_unlock(&register_mutex);
- return err;
+ return -EBUSY;
}
+ list_add_tail(&pcm->list, &snd_pcm_devices);
for (cidx = 0; cidx < 2; cidx++) {
int devtype = -1;
if (pcm->streams[cidx].substream == NULL)