20 #include <linux/timex.h>
29 #define PAS_PCM_INTRBITS (0x08)
38 static unsigned long pcm_speed;
39 static unsigned char pcm_channels = 1;
40 static unsigned char pcm_bits = 8;
41 static unsigned char pcm_filter;
42 static unsigned char pcm_mode =
PCM_NON;
43 static unsigned long pcm_count;
44 static unsigned short pcm_bitsok = 8;
51 static int pcm_set_speed(
int arg)
91 #if !defined NO_AUTO_FILTER_SET
93 if (pcm_speed >= 2 * 17897)
95 else if (pcm_speed >= 2 * 15909)
97 else if (pcm_speed >= 2 * 11931)
99 else if (pcm_speed >= 2 * 8948)
101 else if (pcm_speed >= 2 * 5965)
103 else if (pcm_speed >= 2 * 2982)
116 spin_unlock_irqrestore(&pas_lock, flags);
121 static int pcm_set_channels(
int arg)
124 if ((arg != 1) && (arg != 2))
127 if (arg != pcm_channels)
132 pcm_set_speed(pcm_speed);
137 static int pcm_set_bits(
int arg)
142 if ((arg & pcm_bitsok) != arg)
154 static int pas_audio_ioctl(
int dev,
unsigned int cmd,
void __user *arg)
159 DEB(
printk(
"pas2_pcm.c: static int pas_audio_ioctl(unsigned int cmd = %X, unsigned int arg = %X)\n", cmd, arg));
166 ret = pcm_set_speed(val);
176 ret = pcm_set_channels(val + 1) - 1;
182 ret = pcm_set_channels(val);
192 ret = pcm_set_bits(val);
205 static void pas_audio_reset(
int dev)
207 DEB(
printk(
"pas2_pcm.c: static void pas_audio_reset(void)\n"));
212 static int pas_audio_open(
int dev,
int mode)
217 DEB(
printk(
"pas2_pcm.c: static int pas_audio_open(int mode = %X)\n", mode));
222 spin_unlock_irqrestore(&pas_lock, flags);
226 spin_unlock_irqrestore(&pas_lock, flags);
238 static void pas_audio_close(
int dev)
242 DEB(
printk(
"pas2_pcm.c: static void pas_audio_close(void)\n"));
246 pas_audio_reset(dev);
251 spin_unlock_irqrestore(&pas_lock, flags);
254 static void pas_audio_output_block(
int dev,
unsigned long buf,
int count,
259 DEB(
printk(
"pas2_pcm.c: static void pas_audio_output_block(char *buf = %P, int count = %X)\n", buf, count));
280 if (count != pcm_count)
297 spin_unlock_irqrestore(&pas_lock, flags);
300 static void pas_audio_start_input(
int dev,
unsigned long buf,
int count,
306 DEB(
printk(
"pas2_pcm.c: static void pas_audio_start_input(char *buf = %P, int count = %X)\n", buf, count));
324 if (count != pcm_count)
341 spin_unlock_irqrestore(&pas_lock, flags);
345 static void pas_audio_trigger(
int dev,
int state)
359 spin_unlock_irqrestore(&pas_lock, flags);
363 static int pas_audio_prepare_for_input(
int dev,
int bsize,
int bcount)
365 pas_audio_reset(dev);
369 static int pas_audio_prepare_for_output(
int dev,
int bsize,
int bcount)
371 pas_audio_reset(dev);
378 .open = pas_audio_open,
379 .close = pas_audio_close,
380 .output_block = pas_audio_output_block,
381 .start_input = pas_audio_start_input,
382 .ioctl = pas_audio_ioctl,
383 .prepare_for_input = pas_audio_prepare_for_input,
384 .prepare_for_output = pas_audio_prepare_for_output,
385 .halt_io = pas_audio_reset,
386 .trigger = pas_audio_trigger
391 DEB(
printk(
"pas2_pcm.c: long pas_pcm_init()\n"));
400 "Pro Audio Spectrum",
407 hw_config->
dma)) < 0)