summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--include/sound/minors.h2
-rw-r--r--include/sound/pcm.h4
-rw-r--r--sound/core/oss/pcm_oss.c10
-rw-r--r--sound/core/pcm.c50
-rw-r--r--sound/core/sound.c2
5 files changed, 23 insertions, 45 deletions
diff --git a/include/sound/minors.h b/include/sound/minors.h
index a81798ab73ed..46bcd2023ed8 100644
--- a/include/sound/minors.h
+++ b/include/sound/minors.h
@@ -21,8 +21,6 @@
  *
  */
 
-#define SNDRV_OS_MINORS			256
-
 #define SNDRV_MINOR_DEVICES		32
 #define SNDRV_MINOR_CARD(minor)		((minor) >> 5)
 #define SNDRV_MINOR_DEVICE(minor)	((minor) & 0x001f)
diff --git a/include/sound/pcm.h b/include/sound/pcm.h
index bfc096ac82e5..51d58ccda2d8 100644
--- a/include/sound/pcm.h
+++ b/include/sound/pcm.h
@@ -84,6 +84,8 @@ struct snd_pcm_ops {
  *
  */
 
+#define SNDRV_PCM_DEVICES		8
+
 #define SNDRV_PCM_IOCTL1_FALSE		((void *)0)
 #define SNDRV_PCM_IOCTL1_TRUE		((void *)1)
 
@@ -414,7 +416,7 @@ struct snd_pcm_str {
 struct snd_pcm {
 	struct snd_card *card;
 	struct list_head list;
-	int device; /* device number */
+	unsigned int device;	/* device number */
 	unsigned int info_flags;
 	unsigned short dev_class;
 	unsigned short dev_subclass;
diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
index 4ccd761a5f41..4c601b192ddf 100644
--- a/sound/core/oss/pcm_oss.c
+++ b/sound/core/oss/pcm_oss.c
@@ -2947,7 +2947,7 @@ static void register_oss_dsp(struct snd_pcm *pcm, int index)
 static int snd_pcm_oss_register_minor(struct snd_pcm *pcm)
 {
 	pcm->oss.reg = 0;
-	if (dsp_map[pcm->card->number] == pcm->device) {
+	if (dsp_map[pcm->card->number] == (int)pcm->device) {
 		char name[128];
 		int duplex;
 		register_oss_dsp(pcm, 0);
@@ -2963,7 +2963,7 @@ static int snd_pcm_oss_register_minor(struct snd_pcm *pcm)
 		pcm->oss.reg++;
 		pcm->oss.reg_mask |= 1;
 	}
-	if (adsp_map[pcm->card->number] == pcm->device) {
+	if (adsp_map[pcm->card->number] == (int)pcm->device) {
 		register_oss_dsp(pcm, 1);
 		pcm->oss.reg++;
 		pcm->oss.reg_mask |= 2;
@@ -2988,7 +2988,7 @@ static int snd_pcm_oss_disconnect_minor(struct snd_pcm *pcm)
 			snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_PCM,
 						  pcm->card, 1);
 		}
-		if (dsp_map[pcm->card->number] == pcm->device) {
+		if (dsp_map[pcm->card->number] == (int)pcm->device) {
 #ifdef SNDRV_OSS_INFO_DEV_AUDIO
 			snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_AUDIO, pcm->card->number);
 #endif
@@ -3019,12 +3019,12 @@ static int __init alsa_pcm_oss_init(void)
 
 	/* check device map table */
 	for (i = 0; i < SNDRV_CARDS; i++) {
-		if (dsp_map[i] < 0 || dsp_map[i] >= SNDRV_OS_MINORS) {
+		if (dsp_map[i] < 0 || dsp_map[i] >= SNDRV_PCM_DEVICES) {
 			snd_printk(KERN_ERR "invalid dsp_map[%d] = %d\n",
 				   i, dsp_map[i]);
 			dsp_map[i] = 0;
 		}
-		if (adsp_map[i] < 0 || adsp_map[i] >= SNDRV_OS_MINORS) {
+		if (adsp_map[i] < 0 || adsp_map[i] >= SNDRV_PCM_DEVICES) {
 			snd_printk(KERN_ERR "invalid adsp_map[%d] = %d\n",
 				   i, adsp_map[i]);
 			adsp_map[i] = 1;
diff --git a/sound/core/pcm.c b/sound/core/pcm.c
index 24271a3bd901..ece25c718e95 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)
diff --git a/sound/core/sound.c b/sound/core/sound.c
index 838dd9ee957c..1003ae375d47 100644
--- a/sound/core/sound.c
+++ b/sound/core/sound.c
@@ -34,6 +34,8 @@
 #include <linux/kmod.h>
 #include <linux/mutex.h>
 
+#define SNDRV_OS_MINORS 256
+
 static int major = CONFIG_SND_MAJOR;
 int snd_major;
 EXPORT_SYMBOL(snd_major);