Pull one more egcs 1.1.2 workaround.
[linux-2.6/linux-mips.git] / sound / oss / rme96xx.c
blob9ad6e157c86b043131a6c7f715e587205e6350a4
1 /* (C) 2000 Guenter Geiger <geiger@debian.org>
2 with copy/pastes from the driver of Winfried Ritsch <ritsch@iem.kug.ac.at>
3 based on es1370.c
7 * 10 Jan 2001: 0.1 initial version
8 * 19 Jan 2001: 0.2 fixed bug in select()
9 * 27 Apr 2001: 0.3 more than one card usable
10 * 11 May 2001: 0.4 fixed for SMP, included into kernel source tree
11 * 17 May 2001: 0.5 draining code didn't work on new cards
12 * 18 May 2001: 0.6 remove synchronize_irq() call
13 * 10 Aug 2002: added synchronize_irq() again
15 TODO:
16 - test more than one card --- done
17 - check for pci IOREGION (see es1370) in rme96xx_probe ??
18 - error detection
19 - mmap interface
20 - mixer mmap interface
21 - mixer ioctl
22 - get rid of noise upon first open (why ??)
23 - allow multiple open(at least for read)
24 - allow multiple open for non overlapping regions
25 - recheck the multiple devices part (offsets of different devices, etc)
26 - do decent draining in _release --- done
27 - SMP support
30 #ifndef RMEVERSION
31 #define RMEVERSION "0.6"
32 #endif
34 #include <linux/version.h>
35 #include <linux/module.h>
36 #include <linux/string.h>
37 #include <linux/sched.h>
38 #include <linux/sound.h>
39 #include <linux/soundcard.h>
40 #include <linux/pci.h>
41 #include <linux/smp_lock.h>
42 #include <linux/delay.h>
43 #include <linux/slab.h>
44 #include <asm/dma.h>
45 #include <asm/hardirq.h>
46 #include <linux/init.h>
47 #include <linux/poll.h>
48 #include "rme96xx.h"
50 #define NR_DEVICE 2
52 static int devices = 1;
53 MODULE_PARM(devices, "1-" __MODULE_STRING(NR_DEVICE) "i");
54 MODULE_PARM_DESC(devices, "number of dsp devices allocated by the driver");
57 MODULE_AUTHOR("Guenter Geiger, geiger@debian.org");
58 MODULE_DESCRIPTION("RME9652/36 \"Hammerfall\" Driver");
59 MODULE_LICENSE("GPL");
62 #ifdef DEBUG
63 #define DBG(x) printk("RME_DEBUG:");x
64 #define COMM(x) printk("RME_COMM: " x "\n");
65 #else
66 #define DBG(x) while (0) {}
67 #define COMM(x)
68 #endif
70 /*--------------------------------------------------------------------------
71 Preporcessor Macros and Definitions
72 --------------------------------------------------------------------------*/
74 #define RME96xx_MAGIC 0x6473
76 /* Registers-Space in offsets from base address with 16MByte size */
78 #define RME96xx_IO_EXTENT 16l*1024l*1024l
79 #define RME96xx_CHANNELS_PER_CARD 26
81 /* Write - Register */
83 /* 0,4,8,12,16,20,24,28 ... hardware init (erasing fifo-pointer intern) */
84 #define RME96xx_num_of_init_regs 8
86 #define RME96xx_init_buffer (0/4)
87 #define RME96xx_play_buffer (32/4) /* pointer to 26x64kBit RAM from mainboard */
88 #define RME96xx_rec_buffer (36/4) /* pointer to 26x64kBit RAM from mainboard */
89 #define RME96xx_control_register (64/4) /* exact meaning see below */
90 #define RME96xx_irq_clear (96/4) /* irq acknowledge */
91 #define RME96xx_time_code (100/4) /* if used with alesis adat */
92 #define RME96xx_thru_base (128/4) /* 132...228 Thru for 26 channels */
93 #define RME96xx_thru_channels RME96xx_CHANNELS_PER_CARD
95 /* Read Register */
97 #define RME96xx_status_register 0 /* meaning see below */
101 /* Status Register: */
102 /* ------------------------------------------------------------------------ */
103 #define RME96xx_IRQ 0x0000001 /* IRQ is High if not reset by RMExx_irq_clear */
104 #define RME96xx_lock_2 0x0000002 /* ADAT 3-PLL: 1=locked, 0=unlocked */
105 #define RME96xx_lock_1 0x0000004 /* ADAT 2-PLL: 1=locked, 0=unlocked */
106 #define RME96xx_lock_0 0x0000008 /* ADAT 1-PLL: 1=locked, 0=unlocked */
108 #define RME96xx_fs48 0x0000010 /* sample rate 0 ...44.1/88.2, 1 ... 48/96 Khz */
109 #define RME96xx_wsel_rd 0x0000020 /* if Word-Clock is used and valid then 1 */
110 #define RME96xx_buf_pos1 0x0000040 /* Bit 6..15 : Position of buffer-pointer in 64Bytes-blocks */
111 #define RME96xx_buf_pos2 0x0000080 /* resolution +/- 1 64Byte/block (since 64Bytes bursts) */
113 #define RME96xx_buf_pos3 0x0000100 /* 10 bits = 1024 values */
114 #define RME96xx_buf_pos4 0x0000200 /* if we mask off the first 6 bits, we can take the status */
115 #define RME96xx_buf_pos5 0x0000400 /* register as sample counter in the hardware buffer */
116 #define RME96xx_buf_pos6 0x0000800
118 #define RME96xx_buf_pos7 0x0001000
119 #define RME96xx_buf_pos8 0x0002000
120 #define RME96xx_buf_pos9 0x0004000
121 #define RME96xx_buf_pos10 0x0008000
123 #define RME96xx_sync_2 0x0010000 /* if ADAT-IN3 synced to system clock */
124 #define RME96xx_sync_1 0x0020000 /* if ADAT-IN2 synced to system clock */
125 #define RME96xx_sync_0 0x0040000 /* if ADAT-IN1 synced to system clock */
126 #define RME96xx_DS_rd 0x0080000 /* 1=Double Speed, 0=Normal Speed */
128 #define RME96xx_tc_busy 0x0100000 /* 1=time-code copy in progress (960ms) */
129 #define RME96xx_tc_out 0x0200000 /* time-code out bit */
130 #define RME96xx_F_0 0x0400000 /* 000=64kHz, 100=88.2kHz, 011=96kHz */
131 #define RME96xx_F_1 0x0800000 /* 111=32kHz, 110=44.1kHz, 101=48kHz, */
133 #define RME96xx_F_2 0x1000000 /* od external Crystal Chip if ERF=1*/
134 #define RME96xx_ERF 0x2000000 /* Error-Flag of SDPIF Receiver (1=No Lock)*/
135 #define RME96xx_buffer_id 0x4000000 /* toggles by each interrupt on rec/play */
136 #define RME96xx_tc_valid 0x8000000 /* 1 = a signal is detected on time-code input */
138 /* Status Register Fields */
140 #define RME96xx_lock (RME96xx_lock_0|RME96xx_lock_1|RME96xx_lock_2)
141 #define RME96xx_buf_pos 0x000FFC0
142 #define RME96xx_sync (RME96xx_sync_0|RME96xx_sync_1|RME96xx_sync_2)
143 #define RME96xx_F (RME96xx_F_0|RME96xx_F_1|RME96xx_F_2)
147 /* Control-Register: */
148 /*--------------------------------------------------------------------------------*/
150 #define RME96xx_start_bit 0x0001 /* start record/play */
151 #define RME96xx_latency0 0x0002 /* Bit 0 - Buffer size or latency */
152 #define RME96xx_latency1 0x0004 /* Bit 1 - Buffer size or latency */
153 #define RME96xx_latency2 0x0008 /* Bit 2 - Buffer size or latency */
155 #define RME96xx_Master 0x0010 /* Clock Mode Master=1,Slave/Auto=0 */
156 #define RME96xx_IE 0x0020 /* Interupt Enable */
157 #define RME96xx_freq 0x0040 /* samplerate 0=44.1/88.2, 1=48/96 kHz*/
160 #define RME96xx_DS 0x0100 /* Doule Speed 0=44.1/48, 1=88.2/96 Khz */
161 #define RME96xx_PRO 0x0200 /* spdif 0=consumer, 1=professional Mode*/
162 #define RME96xx_EMP 0x0400 /* spdif Emphasis 0=None, 1=ON */
163 #define RME96xx_Dolby 0x0800 /* spdif Non-audio bit 1=set, 0=unset */
165 #define RME96xx_opt_out 0x1000 /* Use 1st optical OUT as SPDIF: 1=yes,0=no */
166 #define RME96xx_wsel 0x2000 /* use Wordclock as sync (overwrites master)*/
167 #define RME96xx_inp_0 0x4000 /* SPDIF-IN: 00=optical (ADAT1), */
168 #define RME96xx_inp_1 0x8000 /* 01=koaxial (Cinch), 10=Internal CDROM*/
170 #define RME96xx_SyncRef0 0x10000 /* preferred sync-source in autosync */
171 #define RME96xx_SyncRef1 0x20000 /* 00=ADAT1,01=ADAT2,10=ADAT3,11=SPDIF */
174 #define RME96xx_ctrl_init (RME96xx_latency0 |\
175 RME96xx_Master |\
176 RME96xx_inp_1)
180 /* Control register fields and shortcuts */
182 #define RME96xx_latency (RME96xx_latency0|RME96xx_latency1|RME96xx_latency2)
183 #define RME96xx_inp (RME96xx_inp_0|RME96xx_inp_1)
184 #define RME96xx_SyncRef (RME96xx_SyncRef0|RME96xx_SyncRef1)
185 /* latency = 512Bytes * 2^n, where n is made from Bit3 ... Bit0 */
187 #define RME96xx_SET_LATENCY(x) (((x)&0x7)<<1)
188 #define RME96xx_GET_LATENCY(x) (((x)>>1)&0x7)
189 #define RME96xx_SET_inp(x) (((x)&0x3)<<14)
190 #define RME96xx_GET_inp(x) (((x)>>14)&0x3)
191 #define RME96xx_SET_SyncRef(x) (((x)&0x3)<<17)
192 #define RME96xx_GET_SyncRef(x) (((x)>>17)&0x3)
195 /* buffer sizes */
196 #define RME96xx_BYTES_PER_SAMPLE 4 /* sizeof(u32) */
197 #define RME_16K 16*1024
199 #define RME96xx_DMA_MAX_SAMPLES (RME_16K)
200 #define RME96xx_DMA_MAX_SIZE (RME_16K * RME96xx_BYTES_PER_SAMPLE)
201 #define RME96xx_DMA_MAX_SIZE_ALL (RME96xx_DMA_MAX_SIZE * RME96xx_CHANNELS_PER_CARD)
203 #define RME96xx_NUM_OF_FRAGMENTS 2
204 #define RME96xx_FRAGMENT_MAX_SIZE (RME96xx_DMA_MAX_SIZE/2)
205 #define RME96xx_FRAGMENT_MAX_SAMPLES (RME96xx_DMA_MAX_SAMPLES/2)
206 #define RME96xx_MAX_LATENCY 7 /* 16k samples */
209 #define RME96xx_MAX_DEVS 4 /* we provide some OSS stereodevs */
211 #define RME_MESS "rme96xx:"
212 /*------------------------------------------------------------------------
213 Types, struct and function declarations
214 ------------------------------------------------------------------------*/
217 /* --------------------------------------------------------------------- */
219 static const char invalid_magic[] = KERN_CRIT RME_MESS" invalid magic value\n";
221 #define VALIDATE_STATE(s) \
222 ({ \
223 if (!(s) || (s)->magic != RME96xx_MAGIC) { \
224 printk(invalid_magic); \
225 return -ENXIO; \
229 /* --------------------------------------------------------------------- */
232 static struct file_operations rme96xx_audio_fops;
233 static struct file_operations rme96xx_mixer_fops;
234 static int numcards;
236 typedef int32_t raw_sample_t;
238 typedef struct _rme96xx_info {
240 /* hardware settings */
241 int magic;
242 struct pci_dev * pcidev; /* pci_dev structure */
243 unsigned long *iobase;
244 unsigned int irq;
246 /* list of rme96xx devices */
247 struct list_head devs;
249 spinlock_t lock;
251 u32 *recbuf; /* memory for rec buffer */
252 u32 *playbuf; /* memory for play buffer */
254 u32 control_register;
256 u32 thru_bits; /* thru 1=on, 0=off channel 1=Bit1... channel 26= Bit26 */
258 int open_count;
261 int rate;
262 int latency;
263 unsigned int fragsize;
264 int started;
266 int hwptr; /* can be negativ because of pci burst offset */
267 unsigned int hwbufid; /* set by interrupt, buffer which is written/read now */
269 struct dmabuf {
271 unsigned int format;
272 int formatshift;
273 int inchannels; /* number of channels for device */
274 int outchannels; /* number of channels for device */
275 int mono; /* if true, we play mono on 2 channels */
276 int inoffset; /* which channel is considered the first one */
277 int outoffset;
279 /* state */
280 int opened; /* open() made */
281 int started; /* first write/read */
282 int mmapped; /* mmap */
283 int open_mode;
285 struct _rme96xx_info *s;
287 /* pointer to read/write position in buffer */
288 unsigned readptr;
289 unsigned writeptr;
291 unsigned error; /* over/underruns cleared on sync again */
293 /* waiting and locking */
294 wait_queue_head_t wait;
295 struct semaphore open_sem;
296 wait_queue_head_t open_wait;
298 } dma[RME96xx_MAX_DEVS];
300 int dspnum[RME96xx_MAX_DEVS]; /* register with sound subsystem */
301 int mixer; /* register with sound subsystem */
302 } rme96xx_info;
305 /* fiddling with the card (first level hardware control) */
307 inline void rme96xx_set_ctrl(rme96xx_info* s,int mask)
310 s->control_register|=mask;
311 writel(s->control_register,s->iobase + RME96xx_control_register);
315 inline void rme96xx_unset_ctrl(rme96xx_info* s,int mask)
318 s->control_register&=(~mask);
319 writel(s->control_register,s->iobase + RME96xx_control_register);
325 /* the hwbuf in the status register seems to have some jitter, to get rid of
326 it, we first only let the numbers grow, to be on the secure side we
327 subtract a certain amount RME96xx_BURSTBYTES from the resulting number */
329 /* the function returns the hardware pointer in bytes */
330 #define RME96xx_BURSTBYTES -64 /* bytes by which hwptr could be off */
332 inline int rme96xx_gethwptr(rme96xx_info* s,int exact)
334 long flags;
335 if (exact) {
336 unsigned int hwp;
337 /* the hwptr seems to be rather unreliable :(, so we don't use it */
338 spin_lock_irqsave(&s->lock,flags);
340 hwp = readl(s->iobase + RME96xx_status_register) & 0xffc0;
341 s->hwptr = (hwp < s->hwptr) ? s->hwptr : hwp;
342 // s->hwptr = hwp;
344 spin_unlock_irqrestore(&s->lock,flags);
345 return (s->hwptr+RME96xx_BURSTBYTES) & ((s->fragsize<<1)-1);
347 return (s->hwbufid ? s->fragsize : 0);
350 inline void rme96xx_setlatency(rme96xx_info* s,int l)
352 s->latency = l;
353 s->fragsize = 1<<(8+l);
354 rme96xx_unset_ctrl(s,RME96xx_latency);
355 rme96xx_set_ctrl(s,RME96xx_SET_LATENCY(l));
359 static void rme96xx_clearbufs(struct dmabuf* dma)
361 int i,j;
362 unsigned long flags;
364 /* clear dmabufs */
365 for(i=0;i<devices;i++) {
366 for (j=0;j<dma->outchannels + dma->mono;j++)
367 memset(&dma->s->playbuf[(dma->outoffset + j)*RME96xx_DMA_MAX_SAMPLES],
368 0, RME96xx_DMA_MAX_SIZE);
370 spin_lock_irqsave(&dma->s->lock,flags);
371 dma->writeptr = 0;
372 dma->readptr = 0;
373 spin_unlock_irqrestore(&dma->s->lock,flags);
376 static int rme96xx_startcard(rme96xx_info *s,int stop)
378 int i;
379 long flags;
381 COMM ("startcard");
382 if(s->control_register & RME96xx_IE){
383 /* disable interrupt first */
385 rme96xx_unset_ctrl( s,RME96xx_start_bit );
386 udelay(10);
387 rme96xx_unset_ctrl( s,RME96xx_IE);
388 spin_lock_irqsave(&s->lock,flags); /* timing is critical */
389 s->started = 0;
390 spin_unlock_irqrestore(&s->lock,flags);
391 if (stop) {
392 COMM("Sound card stopped");
393 return 1;
396 COMM ("interupt disabled");
397 /* first initialize all pointers on card */
398 for(i=0;i<RME96xx_num_of_init_regs;i++){
399 writel(0,s->iobase + i);
400 udelay(10); /* ?? */
402 COMM ("regs cleaned");
404 spin_lock_irqsave(&s->lock,flags); /* timing is critical */
405 udelay(10);
406 s->started = 1;
407 s->hwptr = 0;
408 spin_unlock_irqrestore(&s->lock,flags);
410 rme96xx_set_ctrl( s, RME96xx_IE | RME96xx_start_bit);
413 COMM("Sound card started");
415 return 1;
419 inline int rme96xx_getospace(struct dmabuf * dma, unsigned int hwp)
421 int cnt;
422 int swptr;
423 unsigned long flags;
425 spin_lock_irqsave(&dma->s->lock,flags);
426 swptr = dma->writeptr;
427 cnt = (hwp - swptr);
429 if (cnt < 0) {
430 cnt = ((dma->s->fragsize<<1) - swptr);
432 spin_unlock_irqrestore(&dma->s->lock,flags);
433 return cnt;
436 inline int rme96xx_getispace(struct dmabuf * dma, unsigned int hwp)
438 int cnt;
439 int swptr;
440 unsigned long flags;
442 spin_lock_irqsave(&dma->s->lock,flags);
443 swptr = dma->readptr;
444 cnt = (hwp - swptr);
446 if (cnt < 0) {
447 cnt = ((dma->s->fragsize<<1) - swptr);
449 spin_unlock_irqrestore(&dma->s->lock,flags);
450 return cnt;
454 inline int rme96xx_copyfromuser(struct dmabuf* dma,const char* buffer,int count,int hop)
456 int swptr = dma->writeptr;
457 switch (dma->format) {
458 case AFMT_S32_BLOCKED:
460 char* buf = (char*)buffer;
461 int cnt = count/dma->outchannels;
462 int i;
463 for (i=0;i < dma->outchannels;i++) {
464 char* hwbuf =(char*) &dma->s->playbuf[(dma->outoffset + i)*RME96xx_DMA_MAX_SAMPLES];
465 hwbuf+=swptr;
467 if (copy_from_user(hwbuf,buf, cnt))
468 return -1;
469 buf+=hop;
471 swptr+=cnt;
472 break;
474 case AFMT_S16_LE:
476 int i,j;
477 int cnt = count/dma->outchannels;
478 for (i=0;i < dma->outchannels + dma->mono;i++) {
479 short* sbuf = (short*)buffer + i*(!dma->mono);
480 short* hwbuf =(short*) &dma->s->playbuf[(dma->outoffset + i)*RME96xx_DMA_MAX_SAMPLES];
481 hwbuf+=(swptr>>1);
482 for (j=0;j<(cnt>>1);j++) {
483 hwbuf++; /* skip the low 16 bits */
484 __get_user(*hwbuf++,sbuf++);
485 sbuf+=(dma->outchannels-1);
488 swptr += (cnt<<1);
489 break;
491 default:
492 printk(RME_MESS" unsupported format\n");
493 return -1;
494 } /* switch */
496 swptr&=((dma->s->fragsize<<1) -1);
497 dma->writeptr = swptr;
499 return 0;
502 /* The count argument is the number of bytes */
503 inline int rme96xx_copytouser(struct dmabuf* dma,const char* buffer,int count,int hop)
505 int swptr = dma->readptr;
506 switch (dma->format) {
507 case AFMT_S32_BLOCKED:
509 char* buf = (char*)buffer;
510 int cnt = count/dma->inchannels;
511 int i;
513 for (i=0;i < dma->inchannels;i++) {
514 char* hwbuf =(char*) &dma->s->recbuf[(dma->inoffset + i)*RME96xx_DMA_MAX_SAMPLES];
515 hwbuf+=swptr;
517 if (copy_to_user(buf,hwbuf,cnt))
518 return -1;
519 buf+=hop;
521 swptr+=cnt;
522 break;
524 case AFMT_S16_LE:
526 int i,j;
527 int cnt = count/dma->inchannels;
528 for (i=0;i < dma->inchannels;i++) {
529 short* sbuf = (short*)buffer + i;
530 short* hwbuf =(short*) &dma->s->recbuf[(dma->inoffset + i)*RME96xx_DMA_MAX_SAMPLES];
531 hwbuf+=(swptr>>1);
532 for (j=0;j<(cnt>>1);j++) {
533 hwbuf++;
534 __put_user(*hwbuf++,sbuf++);
535 sbuf+=(dma->inchannels-1);
538 swptr += (cnt<<1);
539 break;
541 default:
542 printk(RME_MESS" unsupported format\n");
543 return -1;
544 } /* switch */
546 swptr&=((dma->s->fragsize<<1) -1);
547 dma->readptr = swptr;
548 return 0;
552 static void rme96xx_interrupt(int irq, void *dev_id, struct pt_regs *regs)
554 int i;
555 rme96xx_info *s = (rme96xx_info *)dev_id;
556 struct dmabuf *db;
557 u32 status;
558 unsigned long flags;
560 status = readl(s->iobase + RME96xx_status_register);
561 if (!(status & RME96xx_IRQ)) {
562 return;
565 spin_lock_irqsave(&s->lock,flags);
566 writel(0,s->iobase + RME96xx_irq_clear);
568 s->hwbufid = (status & RME96xx_buffer_id)>>26;
569 if ((status & 0xffc0) <= 256) s->hwptr = 0;
570 for(i=0;i<devices;i++)
572 db = &(s->dma[i]);
573 if(db->started > 0)
574 wake_up(&(db->wait));
576 spin_unlock_irqrestore(&s->lock,flags);
581 /*----------------------------------------------------------------------------
582 PCI detection and module initialization stuff
583 ----------------------------------------------------------------------------*/
585 void* busmaster_malloc(int size) {
586 int pg; /* 2 s exponent of memory size */
587 char *buf;
589 DBG(printk("kernel malloc pages ..\n"));
591 for (pg = 0; PAGE_SIZE * (1 << pg) < size; pg++);
593 buf = (char *) __get_free_pages(GFP_KERNEL | GFP_DMA, pg);
595 if (buf) {
596 struct page* page, *last_page;
598 page = virt_to_page(buf);
599 last_page = virt_to_page(buf + (1 << pg));
600 DBG(printk("setting reserved bit\n"));
601 while (page < last_page) {
602 SetPageReserved(page);
603 page++;
605 return buf;
607 DBG(printk("allocated %ld",(long)buf));
608 return NULL;
611 void busmaster_free(void* ptr,int size) {
612 int pg;
613 struct page* page, *last_page;
615 if (ptr == NULL)
616 return;
618 for (pg = 0; PAGE_SIZE * (1 << pg) < size; pg++);
620 page = virt_to_page(ptr);
621 last_page = page + (1 << pg);
622 while (page < last_page) {
623 ClearPageReserved(page);
624 page++;
626 DBG(printk("freeing pages\n"));
627 free_pages((unsigned long) ptr, pg);
628 DBG(printk("done\n"));
631 /* initialize those parts of the info structure which are not pci detectable resources */
633 static int rme96xx_dmabuf_init(rme96xx_info * s,struct dmabuf* dma,int ioffset,int ooffset) {
635 init_MUTEX(&dma->open_sem);
636 init_waitqueue_head(&dma->open_wait);
637 init_waitqueue_head(&dma->wait);
638 dma->s = s;
639 dma->error = 0;
641 dma->format = AFMT_S32_BLOCKED;
642 dma->formatshift = 0;
643 dma->inchannels = dma->outchannels = 1;
644 dma->inoffset = ioffset;
645 dma->outoffset = ooffset;
647 dma->opened=0;
648 dma->started=0;
649 dma->mmapped=0;
650 dma->open_mode=0;
651 dma->mono=0;
653 rme96xx_clearbufs(dma);
654 return 0;
658 int rme96xx_init(rme96xx_info* s)
660 int i;
661 DBG(printk(__FUNCTION__"\n"));
662 numcards++;
664 s->magic = RME96xx_MAGIC;
666 spin_lock_init(&s->lock);
668 COMM ("setup busmaster memory")
669 s->recbuf = busmaster_malloc(RME96xx_DMA_MAX_SIZE_ALL);
670 s->playbuf = busmaster_malloc(RME96xx_DMA_MAX_SIZE_ALL);
672 if (!s->recbuf || !s->playbuf) {
673 printk(KERN_ERR RME_MESS" Unable to allocate busmaster memory\n");
674 return -ENODEV;
677 COMM ("setting rec and playbuffers")
679 writel((u32) virt_to_bus(s->recbuf),s->iobase + RME96xx_rec_buffer);
680 writel((u32) virt_to_bus(s->playbuf),s->iobase + RME96xx_play_buffer);
682 COMM ("initializing control register")
683 rme96xx_unset_ctrl(s,0xffffffff);
684 rme96xx_set_ctrl(s,RME96xx_ctrl_init);
687 COMM ("setup devices")
688 for (i=0;i < devices;i++) {
689 struct dmabuf * dma = &s->dma[i];
690 rme96xx_dmabuf_init(s,dma,2*i,2*i);
693 s->started = 0;
694 rme96xx_setlatency(s,7);
696 printk(KERN_INFO RME_MESS" card %d initialized\n",numcards);
697 return 0;
701 /* open uses this to figure out which device was opened .. this seems to be
702 unnecessary complex */
704 static LIST_HEAD(devs);
706 static int __devinit rme96xx_probe(struct pci_dev *pcidev, const struct pci_device_id *pciid)
708 int i;
709 rme96xx_info *s;
711 DBG(printk(__FUNCTION__"\n"));
713 if (pcidev->irq == 0)
714 return -1;
715 if (!pci_dma_supported(pcidev, 0xffffffff)) {
716 printk(KERN_WARNING RME_MESS" architecture does not support 32bit PCI busmaster DMA\n");
717 return -1;
719 if (!(s = kmalloc(sizeof(rme96xx_info), GFP_KERNEL))) {
720 printk(KERN_WARNING RME_MESS" out of memory\n");
721 return -1;
723 memset(s, 0, sizeof(rme96xx_info));
725 s->pcidev = pcidev;
726 s->iobase = ioremap(pci_resource_start(pcidev, 0),RME96xx_IO_EXTENT);
727 s->irq = pcidev->irq;
729 DBG(printk("remapped iobase: %lx irq %d\n",(long)s->iobase,s->irq));
731 if (pci_enable_device(pcidev))
732 goto err_irq;
733 if (request_irq(s->irq, rme96xx_interrupt, SA_SHIRQ, "es1370", s)) {
734 printk(KERN_ERR RME_MESS" irq %u in use\n", s->irq);
735 goto err_irq;
738 /* initialize the card */
740 i = 0;
741 if (rme96xx_init(s) < 0) {
742 printk(KERN_ERR RME_MESS" initialization failed\n");
743 goto err_devices;
745 for (i=0;i<devices;i++) {
746 if ((s->dspnum[i] = register_sound_dsp(&rme96xx_audio_fops, -1)) < 0)
747 goto err_devices;
750 if ((s->mixer = register_sound_mixer(&rme96xx_mixer_fops, -1)) < 0)
751 goto err_devices;
753 pci_set_drvdata(pcidev, s);
754 pcidev->dma_mask = 0xffffffff; /* ????? */
755 /* put it into driver list */
756 list_add_tail(&s->devs, &devs);
758 DBG(printk("initialization successful\n"));
759 return 0;
761 /* error handler */
762 err_devices:
763 while (i--)
764 unregister_sound_dsp(s->dspnum[i]);
765 free_irq(s->irq,s);
766 err_irq:
767 kfree(s);
768 return -1;
772 static void __devinit rme96xx_remove(struct pci_dev *dev)
774 int i;
775 rme96xx_info *s = pci_get_drvdata(dev);
777 if (!s) {
778 printk(KERN_ERR"device structure not valid\n");
779 return ;
782 if (s->started) rme96xx_startcard(s,0);
784 i = devices;
785 while (i) {
786 i--;
787 unregister_sound_dsp(s->dspnum[i]);
790 unregister_sound_mixer(s->mixer);
791 synchronize_irq(s->irq);
792 free_irq(s->irq,s);
793 busmaster_free(s->recbuf,RME96xx_DMA_MAX_SIZE_ALL);
794 busmaster_free(s->playbuf,RME96xx_DMA_MAX_SIZE_ALL);
795 kfree(s);
796 pci_set_drvdata(dev, NULL);
800 #ifndef PCI_VENDOR_ID_RME
801 #define PCI_VENDOR_ID_RME 0x10ee
802 #endif
803 #ifndef PCI_DEVICE_ID_RME9652
804 #define PCI_DEVICE_ID_RME9652 0x3fc4
805 #endif
806 #ifndef PCI_ANY_ID
807 #define PCI_ANY_ID 0
808 #endif
810 static struct pci_device_id id_table[] __devinitdata = {
811 { PCI_VENDOR_ID_RME, PCI_DEVICE_ID_RME9652, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
812 { 0, }
815 MODULE_DEVICE_TABLE(pci, id_table);
817 static struct pci_driver rme96xx_driver = {
818 name: "rme96xx",
819 id_table: id_table,
820 probe: rme96xx_probe,
821 remove: rme96xx_remove
824 static int __init init_rme96xx(void)
827 if (!pci_present()) /* No PCI bus in this machine! */
828 return -ENODEV;
829 printk(KERN_INFO RME_MESS" version "RMEVERSION" time " __TIME__ " " __DATE__ "\n");
830 printk(KERN_INFO RME_MESS" reserving %d dsp device(s)\n",devices);
831 numcards = 0;
832 return pci_module_init(&rme96xx_driver);
835 static void __exit cleanup_rme96xx(void)
837 printk(KERN_INFO RME_MESS" unloading\n");
838 pci_unregister_driver(&rme96xx_driver);
841 module_init(init_rme96xx);
842 module_exit(cleanup_rme96xx);
848 /*--------------------------------------------------------------------------
849 Implementation of file operations
850 ---------------------------------------------------------------------------*/
852 #define RME96xx_FMT (AFMT_S16_LE|AFMT_U8|AFMT_S32_BLOCKED)
855 static int rme96xx_ioctl(struct inode *in, struct file *file,
856 unsigned int cmd, unsigned long arg)
860 struct dmabuf * dma = (struct dmabuf *)file->private_data;
861 rme96xx_info *s = dma->s;
862 unsigned long flags;
863 audio_buf_info abinfo;
864 count_info cinfo;
865 int count;
866 int val = 0;
868 VALIDATE_STATE(s);
870 DBG(printk("ioctl %ud\n",cmd));
872 switch (cmd) {
873 case OSS_GETVERSION:
874 return put_user(SOUND_VERSION, (int *)arg);
876 case SNDCTL_DSP_SYNC:
877 #if 0
878 if (file->f_mode & FMODE_WRITE)
879 return drain_dac2(s, 0/*file->f_flags & O_NONBLOCK*/);
880 #endif
881 return 0;
883 case SNDCTL_DSP_SETDUPLEX:
884 return 0;
886 case SNDCTL_DSP_GETCAPS:
887 return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP, (int *)arg);
889 case SNDCTL_DSP_RESET:
890 // rme96xx_clearbufs(dma);
891 return 0;
893 case SNDCTL_DSP_SPEED:
894 if (get_user(val, (int *)arg))
895 return -EFAULT;
896 if (val >= 0) {
897 /* generally it's not a problem if we change the speed
898 if (dma->open_mode & (~file->f_mode) & (FMODE_READ|FMODE_WRITE))
899 return -EINVAL;
901 spin_lock_irqsave(&s->lock, flags);
903 switch (val) {
904 case 44100:
905 case 88200:
906 rme96xx_unset_ctrl(s,RME96xx_freq);
907 break;
908 case 48000:
909 case 96000:
910 rme96xx_set_ctrl(s,RME96xx_freq);
911 break;
912 default:
913 rme96xx_unset_ctrl(s,RME96xx_freq);
914 val = 44100;
916 if (val > 50000)
917 rme96xx_set_ctrl(s,RME96xx_DS);
918 else
919 rme96xx_unset_ctrl(s,RME96xx_DS);
920 s->rate = val;
921 spin_unlock_irqrestore(&s->lock, flags);
923 DBG(printk("speed set to %d\n",val));
924 return put_user(val, (int *)arg);
926 case SNDCTL_DSP_STEREO: /* this plays a mono file on two channels */
927 if (get_user(val, (int *)arg))
928 return -EFAULT;
930 if (!val) {
931 DBG(printk("setting to mono\n"));
932 dma->mono=1;
933 dma->inchannels = 1;
934 dma->outchannels = 1;
936 else {
937 DBG(printk("setting to stereo\n"));
938 dma->mono = 0;
939 dma->inchannels = 2;
940 dma->outchannels = 2;
942 return 0;
943 case SNDCTL_DSP_CHANNELS:
944 /* remember to check for resonable offset/channel pairs here */
945 if (get_user(val, (int *)arg))
946 return -EFAULT;
948 if (file->f_mode & FMODE_WRITE) {
949 if (val > 0 && (dma->outoffset + val) <= RME96xx_CHANNELS_PER_CARD)
950 dma->outchannels = val;
951 else
952 dma->outchannels = val = 2;
953 DBG(printk("setting to outchannels %d\n",val));
955 if (file->f_mode & FMODE_READ) {
956 if (val > 0 && (dma->inoffset + val) <= RME96xx_CHANNELS_PER_CARD)
957 dma->inchannels = val;
958 else
959 dma->inchannels = val = 2;
960 DBG(printk("setting to inchannels %d\n",val));
963 dma->mono=0;
965 return put_user(val, (int *)arg);
967 case SNDCTL_DSP_GETFMTS: /* Returns a mask */
968 return put_user(RME96xx_FMT, (int *)arg);
970 case SNDCTL_DSP_SETFMT: /* Selects ONE fmt*/
971 DBG(printk("setting to format %x\n",val));
972 if (get_user(val, (int *)arg))
973 return -EFAULT;
974 if (val != AFMT_QUERY) {
975 if (val & RME96xx_FMT)
976 dma->format = val;
977 switch (dma->format) {
978 case AFMT_S16_LE:
979 dma->formatshift=1;
980 break;
981 case AFMT_S32_BLOCKED:
982 dma->formatshift=0;
983 break;
986 return put_user(dma->format, (int *)arg);
988 case SNDCTL_DSP_POST:
989 return 0;
991 case SNDCTL_DSP_GETTRIGGER:
992 val = 0;
993 #if 0
994 if (file->f_mode & FMODE_READ && s->ctrl & CTRL_ADC_EN)
995 val |= PCM_ENABLE_INPUT;
996 if (file->f_mode & FMODE_WRITE && s->ctrl & CTRL_DAC2_EN)
997 val |= PCM_ENABLE_OUTPUT;
998 #endif
999 return put_user(val, (int *)arg);
1001 case SNDCTL_DSP_SETTRIGGER:
1002 if (get_user(val, (int *)arg))
1003 return -EFAULT;
1004 #if 0
1005 if (file->f_mode & FMODE_READ) {
1006 if (val & PCM_ENABLE_INPUT) {
1007 if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
1008 return ret;
1009 start_adc(s);
1010 } else
1011 stop_adc(s);
1013 if (file->f_mode & FMODE_WRITE) {
1014 if (val & PCM_ENABLE_OUTPUT) {
1015 if (!s->dma_dac2.ready && (ret = prog_dmabuf_dac2(s)))
1016 return ret;
1017 start_dac2(s);
1018 } else
1019 stop_dac2(s);
1021 #endif
1022 return 0;
1024 case SNDCTL_DSP_GETOSPACE:
1025 if (!(file->f_mode & FMODE_WRITE))
1026 return -EINVAL;
1028 val = rme96xx_gethwptr(dma->s,0);
1031 count = rme96xx_getospace(dma,val);
1032 if (!s->started) count = s->fragsize*2;
1033 abinfo.fragsize =(s->fragsize*dma->outchannels)>>dma->formatshift;
1034 abinfo.bytes = (count*dma->outchannels)>>dma->formatshift;
1035 abinfo.fragstotal = 2;
1036 abinfo.fragments = (count > s->fragsize);
1038 return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
1040 case SNDCTL_DSP_GETISPACE:
1041 if (!(file->f_mode & FMODE_READ))
1042 return -EINVAL;
1044 val = rme96xx_gethwptr(dma->s,0);
1046 count = rme96xx_getispace(dma,val);
1048 abinfo.fragsize = (s->fragsize*dma->inchannels)>>dma->formatshift;
1049 abinfo.bytes = (count*dma->inchannels)>>dma->formatshift;;
1050 abinfo.fragstotal = 2;
1051 abinfo.fragments = count > s->fragsize;
1052 return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
1054 case SNDCTL_DSP_NONBLOCK:
1055 file->f_flags |= O_NONBLOCK;
1056 return 0;
1058 case SNDCTL_DSP_GETODELAY: /* What shold this exactly do ? ,
1059 ATM it is just abinfo.bytes */
1060 if (!(file->f_mode & FMODE_WRITE))
1061 return -EINVAL;
1063 val = rme96xx_gethwptr(dma->s,0);
1064 count = val - dma->readptr;
1065 if (count < 0)
1066 count += s->fragsize<<1;
1068 return put_user(count, (int *)arg);
1071 /* check out how to use mmaped mode (can only be blocked !!!) */
1072 case SNDCTL_DSP_GETIPTR:
1073 if (!(file->f_mode & FMODE_READ))
1074 return -EINVAL;
1075 val = rme96xx_gethwptr(dma->s,0);
1076 spin_lock_irqsave(&s->lock,flags);
1077 cinfo.bytes = s->fragsize<<1;;
1078 count = val - dma->readptr;
1079 if (count < 0)
1080 count += s->fragsize<<1;
1082 cinfo.blocks = (count > s->fragsize);
1083 cinfo.ptr = val;
1084 if (dma->mmapped)
1085 dma->readptr &= s->fragsize<<1;
1086 spin_unlock_irqrestore(&s->lock,flags);
1088 if (copy_to_user((void *)arg, &cinfo, sizeof(cinfo)))
1089 return -EFAULT;
1090 return 0;
1092 case SNDCTL_DSP_GETOPTR:
1093 if (!(file->f_mode & FMODE_READ))
1094 return -EINVAL;
1095 val = rme96xx_gethwptr(dma->s,0);
1096 spin_lock_irqsave(&s->lock,flags);
1097 cinfo.bytes = s->fragsize<<1;;
1098 count = val - dma->writeptr;
1099 if (count < 0)
1100 count += s->fragsize<<1;
1102 cinfo.blocks = (count > s->fragsize);
1103 cinfo.ptr = val;
1104 if (dma->mmapped)
1105 dma->writeptr &= s->fragsize<<1;
1106 spin_unlock_irqrestore(&s->lock,flags);
1107 if (copy_to_user((void *)arg, &cinfo, sizeof(cinfo)))
1108 return -EFAULT;
1109 return 0;
1110 case SNDCTL_DSP_GETBLKSIZE:
1111 return put_user(s->fragsize, (int *)arg);
1113 case SNDCTL_DSP_SETFRAGMENT:
1114 if (get_user(val, (int *)arg))
1115 return -EFAULT;
1116 val&=0xffff;
1117 val -= 7;
1118 if (val < 0) val = 0;
1119 if (val > 7) val = 7;
1120 rme96xx_setlatency(s,val);
1121 return 0;
1123 case SNDCTL_DSP_SUBDIVIDE:
1124 #if 0
1125 if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision) ||
1126 (file->f_mode & FMODE_WRITE && s->dma_dac2.subdivision))
1127 return -EINVAL;
1128 if (get_user(val, (int *)arg))
1129 return -EFAULT;
1130 if (val != 1 && val != 2 && val != 4)
1131 return -EINVAL;
1132 if (file->f_mode & FMODE_READ)
1133 s->dma_adc.subdivision = val;
1134 if (file->f_mode & FMODE_WRITE)
1135 s->dma_dac2.subdivision = val;
1136 #endif
1137 return 0;
1139 case SOUND_PCM_READ_RATE:
1140 return put_user(s->rate, (int *)arg);
1142 case SOUND_PCM_READ_CHANNELS:
1143 return put_user(dma->outchannels, (int *)arg);
1145 case SOUND_PCM_READ_BITS:
1146 switch (dma->format) {
1147 case AFMT_S32_BLOCKED:
1148 val = 32;
1149 break;
1150 case AFMT_S16_LE:
1151 val = 16;
1152 break;
1154 return put_user(val, (int *)arg);
1156 case SOUND_PCM_WRITE_FILTER:
1157 case SNDCTL_DSP_SETSYNCRO:
1158 case SOUND_PCM_READ_FILTER:
1159 return -EINVAL;
1164 return -ENODEV;
1169 static int rme96xx_open(struct inode *in, struct file *f)
1171 int minor = minor(in->i_rdev);
1172 struct list_head *list;
1173 int devnum = ((minor-3)/16) % devices; /* default = 0 */
1174 rme96xx_info *s;
1175 struct dmabuf* dma;
1176 DECLARE_WAITQUEUE(wait, current);
1178 DBG(printk("device num %d open\n",devnum));
1180 /* ??? */
1181 for (list = devs.next; ; list = list->next) {
1182 if (list == &devs)
1183 return -ENODEV;
1184 s = list_entry(list, rme96xx_info, devs);
1185 if (!((s->dspnum[devnum] ^ minor) & ~0xf))
1186 break;
1188 VALIDATE_STATE(s);
1189 /* ??? */
1191 dma = &s->dma[devnum];
1192 f->private_data = dma;
1193 /* wait for device to become free */
1194 down(&s->dma[devnum].open_sem);
1195 while (dma->open_mode & f->f_mode) {
1196 if (f->f_flags & O_NONBLOCK) {
1197 up(&dma->open_sem);
1198 return -EBUSY;
1200 add_wait_queue(&dma->open_wait, &wait);
1201 __set_current_state(TASK_INTERRUPTIBLE);
1202 up(&dma->open_sem);
1203 schedule();
1204 remove_wait_queue(&dma->open_wait, &wait);
1205 set_current_state(TASK_RUNNING);
1206 if (signal_pending(current))
1207 return -ERESTARTSYS;
1208 down(&dma->open_sem);
1211 COMM ("hardware open")
1213 if (!s->dma[devnum].opened) rme96xx_dmabuf_init(dma->s,dma,dma->inoffset,dma->outoffset);
1215 s->dma[devnum].open_mode |= (f->f_mode & (FMODE_READ | FMODE_WRITE));
1216 s->dma[devnum].opened = 1;
1217 up(&s->dma[devnum].open_sem);
1219 DBG(printk("device num %d open finished\n",devnum));
1220 return 0;
1223 static int rme96xx_release(struct inode *in, struct file *file)
1225 struct dmabuf * dma = (struct dmabuf*) file->private_data;
1226 int hwp;
1227 DBG(printk(__FUNCTION__"\n"));
1229 COMM ("draining")
1230 if (dma->open_mode & FMODE_WRITE) {
1231 #if 0 /* Why doesn't this work with some cards ?? */
1232 hwp = rme96xx_gethwptr(dma->s,0);
1233 while (rme96xx_getospace(dma,hwp)) {
1234 interruptible_sleep_on(&(dma->wait));
1235 hwp = rme96xx_gethwptr(dma->s,0);
1237 #endif
1238 rme96xx_clearbufs(dma);
1241 dma->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
1243 if (!(dma->open_mode & (FMODE_READ|FMODE_WRITE))) {
1244 dma->opened = 0;
1245 if (dma->s->started) rme96xx_startcard(dma->s,1);
1248 wake_up(&dma->open_wait);
1249 up(&dma->open_sem);
1251 return 0;
1255 static ssize_t rme96xx_write(struct file *file, const char *buffer,
1256 size_t count, loff_t *ppos)
1258 struct dmabuf *dma = (struct dmabuf *)file->private_data;
1259 ssize_t ret = 0;
1260 int cnt; /* number of bytes from "buffer" that will/can be used */
1261 int hop = count/dma->outchannels;
1262 int hwp;
1263 int exact = (file->f_flags & O_NONBLOCK);
1266 if(dma == NULL || (dma->s) == NULL)
1267 return -ENXIO;
1269 if (ppos != &file->f_pos)
1270 return -ESPIPE;
1272 if (dma->mmapped || !dma->opened)
1273 return -ENXIO;
1275 if (!access_ok(VERIFY_READ, buffer, count))
1276 return -EFAULT;
1278 if (! (dma->open_mode & FMODE_WRITE))
1279 return -ENXIO;
1281 if (!dma->s->started) rme96xx_startcard(dma->s,exact);
1282 hwp = rme96xx_gethwptr(dma->s,0);
1284 if(!(dma->started)){
1285 COMM ("first write")
1287 dma->readptr = hwp;
1288 dma->writeptr = hwp;
1289 dma->started = 1;
1290 COMM ("first write done")
1293 while (count > 0) {
1294 cnt = rme96xx_getospace(dma,hwp);
1295 cnt>>=dma->formatshift;
1296 cnt*=dma->outchannels;
1297 if (cnt > count)
1298 cnt = count;
1300 if (cnt != 0) {
1301 if (rme96xx_copyfromuser(dma,buffer,cnt,hop))
1302 return ret ? ret : -EFAULT;
1303 count -= cnt;
1304 buffer += cnt;
1305 ret += cnt;
1306 if (count == 0) return ret;
1308 if (file->f_flags & O_NONBLOCK)
1309 return ret ? ret : -EAGAIN;
1311 if ((hwp - dma->writeptr) <= 0) {
1312 interruptible_sleep_on(&(dma->wait));
1314 if (signal_pending(current))
1315 return ret ? ret : -ERESTARTSYS;
1318 hwp = rme96xx_gethwptr(dma->s,exact);
1320 }; /* count > 0 */
1322 return ret;
1325 static ssize_t rme96xx_read(struct file *file, char *buffer,size_t count, loff_t *ppos)
1327 struct dmabuf *dma = (struct dmabuf *)file->private_data;
1328 ssize_t ret = 0;
1329 int cnt;
1330 int hop = count/dma->inchannels;
1331 int hwp;
1332 int exact = (file->f_flags & O_NONBLOCK);
1335 if(dma == NULL || (dma->s) == NULL)
1336 return -ENXIO;
1338 if (ppos != &file->f_pos)
1339 return -ESPIPE;
1341 if (dma->mmapped || !dma->opened)
1342 return -ENXIO;
1344 if (!access_ok(VERIFY_WRITE, buffer, count))
1345 return -EFAULT;
1347 if (! (dma->open_mode & FMODE_READ))
1348 return -ENXIO;
1350 if (count > ((dma->s->fragsize*dma->inchannels)>>dma->formatshift))
1351 return -EFAULT;
1353 if (!dma->s->started) rme96xx_startcard(dma->s,exact);
1354 hwp = rme96xx_gethwptr(dma->s,0);
1356 if(!(dma->started)){
1357 COMM ("first read")
1359 dma->writeptr = hwp;
1360 dma->readptr = hwp;
1361 dma->started = 1;
1364 while (count > 0) {
1365 cnt = rme96xx_getispace(dma,hwp);
1366 cnt>>=dma->formatshift;
1367 cnt*=dma->inchannels;
1369 if (cnt > count)
1370 cnt = count;
1372 if (cnt != 0) {
1374 if (rme96xx_copytouser(dma,buffer,cnt,hop))
1375 return ret ? ret : -EFAULT;
1377 count -= cnt;
1378 buffer += cnt;
1379 ret += cnt;
1380 if (count == 0) return ret;
1382 if (file->f_flags & O_NONBLOCK)
1383 return ret ? ret : -EAGAIN;
1385 if ((hwp - dma->readptr) <= 0) {
1386 interruptible_sleep_on(&(dma->wait));
1388 if (signal_pending(current))
1389 return ret ? ret : -ERESTARTSYS;
1391 hwp = rme96xx_gethwptr(dma->s,exact);
1393 }; /* count > 0 */
1395 return ret;
1398 static int rm96xx_mmap(struct file *file, struct vm_area_struct *vma) {
1399 struct dmabuf *dma = (struct dmabuf *)file->private_data;
1400 rme96xx_info* s = dma->s;
1401 unsigned long size;
1403 VALIDATE_STATE(s);
1404 lock_kernel();
1406 if (vma->vm_pgoff != 0) {
1407 unlock_kernel();
1408 return -EINVAL;
1410 size = vma->vm_end - vma->vm_start;
1411 if (size > RME96xx_DMA_MAX_SIZE) {
1412 unlock_kernel();
1413 return -EINVAL;
1417 if (vma->vm_flags & VM_WRITE) {
1418 if (!s->started) rme96xx_startcard(s,1);
1420 if (remap_page_range(vma, vma->vm_start, virt_to_phys(s->playbuf + dma->outoffset*RME96xx_DMA_MAX_SIZE), size, vma->vm_page_prot)) {
1421 unlock_kernel();
1422 return -EAGAIN;
1425 else if (vma->vm_flags & VM_READ) {
1426 if (!s->started) rme96xx_startcard(s,1);
1427 if (remap_page_range(vma, vma->vm_start, virt_to_phys(s->playbuf + dma->inoffset*RME96xx_DMA_MAX_SIZE), size, vma->vm_page_prot)) {
1428 unlock_kernel();
1429 return -EAGAIN;
1431 } else {
1432 unlock_kernel();
1433 return -EINVAL;
1437 /* this is the mapping */
1439 dma->mmapped = 1;
1440 unlock_kernel();
1441 return 0;
1444 static unsigned int rme96xx_poll(struct file *file, struct poll_table_struct *wait)
1446 struct dmabuf *dma = (struct dmabuf *)file->private_data;
1447 rme96xx_info* s = dma->s;
1448 unsigned int mask = 0;
1449 unsigned int hwp,cnt;
1451 DBG(printk("rme96xx poll_wait ...\n"));
1452 VALIDATE_STATE(s);
1454 if (!s->started) {
1455 mask |= POLLOUT | POLLWRNORM;
1457 poll_wait(file, &dma->wait, wait);
1459 hwp = rme96xx_gethwptr(dma->s,0);
1461 DBG(printk("rme96xx poll: ..cnt %d > %d\n",cnt,s->fragsize));
1463 cnt = rme96xx_getispace(dma,hwp);
1465 if (file->f_mode & FMODE_READ)
1466 if (cnt > 0)
1467 mask |= POLLIN | POLLRDNORM;
1471 cnt = rme96xx_getospace(dma,hwp);
1473 if (file->f_mode & FMODE_WRITE)
1474 if (cnt > 0)
1475 mask |= POLLOUT | POLLWRNORM;
1478 // printk("rme96xx poll_wait ...%d > %d\n",rme96xx_getospace(dma,hwp),rme96xx_getispace(dma,hwp));
1480 return mask;
1484 static struct file_operations rme96xx_audio_fops = {
1485 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
1486 owner: THIS_MODULE,
1487 #endif
1488 read: rme96xx_read,
1489 write: rme96xx_write,
1490 poll: rme96xx_poll,
1491 ioctl: rme96xx_ioctl,
1492 mmap: rm96xx_mmap,
1493 open: rme96xx_open,
1494 release: rme96xx_release
1497 static int rme96xx_mixer_open(struct inode *inode, struct file *file)
1499 int minor = minor(inode->i_rdev);
1500 struct list_head *list;
1501 rme96xx_info *s;
1503 COMM ("mixer open");
1505 for (list = devs.next; ; list = list->next) {
1506 if (list == &devs)
1507 return -ENODEV;
1508 s = list_entry(list, rme96xx_info, devs);
1509 if (s->mixer== minor)
1510 break;
1512 VALIDATE_STATE(s);
1513 file->private_data = s;
1515 COMM ("mixer opened")
1516 return 0;
1519 static int rme96xx_mixer_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
1521 rme96xx_info *s = (rme96xx_info *)file->private_data;
1522 u32 status;
1524 status = readl(s->iobase + RME96xx_status_register);
1526 VALIDATE_STATE(s);
1527 if (cmd == SOUND_MIXER_PRIVATE1) {
1528 rme_mixer mixer;
1529 if (copy_from_user(&mixer,(void*)arg,sizeof(mixer)))
1530 return -EFAULT;
1532 if (file->f_mode & FMODE_WRITE) {
1533 s->dma[mixer.devnr].outoffset = mixer.o_offset;
1534 s->dma[mixer.devnr].inoffset = mixer.i_offset;
1537 mixer.o_offset = s->dma[mixer.devnr].outoffset;
1538 mixer.i_offset = s->dma[mixer.devnr].inoffset;
1540 return copy_to_user((void *)arg, &mixer, sizeof(mixer)) ? -EFAULT : 0;
1542 if (cmd == SOUND_MIXER_PRIVATE2) {
1543 return put_user(status, (int *)arg);
1545 if (cmd == SOUND_MIXER_PRIVATE3) {
1546 u32 control;
1547 if (copy_from_user(&control,(void*)arg,sizeof(control)))
1548 return -EFAULT;
1549 if (file->f_mode & FMODE_WRITE) {
1550 s->control_register = control;
1551 writel(control,s->iobase + RME96xx_control_register);
1554 return put_user(s->control_register, (int *)arg);
1556 return -1;
1561 static int rme96xx_mixer_release(struct inode *inode, struct file *file)
1563 return 0;
1566 static /*const*/ struct file_operations rme96xx_mixer_fops = {
1567 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
1568 owner: THIS_MODULE,
1569 #endif
1570 ioctl: rme96xx_mixer_ioctl,
1571 open: rme96xx_mixer_open,
1572 release: rme96xx_mixer_release,