Commit 896e6cc20e67038af12e1a7711eef32647e62f23

Authored by Jaroslav Kysela
1 parent 687fbc3fec

sound: Revert "ALSA: Fix limit of 8 PCM devices in SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE"

This reverts commit fb3d6f2b77bdec75d45aa9d4464287ed87927866.

New, updated patch with same subject replaces this commit.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>

Showing 5 changed files with 23 additions and 45 deletions Side-by-side Diff

include/sound/minors.h
... ... @@ -21,8 +21,6 @@
21 21 *
22 22 */
23 23  
24   -#define SNDRV_OS_MINORS 256
25   -
26 24 #define SNDRV_MINOR_DEVICES 32
27 25 #define SNDRV_MINOR_CARD(minor) ((minor) >> 5)
28 26 #define SNDRV_MINOR_DEVICE(minor) ((minor) & 0x001f)
... ... @@ -84,6 +84,8 @@
84 84 *
85 85 */
86 86  
  87 +#define SNDRV_PCM_DEVICES 8
  88 +
87 89 #define SNDRV_PCM_IOCTL1_FALSE ((void *)0)
88 90 #define SNDRV_PCM_IOCTL1_TRUE ((void *)1)
89 91  
... ... @@ -414,7 +416,7 @@
414 416 struct snd_pcm {
415 417 struct snd_card *card;
416 418 struct list_head list;
417   - int device; /* device number */
  419 + unsigned int device; /* device number */
418 420 unsigned int info_flags;
419 421 unsigned short dev_class;
420 422 unsigned short dev_subclass;
sound/core/oss/pcm_oss.c
... ... @@ -2947,7 +2947,7 @@
2947 2947 static int snd_pcm_oss_register_minor(struct snd_pcm *pcm)
2948 2948 {
2949 2949 pcm->oss.reg = 0;
2950   - if (dsp_map[pcm->card->number] == pcm->device) {
  2950 + if (dsp_map[pcm->card->number] == (int)pcm->device) {
2951 2951 char name[128];
2952 2952 int duplex;
2953 2953 register_oss_dsp(pcm, 0);
... ... @@ -2963,7 +2963,7 @@
2963 2963 pcm->oss.reg++;
2964 2964 pcm->oss.reg_mask |= 1;
2965 2965 }
2966   - if (adsp_map[pcm->card->number] == pcm->device) {
  2966 + if (adsp_map[pcm->card->number] == (int)pcm->device) {
2967 2967 register_oss_dsp(pcm, 1);
2968 2968 pcm->oss.reg++;
2969 2969 pcm->oss.reg_mask |= 2;
... ... @@ -2988,7 +2988,7 @@
2988 2988 snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_PCM,
2989 2989 pcm->card, 1);
2990 2990 }
2991   - if (dsp_map[pcm->card->number] == pcm->device) {
  2991 + if (dsp_map[pcm->card->number] == (int)pcm->device) {
2992 2992 #ifdef SNDRV_OSS_INFO_DEV_AUDIO
2993 2993 snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_AUDIO, pcm->card->number);
2994 2994 #endif
2995 2995  
... ... @@ -3019,12 +3019,12 @@
3019 3019  
3020 3020 /* check device map table */
3021 3021 for (i = 0; i < SNDRV_CARDS; i++) {
3022   - if (dsp_map[i] < 0 || dsp_map[i] >= SNDRV_OS_MINORS) {
  3022 + if (dsp_map[i] < 0 || dsp_map[i] >= SNDRV_PCM_DEVICES) {
3023 3023 snd_printk(KERN_ERR "invalid dsp_map[%d] = %d\n",
3024 3024 i, dsp_map[i]);
3025 3025 dsp_map[i] = 0;
3026 3026 }
3027   - if (adsp_map[i] < 0 || adsp_map[i] >= SNDRV_OS_MINORS) {
  3027 + if (adsp_map[i] < 0 || adsp_map[i] >= SNDRV_PCM_DEVICES) {
3028 3028 snd_printk(KERN_ERR "invalid adsp_map[%d] = %d\n",
3029 3029 i, adsp_map[i]);
3030 3030 adsp_map[i] = 1;
... ... @@ -42,7 +42,7 @@
42 42 static int snd_pcm_dev_register(struct snd_device *device);
43 43 static int snd_pcm_dev_disconnect(struct snd_device *device);
44 44  
45   -static inline struct snd_pcm *snd_pcm_get(struct snd_card *card, int device)
  45 +static struct snd_pcm *snd_pcm_search(struct snd_card *card, int device)
46 46 {
47 47 struct snd_pcm *pcm;
48 48  
... ... @@ -53,37 +53,6 @@
53 53 return NULL;
54 54 }
55 55  
56   -static inline int snd_pcm_next(struct snd_card *card, int device)
57   -{
58   - struct snd_pcm *pcm;
59   -
60   - list_for_each_entry(pcm, &snd_pcm_devices, list) {
61   - if (pcm->card == card && pcm->device > device)
62   - return pcm->device;
63   - else if (pcm->card->number > card->number)
64   - return -1;
65   - }
66   - return -1;
67   -}
68   -
69   -static inline int snd_pcm_add(struct snd_pcm *newpcm)
70   -{
71   - struct snd_pcm *pcm;
72   -
73   - list_for_each_entry(pcm, &snd_pcm_devices, list) {
74   - if (pcm->card == newpcm->card && pcm->device == newpcm->device)
75   - return -EBUSY;
76   - if (pcm->card->number > newpcm->card->number ||
77   - (pcm->card == newpcm->card &&
78   - pcm->device > newpcm->device)) {
79   - list_add(&newpcm->list, pcm->list.prev);
80   - return 0;
81   - }
82   - }
83   - list_add_tail(&newpcm->list, &snd_pcm_devices);
84   - return 0;
85   -}
86   -
87 56 static int snd_pcm_control_ioctl(struct snd_card *card,
88 57 struct snd_ctl_file *control,
89 58 unsigned int cmd, unsigned long arg)
... ... @@ -96,7 +65,14 @@
96 65 if (get_user(device, (int __user *)arg))
97 66 return -EFAULT;
98 67 mutex_lock(&register_mutex);
99   - device = snd_pcm_next(card, device);
  68 + device = device < 0 ? 0 : device + 1;
  69 + while (device < SNDRV_PCM_DEVICES) {
  70 + if (snd_pcm_search(card, device))
  71 + break;
  72 + device++;
  73 + }
  74 + if (device == SNDRV_PCM_DEVICES)
  75 + device = -1;
100 76 mutex_unlock(&register_mutex);
101 77 if (put_user(device, (int __user *)arg))
102 78 return -EFAULT;
... ... @@ -122,7 +98,7 @@
122 98 if (get_user(subdevice, &info->subdevice))
123 99 return -EFAULT;
124 100 mutex_lock(&register_mutex);
125   - pcm = snd_pcm_get(card, device);
  101 + pcm = snd_pcm_search(card, device);
126 102 if (pcm == NULL) {
127 103 err = -ENXIO;
128 104 goto _error;
129 105  
130 106  
... ... @@ -955,11 +931,11 @@
955 931  
956 932 snd_assert(pcm != NULL && device != NULL, return -ENXIO);
957 933 mutex_lock(&register_mutex);
958   - err = snd_pcm_add(pcm);
959   - if (err) {
  934 + if (snd_pcm_search(pcm->card, pcm->device)) {
960 935 mutex_unlock(&register_mutex);
961   - return err;
  936 + return -EBUSY;
962 937 }
  938 + list_add_tail(&pcm->list, &snd_pcm_devices);
963 939 for (cidx = 0; cidx < 2; cidx++) {
964 940 int devtype = -1;
965 941 if (pcm->streams[cidx].substream == NULL)
... ... @@ -34,6 +34,8 @@
34 34 #include <linux/kmod.h>
35 35 #include <linux/mutex.h>
36 36  
  37 +#define SNDRV_OS_MINORS 256
  38 +
37 39 static int major = CONFIG_SND_MAJOR;
38 40 int snd_major;
39 41 EXPORT_SYMBOL(snd_major);