Blame view

sound/oss/dev_table.c 5.45 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
f30c22695   Uwe Zeisberger   fix file specific...
2
   * sound/oss/dev_table.c
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
4
5
6
7
8
9
10
11
12
13
14
   *
   * Device call tables.
   *
   *
   * Copyright (C) by Hannu Savolainen 1993-1997
   *
   * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
   * Version 2 (June 1991). See the "COPYING" file distributed with this software
   * for more info.
   */
  
  #include <linux/init.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
  #include "sound_config.h"
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  struct audio_operations *audio_devs[MAX_AUDIO_DEV];
  EXPORT_SYMBOL(audio_devs);
  
  int num_audiodevs;
  EXPORT_SYMBOL(num_audiodevs);
  
  struct mixer_operations *mixer_devs[MAX_MIXER_DEV];
  EXPORT_SYMBOL(mixer_devs);
  
  int num_mixers;
  EXPORT_SYMBOL(num_mixers);
  
  struct synth_operations *synth_devs[MAX_SYNTH_DEV+MAX_MIDI_DEV];
  EXPORT_SYMBOL(synth_devs);
  
  int num_synths;
  
  struct midi_operations *midi_devs[MAX_MIDI_DEV];
  EXPORT_SYMBOL(midi_devs);
  
  int num_midis;
  EXPORT_SYMBOL(num_midis);
  
  struct sound_timer_operations *sound_timer_devs[MAX_TIMER_DEV] = {
  	&default_sound_timer, NULL
  };
  EXPORT_SYMBOL(sound_timer_devs);
  
  int num_sound_timers = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
47
48
49
50
51
52
53
54
55
56
57
  static int sound_alloc_audiodev(void);
  
  int sound_install_audiodrv(int vers, char *name, struct audio_driver *driver,
  			int driver_size, int flags, unsigned int format_mask,
  			void *devc, int dma1, int dma2)
  {
  	struct audio_driver *d;
  	struct audio_operations *op;
  	int num;
  
  	if (vers != AUDIO_DRIVER_VERSION || driver_size > sizeof(struct audio_driver)) {
  		printk(KERN_ERR "Sound: Incompatible audio driver for %s
  ", name);
9a303dc7b   Joe Perches   sound: Deparenthe...
58
  		return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
62
63
64
  	}
  	num = sound_alloc_audiodev();
  
  	if (num == -1) {
  		printk(KERN_ERR "sound: Too many audio drivers
  ");
9a303dc7b   Joe Perches   sound: Deparenthe...
65
  		return -EBUSY;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
  	}
  	d = (struct audio_driver *) (sound_mem_blocks[sound_nblocks] = vmalloc(sizeof(struct audio_driver)));
444c1953d   Dan Carpenter   sound: oss: off b...
68
69
70
  	sound_nblocks++;
  	if (sound_nblocks >= MAX_MEM_BLOCKS)
  		sound_nblocks = MAX_MEM_BLOCKS - 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71

f724bd240   Joe Perches   sound/oss/dev_tab...
72
  	op = (struct audio_operations *) (sound_mem_blocks[sound_nblocks] = vzalloc(sizeof(struct audio_operations)));
444c1953d   Dan Carpenter   sound: oss: off b...
73
74
75
  	sound_nblocks++;
  	if (sound_nblocks >= MAX_MEM_BLOCKS)
  		sound_nblocks = MAX_MEM_BLOCKS - 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
78
79
80
  	if (d == NULL || op == NULL) {
  		printk(KERN_ERR "Sound: Can't allocate driver for (%s)
  ", name);
  		sound_unload_audiodev(num);
9a303dc7b   Joe Perches   sound: Deparenthe...
81
  		return -ENOMEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
82
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  	init_waitqueue_head(&op->in_sleeper);
  	init_waitqueue_head(&op->out_sleeper);	
  	init_waitqueue_head(&op->poll_sleeper);
  	if (driver_size < sizeof(struct audio_driver))
  		memset((char *) d, 0, sizeof(struct audio_driver));
  
  	memcpy((char *) d, (char *) driver, driver_size);
  
  	op->d = d;
  	strlcpy(op->name, name, sizeof(op->name));
  	op->flags = flags;
  	op->format_mask = format_mask;
  	op->devc = devc;
  
  	/*
  	 *    Hardcoded defaults
  	 */
  	audio_devs[num] = op;
  
  	DMAbuf_init(num, dma1, dma2);
  
  	audio_init_devices();
  	return num;
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
107
  EXPORT_SYMBOL(sound_install_audiodrv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
  
  int sound_install_mixer(int vers, char *name, struct mixer_operations *driver,
  	int driver_size, void *devc)
  {
  	struct mixer_operations *op;
  
  	int n = sound_alloc_mixerdev();
  
  	if (n == -1) {
  		printk(KERN_ERR "Sound: Too many mixer drivers
  ");
  		return -EBUSY;
  	}
  	if (vers != MIXER_DRIVER_VERSION ||
  		driver_size > sizeof(struct mixer_operations)) {
  		printk(KERN_ERR "Sound: Incompatible mixer driver for %s
  ", name);
  		return -EINVAL;
  	}
  	
  	/* FIXME: This leaks a mixer_operations struct every time its called
  	   until you unload sound! */
  	   
f724bd240   Joe Perches   sound/oss/dev_tab...
131
  	op = (struct mixer_operations *) (sound_mem_blocks[sound_nblocks] = vzalloc(sizeof(struct mixer_operations)));
444c1953d   Dan Carpenter   sound: oss: off b...
132
133
134
  	sound_nblocks++;
  	if (sound_nblocks >= MAX_MEM_BLOCKS)
  		sound_nblocks = MAX_MEM_BLOCKS - 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
137
138
139
140
  	if (op == NULL) {
  		printk(KERN_ERR "Sound: Can't allocate mixer driver for (%s)
  ", name);
  		return -ENOMEM;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
142
143
144
145
146
147
148
  	memcpy((char *) op, (char *) driver, driver_size);
  
  	strlcpy(op->name, name, sizeof(op->name));
  	op->devc = devc;
  
  	mixer_devs[n] = op;
  	return n;
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
149
  EXPORT_SYMBOL(sound_install_mixer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
150
151
152
153
154
155
156
157
158
  
  void sound_unload_audiodev(int dev)
  {
  	if (dev != -1) {
  		DMAbuf_deinit(dev);
  		audio_devs[dev] = NULL;
  		unregister_sound_dsp((dev<<4)+3);
  	}
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
159
  EXPORT_SYMBOL(sound_unload_audiodev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
  
  static int sound_alloc_audiodev(void)
  { 
  	int i = register_sound_dsp(&oss_sound_fops, -1);
  	if(i==-1)
  		return i;
  	i>>=4;
  	if(i>=num_audiodevs)
  		num_audiodevs = i + 1;
  	return i;
  }
  
  int sound_alloc_mididev(void)
  {
  	int i = register_sound_midi(&oss_sound_fops, -1);
  	if(i==-1)
  		return i;
  	i>>=4;
  	if(i>=num_midis)
  		num_midis = i + 1;
  	return i;
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
182
  EXPORT_SYMBOL(sound_alloc_mididev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
184
185
186
187
188
189
190
191
192
193
194
195
196
  
  int sound_alloc_synthdev(void)
  {
  	int i;
  
  	for (i = 0; i < MAX_SYNTH_DEV; i++) {
  		if (synth_devs[i] == NULL) {
  			if (i >= num_synths)
  				num_synths++;
  			return i;
  		}
  	}
  	return -1;
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
197
  EXPORT_SYMBOL(sound_alloc_synthdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
199
200
201
202
203
204
205
206
207
208
  
  int sound_alloc_mixerdev(void)
  {
  	int i = register_sound_mixer(&oss_sound_fops, -1);
  	if(i==-1)
  		return -1;
  	i>>=4;
  	if(i>=num_mixers)
  		num_mixers = i + 1;
  	return i;
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
209
  EXPORT_SYMBOL(sound_alloc_mixerdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
210
211
212
213
214
215
216
217
218
219
220
221
222
223
  
  int sound_alloc_timerdev(void)
  {
  	int i;
  
  	for (i = 0; i < MAX_TIMER_DEV; i++) {
  		if (sound_timer_devs[i] == NULL) {
  			if (i >= num_sound_timers)
  				num_sound_timers++;
  			return i;
  		}
  	}
  	return -1;
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
224
  EXPORT_SYMBOL(sound_alloc_timerdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
226
227
228
229
230
231
232
233
  
  void sound_unload_mixerdev(int dev)
  {
  	if (dev != -1) {
  		mixer_devs[dev] = NULL;
  		unregister_sound_mixer(dev<<4);
  		num_mixers--;
  	}
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
234
  EXPORT_SYMBOL(sound_unload_mixerdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
236
237
238
239
240
241
242
  
  void sound_unload_mididev(int dev)
  {
  	if (dev != -1) {
  		midi_devs[dev] = NULL;
  		unregister_sound_midi((dev<<4)+2);
  	}
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
243
  EXPORT_SYMBOL(sound_unload_mididev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244
245
246
247
248
249
  
  void sound_unload_synthdev(int dev)
  {
  	if (dev != -1)
  		synth_devs[dev] = NULL;
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
250
  EXPORT_SYMBOL(sound_unload_synthdev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
252
253
254
255
256
  
  void sound_unload_timerdev(int dev)
  {
  	if (dev != -1)
  		sound_timer_devs[dev] = NULL;
  }
ece7f77b8   Adrian Bunk   [PATCH] kill soun...
257
  EXPORT_SYMBOL(sound_unload_timerdev);