1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143#include <linux/interrupt.h>
144#include <linux/module.h>
145#include <linux/string.h>
146#include <linux/ioport.h>
147#include <linux/sched.h>
148#include <linux/delay.h>
149#include <linux/sound.h>
150#include <linux/slab.h>
151#include <linux/soundcard.h>
152#include <linux/pci.h>
153#include <linux/smp_lock.h>
154#include <linux/init.h>
155#include <linux/poll.h>
156#include <linux/spinlock.h>
157#include <linux/gameport.h>
158#include <linux/wait.h>
159
160#include <asm/io.h>
161#include <asm/page.h>
162#include <asm/uaccess.h>
163
164
165
166#undef OSS_DOCUMENTED_MIXER_SEMANTICS
167#define DBG(x) {}
168
169
170
171
172#ifndef PCI_VENDOR_ID_ENSONIQ
173#define PCI_VENDOR_ID_ENSONIQ 0x1274
174#endif
175
176#ifndef PCI_DEVICE_ID_ENSONIQ_ES1370
177#define PCI_DEVICE_ID_ENSONIQ_ES1370 0x5000
178#endif
179
180#define ES1370_MAGIC ((PCI_VENDOR_ID_ENSONIQ<<16)|PCI_DEVICE_ID_ENSONIQ_ES1370)
181
182#define ES1370_EXTENT 0x40
183#define JOY_EXTENT 8
184
185#define ES1370_REG_CONTROL 0x00
186#define ES1370_REG_STATUS 0x04
187#define ES1370_REG_UART_DATA 0x08
188#define ES1370_REG_UART_STATUS 0x09
189#define ES1370_REG_UART_CONTROL 0x09
190#define ES1370_REG_UART_TEST 0x0a
191#define ES1370_REG_MEMPAGE 0x0c
192#define ES1370_REG_CODEC 0x10
193#define ES1370_REG_SERIAL_CONTROL 0x20
194#define ES1370_REG_DAC1_SCOUNT 0x24
195#define ES1370_REG_DAC2_SCOUNT 0x28
196#define ES1370_REG_ADC_SCOUNT 0x2c
197
198#define ES1370_REG_DAC1_FRAMEADR 0xc30
199#define ES1370_REG_DAC1_FRAMECNT 0xc34
200#define ES1370_REG_DAC2_FRAMEADR 0xc38
201#define ES1370_REG_DAC2_FRAMECNT 0xc3c
202#define ES1370_REG_ADC_FRAMEADR 0xd30
203#define ES1370_REG_ADC_FRAMECNT 0xd34
204#define ES1370_REG_PHANTOM_FRAMEADR 0xd38
205#define ES1370_REG_PHANTOM_FRAMECNT 0xd3c
206
207#define ES1370_FMT_U8_MONO 0
208#define ES1370_FMT_U8_STEREO 1
209#define ES1370_FMT_S16_MONO 2
210#define ES1370_FMT_S16_STEREO 3
211#define ES1370_FMT_STEREO 1
212#define ES1370_FMT_S16 2
213#define ES1370_FMT_MASK 3
214
215static const unsigned sample_size[] = { 1, 2, 2, 4 };
216static const unsigned sample_shift[] = { 0, 1, 1, 2 };
217
218static const unsigned dac1_samplerate[] = { 5512, 11025, 22050, 44100 };
219
220#define DAC2_SRTODIV(x) (((1411200+(x)/2)/(x))-2)
221#define DAC2_DIVTOSR(x) (1411200/((x)+2))
222
223#define CTRL_ADC_STOP 0x80000000
224#define CTRL_XCTL1 0x40000000
225#define CTRL_OPEN 0x20000000
226#define CTRL_PCLKDIV 0x1fff0000
227#define CTRL_SH_PCLKDIV 16
228#define CTRL_MSFMTSEL 0x00008000
229#define CTRL_M_SBB 0x00004000
230#define CTRL_WTSRSEL 0x00003000
231#define CTRL_SH_WTSRSEL 12
232#define CTRL_DAC_SYNC 0x00000800
233#define CTRL_CCB_INTRM 0x00000400
234#define CTRL_M_CB 0x00000200
235#define CTRL_XCTL0 0x00000100
236#define CTRL_BREQ 0x00000080
237#define CTRL_DAC1_EN 0x00000040
238#define CTRL_DAC2_EN 0x00000020
239#define CTRL_ADC_EN 0x00000010
240#define CTRL_UART_EN 0x00000008
241#define CTRL_JYSTK_EN 0x00000004
242#define CTRL_CDC_EN 0x00000002
243#define CTRL_SERR_DIS 0x00000001
244
245#define STAT_INTR 0x80000000
246#define STAT_CSTAT 0x00000400
247#define STAT_CBUSY 0x00000200
248#define STAT_CWRIP 0x00000100
249#define STAT_VC 0x00000060
250#define STAT_SH_VC 5
251#define STAT_MCCB 0x00000010
252#define STAT_UART 0x00000008
253#define STAT_DAC1 0x00000004
254#define STAT_DAC2 0x00000002
255#define STAT_ADC 0x00000001
256
257#define USTAT_RXINT 0x80
258#define USTAT_TXINT 0x04
259#define USTAT_TXRDY 0x02
260#define USTAT_RXRDY 0x01
261
262#define UCTRL_RXINTEN 0x80
263#define UCTRL_TXINTEN 0x60
264#define UCTRL_ENA_TXINT 0x20
265#define UCTRL_CNTRL 0x03
266#define UCTRL_CNTRL_SWR 0x03
267
268#define SCTRL_P2ENDINC 0x00380000
269#define SCTRL_SH_P2ENDINC 19
270#define SCTRL_P2STINC 0x00070000
271#define SCTRL_SH_P2STINC 16
272#define SCTRL_R1LOOPSEL 0x00008000
273#define SCTRL_P2LOOPSEL 0x00004000
274#define SCTRL_P1LOOPSEL 0x00002000
275#define SCTRL_P2PAUSE 0x00001000
276#define SCTRL_P1PAUSE 0x00000800
277#define SCTRL_R1INTEN 0x00000400
278#define SCTRL_P2INTEN 0x00000200
279#define SCTRL_P1INTEN 0x00000100
280#define SCTRL_P1SCTRLD 0x00000080
281#define SCTRL_P2DACSEN 0x00000040
282#define SCTRL_R1SEB 0x00000020
283#define SCTRL_R1SMB 0x00000010
284#define SCTRL_R1FMT 0x00000030
285#define SCTRL_SH_R1FMT 4
286#define SCTRL_P2SEB 0x00000008
287#define SCTRL_P2SMB 0x00000004
288#define SCTRL_P2FMT 0x0000000c
289#define SCTRL_SH_P2FMT 2
290#define SCTRL_P1SEB 0x00000002
291#define SCTRL_P1SMB 0x00000001
292#define SCTRL_P1FMT 0x00000003
293#define SCTRL_SH_P1FMT 0
294
295
296
297#define FMODE_DAC 4
298
299
300
301#define MIDIINBUF 256
302#define MIDIOUTBUF 256
303
304#define FMODE_MIDI_SHIFT 3
305#define FMODE_MIDI_READ (FMODE_READ << FMODE_MIDI_SHIFT)
306#define FMODE_MIDI_WRITE (FMODE_WRITE << FMODE_MIDI_SHIFT)
307
308
309
310struct es1370_state {
311
312 unsigned int magic;
313
314
315 struct list_head devs;
316
317
318 struct pci_dev *dev;
319
320
321 int dev_audio;
322 int dev_mixer;
323 int dev_dac;
324 int dev_midi;
325
326
327 unsigned long io;
328 unsigned int irq;
329
330
331 struct {
332 unsigned short vol[10];
333 unsigned int recsrc;
334 unsigned int modcnt;
335 unsigned short micpreamp;
336 unsigned int imix;
337 } mix;
338
339
340 unsigned ctrl;
341 unsigned sctrl;
342
343 spinlock_t lock;
344 struct semaphore open_sem;
345 mode_t open_mode;
346 wait_queue_head_t open_wait;
347
348 struct dmabuf {
349 void *rawbuf;
350 dma_addr_t dmaaddr;
351 unsigned buforder;
352 unsigned numfrag;
353 unsigned fragshift;
354 unsigned hwptr, swptr;
355 unsigned total_bytes;
356 int count;
357 unsigned error;
358 wait_queue_head_t wait;
359
360 unsigned fragsize;
361 unsigned dmasize;
362 unsigned fragsamples;
363
364 unsigned mapped:1;
365 unsigned ready:1;
366 unsigned endcleared:1;
367 unsigned enabled:1;
368 unsigned ossfragshift;
369 int ossmaxfrags;
370 unsigned subdivision;
371 } dma_dac1, dma_dac2, dma_adc;
372
373
374 unsigned char *bugbuf_cpu;
375 dma_addr_t bugbuf_dma;
376
377
378 struct {
379 unsigned ird, iwr, icnt;
380 unsigned ord, owr, ocnt;
381 wait_queue_head_t iwait;
382 wait_queue_head_t owait;
383 unsigned char ibuf[MIDIINBUF];
384 unsigned char obuf[MIDIOUTBUF];
385 } midi;
386
387 struct gameport gameport;
388 struct semaphore sem;
389};
390
391
392
393static LIST_HEAD(devs);
394
395
396
397static inline unsigned ld2(unsigned int x)
398{
399 unsigned r = 0;
400
401 if (x >= 0x10000) {
402 x >>= 16;
403 r += 16;
404 }
405 if (x >= 0x100) {
406 x >>= 8;
407 r += 8;
408 }
409 if (x >= 0x10) {
410 x >>= 4;
411 r += 4;
412 }
413 if (x >= 4) {
414 x >>= 2;
415 r += 2;
416 }
417 if (x >= 2)
418 r++;
419 return r;
420}
421
422
423
424static void wrcodec(struct es1370_state *s, unsigned char idx, unsigned char data)
425{
426 unsigned long tmo = jiffies + HZ/10, j;
427
428 do {
429 j = jiffies;
430 if (!(inl(s->io+ES1370_REG_STATUS) & STAT_CSTAT)) {
431 outw((((unsigned short)idx)<<8)|data, s->io+ES1370_REG_CODEC);
432 return;
433 }
434 schedule();
435 } while ((signed)(tmo-j) > 0);
436 printk(KERN_ERR "es1370: write to codec register timeout\n");
437}
438
439
440
441static inline void stop_adc(struct es1370_state *s)
442{
443 unsigned long flags;
444
445 spin_lock_irqsave(&s->lock, flags);
446 s->ctrl &= ~CTRL_ADC_EN;
447 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
448 spin_unlock_irqrestore(&s->lock, flags);
449}
450
451static inline void stop_dac1(struct es1370_state *s)
452{
453 unsigned long flags;
454
455 spin_lock_irqsave(&s->lock, flags);
456 s->ctrl &= ~CTRL_DAC1_EN;
457 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
458 spin_unlock_irqrestore(&s->lock, flags);
459}
460
461static inline void stop_dac2(struct es1370_state *s)
462{
463 unsigned long flags;
464
465 spin_lock_irqsave(&s->lock, flags);
466 s->ctrl &= ~CTRL_DAC2_EN;
467 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
468 spin_unlock_irqrestore(&s->lock, flags);
469}
470
471static void start_dac1(struct es1370_state *s)
472{
473 unsigned long flags;
474 unsigned fragremain, fshift;
475
476 spin_lock_irqsave(&s->lock, flags);
477 if (!(s->ctrl & CTRL_DAC1_EN) && (s->dma_dac1.mapped || s->dma_dac1.count > 0)
478 && s->dma_dac1.ready) {
479 s->ctrl |= CTRL_DAC1_EN;
480 s->sctrl = (s->sctrl & ~(SCTRL_P1LOOPSEL | SCTRL_P1PAUSE | SCTRL_P1SCTRLD)) | SCTRL_P1INTEN;
481 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
482 fragremain = ((- s->dma_dac1.hwptr) & (s->dma_dac1.fragsize-1));
483 fshift = sample_shift[(s->sctrl & SCTRL_P1FMT) >> SCTRL_SH_P1FMT];
484 if (fragremain < 2*fshift)
485 fragremain = s->dma_dac1.fragsize;
486 outl((fragremain >> fshift) - 1, s->io+ES1370_REG_DAC1_SCOUNT);
487 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
488 outl((s->dma_dac1.fragsize >> fshift) - 1, s->io+ES1370_REG_DAC1_SCOUNT);
489 }
490 spin_unlock_irqrestore(&s->lock, flags);
491}
492
493static void start_dac2(struct es1370_state *s)
494{
495 unsigned long flags;
496 unsigned fragremain, fshift;
497
498 spin_lock_irqsave(&s->lock, flags);
499 if (!(s->ctrl & CTRL_DAC2_EN) && (s->dma_dac2.mapped || s->dma_dac2.count > 0)
500 && s->dma_dac2.ready) {
501 s->ctrl |= CTRL_DAC2_EN;
502 s->sctrl = (s->sctrl & ~(SCTRL_P2LOOPSEL | SCTRL_P2PAUSE | SCTRL_P2DACSEN |
503 SCTRL_P2ENDINC | SCTRL_P2STINC)) | SCTRL_P2INTEN |
504 (((s->sctrl & SCTRL_P2FMT) ? 2 : 1) << SCTRL_SH_P2ENDINC) |
505 (0 << SCTRL_SH_P2STINC);
506 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
507 fragremain = ((- s->dma_dac2.hwptr) & (s->dma_dac2.fragsize-1));
508 fshift = sample_shift[(s->sctrl & SCTRL_P2FMT) >> SCTRL_SH_P2FMT];
509 if (fragremain < 2*fshift)
510 fragremain = s->dma_dac2.fragsize;
511 outl((fragremain >> fshift) - 1, s->io+ES1370_REG_DAC2_SCOUNT);
512 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
513 outl((s->dma_dac2.fragsize >> fshift) - 1, s->io+ES1370_REG_DAC2_SCOUNT);
514 }
515 spin_unlock_irqrestore(&s->lock, flags);
516}
517
518static void start_adc(struct es1370_state *s)
519{
520 unsigned long flags;
521 unsigned fragremain, fshift;
522
523 spin_lock_irqsave(&s->lock, flags);
524 if (!(s->ctrl & CTRL_ADC_EN) && (s->dma_adc.mapped || s->dma_adc.count < (signed)(s->dma_adc.dmasize - 2*s->dma_adc.fragsize))
525 && s->dma_adc.ready) {
526 s->ctrl |= CTRL_ADC_EN;
527 s->sctrl = (s->sctrl & ~SCTRL_R1LOOPSEL) | SCTRL_R1INTEN;
528 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
529 fragremain = ((- s->dma_adc.hwptr) & (s->dma_adc.fragsize-1));
530 fshift = sample_shift[(s->sctrl & SCTRL_R1FMT) >> SCTRL_SH_R1FMT];
531 if (fragremain < 2*fshift)
532 fragremain = s->dma_adc.fragsize;
533 outl((fragremain >> fshift) - 1, s->io+ES1370_REG_ADC_SCOUNT);
534 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
535 outl((s->dma_adc.fragsize >> fshift) - 1, s->io+ES1370_REG_ADC_SCOUNT);
536 }
537 spin_unlock_irqrestore(&s->lock, flags);
538}
539
540
541
542#define DMABUF_DEFAULTORDER (17-PAGE_SHIFT)
543#define DMABUF_MINORDER 1
544
545static inline void dealloc_dmabuf(struct es1370_state *s, struct dmabuf *db)
546{
547 struct page *page, *pend;
548
549 if (db->rawbuf) {
550
551 pend = virt_to_page(db->rawbuf + (PAGE_SIZE << db->buforder) - 1);
552 for (page = virt_to_page(db->rawbuf); page <= pend; page++)
553 ClearPageReserved(page);
554 pci_free_consistent(s->dev, PAGE_SIZE << db->buforder, db->rawbuf, db->dmaaddr);
555 }
556 db->rawbuf = NULL;
557 db->mapped = db->ready = 0;
558}
559
560static int prog_dmabuf(struct es1370_state *s, struct dmabuf *db, unsigned rate, unsigned fmt, unsigned reg)
561{
562 int order;
563 unsigned bytepersec;
564 unsigned bufs;
565 struct page *page, *pend;
566
567 db->hwptr = db->swptr = db->total_bytes = db->count = db->error = db->endcleared = 0;
568 if (!db->rawbuf) {
569 db->ready = db->mapped = 0;
570 for (order = DMABUF_DEFAULTORDER; order >= DMABUF_MINORDER; order--)
571 if ((db->rawbuf = pci_alloc_consistent(s->dev, PAGE_SIZE << order, &db->dmaaddr)))
572 break;
573 if (!db->rawbuf)
574 return -ENOMEM;
575 db->buforder = order;
576
577 pend = virt_to_page(db->rawbuf + (PAGE_SIZE << db->buforder) - 1);
578 for (page = virt_to_page(db->rawbuf); page <= pend; page++)
579 SetPageReserved(page);
580 }
581 fmt &= ES1370_FMT_MASK;
582 bytepersec = rate << sample_shift[fmt];
583 bufs = PAGE_SIZE << db->buforder;
584 if (db->ossfragshift) {
585 if ((1000 << db->ossfragshift) < bytepersec)
586 db->fragshift = ld2(bytepersec/1000);
587 else
588 db->fragshift = db->ossfragshift;
589 } else {
590 db->fragshift = ld2(bytepersec/100/(db->subdivision ? db->subdivision : 1));
591 if (db->fragshift < 3)
592 db->fragshift = 3;
593 }
594 db->numfrag = bufs >> db->fragshift;
595 while (db->numfrag < 4 && db->fragshift > 3) {
596 db->fragshift--;
597 db->numfrag = bufs >> db->fragshift;
598 }
599 db->fragsize = 1 << db->fragshift;
600 if (db->ossmaxfrags >= 4 && db->ossmaxfrags < db->numfrag)
601 db->numfrag = db->ossmaxfrags;
602 db->fragsamples = db->fragsize >> sample_shift[fmt];
603 db->dmasize = db->numfrag << db->fragshift;
604 memset(db->rawbuf, (fmt & ES1370_FMT_S16) ? 0 : 0x80, db->dmasize);
605 outl((reg >> 8) & 15, s->io+ES1370_REG_MEMPAGE);
606 outl(db->dmaaddr, s->io+(reg & 0xff));
607 outl((db->dmasize >> 2)-1, s->io+((reg + 4) & 0xff));
608 db->enabled = 1;
609 db->ready = 1;
610 return 0;
611}
612
613static inline int prog_dmabuf_adc(struct es1370_state *s)
614{
615 stop_adc(s);
616 return prog_dmabuf(s, &s->dma_adc, DAC2_DIVTOSR((s->ctrl & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV),
617 (s->sctrl >> SCTRL_SH_R1FMT) & ES1370_FMT_MASK, ES1370_REG_ADC_FRAMEADR);
618}
619
620static inline int prog_dmabuf_dac2(struct es1370_state *s)
621{
622 stop_dac2(s);
623 return prog_dmabuf(s, &s->dma_dac2, DAC2_DIVTOSR((s->ctrl & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV),
624 (s->sctrl >> SCTRL_SH_P2FMT) & ES1370_FMT_MASK, ES1370_REG_DAC2_FRAMEADR);
625}
626
627static inline int prog_dmabuf_dac1(struct es1370_state *s)
628{
629 stop_dac1(s);
630 return prog_dmabuf(s, &s->dma_dac1, dac1_samplerate[(s->ctrl & CTRL_WTSRSEL) >> CTRL_SH_WTSRSEL],
631 (s->sctrl >> SCTRL_SH_P1FMT) & ES1370_FMT_MASK, ES1370_REG_DAC1_FRAMEADR);
632}
633
634static inline unsigned get_hwptr(struct es1370_state *s, struct dmabuf *db, unsigned reg)
635{
636 unsigned hwptr, diff;
637
638 outl((reg >> 8) & 15, s->io+ES1370_REG_MEMPAGE);
639 hwptr = (inl(s->io+(reg & 0xff)) >> 14) & 0x3fffc;
640 diff = (db->dmasize + hwptr - db->hwptr) % db->dmasize;
641 db->hwptr = hwptr;
642 return diff;
643}
644
645static inline void clear_advance(void *buf, unsigned bsize, unsigned bptr, unsigned len, unsigned char c)
646{
647 if (bptr + len > bsize) {
648 unsigned x = bsize - bptr;
649 memset(((char *)buf) + bptr, c, x);
650 bptr = 0;
651 len -= x;
652 }
653 memset(((char *)buf) + bptr, c, len);
654}
655
656
657static void es1370_update_ptr(struct es1370_state *s)
658{
659 int diff;
660
661
662 if (s->ctrl & CTRL_ADC_EN) {
663 diff = get_hwptr(s, &s->dma_adc, ES1370_REG_ADC_FRAMECNT);
664 s->dma_adc.total_bytes += diff;
665 s->dma_adc.count += diff;
666 if (s->dma_adc.count >= (signed)s->dma_adc.fragsize)
667 wake_up(&s->dma_adc.wait);
668 if (!s->dma_adc.mapped) {
669 if (s->dma_adc.count > (signed)(s->dma_adc.dmasize - ((3 * s->dma_adc.fragsize) >> 1))) {
670 s->ctrl &= ~CTRL_ADC_EN;
671 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
672 s->dma_adc.error++;
673 }
674 }
675 }
676
677 if (s->ctrl & CTRL_DAC1_EN) {
678 diff = get_hwptr(s, &s->dma_dac1, ES1370_REG_DAC1_FRAMECNT);
679 s->dma_dac1.total_bytes += diff;
680 if (s->dma_dac1.mapped) {
681 s->dma_dac1.count += diff;
682 if (s->dma_dac1.count >= (signed)s->dma_dac1.fragsize)
683 wake_up(&s->dma_dac1.wait);
684 } else {
685 s->dma_dac1.count -= diff;
686 if (s->dma_dac1.count <= 0) {
687 s->ctrl &= ~CTRL_DAC1_EN;
688 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
689 s->dma_dac1.error++;
690 } else if (s->dma_dac1.count <= (signed)s->dma_dac1.fragsize && !s->dma_dac1.endcleared) {
691 clear_advance(s->dma_dac1.rawbuf, s->dma_dac1.dmasize, s->dma_dac1.swptr,
692 s->dma_dac1.fragsize, (s->sctrl & SCTRL_P1SEB) ? 0 : 0x80);
693 s->dma_dac1.endcleared = 1;
694 }
695 if (s->dma_dac1.count + (signed)s->dma_dac1.fragsize <= (signed)s->dma_dac1.dmasize)
696 wake_up(&s->dma_dac1.wait);
697 }
698 }
699
700 if (s->ctrl & CTRL_DAC2_EN) {
701 diff = get_hwptr(s, &s->dma_dac2, ES1370_REG_DAC2_FRAMECNT);
702 s->dma_dac2.total_bytes += diff;
703 if (s->dma_dac2.mapped) {
704 s->dma_dac2.count += diff;
705 if (s->dma_dac2.count >= (signed)s->dma_dac2.fragsize)
706 wake_up(&s->dma_dac2.wait);
707 } else {
708 s->dma_dac2.count -= diff;
709 if (s->dma_dac2.count <= 0) {
710 s->ctrl &= ~CTRL_DAC2_EN;
711 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
712 s->dma_dac2.error++;
713 } else if (s->dma_dac2.count <= (signed)s->dma_dac2.fragsize && !s->dma_dac2.endcleared) {
714 clear_advance(s->dma_dac2.rawbuf, s->dma_dac2.dmasize, s->dma_dac2.swptr,
715 s->dma_dac2.fragsize, (s->sctrl & SCTRL_P2SEB) ? 0 : 0x80);
716 s->dma_dac2.endcleared = 1;
717 }
718 if (s->dma_dac2.count + (signed)s->dma_dac2.fragsize <= (signed)s->dma_dac2.dmasize)
719 wake_up(&s->dma_dac2.wait);
720 }
721 }
722}
723
724
725static void es1370_handle_midi(struct es1370_state *s)
726{
727 unsigned char ch;
728 int wake;
729
730 if (!(s->ctrl & CTRL_UART_EN))
731 return;
732 wake = 0;
733 while (inb(s->io+ES1370_REG_UART_STATUS) & USTAT_RXRDY) {
734 ch = inb(s->io+ES1370_REG_UART_DATA);
735 if (s->midi.icnt < MIDIINBUF) {
736 s->midi.ibuf[s->midi.iwr] = ch;
737 s->midi.iwr = (s->midi.iwr + 1) % MIDIINBUF;
738 s->midi.icnt++;
739 }
740 wake = 1;
741 }
742 if (wake)
743 wake_up(&s->midi.iwait);
744 wake = 0;
745 while ((inb(s->io+ES1370_REG_UART_STATUS) & USTAT_TXRDY) && s->midi.ocnt > 0) {
746 outb(s->midi.obuf[s->midi.ord], s->io+ES1370_REG_UART_DATA);
747 s->midi.ord = (s->midi.ord + 1) % MIDIOUTBUF;
748 s->midi.ocnt--;
749 if (s->midi.ocnt < MIDIOUTBUF-16)
750 wake = 1;
751 }
752 if (wake)
753 wake_up(&s->midi.owait);
754 outb((s->midi.ocnt > 0) ? UCTRL_RXINTEN | UCTRL_ENA_TXINT : UCTRL_RXINTEN, s->io+ES1370_REG_UART_CONTROL);
755}
756
757static irqreturn_t es1370_interrupt(int irq, void *dev_id, struct pt_regs *regs)
758{
759 struct es1370_state *s = (struct es1370_state *)dev_id;
760 unsigned int intsrc, sctl;
761
762
763 intsrc = inl(s->io+ES1370_REG_STATUS);
764 if (!(intsrc & 0x80000000))
765 return IRQ_NONE;
766 spin_lock(&s->lock);
767
768 sctl = s->sctrl;
769 if (intsrc & STAT_ADC)
770 sctl &= ~SCTRL_R1INTEN;
771 if (intsrc & STAT_DAC1)
772 sctl &= ~SCTRL_P1INTEN;
773 if (intsrc & STAT_DAC2)
774 sctl &= ~SCTRL_P2INTEN;
775 outl(sctl, s->io+ES1370_REG_SERIAL_CONTROL);
776 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
777 es1370_update_ptr(s);
778 es1370_handle_midi(s);
779 spin_unlock(&s->lock);
780 return IRQ_HANDLED;
781}
782
783
784
785static const char invalid_magic[] = KERN_CRIT "es1370: invalid magic value\n";
786
787#define VALIDATE_STATE(s) \
788({ \
789 if (!(s) || (s)->magic != ES1370_MAGIC) { \
790 printk(invalid_magic); \
791 return -ENXIO; \
792 } \
793})
794
795
796
797static const struct {
798 unsigned volidx:4;
799 unsigned left:4;
800 unsigned right:4;
801 unsigned stereo:1;
802 unsigned recmask:13;
803 unsigned avail:1;
804} mixtable[SOUND_MIXER_NRDEVICES] = {
805 [SOUND_MIXER_VOLUME] = { 0, 0x0, 0x1, 1, 0x0000, 1 },
806 [SOUND_MIXER_PCM] = { 1, 0x2, 0x3, 1, 0x0400, 1 },
807 [SOUND_MIXER_SYNTH] = { 2, 0x4, 0x5, 1, 0x0060, 1 },
808 [SOUND_MIXER_CD] = { 3, 0x6, 0x7, 1, 0x0006, 1 },
809 [SOUND_MIXER_LINE] = { 4, 0x8, 0x9, 1, 0x0018, 1 },
810 [SOUND_MIXER_LINE1] = { 5, 0xa, 0xb, 1, 0x1800, 1 },
811 [SOUND_MIXER_LINE2] = { 6, 0xc, 0x0, 0, 0x0100, 1 },
812 [SOUND_MIXER_LINE3] = { 7, 0xd, 0x0, 0, 0x0200, 1 },
813 [SOUND_MIXER_MIC] = { 8, 0xe, 0x0, 0, 0x0001, 1 },
814 [SOUND_MIXER_OGAIN] = { 9, 0xf, 0x0, 0, 0x0000, 1 }
815};
816
817static void set_recsrc(struct es1370_state *s, unsigned int val)
818{
819 unsigned int i, j;
820
821 for (j = i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
822 if (!(val & (1 << i)))
823 continue;
824 if (!mixtable[i].recmask) {
825 val &= ~(1 << i);
826 continue;
827 }
828 j |= mixtable[i].recmask;
829 }
830 s->mix.recsrc = val;
831 wrcodec(s, 0x12, j & 0xd5);
832 wrcodec(s, 0x13, j & 0xaa);
833 wrcodec(s, 0x14, (j >> 8) & 0x17);
834 wrcodec(s, 0x15, (j >> 8) & 0x0f);
835 i = (j & 0x37f) | ((j << 1) & 0x3000) | 0xc60;
836 if (!s->mix.imix) {
837 i &= 0xff60;
838 }
839 wrcodec(s, 0x10, i);
840 wrcodec(s, 0x11, i >> 8);
841}
842
843static int mixer_ioctl(struct es1370_state *s, unsigned int cmd, unsigned long arg)
844{
845 unsigned long flags;
846 int i, val;
847 unsigned char l, r, rl, rr;
848 int __user *p = (int __user *)arg;
849
850 VALIDATE_STATE(s);
851 if (cmd == SOUND_MIXER_PRIVATE1) {
852
853 if (get_user(val, p))
854 return -EFAULT;
855 if (val != -1) {
856 s->mix.micpreamp = !!val;
857 wrcodec(s, 0x19, s->mix.micpreamp);
858 }
859 return put_user(s->mix.micpreamp, p);
860 }
861 if (cmd == SOUND_MIXER_PRIVATE2) {
862
863 if (get_user(val, p))
864 return -EFAULT;
865 if (val != -1) {
866 spin_lock_irqsave(&s->lock, flags);
867 if (val)
868 s->ctrl |= CTRL_XCTL0;
869 else
870 s->ctrl &= ~CTRL_XCTL0;
871 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
872 spin_unlock_irqrestore(&s->lock, flags);
873 }
874 return put_user((s->ctrl & CTRL_XCTL0) ? 1 : 0, p);
875 }
876 if (cmd == SOUND_MIXER_PRIVATE3) {
877
878 if (get_user(val, p))
879 return -EFAULT;
880 if (val != -1) {
881 spin_lock_irqsave(&s->lock, flags);
882 if (val)
883 s->ctrl |= CTRL_XCTL1;
884 else
885 s->ctrl &= ~CTRL_XCTL1;
886 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
887 spin_unlock_irqrestore(&s->lock, flags);
888 }
889 return put_user((s->ctrl & CTRL_XCTL1) ? 1 : 0, p);
890 }
891 if (cmd == SOUND_MIXER_INFO) {
892 mixer_info info;
893 strncpy(info.id, "ES1370", sizeof(info.id));
894 strncpy(info.name, "Ensoniq ES1370", sizeof(info.name));
895 info.modify_counter = s->mix.modcnt;
896 if (copy_to_user((void __user *)arg, &info, sizeof(info)))
897 return -EFAULT;
898 return 0;
899 }
900 if (cmd == SOUND_OLD_MIXER_INFO) {
901 _old_mixer_info info;
902 strncpy(info.id, "ES1370", sizeof(info.id));
903 strncpy(info.name, "Ensoniq ES1370", sizeof(info.name));
904 if (copy_to_user((void __user *)arg, &info, sizeof(info)))
905 return -EFAULT;
906 return 0;
907 }
908 if (cmd == OSS_GETVERSION)
909 return put_user(SOUND_VERSION, p);
910 if (_IOC_TYPE(cmd) != 'M' || _SIOC_SIZE(cmd) != sizeof(int))
911 return -EINVAL;
912 if (_SIOC_DIR(cmd) == _SIOC_READ) {
913 switch (_IOC_NR(cmd)) {
914 case SOUND_MIXER_RECSRC:
915 return put_user(s->mix.recsrc, p);
916
917 case SOUND_MIXER_DEVMASK:
918 val = SOUND_MASK_IMIX;
919 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
920 if (mixtable[i].avail)
921 val |= 1 << i;
922 return put_user(val, p);
923
924 case SOUND_MIXER_RECMASK:
925 for (val = i = 0; i < SOUND_MIXER_NRDEVICES; i++)
926 if (mixtable[i].recmask)
927 val |= 1 << i;
928 return put_user(val, p);
929
930 case SOUND_MIXER_STEREODEVS:
931 for (val = i = 0; i < SOUND_MIXER_NRDEVICES; i++)
932 if (mixtable[i].stereo)
933 val |= 1 << i;
934 return put_user(val, p);
935
936 case SOUND_MIXER_CAPS:
937 return put_user(0, p);
938
939 case SOUND_MIXER_IMIX:
940 return put_user(s->mix.imix, p);
941
942 default:
943 i = _IOC_NR(cmd);
944 if (i >= SOUND_MIXER_NRDEVICES || !mixtable[i].avail)
945 return -EINVAL;
946 return put_user(s->mix.vol[mixtable[i].volidx], p);
947 }
948 }
949 if (_SIOC_DIR(cmd) != (_SIOC_READ|_SIOC_WRITE))
950 return -EINVAL;
951 s->mix.modcnt++;
952 switch (_IOC_NR(cmd)) {
953
954 case SOUND_MIXER_IMIX:
955 if (get_user(s->mix.imix, p))
956 return -EFAULT;
957 set_recsrc(s, s->mix.recsrc);
958 return 0;
959
960 case SOUND_MIXER_RECSRC:
961 if (get_user(val, p))
962 return -EFAULT;
963 set_recsrc(s, val);
964 return 0;
965
966 default:
967 i = _IOC_NR(cmd);
968 if (i >= SOUND_MIXER_NRDEVICES || !mixtable[i].avail)
969 return -EINVAL;
970 if (get_user(val, p))
971 return -EFAULT;
972 l = val & 0xff;
973 if (l > 100)
974 l = 100;
975 if (mixtable[i].stereo) {
976 r = (val >> 8) & 0xff;
977 if (r > 100)
978 r = 100;
979 if (l < 7) {
980 rl = 0x80;
981 l = 0;
982 } else {
983 rl = 31 - ((l - 7) / 3);
984 l = (31 - rl) * 3 + 7;
985 }
986 if (r < 7) {
987 rr = 0x80;
988 r = 0;
989 } else {
990 rr = 31 - ((r - 7) / 3);
991 r = (31 - rr) * 3 + 7;
992 }
993 wrcodec(s, mixtable[i].right, rr);
994 } else {
995 if (mixtable[i].left == 15) {
996 if (l < 2) {
997 rr = rl = 0x80;
998 r = l = 0;
999 } else {
1000 rl = 7 - ((l - 2) / 14);
1001 r = l = (7 - rl) * 14 + 2;
1002 }
1003 } else {
1004 if (l < 7) {
1005 rl = 0x80;
1006 r = l = 0;
1007 } else {
1008 rl = 31 - ((l - 7) / 3);
1009 r = l = (31 - rl) * 3 + 7;
1010 }
1011 }
1012 }
1013 wrcodec(s, mixtable[i].left, rl);
1014#ifdef OSS_DOCUMENTED_MIXER_SEMANTICS
1015 s->mix.vol[mixtable[i].volidx] = ((unsigned int)r << 8) | l;
1016#else
1017 s->mix.vol[mixtable[i].volidx] = val;
1018#endif
1019 return put_user(s->mix.vol[mixtable[i].volidx], p);
1020 }
1021}
1022
1023
1024
1025static int es1370_open_mixdev(struct inode *inode, struct file *file)
1026{
1027 unsigned int minor = iminor(inode);
1028 struct list_head *list;
1029 struct es1370_state *s;
1030
1031 for (list = devs.next; ; list = list->next) {
1032 if (list == &devs)
1033 return -ENODEV;
1034 s = list_entry(list, struct es1370_state, devs);
1035 if (s->dev_mixer == minor)
1036 break;
1037 }
1038 VALIDATE_STATE(s);
1039 file->private_data = s;
1040 return nonseekable_open(inode, file);
1041}
1042
1043static int es1370_release_mixdev(struct inode *inode, struct file *file)
1044{
1045 struct es1370_state *s = (struct es1370_state *)file->private_data;
1046
1047 VALIDATE_STATE(s);
1048 return 0;
1049}
1050
1051static int es1370_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
1052{
1053 return mixer_ioctl((struct es1370_state *)file->private_data, cmd, arg);
1054}
1055
1056static struct file_operations es1370_mixer_fops = {
1057 .owner = THIS_MODULE,
1058 .llseek = no_llseek,
1059 .ioctl = es1370_ioctl_mixdev,
1060 .open = es1370_open_mixdev,
1061 .release = es1370_release_mixdev,
1062};
1063
1064
1065
1066static int drain_dac1(struct es1370_state *s, int nonblock)
1067{
1068 DECLARE_WAITQUEUE(wait, current);
1069 unsigned long flags;
1070 int count, tmo;
1071
1072 if (s->dma_dac1.mapped || !s->dma_dac1.ready)
1073 return 0;
1074 add_wait_queue(&s->dma_dac1.wait, &wait);
1075 for (;;) {
1076 __set_current_state(TASK_INTERRUPTIBLE);
1077 spin_lock_irqsave(&s->lock, flags);
1078 count = s->dma_dac1.count;
1079 spin_unlock_irqrestore(&s->lock, flags);
1080 if (count <= 0)
1081 break;
1082 if (signal_pending(current))
1083 break;
1084 if (nonblock) {
1085 remove_wait_queue(&s->dma_dac1.wait, &wait);
1086 set_current_state(TASK_RUNNING);
1087 return -EBUSY;
1088 }
1089 tmo = 3 * HZ * (count + s->dma_dac1.fragsize) / 2
1090 / dac1_samplerate[(s->ctrl & CTRL_WTSRSEL) >> CTRL_SH_WTSRSEL];
1091 tmo >>= sample_shift[(s->sctrl & SCTRL_P1FMT) >> SCTRL_SH_P1FMT];
1092 if (!schedule_timeout(tmo + 1))
1093 DBG(printk(KERN_DEBUG "es1370: dma timed out??\n");)
1094 }
1095 remove_wait_queue(&s->dma_dac1.wait, &wait);
1096 set_current_state(TASK_RUNNING);
1097 if (signal_pending(current))
1098 return -ERESTARTSYS;
1099 return 0;
1100}
1101
1102static int drain_dac2(struct es1370_state *s, int nonblock)
1103{
1104 DECLARE_WAITQUEUE(wait, current);
1105 unsigned long flags;
1106 int count, tmo;
1107
1108 if (s->dma_dac2.mapped || !s->dma_dac2.ready)
1109 return 0;
1110 add_wait_queue(&s->dma_dac2.wait, &wait);
1111 for (;;) {
1112 __set_current_state(TASK_INTERRUPTIBLE);
1113 spin_lock_irqsave(&s->lock, flags);
1114 count = s->dma_dac2.count;
1115 spin_unlock_irqrestore(&s->lock, flags);
1116 if (count <= 0)
1117 break;
1118 if (signal_pending(current))
1119 break;
1120 if (nonblock) {
1121 remove_wait_queue(&s->dma_dac2.wait, &wait);
1122 set_current_state(TASK_RUNNING);
1123 return -EBUSY;
1124 }
1125 tmo = 3 * HZ * (count + s->dma_dac2.fragsize) / 2
1126 / DAC2_DIVTOSR((s->ctrl & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV);
1127 tmo >>= sample_shift[(s->sctrl & SCTRL_P2FMT) >> SCTRL_SH_P2FMT];
1128 if (!schedule_timeout(tmo + 1))
1129 DBG(printk(KERN_DEBUG "es1370: dma timed out??\n");)
1130 }
1131 remove_wait_queue(&s->dma_dac2.wait, &wait);
1132 set_current_state(TASK_RUNNING);
1133 if (signal_pending(current))
1134 return -ERESTARTSYS;
1135 return 0;
1136}
1137
1138
1139
1140static ssize_t es1370_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
1141{
1142 struct es1370_state *s = (struct es1370_state *)file->private_data;
1143 DECLARE_WAITQUEUE(wait, current);
1144 ssize_t ret = 0;
1145 unsigned long flags;
1146 unsigned swptr;
1147 int cnt;
1148
1149 VALIDATE_STATE(s);
1150 if (s->dma_adc.mapped)
1151 return -ENXIO;
1152 if (!access_ok(VERIFY_WRITE, buffer, count))
1153 return -EFAULT;
1154 down(&s->sem);
1155 if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
1156 goto out;
1157
1158 add_wait_queue(&s->dma_adc.wait, &wait);
1159 while (count > 0) {
1160 spin_lock_irqsave(&s->lock, flags);
1161 swptr = s->dma_adc.swptr;
1162 cnt = s->dma_adc.dmasize-swptr;
1163 if (s->dma_adc.count < cnt)
1164 cnt = s->dma_adc.count;
1165 if (cnt <= 0)
1166 __set_current_state(TASK_INTERRUPTIBLE);
1167 spin_unlock_irqrestore(&s->lock, flags);
1168 if (cnt > count)
1169 cnt = count;
1170 if (cnt <= 0) {
1171 if (s->dma_adc.enabled)
1172 start_adc(s);
1173 if (file->f_flags & O_NONBLOCK) {
1174 if (!ret)
1175 ret = -EAGAIN;
1176 goto out;
1177 }
1178 up(&s->sem);
1179 schedule();
1180 if (signal_pending(current)) {
1181 if (!ret)
1182 ret = -ERESTARTSYS;
1183 goto out;
1184 }
1185 down(&s->sem);
1186 if (s->dma_adc.mapped)
1187 {
1188 ret = -ENXIO;
1189 goto out;
1190 }
1191 continue;
1192 }
1193 if (copy_to_user(buffer, s->dma_adc.rawbuf + swptr, cnt)) {
1194 if (!ret)
1195 ret = -EFAULT;
1196 goto out;
1197 }
1198 swptr = (swptr + cnt) % s->dma_adc.dmasize;
1199 spin_lock_irqsave(&s->lock, flags);
1200 s->dma_adc.swptr = swptr;
1201 s->dma_adc.count -= cnt;
1202 spin_unlock_irqrestore(&s->lock, flags);
1203 count -= cnt;
1204 buffer += cnt;
1205 ret += cnt;
1206 if (s->dma_adc.enabled)
1207 start_adc(s);
1208 }
1209out:
1210 up(&s->sem);
1211 remove_wait_queue(&s->dma_adc.wait, &wait);
1212 set_current_state(TASK_RUNNING);
1213 return ret;
1214}
1215
1216static ssize_t es1370_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
1217{
1218 struct es1370_state *s = (struct es1370_state *)file->private_data;
1219 DECLARE_WAITQUEUE(wait, current);
1220 ssize_t ret = 0;
1221 unsigned long flags;
1222 unsigned swptr;
1223 int cnt;
1224
1225 VALIDATE_STATE(s);
1226 if (s->dma_dac2.mapped)
1227 return -ENXIO;
1228 if (!access_ok(VERIFY_READ, buffer, count))
1229 return -EFAULT;
1230 down(&s->sem);
1231 if (!s->dma_dac2.ready && (ret = prog_dmabuf_dac2(s)))
1232 goto out;
1233 ret = 0;
1234 add_wait_queue(&s->dma_dac2.wait, &wait);
1235 while (count > 0) {
1236 spin_lock_irqsave(&s->lock, flags);
1237 if (s->dma_dac2.count < 0) {
1238 s->dma_dac2.count = 0;
1239 s->dma_dac2.swptr = s->dma_dac2.hwptr;
1240 }
1241 swptr = s->dma_dac2.swptr;
1242 cnt = s->dma_dac2.dmasize-swptr;
1243 if (s->dma_dac2.count + cnt > s->dma_dac2.dmasize)
1244 cnt = s->dma_dac2.dmasize - s->dma_dac2.count;
1245 if (cnt <= 0)
1246 __set_current_state(TASK_INTERRUPTIBLE);
1247 spin_unlock_irqrestore(&s->lock, flags);
1248 if (cnt > count)
1249 cnt = count;
1250 if (cnt <= 0) {
1251 if (s->dma_dac2.enabled)
1252 start_dac2(s);
1253 if (file->f_flags & O_NONBLOCK) {
1254 if (!ret)
1255 ret = -EAGAIN;
1256 goto out;
1257 }
1258 up(&s->sem);
1259 schedule();
1260 if (signal_pending(current)) {
1261 if (!ret)
1262 ret = -ERESTARTSYS;
1263 goto out;
1264 }
1265 down(&s->sem);
1266 if (s->dma_dac2.mapped)
1267 {
1268 ret = -ENXIO;
1269 goto out;
1270 }
1271 continue;
1272 }
1273 if (copy_from_user(s->dma_dac2.rawbuf + swptr, buffer, cnt)) {
1274 if (!ret)
1275 ret = -EFAULT;
1276 goto out;
1277 }
1278 swptr = (swptr + cnt) % s->dma_dac2.dmasize;
1279 spin_lock_irqsave(&s->lock, flags);
1280 s->dma_dac2.swptr = swptr;
1281 s->dma_dac2.count += cnt;
1282 s->dma_dac2.endcleared = 0;
1283 spin_unlock_irqrestore(&s->lock, flags);
1284 count -= cnt;
1285 buffer += cnt;
1286 ret += cnt;
1287 if (s->dma_dac2.enabled)
1288 start_dac2(s);
1289 }
1290out:
1291 up(&s->sem);
1292 remove_wait_queue(&s->dma_dac2.wait, &wait);
1293 set_current_state(TASK_RUNNING);
1294 return ret;
1295}
1296
1297
1298static unsigned int es1370_poll(struct file *file, struct poll_table_struct *wait)
1299{
1300 struct es1370_state *s = (struct es1370_state *)file->private_data;
1301 unsigned long flags;
1302 unsigned int mask = 0;
1303
1304 VALIDATE_STATE(s);
1305 if (file->f_mode & FMODE_WRITE) {
1306 if (!s->dma_dac2.ready && prog_dmabuf_dac2(s))
1307 return 0;
1308 poll_wait(file, &s->dma_dac2.wait, wait);
1309 }
1310 if (file->f_mode & FMODE_READ) {
1311 if (!s->dma_adc.ready && prog_dmabuf_adc(s))
1312 return 0;
1313 poll_wait(file, &s->dma_adc.wait, wait);
1314 }
1315 spin_lock_irqsave(&s->lock, flags);
1316 es1370_update_ptr(s);
1317 if (file->f_mode & FMODE_READ) {
1318 if (s->dma_adc.count >= (signed)s->dma_adc.fragsize)
1319 mask |= POLLIN | POLLRDNORM;
1320 }
1321 if (file->f_mode & FMODE_WRITE) {
1322 if (s->dma_dac2.mapped) {
1323 if (s->dma_dac2.count >= (signed)s->dma_dac2.fragsize)
1324 mask |= POLLOUT | POLLWRNORM;
1325 } else {
1326 if ((signed)s->dma_dac2.dmasize >= s->dma_dac2.count + (signed)s->dma_dac2.fragsize)
1327 mask |= POLLOUT | POLLWRNORM;
1328 }
1329 }
1330 spin_unlock_irqrestore(&s->lock, flags);
1331 return mask;
1332}
1333
1334static int es1370_mmap(struct file *file, struct vm_area_struct *vma)
1335{
1336 struct es1370_state *s = (struct es1370_state *)file->private_data;
1337 struct dmabuf *db;
1338 int ret = 0;
1339 unsigned long size;
1340
1341 VALIDATE_STATE(s);
1342 lock_kernel();
1343 down(&s->sem);
1344 if (vma->vm_flags & VM_WRITE) {
1345 if ((ret = prog_dmabuf_dac2(s)) != 0) {
1346 goto out;
1347 }
1348 db = &s->dma_dac2;
1349 } else if (vma->vm_flags & VM_READ) {
1350 if ((ret = prog_dmabuf_adc(s)) != 0) {
1351 goto out;
1352 }
1353 db = &s->dma_adc;
1354 } else {
1355 ret = -EINVAL;
1356 goto out;
1357 }
1358 if (vma->vm_pgoff != 0) {
1359 ret = -EINVAL;
1360 goto out;
1361 }
1362 size = vma->vm_end - vma->vm_start;
1363 if (size > (PAGE_SIZE << db->buforder)) {
1364 ret = -EINVAL;
1365 goto out;
1366 }
1367 if (remap_pfn_range(vma, vma->vm_start,
1368 virt_to_phys(db->rawbuf) >> PAGE_SHIFT,
1369 size, vma->vm_page_prot)) {
1370 ret = -EAGAIN;
1371 goto out;
1372 }
1373 db->mapped = 1;
1374out:
1375 up(&s->sem);
1376 unlock_kernel();
1377 return ret;
1378}
1379
1380static int es1370_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
1381{
1382 struct es1370_state *s = (struct es1370_state *)file->private_data;
1383 unsigned long flags;
1384 audio_buf_info abinfo;
1385 count_info cinfo;
1386 int count;
1387 int val, mapped, ret;
1388 void __user *argp = (void __user *)arg;
1389 int __user *p = argp;
1390
1391 VALIDATE_STATE(s);
1392 mapped = ((file->f_mode & FMODE_WRITE) && s->dma_dac2.mapped) ||
1393 ((file->f_mode & FMODE_READ) && s->dma_adc.mapped);
1394 switch (cmd) {
1395 case OSS_GETVERSION:
1396 return put_user(SOUND_VERSION, p);
1397
1398 case SNDCTL_DSP_SYNC:
1399 if (file->f_mode & FMODE_WRITE)
1400 return drain_dac2(s, 0);
1401 return 0;
1402
1403 case SNDCTL_DSP_SETDUPLEX:
1404 return 0;
1405
1406 case SNDCTL_DSP_GETCAPS:
1407 return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP, p);
1408
1409 case SNDCTL_DSP_RESET:
1410 if (file->f_mode & FMODE_WRITE) {
1411 stop_dac2(s);
1412 synchronize_irq(s->irq);
1413 s->dma_dac2.swptr = s->dma_dac2.hwptr = s->dma_dac2.count = s->dma_dac2.total_bytes = 0;
1414 }
1415 if (file->f_mode & FMODE_READ) {
1416 stop_adc(s);
1417 synchronize_irq(s->irq);
1418 s->dma_adc.swptr = s->dma_adc.hwptr = s->dma_adc.count = s->dma_adc.total_bytes = 0;
1419 }
1420 return 0;
1421
1422 case SNDCTL_DSP_SPEED:
1423 if (get_user(val, p))
1424 return -EFAULT;
1425 if (val >= 0) {
1426 if (s->open_mode & (~file->f_mode) & (FMODE_READ|FMODE_WRITE))
1427 return -EINVAL;
1428 if (val < 4000)
1429 val = 4000;
1430 if (val > 50000)
1431 val = 50000;
1432 stop_adc(s);
1433 stop_dac2(s);
1434 s->dma_adc.ready = s->dma_dac2.ready = 0;
1435 spin_lock_irqsave(&s->lock, flags);
1436 s->ctrl = (s->ctrl & ~CTRL_PCLKDIV) | (DAC2_SRTODIV(val) << CTRL_SH_PCLKDIV);
1437 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
1438 spin_unlock_irqrestore(&s->lock, flags);
1439 }
1440 return put_user(DAC2_DIVTOSR((s->ctrl & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV), p);
1441
1442 case SNDCTL_DSP_STEREO:
1443 if (get_user(val, p))
1444 return -EFAULT;
1445 if (file->f_mode & FMODE_READ) {
1446 stop_adc(s);
1447 s->dma_adc.ready = 0;
1448 spin_lock_irqsave(&s->lock, flags);
1449 if (val)
1450 s->sctrl |= SCTRL_R1SMB;
1451 else
1452 s->sctrl &= ~SCTRL_R1SMB;
1453 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
1454 spin_unlock_irqrestore(&s->lock, flags);
1455 }
1456 if (file->f_mode & FMODE_WRITE) {
1457 stop_dac2(s);
1458 s->dma_dac2.ready = 0;
1459 spin_lock_irqsave(&s->lock, flags);
1460 if (val)
1461 s->sctrl |= SCTRL_P2SMB;
1462 else
1463 s->sctrl &= ~SCTRL_P2SMB;
1464 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
1465 spin_unlock_irqrestore(&s->lock, flags);
1466 }
1467 return 0;
1468
1469 case SNDCTL_DSP_CHANNELS:
1470 if (get_user(val, p))
1471 return -EFAULT;
1472 if (val != 0) {
1473 if (file->f_mode & FMODE_READ) {
1474 stop_adc(s);
1475 s->dma_adc.ready = 0;
1476 spin_lock_irqsave(&s->lock, flags);
1477 if (val >= 2)
1478 s->sctrl |= SCTRL_R1SMB;
1479 else
1480 s->sctrl &= ~SCTRL_R1SMB;
1481 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
1482 spin_unlock_irqrestore(&s->lock, flags);
1483 }
1484 if (file->f_mode & FMODE_WRITE) {
1485 stop_dac2(s);
1486 s->dma_dac2.ready = 0;
1487 spin_lock_irqsave(&s->lock, flags);
1488 if (val >= 2)
1489 s->sctrl |= SCTRL_P2SMB;
1490 else
1491 s->sctrl &= ~SCTRL_P2SMB;
1492 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
1493 spin_unlock_irqrestore(&s->lock, flags);
1494 }
1495 }
1496 return put_user((s->sctrl & ((file->f_mode & FMODE_READ) ? SCTRL_R1SMB : SCTRL_P2SMB)) ? 2 : 1, p);
1497
1498 case SNDCTL_DSP_GETFMTS:
1499 return put_user(AFMT_S16_LE|AFMT_U8, p);
1500
1501 case SNDCTL_DSP_SETFMT:
1502 if (get_user(val, p))
1503 return -EFAULT;
1504 if (val != AFMT_QUERY) {
1505 if (file->f_mode & FMODE_READ) {
1506 stop_adc(s);
1507 s->dma_adc.ready = 0;
1508 spin_lock_irqsave(&s->lock, flags);
1509 if (val == AFMT_S16_LE)
1510 s->sctrl |= SCTRL_R1SEB;
1511 else
1512 s->sctrl &= ~SCTRL_R1SEB;
1513 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
1514 spin_unlock_irqrestore(&s->lock, flags);
1515 }
1516 if (file->f_mode & FMODE_WRITE) {
1517 stop_dac2(s);
1518 s->dma_dac2.ready = 0;
1519 spin_lock_irqsave(&s->lock, flags);
1520 if (val == AFMT_S16_LE)
1521 s->sctrl |= SCTRL_P2SEB;
1522 else
1523 s->sctrl &= ~SCTRL_P2SEB;
1524 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
1525 spin_unlock_irqrestore(&s->lock, flags);
1526 }
1527 }
1528 return put_user((s->sctrl & ((file->f_mode & FMODE_READ) ? SCTRL_R1SEB : SCTRL_P2SEB)) ?
1529 AFMT_S16_LE : AFMT_U8, p);
1530
1531 case SNDCTL_DSP_POST:
1532 return 0;
1533
1534 case SNDCTL_DSP_GETTRIGGER:
1535 val = 0;
1536 if (file->f_mode & FMODE_READ && s->ctrl & CTRL_ADC_EN)
1537 val |= PCM_ENABLE_INPUT;
1538 if (file->f_mode & FMODE_WRITE && s->ctrl & CTRL_DAC2_EN)
1539 val |= PCM_ENABLE_OUTPUT;
1540 return put_user(val, p);
1541
1542 case SNDCTL_DSP_SETTRIGGER:
1543 if (get_user(val, p))
1544 return -EFAULT;
1545 if (file->f_mode & FMODE_READ) {
1546 if (val & PCM_ENABLE_INPUT) {
1547 if (!s->dma_adc.ready && (ret = prog_dmabuf_adc(s)))
1548 return ret;
1549 s->dma_adc.enabled = 1;
1550 start_adc(s);
1551 } else {
1552 s->dma_adc.enabled = 0;
1553 stop_adc(s);
1554 }
1555 }
1556 if (file->f_mode & FMODE_WRITE) {
1557 if (val & PCM_ENABLE_OUTPUT) {
1558 if (!s->dma_dac2.ready && (ret = prog_dmabuf_dac2(s)))
1559 return ret;
1560 s->dma_dac2.enabled = 1;
1561 start_dac2(s);
1562 } else {
1563 s->dma_dac2.enabled = 0;
1564 stop_dac2(s);
1565 }
1566 }
1567 return 0;
1568
1569 case SNDCTL_DSP_GETOSPACE:
1570 if (!(file->f_mode & FMODE_WRITE))
1571 return -EINVAL;
1572 if (!s->dma_dac2.ready && (val = prog_dmabuf_dac2(s)) != 0)
1573 return val;
1574 spin_lock_irqsave(&s->lock, flags);
1575 es1370_update_ptr(s);
1576 abinfo.fragsize = s->dma_dac2.fragsize;
1577 count = s->dma_dac2.count;
1578 if (count < 0)
1579 count = 0;
1580 abinfo.bytes = s->dma_dac2.dmasize - count;
1581 abinfo.fragstotal = s->dma_dac2.numfrag;
1582 abinfo.fragments = abinfo.bytes >> s->dma_dac2.fragshift;
1583 spin_unlock_irqrestore(&s->lock, flags);
1584 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
1585
1586 case SNDCTL_DSP_GETISPACE:
1587 if (!(file->f_mode & FMODE_READ))
1588 return -EINVAL;
1589 if (!s->dma_adc.ready && (val = prog_dmabuf_adc(s)) != 0)
1590 return val;
1591 spin_lock_irqsave(&s->lock, flags);
1592 es1370_update_ptr(s);
1593 abinfo.fragsize = s->dma_adc.fragsize;
1594 count = s->dma_adc.count;
1595 if (count < 0)
1596 count = 0;
1597 abinfo.bytes = count;
1598 abinfo.fragstotal = s->dma_adc.numfrag;
1599 abinfo.fragments = abinfo.bytes >> s->dma_adc.fragshift;
1600 spin_unlock_irqrestore(&s->lock, flags);
1601 return copy_to_user(argp, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
1602
1603 case SNDCTL_DSP_NONBLOCK:
1604 file->f_flags |= O_NONBLOCK;
1605 return 0;
1606
1607 case SNDCTL_DSP_GETODELAY:
1608 if (!(file->f_mode & FMODE_WRITE))
1609 return -EINVAL;
1610 if (!s->dma_dac2.ready && (val = prog_dmabuf_dac2(s)) != 0)
1611 return val;
1612 spin_lock_irqsave(&s->lock, flags);
1613 es1370_update_ptr(s);
1614 count = s->dma_dac2.count;
1615 spin_unlock_irqrestore(&s->lock, flags);
1616 if (count < 0)
1617 count = 0;
1618 return put_user(count, p);
1619
1620 case SNDCTL_DSP_GETIPTR:
1621 if (!(file->f_mode & FMODE_READ))
1622 return -EINVAL;
1623 if (!s->dma_adc.ready && (val = prog_dmabuf_adc(s)) != 0)
1624 return val;
1625 spin_lock_irqsave(&s->lock, flags);
1626 es1370_update_ptr(s);
1627 cinfo.bytes = s->dma_adc.total_bytes;
1628 count = s->dma_adc.count;
1629 if (count < 0)
1630 count = 0;
1631 cinfo.blocks = count >> s->dma_adc.fragshift;
1632 cinfo.ptr = s->dma_adc.hwptr;
1633 if (s->dma_adc.mapped)
1634 s->dma_adc.count &= s->dma_adc.fragsize-1;
1635 spin_unlock_irqrestore(&s->lock, flags);
1636 if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
1637 return -EFAULT;
1638 return 0;
1639
1640 case SNDCTL_DSP_GETOPTR:
1641 if (!(file->f_mode & FMODE_WRITE))
1642 return -EINVAL;
1643 if (!s->dma_dac2.ready && (val = prog_dmabuf_dac2(s)) != 0)
1644 return val;
1645 spin_lock_irqsave(&s->lock, flags);
1646 es1370_update_ptr(s);
1647 cinfo.bytes = s->dma_dac2.total_bytes;
1648 count = s->dma_dac2.count;
1649 if (count < 0)
1650 count = 0;
1651 cinfo.blocks = count >> s->dma_dac2.fragshift;
1652 cinfo.ptr = s->dma_dac2.hwptr;
1653 if (s->dma_dac2.mapped)
1654 s->dma_dac2.count &= s->dma_dac2.fragsize-1;
1655 spin_unlock_irqrestore(&s->lock, flags);
1656 if (copy_to_user(argp, &cinfo, sizeof(cinfo)))
1657 return -EFAULT;
1658 return 0;
1659
1660 case SNDCTL_DSP_GETBLKSIZE:
1661 if (file->f_mode & FMODE_WRITE) {
1662 if ((val = prog_dmabuf_dac2(s)))
1663 return val;
1664 return put_user(s->dma_dac2.fragsize, p);
1665 }
1666 if ((val = prog_dmabuf_adc(s)))
1667 return val;
1668 return put_user(s->dma_adc.fragsize, p);
1669
1670 case SNDCTL_DSP_SETFRAGMENT:
1671 if (get_user(val, p))
1672 return -EFAULT;
1673 if (file->f_mode & FMODE_READ) {
1674 s->dma_adc.ossfragshift = val & 0xffff;
1675 s->dma_adc.ossmaxfrags = (val >> 16) & 0xffff;
1676 if (s->dma_adc.ossfragshift < 4)
1677 s->dma_adc.ossfragshift = 4;
1678 if (s->dma_adc.ossfragshift > 15)
1679 s->dma_adc.ossfragshift = 15;
1680 if (s->dma_adc.ossmaxfrags < 4)
1681 s->dma_adc.ossmaxfrags = 4;
1682 }
1683 if (file->f_mode & FMODE_WRITE) {
1684 s->dma_dac2.ossfragshift = val & 0xffff;
1685 s->dma_dac2.ossmaxfrags = (val >> 16) & 0xffff;
1686 if (s->dma_dac2.ossfragshift < 4)
1687 s->dma_dac2.ossfragshift = 4;
1688 if (s->dma_dac2.ossfragshift > 15)
1689 s->dma_dac2.ossfragshift = 15;
1690 if (s->dma_dac2.ossmaxfrags < 4)
1691 s->dma_dac2.ossmaxfrags = 4;
1692 }
1693 return 0;
1694
1695 case SNDCTL_DSP_SUBDIVIDE:
1696 if ((file->f_mode & FMODE_READ && s->dma_adc.subdivision) ||
1697 (file->f_mode & FMODE_WRITE && s->dma_dac2.subdivision))
1698 return -EINVAL;
1699 if (get_user(val, p))
1700 return -EFAULT;
1701 if (val != 1 && val != 2 && val != 4)
1702 return -EINVAL;
1703 if (file->f_mode & FMODE_READ)
1704 s->dma_adc.subdivision = val;
1705 if (file->f_mode & FMODE_WRITE)
1706 s->dma_dac2.subdivision = val;
1707 return 0;
1708
1709 case SOUND_PCM_READ_RATE:
1710 return put_user(DAC2_DIVTOSR((s->ctrl & CTRL_PCLKDIV) >> CTRL_SH_PCLKDIV), p);
1711
1712 case SOUND_PCM_READ_CHANNELS:
1713 return put_user((s->sctrl & ((file->f_mode & FMODE_READ) ? SCTRL_R1SMB : SCTRL_P2SMB)) ?
1714 2 : 1, p);
1715
1716 case SOUND_PCM_READ_BITS:
1717 return put_user((s->sctrl & ((file->f_mode & FMODE_READ) ? SCTRL_R1SEB : SCTRL_P2SEB)) ?
1718 16 : 8, p);
1719
1720 case SOUND_PCM_WRITE_FILTER:
1721 case SNDCTL_DSP_SETSYNCRO:
1722 case SOUND_PCM_READ_FILTER:
1723 return -EINVAL;
1724
1725 }
1726 return mixer_ioctl(s, cmd, arg);
1727}
1728
1729static int es1370_open(struct inode *inode, struct file *file)
1730{
1731 unsigned int minor = iminor(inode);
1732 DECLARE_WAITQUEUE(wait, current);
1733 unsigned long flags;
1734 struct list_head *list;
1735 struct es1370_state *s;
1736
1737 for (list = devs.next; ; list = list->next) {
1738 if (list == &devs)
1739 return -ENODEV;
1740 s = list_entry(list, struct es1370_state, devs);
1741 if (!((s->dev_audio ^ minor) & ~0xf))
1742 break;
1743 }
1744 VALIDATE_STATE(s);
1745 file->private_data = s;
1746
1747 down(&s->open_sem);
1748 while (s->open_mode & file->f_mode) {
1749 if (file->f_flags & O_NONBLOCK) {
1750 up(&s->open_sem);
1751 return -EBUSY;
1752 }
1753 add_wait_queue(&s->open_wait, &wait);
1754 __set_current_state(TASK_INTERRUPTIBLE);
1755 up(&s->open_sem);
1756 schedule();
1757 remove_wait_queue(&s->open_wait, &wait);
1758 set_current_state(TASK_RUNNING);
1759 if (signal_pending(current))
1760 return -ERESTARTSYS;
1761 down(&s->open_sem);
1762 }
1763 spin_lock_irqsave(&s->lock, flags);
1764 if (!(s->open_mode & (FMODE_READ|FMODE_WRITE)))
1765 s->ctrl = (s->ctrl & ~CTRL_PCLKDIV) | (DAC2_SRTODIV(8000) << CTRL_SH_PCLKDIV);
1766 if (file->f_mode & FMODE_READ) {
1767 s->dma_adc.ossfragshift = s->dma_adc.ossmaxfrags = s->dma_adc.subdivision = 0;
1768 s->dma_adc.enabled = 1;
1769 s->sctrl &= ~SCTRL_R1FMT;
1770 if ((minor & 0xf) == SND_DEV_DSP16)
1771 s->sctrl |= ES1370_FMT_S16_MONO << SCTRL_SH_R1FMT;
1772 else
1773 s->sctrl |= ES1370_FMT_U8_MONO << SCTRL_SH_R1FMT;
1774 }
1775 if (file->f_mode & FMODE_WRITE) {
1776 s->dma_dac2.ossfragshift = s->dma_dac2.ossmaxfrags = s->dma_dac2.subdivision = 0;
1777 s->dma_dac2.enabled = 1;
1778 s->sctrl &= ~SCTRL_P2FMT;
1779 if ((minor & 0xf) == SND_DEV_DSP16)
1780 s->sctrl |= ES1370_FMT_S16_MONO << SCTRL_SH_P2FMT;
1781 else
1782 s->sctrl |= ES1370_FMT_U8_MONO << SCTRL_SH_P2FMT;
1783 }
1784 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
1785 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
1786 spin_unlock_irqrestore(&s->lock, flags);
1787 s->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
1788 up(&s->open_sem);
1789 init_MUTEX(&s->sem);
1790 return nonseekable_open(inode, file);
1791}
1792
1793static int es1370_release(struct inode *inode, struct file *file)
1794{
1795 struct es1370_state *s = (struct es1370_state *)file->private_data;
1796
1797 VALIDATE_STATE(s);
1798 lock_kernel();
1799 if (file->f_mode & FMODE_WRITE)
1800 drain_dac2(s, file->f_flags & O_NONBLOCK);
1801 down(&s->open_sem);
1802 if (file->f_mode & FMODE_WRITE) {
1803 stop_dac2(s);
1804 synchronize_irq(s->irq);
1805 dealloc_dmabuf(s, &s->dma_dac2);
1806 }
1807 if (file->f_mode & FMODE_READ) {
1808 stop_adc(s);
1809 dealloc_dmabuf(s, &s->dma_adc);
1810 }
1811 s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE));
1812 wake_up(&s->open_wait);
1813 up(&s->open_sem);
1814 unlock_kernel();
1815 return 0;
1816}
1817
1818static struct file_operations es1370_audio_fops = {
1819 .owner = THIS_MODULE,
1820 .llseek = no_llseek,
1821 .read = es1370_read,
1822 .write = es1370_write,
1823 .poll = es1370_poll,
1824 .ioctl = es1370_ioctl,
1825 .mmap = es1370_mmap,
1826 .open = es1370_open,
1827 .release = es1370_release,
1828};
1829
1830
1831
1832static ssize_t es1370_write_dac(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
1833{
1834 struct es1370_state *s = (struct es1370_state *)file->private_data;
1835 DECLARE_WAITQUEUE(wait, current);
1836 ssize_t ret = 0;
1837 unsigned long flags;
1838 unsigned swptr;
1839 int cnt;
1840
1841 VALIDATE_STATE(s);
1842 if (s->dma_dac1.mapped)
1843 return -ENXIO;
1844 if (!s->dma_dac1.ready && (ret = prog_dmabuf_dac1(s)))
1845 return ret;
1846 if (!access_ok(VERIFY_READ, buffer, count))
1847 return -EFAULT;
1848 add_wait_queue(&s->dma_dac1.wait, &wait);
1849 while (count > 0) {
1850 spin_lock_irqsave(&s->lock, flags);
1851 if (s->dma_dac1.count < 0) {
1852 s->dma_dac1.count = 0;
1853 s->dma_dac1.swptr = s->dma_dac1.hwptr;
1854 }
1855 swptr = s->dma_dac1.swptr;
1856 cnt = s->dma_dac1.dmasize-swptr;
1857 if (s->dma_dac1.count + cnt > s->dma_dac1.dmasize)
1858 cnt = s->dma_dac1.dmasize - s->dma_dac1.count;
1859 if (cnt <= 0)
1860 __set_current_state(TASK_INTERRUPTIBLE);
1861 spin_unlock_irqrestore(&s->lock, flags);
1862 if (cnt > count)
1863 cnt = count;
1864 if (cnt <= 0) {
1865 if (s->dma_dac1.enabled)
1866 start_dac1(s);
1867 if (file->f_flags & O_NONBLOCK) {
1868 if (!ret)
1869 ret = -EAGAIN;
1870 break;
1871 }
1872 schedule();
1873 if (signal_pending(current)) {
1874 if (!ret)
1875 ret = -ERESTARTSYS;
1876 break;
1877 }
1878 continue;
1879 }
1880 if (copy_from_user(s->dma_dac1.rawbuf + swptr, buffer, cnt)) {
1881 if (!ret)
1882 ret = -EFAULT;
1883 break;
1884 }
1885 swptr = (swptr + cnt) % s->dma_dac1.dmasize;
1886 spin_lock_irqsave(&s->lock, flags);
1887 s->dma_dac1.swptr = swptr;
1888 s->dma_dac1.count += cnt;
1889 s->dma_dac1.endcleared = 0;
1890 spin_unlock_irqrestore(&s->lock, flags);
1891 count -= cnt;
1892 buffer += cnt;
1893 ret += cnt;
1894 if (s->dma_dac1.enabled)
1895 start_dac1(s);
1896 }
1897 remove_wait_queue(&s->dma_dac1.wait, &wait);
1898 set_current_state(TASK_RUNNING);
1899 return ret;
1900}
1901
1902
1903static unsigned int es1370_poll_dac(struct file *file, struct poll_table_struct *wait)
1904{
1905 struct es1370_state *s = (struct es1370_state *)file->private_data;
1906 unsigned long flags;
1907 unsigned int mask = 0;
1908
1909 VALIDATE_STATE(s);
1910 if (!s->dma_dac1.ready && prog_dmabuf_dac1(s))
1911 return 0;
1912 poll_wait(file, &s->dma_dac1.wait, wait);
1913 spin_lock_irqsave(&s->lock, flags);
1914 es1370_update_ptr(s);
1915 if (s->dma_dac1.mapped) {
1916 if (s->dma_dac1.count >= (signed)s->dma_dac1.fragsize)
1917 mask |= POLLOUT | POLLWRNORM;
1918 } else {
1919 if ((signed)s->dma_dac1.dmasize >= s->dma_dac1.count + (signed)s->dma_dac1.fragsize)
1920 mask |= POLLOUT | POLLWRNORM;
1921 }
1922 spin_unlock_irqrestore(&s->lock, flags);
1923 return mask;
1924}
1925
1926static int es1370_mmap_dac(struct file *file, struct vm_area_struct *vma)
1927{
1928 struct es1370_state *s = (struct es1370_state *)file->private_data;
1929 int ret;
1930 unsigned long size;
1931
1932 VALIDATE_STATE(s);
1933 if (!(vma->vm_flags & VM_WRITE))
1934 return -EINVAL;
1935 lock_kernel();
1936 if ((ret = prog_dmabuf_dac1(s)) != 0)
1937 goto out;
1938 ret = -EINVAL;
1939 if (vma->vm_pgoff != 0)
1940 goto out;
1941 size = vma->vm_end - vma->vm_start;
1942 if (size > (PAGE_SIZE << s->dma_dac1.buforder))
1943 goto out;
1944 ret = -EAGAIN;
1945 if (remap_pfn_range(vma, vma->vm_start,
1946 virt_to_phys(s->dma_dac1.rawbuf) >> PAGE_SHIFT,
1947 size, vma->vm_page_prot))
1948 goto out;
1949 s->dma_dac1.mapped = 1;
1950 ret = 0;
1951out:
1952 unlock_kernel();
1953 return ret;
1954}
1955
1956static int es1370_ioctl_dac(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
1957{
1958 struct es1370_state *s = (struct es1370_state *)file->private_data;
1959 unsigned long flags;
1960 audio_buf_info abinfo;
1961 count_info cinfo;
1962 int count;
1963 unsigned ctrl;
1964 int val, ret;
1965 int __user *p = (int __user *)arg;
1966
1967 VALIDATE_STATE(s);
1968 switch (cmd) {
1969 case OSS_GETVERSION:
1970 return put_user(SOUND_VERSION, p);
1971
1972 case SNDCTL_DSP_SYNC:
1973 return drain_dac1(s, 0);
1974
1975 case SNDCTL_DSP_SETDUPLEX:
1976 return -EINVAL;
1977
1978 case SNDCTL_DSP_GETCAPS:
1979 return put_user(DSP_CAP_REALTIME | DSP_CAP_TRIGGER | DSP_CAP_MMAP, p);
1980
1981 case SNDCTL_DSP_RESET:
1982 stop_dac1(s);
1983 synchronize_irq(s->irq);
1984 s->dma_dac1.swptr = s->dma_dac1.hwptr = s->dma_dac1.count = s->dma_dac1.total_bytes = 0;
1985 return 0;
1986
1987 case SNDCTL_DSP_SPEED:
1988 if (get_user(val, p))
1989 return -EFAULT;
1990 if (val >= 0) {
1991 stop_dac1(s);
1992 s->dma_dac1.ready = 0;
1993 for (ctrl = 0; ctrl <= 2; ctrl++)
1994 if (val < (dac1_samplerate[ctrl] + dac1_samplerate[ctrl+1]) / 2)
1995 break;
1996 spin_lock_irqsave(&s->lock, flags);
1997 s->ctrl = (s->ctrl & ~CTRL_WTSRSEL) | (ctrl << CTRL_SH_WTSRSEL);
1998 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
1999 spin_unlock_irqrestore(&s->lock, flags);
2000 }
2001 return put_user(dac1_samplerate[(s->ctrl & CTRL_WTSRSEL) >> CTRL_SH_WTSRSEL], p);
2002
2003 case SNDCTL_DSP_STEREO:
2004 if (get_user(val, p))
2005 return -EFAULT;
2006 stop_dac1(s);
2007 s->dma_dac1.ready = 0;
2008 spin_lock_irqsave(&s->lock, flags);
2009 if (val)
2010 s->sctrl |= SCTRL_P1SMB;
2011 else
2012 s->sctrl &= ~SCTRL_P1SMB;
2013 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
2014 spin_unlock_irqrestore(&s->lock, flags);
2015 return 0;
2016
2017 case SNDCTL_DSP_CHANNELS:
2018 if (get_user(val, p))
2019 return -EFAULT;
2020 if (val != 0) {
2021 if (s->dma_dac1.mapped)
2022 return -EINVAL;
2023 stop_dac1(s);
2024 s->dma_dac1.ready = 0;
2025 spin_lock_irqsave(&s->lock, flags);
2026 if (val >= 2)
2027 s->sctrl |= SCTRL_P1SMB;
2028 else
2029 s->sctrl &= ~SCTRL_P1SMB;
2030 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
2031 spin_unlock_irqrestore(&s->lock, flags);
2032 }
2033 return put_user((s->sctrl & SCTRL_P1SMB) ? 2 : 1, p);
2034
2035 case SNDCTL_DSP_GETFMTS:
2036 return put_user(AFMT_S16_LE|AFMT_U8, p);
2037
2038 case SNDCTL_DSP_SETFMT:
2039 if (get_user(val, p))
2040 return -EFAULT;
2041 if (val != AFMT_QUERY) {
2042 stop_dac1(s);
2043 s->dma_dac1.ready = 0;
2044 spin_lock_irqsave(&s->lock, flags);
2045 if (val == AFMT_S16_LE)
2046 s->sctrl |= SCTRL_P1SEB;
2047 else
2048 s->sctrl &= ~SCTRL_P1SEB;
2049 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
2050 spin_unlock_irqrestore(&s->lock, flags);
2051 }
2052 return put_user((s->sctrl & SCTRL_P1SEB) ? AFMT_S16_LE : AFMT_U8, p);
2053
2054 case SNDCTL_DSP_POST:
2055 return 0;
2056
2057 case SNDCTL_DSP_GETTRIGGER:
2058 return put_user((s->ctrl & CTRL_DAC1_EN) ? PCM_ENABLE_OUTPUT : 0, p);
2059
2060 case SNDCTL_DSP_SETTRIGGER:
2061 if (get_user(val, p))
2062 return -EFAULT;
2063 if (val & PCM_ENABLE_OUTPUT) {
2064 if (!s->dma_dac1.ready && (ret = prog_dmabuf_dac1(s)))
2065 return ret;
2066 s->dma_dac1.enabled = 1;
2067 start_dac1(s);
2068 } else {
2069 s->dma_dac1.enabled = 0;
2070 stop_dac1(s);
2071 }
2072 return 0;
2073
2074 case SNDCTL_DSP_GETOSPACE:
2075 if (!s->dma_dac1.ready && (val = prog_dmabuf_dac1(s)) != 0)
2076 return val;
2077 spin_lock_irqsave(&s->lock, flags);
2078 es1370_update_ptr(s);
2079 abinfo.fragsize = s->dma_dac1.fragsize;
2080 count = s->dma_dac1.count;
2081 if (count < 0)
2082 count = 0;
2083 abinfo.bytes = s->dma_dac1.dmasize - count;
2084 abinfo.fragstotal = s->dma_dac1.numfrag;
2085 abinfo.fragments = abinfo.bytes >> s->dma_dac1.fragshift;
2086 spin_unlock_irqrestore(&s->lock, flags);
2087 return copy_to_user((void __user *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2088
2089 case SNDCTL_DSP_NONBLOCK:
2090 file->f_flags |= O_NONBLOCK;
2091 return 0;
2092
2093 case SNDCTL_DSP_GETODELAY:
2094 if (!s->dma_dac1.ready && (val = prog_dmabuf_dac1(s)) != 0)
2095 return val;
2096 spin_lock_irqsave(&s->lock, flags);
2097 es1370_update_ptr(s);
2098 count = s->dma_dac1.count;
2099 spin_unlock_irqrestore(&s->lock, flags);
2100 if (count < 0)
2101 count = 0;
2102 return put_user(count, p);
2103
2104 case SNDCTL_DSP_GETOPTR:
2105 if (!s->dma_dac1.ready && (val = prog_dmabuf_dac1(s)) != 0)
2106 return val;
2107 spin_lock_irqsave(&s->lock, flags);
2108 es1370_update_ptr(s);
2109 cinfo.bytes = s->dma_dac1.total_bytes;
2110 count = s->dma_dac1.count;
2111 if (count < 0)
2112 count = 0;
2113 cinfo.blocks = count >> s->dma_dac1.fragshift;
2114 cinfo.ptr = s->dma_dac1.hwptr;
2115 if (s->dma_dac1.mapped)
2116 s->dma_dac1.count &= s->dma_dac1.fragsize-1;
2117 spin_unlock_irqrestore(&s->lock, flags);
2118 if (copy_to_user((void __user *)arg, &cinfo, sizeof(cinfo)))
2119 return -EFAULT;
2120 return 0;
2121
2122 case SNDCTL_DSP_GETBLKSIZE:
2123 if ((val = prog_dmabuf_dac1(s)))
2124 return val;
2125 return put_user(s->dma_dac1.fragsize, p);
2126
2127 case SNDCTL_DSP_SETFRAGMENT:
2128 if (get_user(val, p))
2129 return -EFAULT;
2130 s->dma_dac1.ossfragshift = val & 0xffff;
2131 s->dma_dac1.ossmaxfrags = (val >> 16) & 0xffff;
2132 if (s->dma_dac1.ossfragshift < 4)
2133 s->dma_dac1.ossfragshift = 4;
2134 if (s->dma_dac1.ossfragshift > 15)
2135 s->dma_dac1.ossfragshift = 15;
2136 if (s->dma_dac1.ossmaxfrags < 4)
2137 s->dma_dac1.ossmaxfrags = 4;
2138 return 0;
2139
2140 case SNDCTL_DSP_SUBDIVIDE:
2141 if (s->dma_dac1.subdivision)
2142 return -EINVAL;
2143 if (get_user(val, p))
2144 return -EFAULT;
2145 if (val != 1 && val != 2 && val != 4)
2146 return -EINVAL;
2147 s->dma_dac1.subdivision = val;
2148 return 0;
2149
2150 case SOUND_PCM_READ_RATE:
2151 return put_user(dac1_samplerate[(s->ctrl & CTRL_WTSRSEL) >> CTRL_SH_WTSRSEL], p);
2152
2153 case SOUND_PCM_READ_CHANNELS:
2154 return put_user((s->sctrl & SCTRL_P1SMB) ? 2 : 1, p);
2155
2156 case SOUND_PCM_READ_BITS:
2157 return put_user((s->sctrl & SCTRL_P1SEB) ? 16 : 8, p);
2158
2159 case SOUND_PCM_WRITE_FILTER:
2160 case SNDCTL_DSP_SETSYNCRO:
2161 case SOUND_PCM_READ_FILTER:
2162 return -EINVAL;
2163
2164 }
2165 return mixer_ioctl(s, cmd, arg);
2166}
2167
2168static int es1370_open_dac(struct inode *inode, struct file *file)
2169{
2170 unsigned int minor = iminor(inode);
2171 DECLARE_WAITQUEUE(wait, current);
2172 unsigned long flags;
2173 struct list_head *list;
2174 struct es1370_state *s;
2175
2176 for (list = devs.next; ; list = list->next) {
2177 if (list == &devs)
2178 return -ENODEV;
2179 s = list_entry(list, struct es1370_state, devs);
2180 if (!((s->dev_dac ^ minor) & ~0xf))
2181 break;
2182 }
2183 VALIDATE_STATE(s);
2184
2185#if 0
2186 if (file->f_mode & FMODE_READ)
2187 return -EPERM;
2188#endif
2189 if (!(file->f_mode & FMODE_WRITE))
2190 return -EINVAL;
2191 file->private_data = s;
2192
2193 down(&s->open_sem);
2194 while (s->open_mode & FMODE_DAC) {
2195 if (file->f_flags & O_NONBLOCK) {
2196 up(&s->open_sem);
2197 return -EBUSY;
2198 }
2199 add_wait_queue(&s->open_wait, &wait);
2200 __set_current_state(TASK_INTERRUPTIBLE);
2201 up(&s->open_sem);
2202 schedule();
2203 remove_wait_queue(&s->open_wait, &wait);
2204 set_current_state(TASK_RUNNING);
2205 if (signal_pending(current))
2206 return -ERESTARTSYS;
2207 down(&s->open_sem);
2208 }
2209 s->dma_dac1.ossfragshift = s->dma_dac1.ossmaxfrags = s->dma_dac1.subdivision = 0;
2210 s->dma_dac1.enabled = 1;
2211 spin_lock_irqsave(&s->lock, flags);
2212 s->ctrl = (s->ctrl & ~CTRL_WTSRSEL) | (1 << CTRL_SH_WTSRSEL);
2213 s->sctrl &= ~SCTRL_P1FMT;
2214 if ((minor & 0xf) == SND_DEV_DSP16)
2215 s->sctrl |= ES1370_FMT_S16_MONO << SCTRL_SH_P1FMT;
2216 else
2217 s->sctrl |= ES1370_FMT_U8_MONO << SCTRL_SH_P1FMT;
2218 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
2219 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
2220 spin_unlock_irqrestore(&s->lock, flags);
2221 s->open_mode |= FMODE_DAC;
2222 up(&s->open_sem);
2223 return nonseekable_open(inode, file);
2224}
2225
2226static int es1370_release_dac(struct inode *inode, struct file *file)
2227{
2228 struct es1370_state *s = (struct es1370_state *)file->private_data;
2229
2230 VALIDATE_STATE(s);
2231 lock_kernel();
2232 drain_dac1(s, file->f_flags & O_NONBLOCK);
2233 down(&s->open_sem);
2234 stop_dac1(s);
2235 dealloc_dmabuf(s, &s->dma_dac1);
2236 s->open_mode &= ~FMODE_DAC;
2237 wake_up(&s->open_wait);
2238 up(&s->open_sem);
2239 unlock_kernel();
2240 return 0;
2241}
2242
2243static struct file_operations es1370_dac_fops = {
2244 .owner = THIS_MODULE,
2245 .llseek = no_llseek,
2246 .write = es1370_write_dac,
2247 .poll = es1370_poll_dac,
2248 .ioctl = es1370_ioctl_dac,
2249 .mmap = es1370_mmap_dac,
2250 .open = es1370_open_dac,
2251 .release = es1370_release_dac,
2252};
2253
2254
2255
2256static ssize_t es1370_midi_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
2257{
2258 struct es1370_state *s = (struct es1370_state *)file->private_data;
2259 DECLARE_WAITQUEUE(wait, current);
2260 ssize_t ret;
2261 unsigned long flags;
2262 unsigned ptr;
2263 int cnt;
2264
2265 VALIDATE_STATE(s);
2266 if (!access_ok(VERIFY_WRITE, buffer, count))
2267 return -EFAULT;
2268 if (count == 0)
2269 return 0;
2270 ret = 0;
2271 add_wait_queue(&s->midi.iwait, &wait);
2272 while (count > 0) {
2273 spin_lock_irqsave(&s->lock, flags);
2274 ptr = s->midi.ird;
2275 cnt = MIDIINBUF - ptr;
2276 if (s->midi.icnt < cnt)
2277 cnt = s->midi.icnt;
2278 if (cnt <= 0)
2279 __set_current_state(TASK_INTERRUPTIBLE);
2280 spin_unlock_irqrestore(&s->lock, flags);
2281 if (cnt > count)
2282 cnt = count;
2283 if (cnt <= 0) {
2284 if (file->f_flags & O_NONBLOCK) {
2285 if (!ret)
2286 ret = -EAGAIN;
2287 break;
2288 }
2289 schedule();
2290 if (signal_pending(current)) {
2291 if (!ret)
2292 ret = -ERESTARTSYS;
2293 break;
2294 }
2295 continue;
2296 }
2297 if (copy_to_user(buffer, s->midi.ibuf + ptr, cnt)) {
2298 if (!ret)
2299 ret = -EFAULT;
2300 break;
2301 }
2302 ptr = (ptr + cnt) % MIDIINBUF;
2303 spin_lock_irqsave(&s->lock, flags);
2304 s->midi.ird = ptr;
2305 s->midi.icnt -= cnt;
2306 spin_unlock_irqrestore(&s->lock, flags);
2307 count -= cnt;
2308 buffer += cnt;
2309 ret += cnt;
2310 break;
2311 }
2312 __set_current_state(TASK_RUNNING);
2313 remove_wait_queue(&s->midi.iwait, &wait);
2314 return ret;
2315}
2316
2317static ssize_t es1370_midi_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
2318{
2319 struct es1370_state *s = (struct es1370_state *)file->private_data;
2320 DECLARE_WAITQUEUE(wait, current);
2321 ssize_t ret;
2322 unsigned long flags;
2323 unsigned ptr;
2324 int cnt;
2325
2326 VALIDATE_STATE(s);
2327 if (!access_ok(VERIFY_READ, buffer, count))
2328 return -EFAULT;
2329 if (count == 0)
2330 return 0;
2331 ret = 0;
2332 add_wait_queue(&s->midi.owait, &wait);
2333 while (count > 0) {
2334 spin_lock_irqsave(&s->lock, flags);
2335 ptr = s->midi.owr;
2336 cnt = MIDIOUTBUF - ptr;
2337 if (s->midi.ocnt + cnt > MIDIOUTBUF)
2338 cnt = MIDIOUTBUF - s->midi.ocnt;
2339 if (cnt <= 0) {
2340 __set_current_state(TASK_INTERRUPTIBLE);
2341 es1370_handle_midi(s);
2342 }
2343 spin_unlock_irqrestore(&s->lock, flags);
2344 if (cnt > count)
2345 cnt = count;
2346 if (cnt <= 0) {
2347 if (file->f_flags & O_NONBLOCK) {
2348 if (!ret)
2349 ret = -EAGAIN;
2350 break;
2351 }
2352 schedule();
2353 if (signal_pending(current)) {
2354 if (!ret)
2355 ret = -ERESTARTSYS;
2356 break;
2357 }
2358 continue;
2359 }
2360 if (copy_from_user(s->midi.obuf + ptr, buffer, cnt)) {
2361 if (!ret)
2362 ret = -EFAULT;
2363 break;
2364 }
2365 ptr = (ptr + cnt) % MIDIOUTBUF;
2366 spin_lock_irqsave(&s->lock, flags);
2367 s->midi.owr = ptr;
2368 s->midi.ocnt += cnt;
2369 spin_unlock_irqrestore(&s->lock, flags);
2370 count -= cnt;
2371 buffer += cnt;
2372 ret += cnt;
2373 spin_lock_irqsave(&s->lock, flags);
2374 es1370_handle_midi(s);
2375 spin_unlock_irqrestore(&s->lock, flags);
2376 }
2377 __set_current_state(TASK_RUNNING);
2378 remove_wait_queue(&s->midi.owait, &wait);
2379 return ret;
2380}
2381
2382
2383static unsigned int es1370_midi_poll(struct file *file, struct poll_table_struct *wait)
2384{
2385 struct es1370_state *s = (struct es1370_state *)file->private_data;
2386 unsigned long flags;
2387 unsigned int mask = 0;
2388
2389 VALIDATE_STATE(s);
2390 if (file->f_mode & FMODE_WRITE)
2391 poll_wait(file, &s->midi.owait, wait);
2392 if (file->f_mode & FMODE_READ)
2393 poll_wait(file, &s->midi.iwait, wait);
2394 spin_lock_irqsave(&s->lock, flags);
2395 if (file->f_mode & FMODE_READ) {
2396 if (s->midi.icnt > 0)
2397 mask |= POLLIN | POLLRDNORM;
2398 }
2399 if (file->f_mode & FMODE_WRITE) {
2400 if (s->midi.ocnt < MIDIOUTBUF)
2401 mask |= POLLOUT | POLLWRNORM;
2402 }
2403 spin_unlock_irqrestore(&s->lock, flags);
2404 return mask;
2405}
2406
2407static int es1370_midi_open(struct inode *inode, struct file *file)
2408{
2409 unsigned int minor = iminor(inode);
2410 DECLARE_WAITQUEUE(wait, current);
2411 unsigned long flags;
2412 struct list_head *list;
2413 struct es1370_state *s;
2414
2415 for (list = devs.next; ; list = list->next) {
2416 if (list == &devs)
2417 return -ENODEV;
2418 s = list_entry(list, struct es1370_state, devs);
2419 if (s->dev_midi == minor)
2420 break;
2421 }
2422 VALIDATE_STATE(s);
2423 file->private_data = s;
2424
2425 down(&s->open_sem);
2426 while (s->open_mode & (file->f_mode << FMODE_MIDI_SHIFT)) {
2427 if (file->f_flags & O_NONBLOCK) {
2428 up(&s->open_sem);
2429 return -EBUSY;
2430 }
2431 add_wait_queue(&s->open_wait, &wait);
2432 __set_current_state(TASK_INTERRUPTIBLE);
2433 up(&s->open_sem);
2434 schedule();
2435 remove_wait_queue(&s->open_wait, &wait);
2436 set_current_state(TASK_RUNNING);
2437 if (signal_pending(current))
2438 return -ERESTARTSYS;
2439 down(&s->open_sem);
2440 }
2441 spin_lock_irqsave(&s->lock, flags);
2442 if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
2443 s->midi.ird = s->midi.iwr = s->midi.icnt = 0;
2444 s->midi.ord = s->midi.owr = s->midi.ocnt = 0;
2445 outb(UCTRL_CNTRL_SWR, s->io+ES1370_REG_UART_CONTROL);
2446 outb(0, s->io+ES1370_REG_UART_CONTROL);
2447 outb(0, s->io+ES1370_REG_UART_TEST);
2448 }
2449 if (file->f_mode & FMODE_READ) {
2450 s->midi.ird = s->midi.iwr = s->midi.icnt = 0;
2451 }
2452 if (file->f_mode & FMODE_WRITE) {
2453 s->midi.ord = s->midi.owr = s->midi.ocnt = 0;
2454 }
2455 s->ctrl |= CTRL_UART_EN;
2456 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
2457 es1370_handle_midi(s);
2458 spin_unlock_irqrestore(&s->lock, flags);
2459 s->open_mode |= (file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ | FMODE_MIDI_WRITE);
2460 up(&s->open_sem);
2461 return nonseekable_open(inode, file);
2462}
2463
2464static int es1370_midi_release(struct inode *inode, struct file *file)
2465{
2466 struct es1370_state *s = (struct es1370_state *)file->private_data;
2467 DECLARE_WAITQUEUE(wait, current);
2468 unsigned long flags;
2469 unsigned count, tmo;
2470
2471 VALIDATE_STATE(s);
2472
2473 lock_kernel();
2474 if (file->f_mode & FMODE_WRITE) {
2475 add_wait_queue(&s->midi.owait, &wait);
2476 for (;;) {
2477 __set_current_state(TASK_INTERRUPTIBLE);
2478 spin_lock_irqsave(&s->lock, flags);
2479 count = s->midi.ocnt;
2480 spin_unlock_irqrestore(&s->lock, flags);
2481 if (count <= 0)
2482 break;
2483 if (signal_pending(current))
2484 break;
2485 if (file->f_flags & O_NONBLOCK)
2486 break;
2487 tmo = (count * HZ) / 3100;
2488 if (!schedule_timeout(tmo ? : 1) && tmo)
2489 DBG(printk(KERN_DEBUG "es1370: midi timed out??\n");)
2490 }
2491 remove_wait_queue(&s->midi.owait, &wait);
2492 set_current_state(TASK_RUNNING);
2493 }
2494 down(&s->open_sem);
2495 s->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE));
2496 spin_lock_irqsave(&s->lock, flags);
2497 if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
2498 s->ctrl &= ~CTRL_UART_EN;
2499 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
2500 }
2501 spin_unlock_irqrestore(&s->lock, flags);
2502 wake_up(&s->open_wait);
2503 up(&s->open_sem);
2504 unlock_kernel();
2505 return 0;
2506}
2507
2508static struct file_operations es1370_midi_fops = {
2509 .owner = THIS_MODULE,
2510 .llseek = no_llseek,
2511 .read = es1370_midi_read,
2512 .write = es1370_midi_write,
2513 .poll = es1370_midi_poll,
2514 .open = es1370_midi_open,
2515 .release = es1370_midi_release,
2516};
2517
2518
2519
2520
2521#define NR_DEVICE 5
2522
2523static int lineout[NR_DEVICE];
2524static int micbias[NR_DEVICE];
2525
2526static unsigned int devindex;
2527
2528module_param_array(lineout, bool, NULL, 0);
2529MODULE_PARM_DESC(lineout, "if 1 the LINE input is converted to LINE out");
2530module_param_array(micbias, bool, NULL, 0);
2531MODULE_PARM_DESC(micbias, "sets the +5V bias for an electret microphone");
2532
2533MODULE_AUTHOR("Thomas M. Sailer, sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu");
2534MODULE_DESCRIPTION("ES1370 AudioPCI Driver");
2535MODULE_LICENSE("GPL");
2536
2537
2538
2539
2540static struct initvol {
2541 int mixch;
2542 int vol;
2543} initvol[] __initdata = {
2544 { SOUND_MIXER_WRITE_VOLUME, 0x4040 },
2545 { SOUND_MIXER_WRITE_PCM, 0x4040 },
2546 { SOUND_MIXER_WRITE_SYNTH, 0x4040 },
2547 { SOUND_MIXER_WRITE_CD, 0x4040 },
2548 { SOUND_MIXER_WRITE_LINE, 0x4040 },
2549 { SOUND_MIXER_WRITE_LINE1, 0x4040 },
2550 { SOUND_MIXER_WRITE_LINE2, 0x4040 },
2551 { SOUND_MIXER_WRITE_LINE3, 0x4040 },
2552 { SOUND_MIXER_WRITE_MIC, 0x4040 },
2553 { SOUND_MIXER_WRITE_OGAIN, 0x4040 }
2554};
2555
2556static int __devinit es1370_probe(struct pci_dev *pcidev, const struct pci_device_id *pciid)
2557{
2558 struct es1370_state *s;
2559 mm_segment_t fs;
2560 int i, val, ret;
2561
2562 if ((ret=pci_enable_device(pcidev)))
2563 return ret;
2564
2565 if ( !(pci_resource_flags(pcidev, 0) & IORESOURCE_IO) ||
2566 !pci_resource_start(pcidev, 0)
2567 )
2568 return -ENODEV;
2569 if (pcidev->irq == 0)
2570 return -ENODEV;
2571 i = pci_set_dma_mask(pcidev, 0xffffffff);
2572 if (i) {
2573 printk(KERN_WARNING "es1370: architecture does not support 32bit PCI busmaster DMA\n");
2574 return i;
2575 }
2576 if (!(s = kmalloc(sizeof(struct es1370_state), GFP_KERNEL))) {
2577 printk(KERN_WARNING "es1370: out of memory\n");
2578 return -ENOMEM;
2579 }
2580 memset(s, 0, sizeof(struct es1370_state));
2581 init_waitqueue_head(&s->dma_adc.wait);
2582 init_waitqueue_head(&s->dma_dac1.wait);
2583 init_waitqueue_head(&s->dma_dac2.wait);
2584 init_waitqueue_head(&s->open_wait);
2585 init_waitqueue_head(&s->midi.iwait);
2586 init_waitqueue_head(&s->midi.owait);
2587 init_MUTEX(&s->open_sem);
2588 spin_lock_init(&s->lock);
2589 s->magic = ES1370_MAGIC;
2590 s->dev = pcidev;
2591 s->io = pci_resource_start(pcidev, 0);
2592 s->irq = pcidev->irq;
2593 if (!request_region(s->io, ES1370_EXTENT, "es1370")) {
2594 printk(KERN_ERR "es1370: io ports %#lx-%#lx in use\n", s->io, s->io+ES1370_EXTENT-1);
2595 ret = -EBUSY;
2596 goto err_region;
2597 }
2598 if ((ret=request_irq(s->irq, es1370_interrupt, SA_SHIRQ, "es1370",s))) {
2599 printk(KERN_ERR "es1370: irq %u in use\n", s->irq);
2600 goto err_irq;
2601 }
2602
2603
2604
2605
2606 s->ctrl = CTRL_CDC_EN | (DAC2_SRTODIV(8000) << CTRL_SH_PCLKDIV) | (1 << CTRL_SH_WTSRSEL);
2607 s->gameport.io = 0;
2608 if (!request_region(0x200, JOY_EXTENT, "es1370"))
2609 printk(KERN_ERR "es1370: joystick io port 0x200 in use\n");
2610 else {
2611 s->ctrl |= CTRL_JYSTK_EN;
2612 s->gameport.io = 0x200;
2613 }
2614 if (lineout[devindex])
2615 s->ctrl |= CTRL_XCTL0;
2616 if (micbias[devindex])
2617 s->ctrl |= CTRL_XCTL1;
2618 s->sctrl = 0;
2619 printk(KERN_INFO "es1370: found adapter at io %#lx irq %u\n"
2620 KERN_INFO "es1370: features: joystick %s, line %s, mic impedance %s\n",
2621 s->io, s->irq, (s->ctrl & CTRL_JYSTK_EN) ? "on" : "off",
2622 (s->ctrl & CTRL_XCTL0) ? "out" : "in",
2623 (s->ctrl & CTRL_XCTL1) ? "1" : "0");
2624
2625 if ((s->dev_audio = register_sound_dsp(&es1370_audio_fops, -1)) < 0) {
2626 ret = s->dev_audio;
2627 goto err_dev1;
2628 }
2629 if ((s->dev_mixer = register_sound_mixer(&es1370_mixer_fops, -1)) < 0) {
2630 ret = s->dev_mixer;
2631 goto err_dev2;
2632 }
2633 if ((s->dev_dac = register_sound_dsp(&es1370_dac_fops, -1)) < 0) {
2634 ret = s->dev_dac;
2635 goto err_dev3;
2636 }
2637 if ((s->dev_midi = register_sound_midi(&es1370_midi_fops, -1)) < 0) {
2638 ret = s->dev_midi;
2639 goto err_dev4;
2640 }
2641
2642 outl(s->ctrl, s->io+ES1370_REG_CONTROL);
2643 outl(s->sctrl, s->io+ES1370_REG_SERIAL_CONTROL);
2644
2645 s->bugbuf_cpu = pci_alloc_consistent(pcidev,16,&s->bugbuf_dma);
2646 if (!s->bugbuf_cpu) {
2647 ret = -ENOMEM;
2648 goto err_dev5;
2649 }
2650 outl((ES1370_REG_PHANTOM_FRAMEADR >> 8) & 15, s->io+ES1370_REG_MEMPAGE);
2651 outl(s->bugbuf_dma, s->io+(ES1370_REG_PHANTOM_FRAMEADR & 0xff));
2652 outl(0, s->io+(ES1370_REG_PHANTOM_FRAMECNT & 0xff));
2653 pci_set_master(pcidev);
2654 wrcodec(s, 0x16, 3);
2655 wrcodec(s, 0x17, 0);
2656 wrcodec(s, 0x18, 0);
2657 wrcodec(s, 0x19, s->mix.micpreamp = 1);
2658 s->mix.imix = 1;
2659 fs = get_fs();
2660 set_fs(KERNEL_DS);
2661 val = SOUND_MASK_LINE|SOUND_MASK_SYNTH|SOUND_MASK_CD;
2662 mixer_ioctl(s, SOUND_MIXER_WRITE_RECSRC, (unsigned long)&val);
2663 for (i = 0; i < sizeof(initvol)/sizeof(initvol[0]); i++) {
2664 val = initvol[i].vol;
2665 mixer_ioctl(s, initvol[i].mixch, (unsigned long)&val);
2666 }
2667 set_fs(fs);
2668
2669 if (s->gameport.io)
2670 gameport_register_port(&s->gameport);
2671
2672
2673 pci_set_drvdata(pcidev, s);
2674
2675 list_add_tail(&s->devs, &devs);
2676
2677 if (devindex < NR_DEVICE-1)
2678 devindex++;
2679 return 0;
2680
2681 err_dev5:
2682 unregister_sound_midi(s->dev_midi);
2683 err_dev4:
2684 unregister_sound_dsp(s->dev_dac);
2685 err_dev3:
2686 unregister_sound_mixer(s->dev_mixer);
2687 err_dev2:
2688 unregister_sound_dsp(s->dev_audio);
2689 err_dev1:
2690 printk(KERN_ERR "es1370: cannot register misc device\n");
2691 free_irq(s->irq, s);
2692 if (s->gameport.io)
2693 release_region(s->gameport.io, JOY_EXTENT);
2694 err_irq:
2695 release_region(s->io, ES1370_EXTENT);
2696 err_region:
2697 kfree(s);
2698 return ret;
2699}
2700
2701static void __devexit es1370_remove(struct pci_dev *dev)
2702{
2703 struct es1370_state *s = pci_get_drvdata(dev);
2704
2705 if (!s)
2706 return;
2707 list_del(&s->devs);
2708 outl(CTRL_SERR_DIS | (1 << CTRL_SH_WTSRSEL), s->io+ES1370_REG_CONTROL);
2709 outl(0, s->io+ES1370_REG_SERIAL_CONTROL);
2710 synchronize_irq(s->irq);
2711 free_irq(s->irq, s);
2712 if (s->gameport.io) {
2713 gameport_unregister_port(&s->gameport);
2714 release_region(s->gameport.io, JOY_EXTENT);
2715 }
2716 release_region(s->io, ES1370_EXTENT);
2717 unregister_sound_dsp(s->dev_audio);
2718 unregister_sound_mixer(s->dev_mixer);
2719 unregister_sound_dsp(s->dev_dac);
2720 unregister_sound_midi(s->dev_midi);
2721 pci_free_consistent(dev, 16, s->bugbuf_cpu, s->bugbuf_dma);
2722 kfree(s);
2723 pci_set_drvdata(dev, NULL);
2724}
2725
2726static struct pci_device_id id_table[] = {
2727 { PCI_VENDOR_ID_ENSONIQ, PCI_DEVICE_ID_ENSONIQ_ES1370, PCI_ANY_ID, PCI_ANY_ID, 0, 0 },
2728 { 0, }
2729};
2730
2731MODULE_DEVICE_TABLE(pci, id_table);
2732
2733static struct pci_driver es1370_driver = {
2734 .name = "es1370",
2735 .id_table = id_table,
2736 .probe = es1370_probe,
2737 .remove = __devexit_p(es1370_remove),
2738};
2739
2740static int __init init_es1370(void)
2741{
2742 printk(KERN_INFO "es1370: version v0.38 time " __TIME__ " " __DATE__ "\n");
2743 return pci_module_init(&es1370_driver);
2744}
2745
2746static void __exit cleanup_es1370(void)
2747{
2748 printk(KERN_INFO "es1370: unloading\n");
2749 pci_unregister_driver(&es1370_driver);
2750}
2751
2752module_init(init_es1370);
2753module_exit(cleanup_es1370);
2754
2755
2756
2757#ifndef MODULE
2758
2759
2760
2761static int __init es1370_setup(char *str)
2762{
2763 static unsigned __initdata nr_dev = 0;
2764
2765 if (nr_dev >= NR_DEVICE)
2766 return 0;
2767
2768 (void)
2769 ((get_option(&str,&lineout [nr_dev]) == 2)
2770 && get_option(&str,&micbias [nr_dev])
2771 );
2772
2773 nr_dev++;
2774 return 1;
2775}
2776
2777__setup("es1370=", es1370_setup);
2778
2779#endif
2780