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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185#include <linux/version.h>
186#include <linux/kernel.h>
187#include <linux/slab.h>
188#include <linux/string.h>
189#include <linux/timer.h>
190#include <linux/sched.h>
191#include <linux/smp_lock.h>
192#include <linux/module.h>
193#include <linux/sound.h>
194#include <linux/soundcard.h>
195#include <linux/list.h>
196#include <linux/vmalloc.h>
197#include <linux/wrapper.h>
198#include <linux/init.h>
199#include <linux/poll.h>
200#include <linux/bitops.h>
201#include <asm/uaccess.h>
202#include <asm/io.h>
203#include <linux/usb.h>
204
205#include "audio.h"
206
207
208
209
210#define DRIVER_VERSION "v1.0.0"
211#define DRIVER_AUTHOR "Alan Cox <alan@lxorguk.ukuu.org.uk>, Thomas Sailer (sailer@ife.ee.ethz.ch)"
212#define DRIVER_DESC "USB Audio Class driver"
213
214#define AUDIO_DEBUG 1
215
216#define SND_DEV_DSP16 5
217
218#define dprintk(x)
219
220#undef abs
221extern int abs(int __x) __attribute__ ((__const__));
222
223
224
225
226
227
228static struct list_head audiodevs = LIST_HEAD_INIT(audiodevs);
229static DECLARE_MUTEX(open_sem);
230
231
232
233
234static DECLARE_WAIT_QUEUE_HEAD(open_wait);
235
236
237#define MAXFORMATS MAX_ALT
238#define DMABUFSHIFT 17
239#define NRSGBUF (1U<<(DMABUFSHIFT-PAGE_SHIFT))
240
241#define MAXCHANNELS 32
242#define MAXWIDTH 4
243#define MAXSAMPLEWIDTH (MAXCHANNELS*MAXWIDTH)
244#define TMPCOPYWIDTH MAXSAMPLEWIDTH
245
246
247
248
249
250
251
252
253#define DESCFRAMES 5
254#define SYNCFRAMES DESCFRAMES
255
256#define MIXFLG_STEREOIN 1
257#define MIXFLG_STEREOOUT 2
258
259struct mixerchannel {
260 __u16 value;
261 __u16 osschannel;
262 __s16 minval, maxval;
263 __u16 slctunitid;
264 __u8 unitid;
265 __u8 selector;
266 __u8 chnum;
267 __u8 flags;
268};
269
270struct audioformat {
271 unsigned int format;
272 unsigned int sratelo;
273 unsigned int sratehi;
274 unsigned char altsetting;
275 unsigned char attributes;
276};
277
278struct dmabuf {
279
280 unsigned int format;
281 unsigned int srate;
282
283 unsigned char *sgbuf[NRSGBUF];
284 unsigned int bufsize;
285 unsigned int numfrag;
286 unsigned int fragshift;
287 unsigned int wrptr, rdptr;
288 unsigned int total_bytes;
289 int count;
290 unsigned int error;
291 wait_queue_head_t wait;
292
293 unsigned int fragsize;
294 unsigned int dmasize;
295
296 unsigned int mapped:1;
297 unsigned int ready:1;
298 unsigned int enabled:1;
299 unsigned int ossfragshift;
300 int ossmaxfrags;
301 unsigned int subdivision;
302};
303
304struct usb_audio_state;
305
306#define FLG_URB0RUNNING 1
307#define FLG_URB1RUNNING 2
308#define FLG_SYNC0RUNNING 4
309#define FLG_SYNC1RUNNING 8
310#define FLG_RUNNING 16
311#define FLG_CONNECTED 32
312
313struct my_data_urb {
314 struct urb urb;
315 struct iso_packet_descriptor isoframe[DESCFRAMES];
316};
317
318struct my_sync_urb {
319 struct urb urb;
320 struct iso_packet_descriptor isoframe[SYNCFRAMES];
321};
322
323
324struct usb_audiodev {
325 struct list_head list;
326 struct usb_audio_state *state;
327
328
329 int dev_audio;
330
331
332 mode_t open_mode;
333 spinlock_t lock;
334
335 struct usbin {
336 int interface;
337 unsigned int format;
338 unsigned int datapipe;
339 unsigned int syncpipe;
340 unsigned int syncinterval;
341 unsigned int freqn;
342 unsigned int freqmax;
343 unsigned int phase;
344 unsigned int flags;
345
346 struct my_data_urb durb[2];
347 struct my_sync_urb surb[2];
348
349 struct dmabuf dma;
350 } usbin;
351
352 struct usbout {
353 int interface;
354 unsigned int format;
355 unsigned int datapipe;
356 unsigned int syncpipe;
357 unsigned int syncinterval;
358 unsigned int freqn;
359 unsigned int freqm;
360 unsigned int freqmax;
361 unsigned int phase;
362 unsigned int flags;
363
364 struct my_data_urb durb[2];
365 struct my_sync_urb surb[2];
366
367 struct dmabuf dma;
368 } usbout;
369
370
371 unsigned int numfmtin, numfmtout;
372 struct audioformat fmtin[MAXFORMATS];
373 struct audioformat fmtout[MAXFORMATS];
374};
375
376struct usb_mixerdev {
377 struct list_head list;
378 struct usb_audio_state *state;
379
380
381 int dev_mixer;
382
383 unsigned char iface;
384
385
386 unsigned int numch, modcnt;
387
388
389 struct mixerchannel ch[0];
390};
391
392struct usb_audio_state {
393 struct list_head audiodev;
394
395
396 struct usb_device *usbdev;
397
398 struct list_head audiolist;
399 struct list_head mixerlist;
400
401 unsigned count;
402};
403
404
405
406
407#ifndef AFMT_S24_LE
408# define AFMT_S24_LE 0x00000800
409#endif
410#ifndef AFMT_S24_BE
411# define AFMT_S24_BE 0x00001000
412#endif
413#ifndef AFMT_U24_LE
414# define AFMT_U24_LE 0x00002000
415#endif
416#ifndef AFMT_U24_BE
417# define AFMT_U24_BE 0x00004000
418#endif
419#ifndef AFMT_S32_LE
420# define AFMT_S32_LE 0x00008000
421#endif
422#ifndef AFMT_S32_BE
423# define AFMT_S32_BE 0x00010000
424#endif
425#ifndef AFMT_U32_LE
426# define AFMT_U32_LE 0x00020000
427#endif
428#ifndef AFMT_U32_BE
429# define AFMT_U32_BE 0x00040000
430#endif
431
432
433#define AFMT_STEREO 0x01000000
434#define AFMT_CHMASK 0xff000000
435#define AFMT_8MASK (AFMT_U8 | AFMT_S8)
436#define AFMT_16MASK (AFMT_U16_LE | AFMT_S16_LE | AFMT_U16_BE | AFMT_S16_BE)
437#define AFMT_24MASK (AFMT_U24_LE | AFMT_S24_LE | AFMT_U24_BE | AFMT_S24_BE)
438#define AFMT_32MASK (AFMT_U32_LE | AFMT_S32_LE | AFMT_U32_BE | AFMT_S32_BE)
439
440#define AFMT_SIGNMASK (AFMT_S8 | AFMT_S16_LE | AFMT_S16_BE |\
441 AFMT_S24_LE | AFMT_S24_BE |\
442 AFMT_S32_LE | AFMT_S32_BE)
443
444
445#define AFMT_ENDIANMASK (AFMT_S8 | AFMT_U8 |\
446 AFMT_S16_BE | AFMT_U16_BE |\
447 AFMT_S24_BE | AFMT_U24_BE |\
448 AFMT_S32_BE | AFMT_U32_BE)
449
450#define AFMT_ISSTEREO(x) (((x) & 0xff000000) == AFMT_STEREO)
451#define AFMT_CHANNELS(x) (((unsigned)(x) >> 24) + 1)
452#define AFMT_BYTES(x) ( (((x)&AFMT_8MASK)!=0)+\
453 (((x)&AFMT_16MASK)!=0)*2+\
454 (((x)&AFMT_24MASK)!=0)*3+\
455 (((x)&AFMT_32MASK)!=0)*4 )
456#define AFMT_SAMPLEBYTES(x) (AFMT_BYTES(x)*AFMT_CHANNELS(x))
457#define AFMT_SIGN(x) ((x)&AFMT_SIGNMASK)
458#define AFMT_ENDIAN(x) ((x)&AFMT_ENDIANMASK)
459
460
461
462
463
464#undef abs
465static inline int abs(int x)
466{
467 if (x < 0)
468 return -x;
469 return x;
470}
471
472
473
474static inline unsigned ld2(unsigned int x)
475{
476 unsigned r = 0;
477
478 if (x >= 0x10000) {
479 x >>= 16;
480 r += 16;
481 }
482 if (x >= 0x100) {
483 x >>= 8;
484 r += 8;
485 }
486 if (x >= 0x10) {
487 x >>= 4;
488 r += 4;
489 }
490 if (x >= 4) {
491 x >>= 2;
492 r += 2;
493 }
494 if (x >= 2)
495 r++;
496 return r;
497}
498
499
500
501
502
503
504
505
506
507
508
509
510
511static void dmabuf_release(struct dmabuf *db)
512{
513 unsigned int nr;
514 void *p;
515
516 for(nr = 0; nr < NRSGBUF; nr++) {
517 if (!(p = db->sgbuf[nr]))
518 continue;
519 mem_map_unreserve(virt_to_page(p));
520 free_page((unsigned long)p);
521 db->sgbuf[nr] = NULL;
522 }
523 db->mapped = db->ready = 0;
524}
525
526static int dmabuf_init(struct dmabuf *db)
527{
528 unsigned int nr, bytepersec, bufs;
529 void *p;
530
531
532 db->rdptr = db->wrptr = db->total_bytes = db->count = db->error = 0;
533
534 bytepersec = db->srate * AFMT_SAMPLEBYTES(db->format);
535 bufs = 1U << DMABUFSHIFT;
536 if (db->ossfragshift) {
537 if ((1000 << db->ossfragshift) < bytepersec)
538 db->fragshift = ld2(bytepersec/1000);
539 else
540 db->fragshift = db->ossfragshift;
541 } else {
542 db->fragshift = ld2(bytepersec/100/(db->subdivision ? db->subdivision : 1));
543 if (db->fragshift < 3)
544 db->fragshift = 3;
545 }
546 db->numfrag = bufs >> db->fragshift;
547 while (db->numfrag < 4 && db->fragshift > 3) {
548 db->fragshift--;
549 db->numfrag = bufs >> db->fragshift;
550 }
551 db->fragsize = 1 << db->fragshift;
552 if (db->ossmaxfrags >= 4 && db->ossmaxfrags < db->numfrag)
553 db->numfrag = db->ossmaxfrags;
554 db->dmasize = db->numfrag << db->fragshift;
555 for(nr = 0; nr < NRSGBUF; nr++) {
556 if (!db->sgbuf[nr]) {
557 p = (void *)get_free_page(GFP_KERNEL);
558 if (!p)
559 return -ENOMEM;
560 db->sgbuf[nr] = p;
561 mem_map_reserve(virt_to_page(p));
562 }
563 memset(db->sgbuf[nr], AFMT_SIGN(db->format) ? 0 : 0x80, PAGE_SIZE);
564 if ((nr << PAGE_SHIFT) >= db->dmasize)
565 break;
566 }
567 db->bufsize = nr << PAGE_SHIFT;
568 db->enabled = 1;
569 db->ready = 1;
570 dprintk((KERN_DEBUG "usbaudio: dmabuf_init bytepersec %d bufs %d ossfragshift %d ossmaxfrags %d "
571 "fragshift %d fragsize %d numfrag %d dmasize %d bufsize %d fmt 0x%x srate %d\n",
572 bytepersec, bufs, db->ossfragshift, db->ossmaxfrags, db->fragshift, db->fragsize,
573 db->numfrag, db->dmasize, db->bufsize, db->format, db->srate));
574 return 0;
575}
576
577static int dmabuf_mmap(struct dmabuf *db, unsigned long start, unsigned long size, pgprot_t prot)
578{
579 unsigned int nr;
580
581 if (!db->ready || db->mapped || (start | size) & (PAGE_SIZE-1) || size > db->bufsize)
582 return -EINVAL;
583 size >>= PAGE_SHIFT;
584 for(nr = 0; nr < size; nr++)
585 if (!db->sgbuf[nr])
586 return -EINVAL;
587 db->mapped = 1;
588 for(nr = 0; nr < size; nr++) {
589 if (remap_page_range(start, virt_to_phys(db->sgbuf[nr]), PAGE_SIZE, prot))
590 return -EAGAIN;
591 start += PAGE_SIZE;
592 }
593 return 0;
594}
595
596static void dmabuf_copyin(struct dmabuf *db, const void *_buffer, unsigned int size)
597{
598 unsigned int pgrem, rem;
599 const char *buffer = _buffer;
600
601 db->total_bytes += size;
602 for (;;) {
603 if (size <= 0)
604 return;
605 pgrem = ((~db->wrptr) & (PAGE_SIZE-1)) + 1;
606 if (pgrem > size)
607 pgrem = size;
608 rem = db->dmasize - db->wrptr;
609 if (pgrem > rem)
610 pgrem = rem;
611 memcpy((db->sgbuf[db->wrptr >> PAGE_SHIFT]) + (db->wrptr & (PAGE_SIZE-1)), buffer, pgrem);
612 size -= pgrem;
613 buffer += pgrem;
614 db->wrptr += pgrem;
615 if (db->wrptr >= db->dmasize)
616 db->wrptr = 0;
617 }
618}
619
620static void dmabuf_copyout(struct dmabuf *db, void *_buffer, unsigned int size)
621{
622 unsigned int pgrem, rem;
623 char *buffer = _buffer;
624
625 db->total_bytes += size;
626 for (;;) {
627 if (size <= 0)
628 return;
629 pgrem = ((~db->rdptr) & (PAGE_SIZE-1)) + 1;
630 if (pgrem > size)
631 pgrem = size;
632 rem = db->dmasize - db->rdptr;
633 if (pgrem > rem)
634 pgrem = rem;
635 memcpy(buffer, (db->sgbuf[db->rdptr >> PAGE_SHIFT]) + (db->rdptr & (PAGE_SIZE-1)), pgrem);
636 size -= pgrem;
637 buffer += pgrem;
638 db->rdptr += pgrem;
639 if (db->rdptr >= db->dmasize)
640 db->rdptr = 0;
641 }
642}
643
644static int dmabuf_copyin_user(struct dmabuf *db, unsigned int ptr, const void *_buffer, unsigned int size)
645{
646 unsigned int pgrem, rem;
647 const char *buffer = _buffer;
648
649 if (!db->ready || db->mapped)
650 return -EINVAL;
651 for (;;) {
652 if (size <= 0)
653 return 0;
654 pgrem = ((~ptr) & (PAGE_SIZE-1)) + 1;
655 if (pgrem > size)
656 pgrem = size;
657 rem = db->dmasize - ptr;
658 if (pgrem > rem)
659 pgrem = rem;
660 if (copy_from_user((db->sgbuf[ptr >> PAGE_SHIFT]) + (ptr & (PAGE_SIZE-1)), buffer, pgrem))
661 return -EFAULT;
662 size -= pgrem;
663 buffer += pgrem;
664 ptr += pgrem;
665 if (ptr >= db->dmasize)
666 ptr = 0;
667 }
668}
669
670static int dmabuf_copyout_user(struct dmabuf *db, unsigned int ptr, void *_buffer, unsigned int size)
671{
672 unsigned int pgrem, rem;
673 char *buffer = _buffer;
674
675 if (!db->ready || db->mapped)
676 return -EINVAL;
677 for (;;) {
678 if (size <= 0)
679 return 0;
680 pgrem = ((~ptr) & (PAGE_SIZE-1)) + 1;
681 if (pgrem > size)
682 pgrem = size;
683 rem = db->dmasize - ptr;
684 if (pgrem > rem)
685 pgrem = rem;
686 if (copy_to_user(buffer, (db->sgbuf[ptr >> PAGE_SHIFT]) + (ptr & (PAGE_SIZE-1)), pgrem))
687 return -EFAULT;
688 size -= pgrem;
689 buffer += pgrem;
690 ptr += pgrem;
691 if (ptr >= db->dmasize)
692 ptr = 0;
693 }
694}
695
696
697
698
699
700
701static void usbin_stop(struct usb_audiodev *as)
702{
703 struct usbin *u = &as->usbin;
704 unsigned long flags;
705 unsigned int i, notkilled = 1;
706
707 spin_lock_irqsave(&as->lock, flags);
708 u->flags &= ~FLG_RUNNING;
709 i = u->flags;
710 spin_unlock_irqrestore(&as->lock, flags);
711 while (i & (FLG_URB0RUNNING|FLG_URB1RUNNING|FLG_SYNC0RUNNING|FLG_SYNC1RUNNING)) {
712 set_current_state(notkilled ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
713 schedule_timeout(1);
714 spin_lock_irqsave(&as->lock, flags);
715 i = u->flags;
716 spin_unlock_irqrestore(&as->lock, flags);
717 if (notkilled && signal_pending(current)) {
718 if (i & FLG_URB0RUNNING)
719 usb_unlink_urb(&u->durb[0].urb);
720 if (i & FLG_URB1RUNNING)
721 usb_unlink_urb(&u->durb[1].urb);
722 if (i & FLG_SYNC0RUNNING)
723 usb_unlink_urb(&u->surb[0].urb);
724 if (i & FLG_SYNC1RUNNING)
725 usb_unlink_urb(&u->surb[1].urb);
726 notkilled = 0;
727 }
728 }
729 set_current_state(TASK_RUNNING);
730 if (u->durb[0].urb.transfer_buffer)
731 kfree(u->durb[0].urb.transfer_buffer);
732 if (u->durb[1].urb.transfer_buffer)
733 kfree(u->durb[1].urb.transfer_buffer);
734 if (u->surb[0].urb.transfer_buffer)
735 kfree(u->surb[0].urb.transfer_buffer);
736 if (u->surb[1].urb.transfer_buffer)
737 kfree(u->surb[1].urb.transfer_buffer);
738 u->durb[0].urb.transfer_buffer = u->durb[1].urb.transfer_buffer =
739 u->surb[0].urb.transfer_buffer = u->surb[1].urb.transfer_buffer = NULL;
740}
741
742static inline void usbin_release(struct usb_audiodev *as)
743{
744 usbin_stop(as);
745}
746
747static void usbin_disc(struct usb_audiodev *as)
748{
749 struct usbin *u = &as->usbin;
750
751 unsigned long flags;
752
753 spin_lock_irqsave(&as->lock, flags);
754 u->flags &= ~(FLG_RUNNING | FLG_CONNECTED);
755 spin_unlock_irqrestore(&as->lock, flags);
756 usbin_stop(as);
757}
758
759static inline int iconvert(unsigned char **xx,int jump)
760{
761 int value=0;
762 unsigned char *x=*xx;
763
764
765 switch(jump){
766 case 0:
767
768 value = x[3];
769 case 1:
770
771 value |= x[2] << 8;
772 case 2:
773
774 value |= x[1] << 16;
775 case 3:
776
777 value |= x[0] << 24;
778 x+=(4-jump);
779 break;
780
781 case 4:
782
783 value = *x++;
784 case 5:
785
786 value |= *x++ << 8;
787 case 6:
788
789 value |= *x++ << 16;
790 value |= *x++ << 24;
791 break;
792 }
793 *xx=x;
794 return(value);
795}
796
797static inline void oconvert(unsigned char **yy,int jump,int value)
798{
799 unsigned char *y=*yy;
800
801
802 switch(jump){
803 case 0:
804
805 y[3] = value;
806 case 1:
807
808 y[2] = value >> 8;
809 case 2:
810
811 y[1] = value >> 16;
812 case 3:
813
814 y[0] = value >> 24;
815 y+=(4-jump);
816 break;
817
818 case 4:
819
820 *y++ = value;
821 case 5:
822
823 *y++ = value >> 8;
824 case 6:
825
826 *y++ = value >> 16;
827 *y++ = value >> 24;
828 break;
829 }
830 *yy=y;
831}
832
833
834static void conversion(const void *ibuf, unsigned int ifmt,
835 void *obuf, unsigned int ofmt, unsigned int scnt)
836{
837
838
839 unsigned int i,j;
840 unsigned char *x=(unsigned char *)ibuf;
841 unsigned char *y=(unsigned char *)obuf;
842
843 int ichannels = AFMT_CHANNELS(ifmt);
844 int ochannels = AFMT_CHANNELS(ofmt);
845 int ibytes = AFMT_BYTES(ifmt);
846 int obytes = AFMT_BYTES(ofmt);
847 int iendian = AFMT_ENDIAN(ifmt);
848 int oendian = AFMT_ENDIAN(ofmt);
849 int isign = AFMT_SIGN(ifmt)?0:0x80000000UL;
850 int osign = AFMT_SIGN(ofmt)?0:0x80000000UL;
851 int sign = (isign==osign?0:0x80000000UL);
852
853
854 int ijump = (iendian ? 4-ibytes : 8-ibytes);
855 int ojump = (oendian ? 4-obytes : 8-obytes);
856
857 if(ichannels == 2 && ochannels == 1){
858
859 for(i=0;i<scnt;i++){
860 int valueL = iconvert(&x,ijump) ^ isign;
861 int valueR = iconvert(&x,ijump) ^ isign;
862 int value = (valueL>>1) + (valueR>>1);
863 oconvert(&y,ojump,value^osign);
864 }
865 return;
866 }
867 if(ichannels == 1 && ochannels == 2){
868
869 for(i=0;i<scnt;i++){
870 int value = iconvert(&x,ijump) ^ sign;
871 oconvert(&y,ojump,value);
872 oconvert(&y,ojump,value);
873 }
874 return;
875 }
876 if(ichannels<ochannels){
877
878 for(i=0;i<scnt;i++){
879 for(j=0;j<ichannels;j++){
880 int value = iconvert(&x,ijump) ^ sign;
881 oconvert(&y,ojump,value);
882
883 }
884 for(;j<ochannels;j++){
885 oconvert(&y,ojump,osign);
886 }
887 }
888 return;
889 }
890 if(ichannels>=ochannels){
891
892 int xincrement=ibytes*(ichannels-ochannels);
893 for(i=0;i<scnt;i++){
894 for(j=0;j<ichannels;j++){
895 int value = iconvert(&x,ijump) ^ sign;
896 oconvert(&y,ojump,value);
897
898 }
899 x+=xincrement;
900 }
901 return;
902 }
903}
904
905static void usbin_convert(struct usbin *u, unsigned char *buffer, unsigned int samples)
906{
907 unsigned int scnt;
908 unsigned int ufmtb = AFMT_SAMPLEBYTES(u->format);
909 unsigned int dfmtb = AFMT_SAMPLEBYTES(u->dma.format);
910 unsigned char tmp[TMPCOPYWIDTH];
911 unsigned int maxs = sizeof(tmp)/dfmtb;
912
913 while (samples > 0) {
914 scnt = samples;
915 if (scnt > maxs)
916 scnt = maxs;
917
918 conversion(buffer, u->format, tmp, u->dma.format, scnt);
919 dmabuf_copyin(&u->dma, tmp, scnt * dfmtb);
920 buffer += scnt * ufmtb;
921 samples -= scnt;
922 }
923}
924
925static int usbin_prepare_desc(struct usbin *u, struct urb *urb)
926{
927 unsigned int i, maxsize, offs;
928
929 maxsize = ((u->freqmax + 0x3fff) * AFMT_SAMPLEBYTES(u->format)) >> 14;
930
931 for (i = offs = 0; i < DESCFRAMES; i++, offs += maxsize) {
932 urb->iso_frame_desc[i].length = maxsize;
933 urb->iso_frame_desc[i].offset = offs;
934 }
935 return 0;
936}
937
938
939
940
941
942static int usbin_retire_desc(struct usbin *u, struct urb *urb)
943{
944 unsigned int i, ufmtb, dfmtb, err = 0, cnt, scnt, dmafree;
945 unsigned char *cp;
946
947 ufmtb = AFMT_SAMPLEBYTES(u->format);
948 dfmtb = AFMT_SAMPLEBYTES(u->dma.format);
949 for (i = 0; i < DESCFRAMES; i++) {
950 cp = ((unsigned char *)urb->transfer_buffer) + urb->iso_frame_desc[i].offset;
951 if (urb->iso_frame_desc[i].status) {
952 dprintk((KERN_DEBUG "usbin_retire_desc: frame %u status %d\n", i, urb->iso_frame_desc[i].status));
953 continue;
954 }
955 scnt = urb->iso_frame_desc[i].actual_length / ufmtb;
956 if (!scnt)
957 continue;
958 cnt = scnt * dfmtb;
959 if (!u->dma.mapped) {
960 dmafree = u->dma.dmasize - u->dma.count;
961 if (cnt > dmafree) {
962 scnt = dmafree / dfmtb;
963 cnt = scnt * dfmtb;
964 err++;
965 }
966 }
967 u->dma.count += cnt;
968 if (u->format == u->dma.format) {
969
970 dprintk((KERN_DEBUG "usbaudio: no sample format conversion\n"));
971 dmabuf_copyin(&u->dma, cp, cnt);
972 } else {
973
974 dprintk((KERN_DEBUG "usbaudio: sample format conversion %x != %x\n", u->format, u->dma.format));
975 usbin_convert(u, cp, scnt);
976 }
977 }
978 if (err)
979 u->dma.error++;
980 if (u->dma.count >= (signed)u->dma.fragsize)
981 wake_up(&u->dma.wait);
982 return err ? -1 : 0;
983}
984
985static void usbin_completed(struct urb *urb)
986{
987 struct usb_audiodev *as = (struct usb_audiodev *)urb->context;
988 struct usbin *u = &as->usbin;
989 unsigned long flags;
990 unsigned int mask;
991 int suret = USB_ST_NOERROR;
992
993#if 0
994 printk(KERN_DEBUG "usbin_completed: status %d errcnt %d flags 0x%x\n", urb->status, urb->error_count, u->flags);
995#endif
996 if (urb == &u->durb[0].urb)
997 mask = FLG_URB0RUNNING;
998 else if (urb == &u->durb[1].urb)
999 mask = FLG_URB1RUNNING;
1000 else {
1001 mask = 0;
1002 printk(KERN_ERR "usbin_completed: panic: unknown URB\n");
1003 }
1004 urb->dev = as->state->usbdev;
1005 spin_lock_irqsave(&as->lock, flags);
1006 if (!usbin_retire_desc(u, urb) &&
1007 u->flags & FLG_RUNNING &&
1008 !usbin_prepare_desc(u, urb) &&
1009 (suret = usb_submit_urb(urb)) == USB_ST_NOERROR) {
1010 u->flags |= mask;
1011 } else {
1012 u->flags &= ~(mask | FLG_RUNNING);
1013 wake_up(&u->dma.wait);
1014 printk(KERN_DEBUG "usbin_completed: descriptor not restarted (usb_submit_urb: %d)\n", suret);
1015 }
1016 spin_unlock_irqrestore(&as->lock, flags);
1017}
1018
1019
1020
1021
1022static int usbin_sync_prepare_desc(struct usbin *u, struct urb *urb)
1023{
1024 unsigned char *cp = urb->transfer_buffer;
1025 unsigned int i, offs;
1026
1027 for (i = offs = 0; i < SYNCFRAMES; i++, offs += 3, cp += 3) {
1028 urb->iso_frame_desc[i].length = 3;
1029 urb->iso_frame_desc[i].offset = offs;
1030 cp[0] = u->freqn;
1031 cp[1] = u->freqn >> 8;
1032 cp[2] = u->freqn >> 16;
1033 }
1034 return 0;
1035}
1036
1037
1038
1039
1040static int usbin_sync_retire_desc(struct usbin *u, struct urb *urb)
1041{
1042 unsigned int i;
1043
1044 for (i = 0; i < SYNCFRAMES; i++)
1045 if (urb->iso_frame_desc[0].status)
1046 dprintk((KERN_DEBUG "usbin_sync_retire_desc: frame %u status %d\n", i, urb->iso_frame_desc[i].status));
1047 return 0;
1048}
1049
1050static void usbin_sync_completed(struct urb *urb)
1051{
1052 struct usb_audiodev *as = (struct usb_audiodev *)urb->context;
1053 struct usbin *u = &as->usbin;
1054 unsigned long flags;
1055 unsigned int mask;
1056 int suret = USB_ST_NOERROR;
1057
1058#if 0
1059 printk(KERN_DEBUG "usbin_sync_completed: status %d errcnt %d flags 0x%x\n", urb->status, urb->error_count, u->flags);
1060#endif
1061 if (urb == &u->surb[0].urb)
1062 mask = FLG_SYNC0RUNNING;
1063 else if (urb == &u->surb[1].urb)
1064 mask = FLG_SYNC1RUNNING;
1065 else {
1066 mask = 0;
1067 printk(KERN_ERR "usbin_sync_completed: panic: unknown URB\n");
1068 }
1069 urb->dev = as->state->usbdev;
1070 spin_lock_irqsave(&as->lock, flags);
1071 if (!usbin_sync_retire_desc(u, urb) &&
1072 u->flags & FLG_RUNNING &&
1073 !usbin_sync_prepare_desc(u, urb) &&
1074 (suret = usb_submit_urb(urb)) == USB_ST_NOERROR) {
1075 u->flags |= mask;
1076 } else {
1077 u->flags &= ~(mask | FLG_RUNNING);
1078 wake_up(&u->dma.wait);
1079 dprintk((KERN_DEBUG "usbin_sync_completed: descriptor not restarted (usb_submit_urb: %d)\n", suret));
1080 }
1081 spin_unlock_irqrestore(&as->lock, flags);
1082}
1083
1084static int usbin_start(struct usb_audiodev *as)
1085{
1086 struct usb_device *dev = as->state->usbdev;
1087 struct usbin *u = &as->usbin;
1088 struct urb *urb;
1089 unsigned long flags;
1090 unsigned int maxsze, bufsz;
1091
1092#if 0
1093 printk(KERN_DEBUG "usbin_start: device %d ufmt 0x%08x dfmt 0x%08x srate %d\n",
1094 dev->devnum, u->format, u->dma.format, u->dma.srate);
1095#endif
1096
1097 spin_lock_irqsave(&as->lock, flags);
1098 if (!(u->flags & FLG_CONNECTED)) {
1099 spin_unlock_irqrestore(&as->lock, flags);
1100 return -EIO;
1101 }
1102 if (!(u->flags & FLG_RUNNING)) {
1103 spin_unlock_irqrestore(&as->lock, flags);
1104 u->freqn = ((u->dma.srate << 11) + 62) / 125;
1105 u->freqmax = u->freqn + (u->freqn >> 2);
1106 u->phase = 0;
1107 maxsze = ((u->freqmax + 0x3fff) * AFMT_SAMPLEBYTES(u->format)) >> 14;
1108 bufsz = DESCFRAMES * maxsze;
1109 if (u->durb[0].urb.transfer_buffer)
1110 kfree(u->durb[0].urb.transfer_buffer);
1111 u->durb[0].urb.transfer_buffer = kmalloc(bufsz, GFP_KERNEL);
1112 u->durb[0].urb.transfer_buffer_length = bufsz;
1113 if (u->durb[1].urb.transfer_buffer)
1114 kfree(u->durb[1].urb.transfer_buffer);
1115 u->durb[1].urb.transfer_buffer = kmalloc(bufsz, GFP_KERNEL);
1116 u->durb[1].urb.transfer_buffer_length = bufsz;
1117 if (u->syncpipe) {
1118 if (u->surb[0].urb.transfer_buffer)
1119 kfree(u->surb[0].urb.transfer_buffer);
1120 u->surb[0].urb.transfer_buffer = kmalloc(3*SYNCFRAMES, GFP_KERNEL);
1121 u->surb[0].urb.transfer_buffer_length = 3*SYNCFRAMES;
1122 if (u->surb[1].urb.transfer_buffer)
1123 kfree(u->surb[1].urb.transfer_buffer);
1124 u->surb[1].urb.transfer_buffer = kmalloc(3*SYNCFRAMES, GFP_KERNEL);
1125 u->surb[1].urb.transfer_buffer_length = 3*SYNCFRAMES;
1126 }
1127 if (!u->durb[0].urb.transfer_buffer || !u->durb[1].urb.transfer_buffer ||
1128 (u->syncpipe && (!u->surb[0].urb.transfer_buffer || !u->surb[1].urb.transfer_buffer))) {
1129 printk(KERN_ERR "usbaudio: cannot start playback device %d\n", dev->devnum);
1130 return 0;
1131 }
1132 spin_lock_irqsave(&as->lock, flags);
1133 }
1134 if (u->dma.count >= u->dma.dmasize && !u->dma.mapped) {
1135 spin_unlock_irqrestore(&as->lock, flags);
1136 return 0;
1137 }
1138 u->flags |= FLG_RUNNING;
1139 if (!(u->flags & FLG_URB0RUNNING)) {
1140 urb = &u->durb[0].urb;
1141 urb->dev = dev;
1142 urb->pipe = u->datapipe;
1143 urb->transfer_flags = USB_ISO_ASAP;
1144 urb->number_of_packets = DESCFRAMES;
1145 urb->context = as;
1146 urb->complete = usbin_completed;
1147 if (!usbin_prepare_desc(u, urb) && !usb_submit_urb(urb))
1148 u->flags |= FLG_URB0RUNNING;
1149 else
1150 u->flags &= ~FLG_RUNNING;
1151 }
1152 if (u->flags & FLG_RUNNING && !(u->flags & FLG_URB1RUNNING)) {
1153 urb = &u->durb[1].urb;
1154 urb->dev = dev;
1155 urb->pipe = u->datapipe;
1156 urb->transfer_flags = USB_ISO_ASAP;
1157 urb->number_of_packets = DESCFRAMES;
1158 urb->context = as;
1159 urb->complete = usbin_completed;
1160 if (!usbin_prepare_desc(u, urb) && !usb_submit_urb(urb))
1161 u->flags |= FLG_URB1RUNNING;
1162 else
1163 u->flags &= ~FLG_RUNNING;
1164 }
1165 if (u->syncpipe) {
1166 if (u->flags & FLG_RUNNING && !(u->flags & FLG_SYNC0RUNNING)) {
1167 urb = &u->surb[0].urb;
1168 urb->dev = dev;
1169 urb->pipe = u->syncpipe;
1170 urb->transfer_flags = USB_ISO_ASAP;
1171 urb->number_of_packets = SYNCFRAMES;
1172 urb->context = as;
1173 urb->complete = usbin_sync_completed;
1174
1175 if (!usbin_sync_prepare_desc(u, urb) && !usb_submit_urb(urb))
1176 u->flags |= FLG_SYNC0RUNNING;
1177 else
1178 u->flags &= ~FLG_RUNNING;
1179 }
1180 if (u->flags & FLG_RUNNING && !(u->flags & FLG_SYNC1RUNNING)) {
1181 urb = &u->surb[1].urb;
1182 urb->dev = dev;
1183 urb->pipe = u->syncpipe;
1184 urb->transfer_flags = USB_ISO_ASAP;
1185 urb->number_of_packets = SYNCFRAMES;
1186 urb->context = as;
1187 urb->complete = usbin_sync_completed;
1188
1189 if (!usbin_sync_prepare_desc(u, urb) && !usb_submit_urb(urb))
1190 u->flags |= FLG_SYNC1RUNNING;
1191 else
1192 u->flags &= ~FLG_RUNNING;
1193 }
1194 }
1195 spin_unlock_irqrestore(&as->lock, flags);
1196 return 0;
1197}
1198
1199static void usbout_stop(struct usb_audiodev *as)
1200{
1201 struct usbout *u = &as->usbout;
1202 unsigned long flags;
1203 unsigned int i, notkilled = 1;
1204
1205 spin_lock_irqsave(&as->lock, flags);
1206 u->flags &= ~FLG_RUNNING;
1207 i = u->flags;
1208 spin_unlock_irqrestore(&as->lock, flags);
1209 while (i & (FLG_URB0RUNNING|FLG_URB1RUNNING|FLG_SYNC0RUNNING|FLG_SYNC1RUNNING)) {
1210 set_current_state(notkilled ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
1211 schedule_timeout(1);
1212 spin_lock_irqsave(&as->lock, flags);
1213 i = u->flags;
1214 spin_unlock_irqrestore(&as->lock, flags);
1215 if (notkilled && signal_pending(current)) {
1216 if (i & FLG_URB0RUNNING)
1217 usb_unlink_urb(&u->durb[0].urb);
1218 if (i & FLG_URB1RUNNING)
1219 usb_unlink_urb(&u->durb[1].urb);
1220 if (i & FLG_SYNC0RUNNING)
1221 usb_unlink_urb(&u->surb[0].urb);
1222 if (i & FLG_SYNC1RUNNING)
1223 usb_unlink_urb(&u->surb[1].urb);
1224 notkilled = 0;
1225 }
1226 }
1227 set_current_state(TASK_RUNNING);
1228 if (u->durb[0].urb.transfer_buffer)
1229 kfree(u->durb[0].urb.transfer_buffer);
1230 if (u->durb[1].urb.transfer_buffer)
1231 kfree(u->durb[1].urb.transfer_buffer);
1232 if (u->surb[0].urb.transfer_buffer)
1233 kfree(u->surb[0].urb.transfer_buffer);
1234 if (u->surb[1].urb.transfer_buffer)
1235 kfree(u->surb[1].urb.transfer_buffer);
1236 u->durb[0].urb.transfer_buffer = u->durb[1].urb.transfer_buffer =
1237 u->surb[0].urb.transfer_buffer = u->surb[1].urb.transfer_buffer = NULL;
1238}
1239
1240static inline void usbout_release(struct usb_audiodev *as)
1241{
1242 usbout_stop(as);
1243}
1244
1245static void usbout_disc(struct usb_audiodev *as)
1246{
1247 struct usbout *u = &as->usbout;
1248 unsigned long flags;
1249
1250 spin_lock_irqsave(&as->lock, flags);
1251 u->flags &= ~(FLG_RUNNING | FLG_CONNECTED);
1252 spin_unlock_irqrestore(&as->lock, flags);
1253 usbout_stop(as);
1254}
1255
1256static void usbout_convert(struct usbout *u, unsigned char *buffer, unsigned int samples)
1257{
1258 unsigned char tmp[TMPCOPYWIDTH];
1259 unsigned int scnt;
1260 unsigned int ufmtb = AFMT_SAMPLEBYTES(u->format);
1261 unsigned int dfmtb = AFMT_SAMPLEBYTES(u->dma.format);
1262 unsigned int maxs = sizeof(tmp)/dfmtb;
1263
1264 while (samples > 0) {
1265 scnt = samples;
1266 if (scnt > maxs)
1267 scnt = maxs;
1268
1269 dmabuf_copyout(&u->dma, tmp, scnt * dfmtb);
1270 conversion(tmp, u->dma.format, buffer, u->format, scnt);
1271 buffer += scnt * ufmtb;
1272 samples -= scnt;
1273 }
1274}
1275
1276static int usbout_prepare_desc(struct usbout *u, struct urb *urb)
1277{
1278 unsigned int i, ufmtb, dfmtb, err = 0, cnt, scnt, offs;
1279 unsigned char *cp = urb->transfer_buffer;
1280
1281 ufmtb = AFMT_SAMPLEBYTES(u->format);
1282 dfmtb = AFMT_SAMPLEBYTES(u->dma.format);
1283 for (i = offs = 0; i < DESCFRAMES; i++) {
1284 urb->iso_frame_desc[i].offset = offs;
1285 u->phase = (u->phase & 0x3fff) + u->freqm;
1286 scnt = u->phase >> 14;
1287 if (!scnt) {
1288 urb->iso_frame_desc[i].length = 0;
1289 continue;
1290 }
1291 cnt = scnt * dfmtb;
1292 if (!u->dma.mapped) {
1293 if (cnt > u->dma.count) {
1294 scnt = u->dma.count / dfmtb;
1295 cnt = scnt * dfmtb;
1296 err++;
1297 }
1298 u->dma.count -= cnt;
1299 } else
1300 u->dma.count += cnt;
1301 if (u->format == u->dma.format) {
1302
1303 dmabuf_copyout(&u->dma, cp, cnt);
1304 } else {
1305
1306 usbout_convert(u, cp, scnt);
1307 }
1308 cnt = scnt * ufmtb;
1309 urb->iso_frame_desc[i].length = cnt;
1310 offs += cnt;
1311 cp += cnt;
1312 }
1313 if (err)
1314 u->dma.error++;
1315 if (u->dma.mapped) {
1316 if (u->dma.count >= (signed)u->dma.fragsize)
1317 wake_up(&u->dma.wait);
1318 } else {
1319 if ((signed)u->dma.dmasize >= u->dma.count + (signed)u->dma.fragsize)
1320 wake_up(&u->dma.wait);
1321 }
1322 return err ? -1 : 0;
1323}
1324
1325
1326
1327
1328static int usbout_retire_desc(struct usbout *u, struct urb *urb)
1329{
1330 unsigned int i;
1331
1332 for (i = 0; i < DESCFRAMES; i++) {
1333 if (urb->iso_frame_desc[i].status) {
1334 dprintk((KERN_DEBUG "usbout_retire_desc: frame %u status %d\n", i, urb->iso_frame_desc[i].status));
1335 continue;
1336 }
1337 }
1338 return 0;
1339}
1340
1341static void usbout_completed(struct urb *urb)
1342{
1343 struct usb_audiodev *as = (struct usb_audiodev *)urb->context;
1344 struct usbout *u = &as->usbout;
1345 unsigned long flags;
1346 unsigned int mask;
1347 int suret = USB_ST_NOERROR;
1348
1349#if 0
1350 printk(KERN_DEBUG "usbout_completed: status %d errcnt %d flags 0x%x\n", urb->status, urb->error_count, u->flags);
1351#endif
1352 if (urb == &u->durb[0].urb)
1353 mask = FLG_URB0RUNNING;
1354 else if (urb == &u->durb[1].urb)
1355 mask = FLG_URB1RUNNING;
1356 else {
1357 mask = 0;
1358 printk(KERN_ERR "usbout_completed: panic: unknown URB\n");
1359 }
1360 urb->dev = as->state->usbdev;
1361 spin_lock_irqsave(&as->lock, flags);
1362 if (!usbout_retire_desc(u, urb) &&
1363 u->flags & FLG_RUNNING &&
1364 !usbout_prepare_desc(u, urb) &&
1365 (suret = usb_submit_urb(urb)) == USB_ST_NOERROR) {
1366 u->flags |= mask;
1367 } else {
1368 u->flags &= ~(mask | FLG_RUNNING);
1369 wake_up(&u->dma.wait);
1370 dprintk((KERN_DEBUG "usbout_completed: descriptor not restarted (usb_submit_urb: %d)\n", suret));
1371 }
1372 spin_unlock_irqrestore(&as->lock, flags);
1373}
1374
1375static int usbout_sync_prepare_desc(struct usbout *u, struct urb *urb)
1376{
1377 unsigned int i, offs;
1378
1379 for (i = offs = 0; i < SYNCFRAMES; i++, offs += 3) {
1380 urb->iso_frame_desc[i].length = 3;
1381 urb->iso_frame_desc[i].offset = offs;
1382 }
1383 return 0;
1384}
1385
1386
1387
1388
1389static int usbout_sync_retire_desc(struct usbout *u, struct urb *urb)
1390{
1391 unsigned char *cp = urb->transfer_buffer;
1392 unsigned int f, i;
1393
1394 for (i = 0; i < SYNCFRAMES; i++, cp += 3) {
1395 if (urb->iso_frame_desc[i].status) {
1396 dprintk((KERN_DEBUG "usbout_sync_retire_desc: frame %u status %d\n", i, urb->iso_frame_desc[i].status));
1397 continue;
1398 }
1399 if (urb->iso_frame_desc[i].actual_length < 3) {
1400 dprintk((KERN_DEBUG "usbout_sync_retire_desc: frame %u length %d\n", i, urb->iso_frame_desc[i].actual_length));
1401 continue;
1402 }
1403 f = cp[0] | (cp[1] << 8) | (cp[2] << 16);
1404 if (abs(f - u->freqn) > (u->freqn >> 3) || f > u->freqmax) {
1405 printk(KERN_WARNING "usbout_sync_retire_desc: requested frequency %u (nominal %u) out of range!\n", f, u->freqn);
1406 continue;
1407 }
1408 u->freqm = f;
1409 }
1410 return 0;
1411}
1412
1413static void usbout_sync_completed(struct urb *urb)
1414{
1415 struct usb_audiodev *as = (struct usb_audiodev *)urb->context;
1416 struct usbout *u = &as->usbout;
1417 unsigned long flags;
1418 unsigned int mask;
1419 int suret = USB_ST_NOERROR;
1420
1421#if 0
1422 printk(KERN_DEBUG "usbout_sync_completed: status %d errcnt %d flags 0x%x\n", urb->status, urb->error_count, u->flags);
1423#endif
1424 if (urb == &u->surb[0].urb)
1425 mask = FLG_SYNC0RUNNING;
1426 else if (urb == &u->surb[1].urb)
1427 mask = FLG_SYNC1RUNNING;
1428 else {
1429 mask = 0;
1430 printk(KERN_ERR "usbout_sync_completed: panic: unknown URB\n");
1431 }
1432 urb->dev = as->state->usbdev;
1433 spin_lock_irqsave(&as->lock, flags);
1434 if (!usbout_sync_retire_desc(u, urb) &&
1435 u->flags & FLG_RUNNING &&
1436 !usbout_sync_prepare_desc(u, urb) &&
1437 (suret = usb_submit_urb(urb)) == USB_ST_NOERROR) {
1438 u->flags |= mask;
1439 } else {
1440 u->flags &= ~(mask | FLG_RUNNING);
1441 wake_up(&u->dma.wait);
1442 dprintk((KERN_DEBUG "usbout_sync_completed: descriptor not restarted (usb_submit_urb: %d)\n", suret));
1443 }
1444 spin_unlock_irqrestore(&as->lock, flags);
1445}
1446
1447static int usbout_start(struct usb_audiodev *as)
1448{
1449 struct usb_device *dev = as->state->usbdev;
1450 struct usbout *u = &as->usbout;
1451 struct urb *urb;
1452 unsigned long flags;
1453 unsigned int maxsze, bufsz;
1454
1455#if 0
1456 printk(KERN_DEBUG "usbout_start: device %d ufmt 0x%08x dfmt 0x%08x srate %d\n",
1457 dev->devnum, u->format, u->dma.format, u->dma.srate);
1458#endif
1459
1460 spin_lock_irqsave(&as->lock, flags);
1461 if (!(u->flags & FLG_CONNECTED)) {
1462 spin_unlock_irqrestore(&as->lock, flags);
1463 return -EIO;
1464 }
1465 if (!(u->flags & FLG_RUNNING)) {
1466 spin_unlock_irqrestore(&as->lock, flags);
1467 u->freqn = u->freqm = ((u->dma.srate << 11) + 62) / 125;
1468 u->freqmax = u->freqn + (u->freqn >> 2);
1469 u->phase = 0;
1470 maxsze = ((u->freqmax + 0x3fff) * AFMT_SAMPLEBYTES(u->format)) >>14;
1471
1472 bufsz = DESCFRAMES * maxsze;
1473 if (u->durb[0].urb.transfer_buffer)
1474 kfree(u->durb[0].urb.transfer_buffer);
1475 u->durb[0].urb.transfer_buffer = kmalloc(bufsz, GFP_KERNEL);
1476 u->durb[0].urb.transfer_buffer_length = bufsz;
1477 if (u->durb[1].urb.transfer_buffer)
1478 kfree(u->durb[1].urb.transfer_buffer);
1479 u->durb[1].urb.transfer_buffer = kmalloc(bufsz, GFP_KERNEL);
1480 u->durb[1].urb.transfer_buffer_length = bufsz;
1481 if (u->syncpipe) {
1482 if (u->surb[0].urb.transfer_buffer)
1483 kfree(u->surb[0].urb.transfer_buffer);
1484 u->surb[0].urb.transfer_buffer = kmalloc(3*SYNCFRAMES, GFP_KERNEL);
1485 u->surb[0].urb.transfer_buffer_length = 3*SYNCFRAMES;
1486 if (u->surb[1].urb.transfer_buffer)
1487 kfree(u->surb[1].urb.transfer_buffer);
1488 u->surb[1].urb.transfer_buffer = kmalloc(3*SYNCFRAMES, GFP_KERNEL);
1489 u->surb[1].urb.transfer_buffer_length = 3*SYNCFRAMES;
1490 }
1491 if (!u->durb[0].urb.transfer_buffer || !u->durb[1].urb.transfer_buffer ||
1492 (u->syncpipe && (!u->surb[0].urb.transfer_buffer || !u->surb[1].urb.transfer_buffer))) {
1493 printk(KERN_ERR "usbaudio: cannot start playback device %d\n", dev->devnum);
1494 return 0;
1495 }
1496 spin_lock_irqsave(&as->lock, flags);
1497 }
1498 if (u->dma.count <= 0 && !u->dma.mapped) {
1499 spin_unlock_irqrestore(&as->lock, flags);
1500 return 0;
1501 }
1502 u->flags |= FLG_RUNNING;
1503 if (!(u->flags & FLG_URB0RUNNING)) {
1504 urb = &u->durb[0].urb;
1505 urb->dev = dev;
1506 urb->pipe = u->datapipe;
1507 urb->transfer_flags = USB_ISO_ASAP;
1508 urb->number_of_packets = DESCFRAMES;
1509 urb->context = as;
1510 urb->complete = usbout_completed;
1511 if (!usbout_prepare_desc(u, urb) && !usb_submit_urb(urb))
1512 u->flags |= FLG_URB0RUNNING;
1513 else
1514 u->flags &= ~FLG_RUNNING;
1515 }
1516 if (u->flags & FLG_RUNNING && !(u->flags & FLG_URB1RUNNING)) {
1517 urb = &u->durb[1].urb;
1518 urb->dev = dev;
1519 urb->pipe = u->datapipe;
1520 urb->transfer_flags = USB_ISO_ASAP;
1521 urb->number_of_packets = DESCFRAMES;
1522 urb->context = as;
1523 urb->complete = usbout_completed;
1524 if (!usbout_prepare_desc(u, urb) && !usb_submit_urb(urb))
1525 u->flags |= FLG_URB1RUNNING;
1526 else
1527 u->flags &= ~FLG_RUNNING;
1528 }
1529 if (u->syncpipe) {
1530 if (u->flags & FLG_RUNNING && !(u->flags & FLG_SYNC0RUNNING)) {
1531 urb = &u->surb[0].urb;
1532 urb->dev = dev;
1533 urb->pipe = u->syncpipe;
1534 urb->transfer_flags = USB_ISO_ASAP;
1535 urb->number_of_packets = SYNCFRAMES;
1536 urb->context = as;
1537 urb->complete = usbout_sync_completed;
1538
1539 if (!usbout_sync_prepare_desc(u, urb) && !usb_submit_urb(urb))
1540 u->flags |= FLG_SYNC0RUNNING;
1541 else
1542 u->flags &= ~FLG_RUNNING;
1543 }
1544 if (u->flags & FLG_RUNNING && !(u->flags & FLG_SYNC1RUNNING)) {
1545 urb = &u->surb[1].urb;
1546 urb->dev = dev;
1547 urb->pipe = u->syncpipe;
1548 urb->transfer_flags = USB_ISO_ASAP;
1549 urb->number_of_packets = SYNCFRAMES;
1550 urb->context = as;
1551 urb->complete = usbout_sync_completed;
1552
1553 if (!usbout_sync_prepare_desc(u, urb) && !usb_submit_urb(urb))
1554 u->flags |= FLG_SYNC1RUNNING;
1555 else
1556 u->flags &= ~FLG_RUNNING;
1557 }
1558 }
1559 spin_unlock_irqrestore(&as->lock, flags);
1560 return 0;
1561}
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599static unsigned int format_goodness(struct audioformat *afp, unsigned int app,
1600 unsigned int srate){
1601 unsigned int g = 0;
1602 unsigned int sratelo=afp->sratelo;
1603 unsigned int sratehi=afp->sratehi;
1604 unsigned int dev=afp->format;
1605
1606 if(AFMT_SIGN(dev) && !AFMT_SIGN(app)) g += 1;
1607 if(!AFMT_SIGN(dev) && AFMT_SIGN(app)) g += 1;
1608 if(AFMT_ENDIAN(dev) && !AFMT_ENDIAN(app)) g += 1;
1609 if(!AFMT_ENDIAN(dev) && AFMT_ENDIAN(app)) g += 1;
1610
1611 switch(AFMT_BYTES(app)+AFMT_BYTES(dev)*10){
1612 case 12: return ~0;
1613 case 13: return ~0;
1614 case 14: return ~0;
1615 case 21: g += 4; break;
1616 case 23: return ~0;
1617 case 24: return ~0;
1618 case 31: g += 5; break;
1619 case 32: g += 4; break;
1620 case 34: return ~0;
1621 case 41: g += 6; break;
1622 case 42: g += 5; break;
1623 case 43: g += 4; break;
1624 }
1625
1626 if(AFMT_CHANNELS(dev) > AFMT_CHANNELS(app)){
1627 g+=32;
1628 }else if(AFMT_CHANNELS(dev) < AFMT_CHANNELS(app)){
1629 return ~0;
1630 }
1631
1632 g<<=20;
1633
1634 if (srate < sratelo)
1635 g += sratelo - srate;
1636 if (srate > sratehi)
1637 g += srate - sratehi;
1638
1639 return(g);
1640}
1641
1642static int find_format(struct audioformat *afp, unsigned int nr,
1643 unsigned int fmt, unsigned int srate)
1644{
1645 unsigned int i, g, gb = ~0;
1646 int j = -1;
1647
1648
1649 for (i = 0; i < nr; i++) {
1650 g = format_goodness(&afp[i], fmt, srate);
1651 if (g >= gb) continue;
1652 j = i;
1653 gb = g;
1654 }
1655 return j;
1656}
1657
1658static int set_format_in(struct usb_audiodev *as)
1659{
1660 struct usb_device *dev = as->state->usbdev;
1661 struct usb_config_descriptor *config = dev->actconfig;
1662 struct usb_interface_descriptor *alts;
1663 struct usb_interface *iface;
1664 struct usbin *u = &as->usbin;
1665 struct dmabuf *d = &u->dma;
1666 struct audioformat *fmt;
1667 unsigned int ep;
1668 unsigned char data[3];
1669 int fmtnr, ret;
1670
1671 if (u->interface < 0 || u->interface >= config->bNumInterfaces)
1672 return 0;
1673 iface = &config->interface[u->interface];
1674
1675 fmtnr = find_format(as->fmtin, as->numfmtin, d->format, d->srate);
1676 if (fmtnr < 0) {
1677 printk(KERN_ERR "usbaudio: set_format_in(): failed to find desired format/speed combination.\n");
1678 return -1;
1679 }
1680
1681 fmt = as->fmtin + fmtnr;
1682 alts = &iface->altsetting[fmt->altsetting];
1683 u->format = fmt->format;
1684 u->datapipe = usb_rcvisocpipe(dev, alts->endpoint[0].bEndpointAddress & 0xf);
1685 u->syncpipe = u->syncinterval = 0;
1686 if ((alts->endpoint[0].bmAttributes & 0x0c) == 0x08) {
1687 if (alts->bNumEndpoints < 2 ||
1688 alts->endpoint[1].bmAttributes != 0x01 ||
1689 alts->endpoint[1].bSynchAddress != 0 ||
1690 alts->endpoint[1].bEndpointAddress != (alts->endpoint[0].bSynchAddress & 0x7f)) {
1691 printk(KERN_WARNING "usbaudio: device %d interface %d altsetting %d claims adaptive in but has invalid synch pipe; treating as asynchronous in\n",
1692 dev->devnum, u->interface, fmt->altsetting);
1693 } else {
1694 u->syncpipe = usb_sndisocpipe(dev, alts->endpoint[1].bEndpointAddress & 0xf);
1695 u->syncinterval = alts->endpoint[1].bRefresh;
1696 }
1697 }
1698 if (d->srate < fmt->sratelo)
1699 d->srate = fmt->sratelo;
1700 if (d->srate > fmt->sratehi)
1701 d->srate = fmt->sratehi;
1702 dprintk((KERN_DEBUG "usbaudio: set_format_in: usb_set_interface %u %u\n", alts->bInterfaceNumber, fmt->altsetting));
1703 if (usb_set_interface(dev, alts->bInterfaceNumber, fmt->altsetting) < 0) {
1704 printk(KERN_WARNING "usbaudio: usb_set_interface failed, device %d interface %d altsetting %d\n",
1705 dev->devnum, u->interface, fmt->altsetting);
1706 return -1;
1707 }
1708 if (fmt->sratelo == fmt->sratehi)
1709 return 0;
1710 ep = usb_pipeendpoint(u->datapipe) | (u->datapipe & USB_DIR_IN);
1711
1712 if (fmt->attributes & 0x02) {
1713 data[0] = 1;
1714 if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT,
1715 PITCH_CONTROL << 8, ep, data, 1, HZ)) < 0) {
1716 printk(KERN_ERR "usbaudio: failure (error %d) to set output pitch control device %d interface %u endpoint 0x%x to %u\n",
1717 ret, dev->devnum, u->interface, ep, d->srate);
1718 return -1;
1719 }
1720 }
1721
1722 if (fmt->attributes & 0x01) {
1723 data[0] = d->srate;
1724 data[1] = d->srate >> 8;
1725 data[2] = d->srate >> 16;
1726 if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT,
1727 SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ)) < 0) {
1728 printk(KERN_ERR "usbaudio: failure (error %d) to set input sampling frequency device %d interface %u endpoint 0x%x to %u\n",
1729 ret, dev->devnum, u->interface, ep, d->srate);
1730 return -1;
1731 }
1732 if ((ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_IN,
1733 SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ)) < 0) {
1734 printk(KERN_ERR "usbaudio: failure (error %d) to get input sampling frequency device %d interface %u endpoint 0x%x\n",
1735 ret, dev->devnum, u->interface, ep);
1736 return -1;
1737 }
1738 dprintk((KERN_DEBUG "usbaudio: set_format_in: device %d interface %d altsetting %d srate req: %u real %u\n",
1739 dev->devnum, u->interface, fmt->altsetting, d->srate, data[0] | (data[1] << 8) | (data[2] << 16)));
1740 d->srate = data[0] | (data[1] << 8) | (data[2] << 16);
1741 }
1742 dprintk((KERN_DEBUG "usbaudio: set_format_in: USB format 0x%x, DMA format 0x%x srate %u\n", u->format, d->format, d->srate));
1743 return 0;
1744}
1745
1746static int set_format_out(struct usb_audiodev *as)
1747{
1748 struct usb_device *dev = as->state->usbdev;
1749 struct usb_config_descriptor *config = dev->actconfig;
1750 struct usb_interface_descriptor *alts;
1751 struct usb_interface *iface;
1752 struct usbout *u = &as->usbout;
1753 struct dmabuf *d = &u->dma;
1754 struct audioformat *fmt;
1755 unsigned int ep;
1756 unsigned char data[3];
1757 int fmtnr, ret;
1758
1759 if (u->interface < 0 || u->interface >= config->bNumInterfaces)
1760 return 0;
1761 iface = &config->interface[u->interface];
1762
1763 fmtnr = find_format(as->fmtout, as->numfmtout, d->format, d->srate);
1764 if (fmtnr < 0) {
1765 printk(KERN_ERR "usbaudio: set_format_out(): failed to find desired format/speed combination.\n");
1766 return -1;
1767 }
1768
1769 fmt = as->fmtout + fmtnr;
1770 u->format = fmt->format;
1771 alts = &iface->altsetting[fmt->altsetting];
1772 u->datapipe = usb_sndisocpipe(dev, alts->endpoint[0].bEndpointAddress & 0xf);
1773 u->syncpipe = u->syncinterval = 0;
1774 if ((alts->endpoint[0].bmAttributes & 0x0c) == 0x04) {
1775#if 0
1776 printk(KERN_DEBUG "bNumEndpoints 0x%02x endpoint[1].bmAttributes 0x%02x\n"
1777 KERN_DEBUG "endpoint[1].bSynchAddress 0x%02x endpoint[1].bEndpointAddress 0x%02x\n"
1778 KERN_DEBUG "endpoint[0].bSynchAddress 0x%02x\n", alts->bNumEndpoints,
1779 alts->endpoint[1].bmAttributes, alts->endpoint[1].bSynchAddress,
1780 alts->endpoint[1].bEndpointAddress, alts->endpoint[0].bSynchAddress);
1781#endif
1782 if (alts->bNumEndpoints < 2 ||
1783 alts->endpoint[1].bmAttributes != 0x01 ||
1784 alts->endpoint[1].bSynchAddress != 0 ||
1785 alts->endpoint[1].bEndpointAddress != (alts->endpoint[0].bSynchAddress | 0x80)) {
1786 printk(KERN_WARNING "usbaudio: device %d interface %d altsetting %d claims asynch out but has invalid synch pipe; treating as adaptive out\n",
1787 dev->devnum, u->interface, fmt->altsetting);
1788 } else {
1789 u->syncpipe = usb_rcvisocpipe(dev, alts->endpoint[1].bEndpointAddress & 0xf);
1790 u->syncinterval = alts->endpoint[1].bRefresh;
1791 }
1792 }
1793 if (d->srate < fmt->sratelo)
1794 d->srate = fmt->sratelo;
1795 if (d->srate > fmt->sratehi)
1796 d->srate = fmt->sratehi;
1797 dprintk((KERN_DEBUG "usbaudio: set_format_out: usb_set_interface %u %u\n", alts->bInterfaceNumber, fmt->altsetting));
1798 if (usb_set_interface(dev, u->interface, fmt->altsetting) < 0) {
1799 printk(KERN_WARNING "usbaudio: usb_set_interface failed, device %d interface %d altsetting %d\n",
1800 dev->devnum, u->interface, fmt->altsetting);
1801 return -1;
1802 }
1803 if (fmt->sratelo == fmt->sratehi)
1804 return 0;
1805 ep = usb_pipeendpoint(u->datapipe) | (u->datapipe & USB_DIR_IN);
1806
1807 if (fmt->attributes & 0x02) {
1808 data[0] = 1;
1809 if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT,
1810 PITCH_CONTROL << 8, ep, data, 1, HZ)) < 0) {
1811 printk(KERN_ERR "usbaudio: failure (error %d) to set output pitch control device %d interface %u endpoint 0x%x to %u\n",
1812 ret, dev->devnum, u->interface, ep, d->srate);
1813 return -1;
1814 }
1815 }
1816
1817 if (fmt->attributes & 0x01) {
1818 data[0] = d->srate;
1819 data[1] = d->srate >> 8;
1820 data[2] = d->srate >> 16;
1821 if ((ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT,
1822 SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ)) < 0) {
1823 printk(KERN_ERR "usbaudio: failure (error %d) to set output sampling frequency device %d interface %u endpoint 0x%x to %u\n",
1824 ret, dev->devnum, u->interface, ep, d->srate);
1825 return -1;
1826 }
1827 if ((ret = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_IN,
1828 SAMPLING_FREQ_CONTROL << 8, ep, data, 3, HZ)) < 0) {
1829 printk(KERN_ERR "usbaudio: failure (error %d) to get output sampling frequency device %d interface %u endpoint 0x%x\n",
1830 ret, dev->devnum, u->interface, ep);
1831 return -1;
1832 }
1833 dprintk((KERN_DEBUG "usbaudio: set_format_out: device %d interface %d altsetting %d srate req: %u real %u\n",
1834 dev->devnum, u->interface, fmt->altsetting, d->srate, data[0] | (data[1] << 8) | (data[2] << 16)));
1835 d->srate = data[0] | (data[1] << 8) | (data[2] << 16);
1836 }
1837 dprintk((KERN_DEBUG "usbaudio: set_format_out: USB format 0x%x, DMA format 0x%x srate %u\n", u->format, d->format, d->srate));
1838 return 0;
1839}
1840
1841static int set_format(struct usb_audiodev *s, unsigned int fmode, unsigned int fmt, unsigned int srate)
1842{
1843 int ret1 = 0, ret2 = 0;
1844
1845 if (!(fmode & (FMODE_READ|FMODE_WRITE)))
1846 return -EINVAL;
1847 if (fmode & FMODE_READ) {
1848 usbin_stop(s);
1849 s->usbin.dma.ready = 0;
1850 if (fmt == AFMT_QUERY)
1851 fmt = s->usbin.dma.format;
1852 else
1853 s->usbin.dma.format = fmt;
1854 if (!srate)
1855 srate = s->usbin.dma.srate;
1856 else
1857 s->usbin.dma.srate = srate;
1858 }
1859 if (fmode & FMODE_WRITE) {
1860 usbout_stop(s);
1861 s->usbout.dma.ready = 0;
1862 if (fmt == AFMT_QUERY)
1863 fmt = s->usbout.dma.format;
1864 else
1865 s->usbout.dma.format = fmt;
1866 if (!srate)
1867 srate = s->usbout.dma.srate;
1868 else
1869 s->usbout.dma.srate = srate;
1870 }
1871 if (fmode & FMODE_READ)
1872 ret1 = set_format_in(s);
1873 if (fmode & FMODE_WRITE)
1874 ret2 = set_format_out(s);
1875 return ret1 ? ret1 : ret2;
1876}
1877
1878
1879
1880static int wrmixer(struct usb_mixerdev *ms, unsigned mixch, unsigned value)
1881{
1882 struct usb_device *dev = ms->state->usbdev;
1883 unsigned char data[2];
1884 struct mixerchannel *ch;
1885 int v1, v2, v3;
1886
1887 if (mixch >= ms->numch)
1888 return -1;
1889 ch = &ms->ch[mixch];
1890 v3 = ch->maxval - ch->minval;
1891 v1 = value & 0xff;
1892 v2 = (value >> 8) & 0xff;
1893 if (v1 > 100)
1894 v1 = 100;
1895 if (v2 > 100)
1896 v2 = 100;
1897 if (!(ch->flags & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT)))
1898 v2 = v1;
1899 ch->value = v1 | (v2 << 8);
1900 v1 = (v1 * v3) / 100 + ch->minval;
1901 v2 = (v2 * v3) / 100 + ch->minval;
1902 switch (ch->selector) {
1903 case 0:
1904 data[0] = v1;
1905 data[1] = v1 >> 8;
1906 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
1907 (ch->chnum << 8) | 1, ms->iface | (ch->unitid << 8), data, 2, HZ) < 0)
1908 goto err;
1909 if (!(ch->flags & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT)))
1910 return 0;
1911 data[0] = v2;
1912 data[1] = v2 >> 8;
1913 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
1914 ((ch->chnum + !!(ch->flags & MIXFLG_STEREOIN)) << 8) | (1 + !!(ch->flags & MIXFLG_STEREOOUT)),
1915 ms->iface | (ch->unitid << 8), data, 2, HZ) < 0)
1916 goto err;
1917 return 0;
1918
1919
1920 case VOLUME_CONTROL:
1921 data[0] = v1;
1922 data[1] = v1 >> 8;
1923 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
1924 (ch->selector << 8) | ch->chnum, ms->iface | (ch->unitid << 8), data, 2, HZ) < 0)
1925 goto err;
1926 if (!(ch->flags & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT)))
1927 return 0;
1928 data[0] = v2;
1929 data[1] = v2 >> 8;
1930 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
1931 (ch->selector << 8) | (ch->chnum + 1), ms->iface | (ch->unitid << 8), data, 2, HZ) < 0)
1932 goto err;
1933 return 0;
1934
1935 case BASS_CONTROL:
1936 case MID_CONTROL:
1937 case TREBLE_CONTROL:
1938 data[0] = v1 >> 8;
1939 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
1940 (ch->selector << 8) | ch->chnum, ms->iface | (ch->unitid << 8), data, 1, HZ) < 0)
1941 goto err;
1942 if (!(ch->flags & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT)))
1943 return 0;
1944 data[0] = v2 >> 8;
1945 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
1946 (ch->selector << 8) | (ch->chnum + 1), ms->iface | (ch->unitid << 8), data, 1, HZ) < 0)
1947 goto err;
1948 return 0;
1949
1950 default:
1951 return -1;
1952 }
1953 return 0;
1954
1955 err:
1956 printk(KERN_ERR "usbaudio: mixer request device %u if %u unit %u ch %u selector %u failed\n",
1957 dev->devnum, ms->iface, ch->unitid, ch->chnum, ch->selector);
1958 return -1;
1959}
1960
1961static int get_rec_src(struct usb_mixerdev *ms)
1962{
1963 struct usb_device *dev = ms->state->usbdev;
1964 unsigned int mask = 0, retmask = 0;
1965 unsigned int i, j;
1966 unsigned char buf;
1967 int err = 0;
1968
1969 for (i = 0; i < ms->numch; i++) {
1970 if (!ms->ch[i].slctunitid || (mask & (1 << i)))
1971 continue;
1972 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
1973 0, ms->iface | (ms->ch[i].slctunitid << 8), &buf, 1, HZ) < 0) {
1974 err = -EIO;
1975 printk(KERN_ERR "usbaudio: selector read request device %u if %u unit %u failed\n",
1976 dev->devnum, ms->iface, ms->ch[i].slctunitid & 0xff);
1977 continue;
1978 }
1979 for (j = i; j < ms->numch; j++) {
1980 if ((ms->ch[i].slctunitid ^ ms->ch[j].slctunitid) & 0xff)
1981 continue;
1982 mask |= 1 << j;
1983 if (buf == (ms->ch[j].slctunitid >> 8))
1984 retmask |= 1 << ms->ch[j].osschannel;
1985 }
1986 }
1987 if (err)
1988 return -EIO;
1989 return retmask;
1990}
1991
1992static int set_rec_src(struct usb_mixerdev *ms, int srcmask)
1993{
1994 struct usb_device *dev = ms->state->usbdev;
1995 unsigned int mask = 0, smask, bmask;
1996 unsigned int i, j;
1997 unsigned char buf;
1998 int err = 0;
1999
2000 for (i = 0; i < ms->numch; i++) {
2001 if (!ms->ch[i].slctunitid || (mask & (1 << i)))
2002 continue;
2003 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
2004 0, ms->iface | (ms->ch[i].slctunitid << 8), &buf, 1, HZ) < 0) {
2005 err = -EIO;
2006 printk(KERN_ERR "usbaudio: selector read request device %u if %u unit %u failed\n",
2007 dev->devnum, ms->iface, ms->ch[i].slctunitid & 0xff);
2008 continue;
2009 }
2010
2011 smask = bmask = 0;
2012 for (j = i; j < ms->numch; j++) {
2013 if ((ms->ch[i].slctunitid ^ ms->ch[j].slctunitid) & 0xff)
2014 continue;
2015 smask |= 1 << ms->ch[j].osschannel;
2016 if (buf == (ms->ch[j].slctunitid >> 8))
2017 bmask |= 1 << ms->ch[j].osschannel;
2018 mask |= 1 << j;
2019 }
2020
2021 j = hweight32(srcmask & smask);
2022 if (j == 0)
2023 continue;
2024 if (j > 1)
2025 srcmask &= ~bmask;
2026 for (j = i; j < ms->numch; j++) {
2027 if ((ms->ch[i].slctunitid ^ ms->ch[j].slctunitid) & 0xff)
2028 continue;
2029 if (!(srcmask & (1 << ms->ch[j].osschannel)))
2030 continue;
2031 buf = ms->ch[j].slctunitid >> 8;
2032 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
2033 0, ms->iface | (ms->ch[j].slctunitid << 8), &buf, 1, HZ) < 0) {
2034 err = -EIO;
2035 printk(KERN_ERR "usbaudio: selector write request device %u if %u unit %u failed\n",
2036 dev->devnum, ms->iface, ms->ch[j].slctunitid & 0xff);
2037 continue;
2038 }
2039 }
2040 }
2041 return err ? -EIO : 0;
2042}
2043
2044
2045
2046
2047
2048
2049
2050
2051static void release(struct usb_audio_state *s)
2052{
2053 struct usb_audiodev *as;
2054 struct usb_mixerdev *ms;
2055
2056 s->count--;
2057 if (s->count) {
2058 up(&open_sem);
2059 return;
2060 }
2061 up(&open_sem);
2062 wake_up(&open_wait);
2063 while (!list_empty(&s->audiolist)) {
2064 as = list_entry(s->audiolist.next, struct usb_audiodev, list);
2065 list_del(&as->list);
2066 usbin_release(as);
2067 usbout_release(as);
2068 dmabuf_release(&as->usbin.dma);
2069 dmabuf_release(&as->usbout.dma);
2070 kfree(as);
2071 }
2072 while (!list_empty(&s->mixerlist)) {
2073 ms = list_entry(s->mixerlist.next, struct usb_mixerdev, list);
2074 list_del(&ms->list);
2075 kfree(ms);
2076 }
2077 kfree(s);
2078}
2079
2080static inline int prog_dmabuf_in(struct usb_audiodev *as)
2081{
2082 usbin_stop(as);
2083 return dmabuf_init(&as->usbin.dma);
2084}
2085
2086static inline int prog_dmabuf_out(struct usb_audiodev *as)
2087{
2088 usbout_stop(as);
2089 return dmabuf_init(&as->usbout.dma);
2090}
2091
2092
2093
2094static int usb_audio_open_mixdev(struct inode *inode, struct file *file)
2095{
2096 int minor = MINOR(inode->i_rdev);
2097 struct list_head *devs, *mdevs;
2098 struct usb_mixerdev *ms;
2099 struct usb_audio_state *s;
2100
2101 down(&open_sem);
2102 for (devs = audiodevs.next; devs != &audiodevs; devs = devs->next) {
2103 s = list_entry(devs, struct usb_audio_state, audiodev);
2104 for (mdevs = s->mixerlist.next; mdevs != &s->mixerlist; mdevs = mdevs->next) {
2105 ms = list_entry(mdevs, struct usb_mixerdev, list);
2106 if (ms->dev_mixer == minor)
2107 goto mixer_found;
2108 }
2109 }
2110 up(&open_sem);
2111 return -ENODEV;
2112
2113 mixer_found:
2114 if (!s->usbdev) {
2115 up(&open_sem);
2116 return -EIO;
2117 }
2118 file->private_data = ms;
2119 s->count++;
2120
2121 up(&open_sem);
2122 return 0;
2123}
2124
2125static int usb_audio_release_mixdev(struct inode *inode, struct file *file)
2126{
2127 struct usb_mixerdev *ms = (struct usb_mixerdev *)file->private_data;
2128 struct usb_audio_state *s;
2129
2130 lock_kernel();
2131 s = ms->state;
2132 down(&open_sem);
2133 release(s);
2134 unlock_kernel();
2135 return 0;
2136}
2137
2138static int usb_audio_ioctl_mixdev(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
2139{
2140 struct usb_mixerdev *ms = (struct usb_mixerdev *)file->private_data;
2141 int i, j, val;
2142
2143 if (!ms->state->usbdev)
2144 return -ENODEV;
2145
2146 if (cmd == SOUND_MIXER_INFO) {
2147 mixer_info info;
2148
2149 memset(&info, 0, sizeof(info));
2150 strncpy(info.id, "USB_AUDIO", sizeof(info.id));
2151 strncpy(info.name, "USB Audio Class Driver", sizeof(info.name));
2152 info.modify_counter = ms->modcnt;
2153 if (copy_to_user((void *)arg, &info, sizeof(info)))
2154 return -EFAULT;
2155 return 0;
2156 }
2157 if (cmd == SOUND_OLD_MIXER_INFO) {
2158 _old_mixer_info info;
2159
2160 memset(&info, 0, sizeof(info));
2161 strncpy(info.id, "USB_AUDIO", sizeof(info.id));
2162 strncpy(info.name, "USB Audio Class Driver", sizeof(info.name));
2163 if (copy_to_user((void *)arg, &info, sizeof(info)))
2164 return -EFAULT;
2165 return 0;
2166 }
2167 if (cmd == OSS_GETVERSION)
2168 return put_user(SOUND_VERSION, (int *)arg);
2169 if (_IOC_TYPE(cmd) != 'M' || _IOC_SIZE(cmd) != sizeof(int))
2170 return -EINVAL;
2171 if (_IOC_DIR(cmd) == _IOC_READ) {
2172 switch (_IOC_NR(cmd)) {
2173 case SOUND_MIXER_RECSRC:
2174 val = get_rec_src(ms);
2175 if (val < 0)
2176 return val;
2177 return put_user(val, (int *)arg);
2178
2179 case SOUND_MIXER_DEVMASK:
2180 for (val = i = 0; i < ms->numch; i++)
2181 val |= 1 << ms->ch[i].osschannel;
2182 return put_user(val, (int *)arg);
2183
2184 case SOUND_MIXER_RECMASK:
2185 for (val = i = 0; i < ms->numch; i++)
2186 if (ms->ch[i].slctunitid)
2187 val |= 1 << ms->ch[i].osschannel;
2188 return put_user(val, (int *)arg);
2189
2190 case SOUND_MIXER_STEREODEVS:
2191 for (val = i = 0; i < ms->numch; i++)
2192 if (ms->ch[i].flags & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT))
2193 val |= 1 << ms->ch[i].osschannel;
2194 return put_user(val, (int *)arg);
2195
2196 case SOUND_MIXER_CAPS:
2197 return put_user(SOUND_CAP_EXCL_INPUT, (int *)arg);
2198
2199 default:
2200 i = _IOC_NR(cmd);
2201 if (i >= SOUND_MIXER_NRDEVICES)
2202 return -EINVAL;
2203 for (j = 0; j < ms->numch; j++) {
2204 if (ms->ch[j].osschannel == i) {
2205 return put_user(ms->ch[j].value, (int *)arg);
2206 }
2207 }
2208 return -EINVAL;
2209 }
2210 }
2211 if (_IOC_DIR(cmd) != (_IOC_READ|_IOC_WRITE))
2212 return -EINVAL;
2213 ms->modcnt++;
2214 switch (_IOC_NR(cmd)) {
2215 case SOUND_MIXER_RECSRC:
2216 if (get_user(val, (int *)arg))
2217 return -EFAULT;
2218 return set_rec_src(ms, val);
2219
2220 default:
2221 i = _IOC_NR(cmd);
2222 if (i >= SOUND_MIXER_NRDEVICES)
2223 return -EINVAL;
2224 for (j = 0; j < ms->numch && ms->ch[j].osschannel != i; j++);
2225 if (j >= ms->numch)
2226 return -EINVAL;
2227 if (get_user(val, (int *)arg))
2228 return -EFAULT;
2229 if (wrmixer(ms, j, val))
2230 return -EIO;
2231 return put_user(ms->ch[j].value, (int *)arg);
2232 }
2233}
2234
2235static struct file_operations usb_mixer_fops = {
2236 owner: THIS_MODULE,
2237 llseek: no_llseek,
2238 ioctl: usb_audio_ioctl_mixdev,
2239 open: usb_audio_open_mixdev,
2240 release: usb_audio_release_mixdev,
2241};
2242
2243
2244
2245static int drain_out(struct usb_audiodev *as, int nonblock)
2246{
2247 DECLARE_WAITQUEUE(wait, current);
2248 unsigned long flags;
2249 int count, tmo;
2250
2251 if (as->usbout.dma.mapped || !as->usbout.dma.ready)
2252 return 0;
2253 usbout_start(as);
2254 add_wait_queue(&as->usbout.dma.wait, &wait);
2255 for (;;) {
2256 __set_current_state(TASK_INTERRUPTIBLE);
2257 spin_lock_irqsave(&as->lock, flags);
2258 count = as->usbout.dma.count;
2259 spin_unlock_irqrestore(&as->lock, flags);
2260 if (count <= 0)
2261 break;
2262 if (signal_pending(current))
2263 break;
2264 if (nonblock) {
2265 remove_wait_queue(&as->usbout.dma.wait, &wait);
2266 set_current_state(TASK_RUNNING);
2267 return -EBUSY;
2268 }
2269 tmo = 3 * HZ * count / (as->usbout.dma.srate *
2270 AFMT_SAMPLEBYTES(as->usbout.dma.format));
2271 if (!schedule_timeout(tmo + 1)) {
2272 printk(KERN_DEBUG "usbaudio: dma timed out??\n");
2273 break;
2274 }
2275 }
2276 remove_wait_queue(&as->usbout.dma.wait, &wait);
2277 set_current_state(TASK_RUNNING);
2278 if (signal_pending(current))
2279 return -ERESTARTSYS;
2280 return 0;
2281}
2282
2283
2284
2285static ssize_t usb_audio_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
2286{
2287 struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
2288 DECLARE_WAITQUEUE(wait, current);
2289 ssize_t ret = 0;
2290 unsigned long flags;
2291 unsigned int ptr;
2292 int cnt, err;
2293
2294 if (ppos != &file->f_pos)
2295 return -ESPIPE;
2296 if (as->usbin.dma.mapped)
2297 return -ENXIO;
2298 if (!as->usbin.dma.ready && (ret = prog_dmabuf_in(as)))
2299 return ret;
2300 if (!access_ok(VERIFY_WRITE, buffer, count))
2301 return -EFAULT;
2302 add_wait_queue(&as->usbin.dma.wait, &wait);
2303 while (count > 0) {
2304 spin_lock_irqsave(&as->lock, flags);
2305 ptr = as->usbin.dma.rdptr;
2306 cnt = as->usbin.dma.count;
2307
2308 if (cnt <= 0)
2309 __set_current_state(TASK_INTERRUPTIBLE);
2310 spin_unlock_irqrestore(&as->lock, flags);
2311 if (cnt > count)
2312 cnt = count;
2313 if (cnt <= 0) {
2314 if (as->usbin.dma.enabled && usbin_start(as)) {
2315 if (!ret)
2316 ret = -ENODEV;
2317 break;
2318 }
2319 if (file->f_flags & O_NONBLOCK) {
2320 if (!ret)
2321 ret = -EAGAIN;
2322 break;
2323 }
2324 schedule();
2325 if (signal_pending(current)) {
2326 if (!ret)
2327 ret = -ERESTARTSYS;
2328 break;
2329 }
2330 continue;
2331 }
2332 if ((err = dmabuf_copyout_user(&as->usbin.dma, ptr, buffer, cnt))) {
2333 if (!ret)
2334 ret = err;
2335 break;
2336 }
2337 ptr += cnt;
2338 if (ptr >= as->usbin.dma.dmasize)
2339 ptr -= as->usbin.dma.dmasize;
2340 spin_lock_irqsave(&as->lock, flags);
2341 as->usbin.dma.rdptr = ptr;
2342 as->usbin.dma.count -= cnt;
2343 spin_unlock_irqrestore(&as->lock, flags);
2344 count -= cnt;
2345 buffer += cnt;
2346 ret += cnt;
2347 if (as->usbin.dma.enabled && usbin_start(as)) {
2348 if (!ret)
2349 ret = -ENODEV;
2350 break;
2351 }
2352 }
2353 __set_current_state(TASK_RUNNING);
2354 remove_wait_queue(&as->usbin.dma.wait, &wait);
2355 return ret;
2356}
2357
2358static ssize_t usb_audio_write(struct file *file, const char *buffer, size_t count, loff_t *ppos)
2359{
2360 struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
2361 DECLARE_WAITQUEUE(wait, current);
2362 ssize_t ret = 0;
2363 unsigned long flags;
2364 unsigned int ptr;
2365 unsigned int start_thr;
2366 int cnt, err;
2367
2368 if (ppos != &file->f_pos)
2369 return -ESPIPE;
2370 if (as->usbout.dma.mapped)
2371 return -ENXIO;
2372 if (!as->usbout.dma.ready && (ret = prog_dmabuf_out(as)))
2373 return ret;
2374 if (!access_ok(VERIFY_READ, buffer, count))
2375 return -EFAULT;
2376 start_thr = (as->usbout.dma.srate * AFMT_SAMPLEBYTES(as->usbout.dma.format)) / (1000 / (3 * DESCFRAMES));
2377 add_wait_queue(&as->usbout.dma.wait, &wait);
2378 while (count > 0) {
2379#if 0
2380 printk(KERN_DEBUG "usb_audio_write: count %u dma: count %u rdptr %u wrptr %u dmasize %u fragsize %u flags 0x%02x taskst 0x%lx\n",
2381 count, as->usbout.dma.count, as->usbout.dma.rdptr, as->usbout.dma.wrptr, as->usbout.dma.dmasize, as->usbout.dma.fragsize,
2382 as->usbout.flags, current->state);
2383#endif
2384 spin_lock_irqsave(&as->lock, flags);
2385 if (as->usbout.dma.count < 0) {
2386 as->usbout.dma.count = 0;
2387 as->usbout.dma.rdptr = as->usbout.dma.wrptr;
2388 }
2389 ptr = as->usbout.dma.wrptr;
2390 cnt = as->usbout.dma.dmasize - as->usbout.dma.count;
2391
2392 if (cnt <= 0)
2393 __set_current_state(TASK_INTERRUPTIBLE);
2394 spin_unlock_irqrestore(&as->lock, flags);
2395 if (cnt > count)
2396 cnt = count;
2397 if (cnt <= 0) {
2398 if (as->usbout.dma.enabled && usbout_start(as)) {
2399 if (!ret)
2400 ret = -ENODEV;
2401 break;
2402 }
2403 if (file->f_flags & O_NONBLOCK) {
2404 if (!ret)
2405 ret = -EAGAIN;
2406 break;
2407 }
2408 schedule();
2409 if (signal_pending(current)) {
2410 if (!ret)
2411 ret = -ERESTARTSYS;
2412 break;
2413 }
2414 continue;
2415 }
2416 if ((err = dmabuf_copyin_user(&as->usbout.dma, ptr, buffer, cnt))) {
2417 if (!ret)
2418 ret = err;
2419 break;
2420 }
2421 ptr += cnt;
2422 if (ptr >= as->usbout.dma.dmasize)
2423 ptr -= as->usbout.dma.dmasize;
2424 spin_lock_irqsave(&as->lock, flags);
2425 as->usbout.dma.wrptr = ptr;
2426 as->usbout.dma.count += cnt;
2427 spin_unlock_irqrestore(&as->lock, flags);
2428 count -= cnt;
2429 buffer += cnt;
2430 ret += cnt;
2431 if (as->usbout.dma.enabled && as->usbout.dma.count >= start_thr && usbout_start(as)) {
2432 if (!ret)
2433 ret = -ENODEV;
2434 break;
2435 }
2436 }
2437 __set_current_state(TASK_RUNNING);
2438 remove_wait_queue(&as->usbout.dma.wait, &wait);
2439 return ret;
2440}
2441
2442
2443static unsigned int usb_audio_poll(struct file *file, struct poll_table_struct *wait)
2444{
2445 struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
2446 unsigned long flags;
2447 unsigned int mask = 0;
2448
2449 if (file->f_mode & FMODE_WRITE) {
2450 if (!as->usbout.dma.ready)
2451 prog_dmabuf_out(as);
2452 poll_wait(file, &as->usbout.dma.wait, wait);
2453 }
2454 if (file->f_mode & FMODE_READ) {
2455 if (!as->usbin.dma.ready)
2456 prog_dmabuf_in(as);
2457 poll_wait(file, &as->usbin.dma.wait, wait);
2458 }
2459 spin_lock_irqsave(&as->lock, flags);
2460 if (file->f_mode & FMODE_READ) {
2461 if (as->usbin.dma.count >= (signed)as->usbin.dma.fragsize)
2462 mask |= POLLIN | POLLRDNORM;
2463 }
2464 if (file->f_mode & FMODE_WRITE) {
2465 if (as->usbout.dma.mapped) {
2466 if (as->usbout.dma.count >= (signed)as->usbout.dma.fragsize)
2467 mask |= POLLOUT | POLLWRNORM;
2468 } else {
2469 if ((signed)as->usbout.dma.dmasize >= as->usbout.dma.count + (signed)as->usbout.dma.fragsize)
2470 mask |= POLLOUT | POLLWRNORM;
2471 }
2472 }
2473 spin_unlock_irqrestore(&as->lock, flags);
2474 return mask;
2475}
2476
2477static int usb_audio_mmap(struct file *file, struct vm_area_struct *vma)
2478{
2479 struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
2480 struct dmabuf *db;
2481 int ret = -EINVAL;
2482
2483 lock_kernel();
2484 if (vma->vm_flags & VM_WRITE) {
2485 if ((ret = prog_dmabuf_out(as)) != 0)
2486 goto out;
2487 db = &as->usbout.dma;
2488 } else if (vma->vm_flags & VM_READ) {
2489 if ((ret = prog_dmabuf_in(as)) != 0)
2490 goto out;
2491 db = &as->usbin.dma;
2492 } else
2493 goto out;
2494
2495 ret = -EINVAL;
2496 if (vma->vm_pgoff != 0)
2497 goto out;
2498
2499 ret = dmabuf_mmap(db, vma->vm_start, vma->vm_end - vma->vm_start, vma->vm_page_prot);
2500out:
2501 unlock_kernel();
2502 return ret;
2503}
2504
2505static int usb_audio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
2506{
2507 struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
2508 struct usb_audio_state *s = as->state;
2509 unsigned long flags;
2510 audio_buf_info abinfo;
2511 count_info cinfo;
2512 int val = 0;
2513 int val2, mapped, ret;
2514
2515 if (!s->usbdev)
2516 return -EIO;
2517 mapped = ((file->f_mode & FMODE_WRITE) && as->usbout.dma.mapped) ||
2518 ((file->f_mode & FMODE_READ) && as->usbin.dma.mapped);
2519#if 0
2520 if (arg)
2521 get_user(val, (int *)arg);
2522 printk(KERN_DEBUG "usbaudio: usb_audio_ioctl cmd=%x arg=%lx *arg=%d\n", cmd, arg, val)
2523#endif
2524 switch (cmd) {
2525 case OSS_GETVERSION:
2526 return put_user(SOUND_VERSION, (int *)arg);
2527
2528 case SNDCTL_DSP_SYNC:
2529 if (file->f_mode & FMODE_WRITE)
2530 return drain_out(as, 0);
2531 return 0;
2532
2533 case SNDCTL_DSP_SETDUPLEX:
2534 return 0;
2535
2536 case SNDCTL_DSP_GETCAPS:
2537 return put_user(DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER |
2538 DSP_CAP_MMAP | DSP_CAP_BATCH, (int *)arg);
2539
2540 case SNDCTL_DSP_RESET:
2541 if (file->f_mode & FMODE_WRITE) {
2542 usbout_stop(as);
2543 as->usbout.dma.rdptr = as->usbout.dma.wrptr = as->usbout.dma.count = as->usbout.dma.total_bytes = 0;
2544 }
2545 if (file->f_mode & FMODE_READ) {
2546 usbin_stop(as);
2547 as->usbin.dma.rdptr = as->usbin.dma.wrptr = as->usbin.dma.count = as->usbin.dma.total_bytes = 0;
2548 }
2549 return 0;
2550
2551 case SNDCTL_DSP_SPEED:
2552 if (get_user(val, (int *)arg))
2553 return -EFAULT;
2554 if (val >= 0) {
2555 if (val < 4000)
2556 val = 4000;
2557 if (val > 100000)
2558 val = 100000;
2559 if (set_format(as, file->f_mode, AFMT_QUERY, val))
2560 return -EIO;
2561 }
2562 return put_user((file->f_mode & FMODE_READ) ? as->usbin.dma.srate : as->usbout.dma.srate, (int *)arg);
2563
2564 case SNDCTL_DSP_STEREO:
2565 if (get_user(val, (int *)arg))
2566 return -EFAULT;
2567 val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
2568 val2 &= 0x00ffffff;
2569 if (val)
2570 val2 |= AFMT_STEREO;
2571 else
2572 val2 &= ~AFMT_STEREO;
2573 if (set_format(as, file->f_mode, val2, 0))
2574 return -EIO;
2575 return 0;
2576
2577 case SNDCTL_DSP_CHANNELS:
2578 if (get_user(val, (int *)arg))
2579 return -EFAULT;
2580 if (val != 0) {
2581 val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
2582
2583 val2 &= 0x00ffffff;
2584 val2 |= (val-1)<<24;
2585
2586 if (set_format(as, file->f_mode, val2, 0))
2587 return -EIO;
2588 }
2589 val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
2590 return put_user(AFMT_CHANNELS(val2), (int *)arg);
2591
2592 case SNDCTL_DSP_GETFMTS:
2593 return put_user(AFMT_U8 | AFMT_U16_LE | AFMT_U16_BE |
2594 AFMT_S8 | AFMT_S16_LE | AFMT_S16_BE |
2595 AFMT_U24_LE | AFMT_U24_BE | AFMT_S24_LE | AFMT_S24_BE |
2596 AFMT_U32_LE | AFMT_U32_BE | AFMT_S32_LE | AFMT_S32_BE,
2597 (int *)arg);
2598
2599 case SNDCTL_DSP_SETFMT:
2600 if (get_user(val, (int *)arg))
2601 return -EFAULT;
2602 if (val != AFMT_QUERY) {
2603 if (hweight32(val) != 1)
2604 return -EINVAL;
2605 if (!(val & (AFMT_U8 | AFMT_U16_LE | AFMT_U16_BE |
2606 AFMT_S8 | AFMT_S16_LE | AFMT_S16_BE |
2607 AFMT_U24_LE | AFMT_U24_BE | AFMT_S24_LE | AFMT_S24_BE |
2608 AFMT_U32_LE | AFMT_U32_BE | AFMT_S32_LE | AFMT_S32_BE)))
2609 return -EINVAL;
2610 val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
2611 val |= val2 & AFMT_CHMASK;
2612 if (set_format(as, file->f_mode, val, 0))
2613 return -EIO;
2614 }
2615 val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
2616 return put_user(val2 & ~AFMT_CHMASK, (int *)arg);
2617
2618 case SNDCTL_DSP_POST:
2619 return 0;
2620
2621 case SNDCTL_DSP_GETTRIGGER:
2622 val = 0;
2623 if (file->f_mode & FMODE_READ && as->usbin.flags & FLG_RUNNING)
2624 val |= PCM_ENABLE_INPUT;
2625 if (file->f_mode & FMODE_WRITE && as->usbout.flags & FLG_RUNNING)
2626 val |= PCM_ENABLE_OUTPUT;
2627 return put_user(val, (int *)arg);
2628
2629 case SNDCTL_DSP_SETTRIGGER:
2630 if (get_user(val, (int *)arg))
2631 return -EFAULT;
2632 if (file->f_mode & FMODE_READ) {
2633 if (val & PCM_ENABLE_INPUT) {
2634 if (!as->usbin.dma.ready && (ret = prog_dmabuf_in(as)))
2635 return ret;
2636 as->usbin.dma.enabled = 1;
2637 if (usbin_start(as))
2638 return -ENODEV;
2639 } else {
2640 as->usbin.dma.enabled = 0;
2641 usbin_stop(as);
2642 }
2643 }
2644 if (file->f_mode & FMODE_WRITE) {
2645 if (val & PCM_ENABLE_OUTPUT) {
2646 if (!as->usbout.dma.ready && (ret = prog_dmabuf_out(as)))
2647 return ret;
2648 as->usbout.dma.enabled = 1;
2649 if (usbout_start(as))
2650 return -ENODEV;
2651 } else {
2652 as->usbout.dma.enabled = 0;
2653 usbout_stop(as);
2654 }
2655 }
2656 return 0;
2657
2658 case SNDCTL_DSP_GETOSPACE:
2659 if (!(file->f_mode & FMODE_WRITE))
2660 return -EINVAL;
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678 if ((!as->usbout.dma.ready) && (val = prog_dmabuf_out(as)) != 0)
2679 return val;
2680 spin_lock_irqsave(&as->lock, flags);
2681 abinfo.fragsize = as->usbout.dma.fragsize;
2682 abinfo.bytes = as->usbout.dma.dmasize - as->usbout.dma.count;
2683 abinfo.fragstotal = as->usbout.dma.numfrag;
2684 abinfo.fragments = abinfo.bytes >> as->usbout.dma.fragshift;
2685 spin_unlock_irqrestore(&as->lock, flags);
2686 return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2687
2688 case SNDCTL_DSP_GETISPACE:
2689 if (!(file->f_mode & FMODE_READ))
2690 return -EINVAL;
2691
2692
2693 if ((!as->usbin.dma.ready) && (val = prog_dmabuf_in(as)) != 0)
2694 return val;
2695 spin_lock_irqsave(&as->lock, flags);
2696 abinfo.fragsize = as->usbin.dma.fragsize;
2697 abinfo.bytes = as->usbin.dma.count;
2698 abinfo.fragstotal = as->usbin.dma.numfrag;
2699 abinfo.fragments = abinfo.bytes >> as->usbin.dma.fragshift;
2700 spin_unlock_irqrestore(&as->lock, flags);
2701 return copy_to_user((void *)arg, &abinfo, sizeof(abinfo)) ? -EFAULT : 0;
2702
2703 case SNDCTL_DSP_NONBLOCK:
2704 file->f_flags |= O_NONBLOCK;
2705 return 0;
2706
2707 case SNDCTL_DSP_GETODELAY:
2708 if (!(file->f_mode & FMODE_WRITE))
2709 return -EINVAL;
2710 spin_lock_irqsave(&as->lock, flags);
2711 val = as->usbout.dma.count;
2712 spin_unlock_irqrestore(&as->lock, flags);
2713 return put_user(val, (int *)arg);
2714
2715 case SNDCTL_DSP_GETIPTR:
2716 if (!(file->f_mode & FMODE_READ))
2717 return -EINVAL;
2718 spin_lock_irqsave(&as->lock, flags);
2719 cinfo.bytes = as->usbin.dma.total_bytes;
2720 cinfo.blocks = as->usbin.dma.count >> as->usbin.dma.fragshift;
2721 cinfo.ptr = as->usbin.dma.wrptr;
2722 if (as->usbin.dma.mapped)
2723 as->usbin.dma.count &= as->usbin.dma.fragsize-1;
2724 spin_unlock_irqrestore(&as->lock, flags);
2725 return copy_to_user((void *)arg, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
2726
2727 case SNDCTL_DSP_GETOPTR:
2728 if (!(file->f_mode & FMODE_WRITE))
2729 return -EINVAL;
2730 spin_lock_irqsave(&as->lock, flags);
2731 cinfo.bytes = as->usbout.dma.total_bytes;
2732 cinfo.blocks = as->usbout.dma.count >> as->usbout.dma.fragshift;
2733 cinfo.ptr = as->usbout.dma.rdptr;
2734 if (as->usbout.dma.mapped)
2735 as->usbout.dma.count &= as->usbout.dma.fragsize-1;
2736 spin_unlock_irqrestore(&as->lock, flags);
2737 return copy_to_user((void *)arg, &cinfo, sizeof(cinfo)) ? -EFAULT : 0;
2738
2739 case SNDCTL_DSP_GETBLKSIZE:
2740 if (file->f_mode & FMODE_WRITE) {
2741
2742
2743 if ((!as->usbout.dma.ready) && (val = prog_dmabuf_out(as)) != 0)
2744 return val;
2745 return put_user(as->usbout.dma.fragsize, (int *)arg);
2746 }
2747
2748 if ((!as->usbin.dma.ready) && (val = prog_dmabuf_in(as)) != 0)
2749 return val;
2750 return put_user(as->usbin.dma.fragsize, (int *)arg);
2751
2752 case SNDCTL_DSP_SETFRAGMENT:
2753 if (get_user(val, (int *)arg))
2754 return -EFAULT;
2755 if (file->f_mode & FMODE_READ) {
2756 as->usbin.dma.ossfragshift = val & 0xffff;
2757 as->usbin.dma.ossmaxfrags = (val >> 16) & 0xffff;
2758 if (as->usbin.dma.ossfragshift < 4)
2759 as->usbin.dma.ossfragshift = 4;
2760 if (as->usbin.dma.ossfragshift > 15)
2761 as->usbin.dma.ossfragshift = 15;
2762 if (as->usbin.dma.ossmaxfrags < 4)
2763 as->usbin.dma.ossmaxfrags = 4;
2764 }
2765 if (file->f_mode & FMODE_WRITE) {
2766 as->usbout.dma.ossfragshift = val & 0xffff;
2767 as->usbout.dma.ossmaxfrags = (val >> 16) & 0xffff;
2768 if (as->usbout.dma.ossfragshift < 4)
2769 as->usbout.dma.ossfragshift = 4;
2770 if (as->usbout.dma.ossfragshift > 15)
2771 as->usbout.dma.ossfragshift = 15;
2772 if (as->usbout.dma.ossmaxfrags < 4)
2773 as->usbout.dma.ossmaxfrags = 4;
2774 }
2775 return 0;
2776
2777 case SNDCTL_DSP_SUBDIVIDE:
2778 if ((file->f_mode & FMODE_READ && as->usbin.dma.subdivision) ||
2779 (file->f_mode & FMODE_WRITE && as->usbout.dma.subdivision))
2780 return -EINVAL;
2781 if (get_user(val, (int *)arg))
2782 return -EFAULT;
2783 if (val != 1 && val != 2 && val != 4)
2784 return -EINVAL;
2785 if (file->f_mode & FMODE_READ)
2786 as->usbin.dma.subdivision = val;
2787 if (file->f_mode & FMODE_WRITE)
2788 as->usbout.dma.subdivision = val;
2789 return 0;
2790
2791 case SOUND_PCM_READ_RATE:
2792 return put_user((file->f_mode & FMODE_READ) ? as->usbin.dma.srate : as->usbout.dma.srate, (int *)arg);
2793
2794 case SOUND_PCM_READ_CHANNELS:
2795 val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
2796 return put_user(AFMT_CHANNELS(val2), (int *)arg);
2797
2798 case SOUND_PCM_READ_BITS:
2799 val2 = (file->f_mode & FMODE_READ) ? as->usbin.dma.format : as->usbout.dma.format;
2800 return put_user(AFMT_BYTES(val2) * 8, (int *)arg);
2801
2802 case SOUND_PCM_WRITE_FILTER:
2803 case SNDCTL_DSP_SETSYNCRO:
2804 case SOUND_PCM_READ_FILTER:
2805 return -EINVAL;
2806 }
2807 dprintk((KERN_DEBUG "usbaudio: usb_audio_ioctl - no command found\n"));
2808 return -ENOIOCTLCMD;
2809}
2810
2811static int usb_audio_open(struct inode *inode, struct file *file)
2812{
2813 int minor = MINOR(inode->i_rdev);
2814 DECLARE_WAITQUEUE(wait, current);
2815 struct list_head *devs, *adevs;
2816 struct usb_audiodev *as;
2817 struct usb_audio_state *s;
2818
2819 for (;;) {
2820 down(&open_sem);
2821 for (devs = audiodevs.next; devs != &audiodevs; devs = devs->next) {
2822 s = list_entry(devs, struct usb_audio_state, audiodev);
2823 for (adevs = s->audiolist.next; adevs != &s->audiolist; adevs = adevs->next) {
2824 as = list_entry(adevs, struct usb_audiodev, list);
2825 if (!((as->dev_audio ^ minor) & ~0xf))
2826 goto device_found;
2827 }
2828 }
2829 up(&open_sem);
2830 return -ENODEV;
2831
2832 device_found:
2833 if (!s->usbdev) {
2834 up(&open_sem);
2835 return -EIO;
2836 }
2837
2838 if (!(as->open_mode & file->f_mode))
2839 break;
2840 if (file->f_flags & O_NONBLOCK) {
2841 up(&open_sem);
2842 return -EBUSY;
2843 }
2844 __set_current_state(TASK_INTERRUPTIBLE);
2845 add_wait_queue(&open_wait, &wait);
2846 up(&open_sem);
2847 schedule();
2848 __set_current_state(TASK_RUNNING);
2849 remove_wait_queue(&open_wait, &wait);
2850 if (signal_pending(current))
2851 return -ERESTARTSYS;
2852 }
2853 if (file->f_mode & FMODE_READ) {
2854 as->usbin.dma.ossfragshift = as->usbin.dma.ossmaxfrags = as->usbin.dma.subdivision = 0;
2855 as->usbin.dma.enabled = 1;
2856 }
2857 if (file->f_mode & FMODE_WRITE) {
2858 as->usbout.dma.ossfragshift = as->usbout.dma.ossmaxfrags = as->usbout.dma.subdivision = 0;
2859 as->usbout.dma.enabled = 1;
2860 }
2861 if (set_format(as, file->f_mode, ((minor & 0xf) == SND_DEV_DSP16) ? AFMT_S16_LE : AFMT_U8 , 8000)) {
2862 up(&open_sem);
2863 return -EIO;
2864 }
2865 file->private_data = as;
2866 as->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
2867 s->count++;
2868 up(&open_sem);
2869 return 0;
2870}
2871
2872static int usb_audio_release(struct inode *inode, struct file *file)
2873{
2874 struct usb_audiodev *as = (struct usb_audiodev *)file->private_data;
2875 struct usb_audio_state *s;
2876 struct usb_device *dev;
2877 struct usb_interface *iface;
2878
2879 lock_kernel();
2880 s = as->state;
2881 dev = s->usbdev;
2882 if (file->f_mode & FMODE_WRITE)
2883 drain_out(as, file->f_flags & O_NONBLOCK);
2884 down(&open_sem);
2885 if (file->f_mode & FMODE_WRITE) {
2886 usbout_stop(as);
2887 if (dev && as->usbout.interface >= 0) {
2888 iface = &dev->actconfig->interface[as->usbout.interface];
2889 usb_set_interface(dev, iface->altsetting->bInterfaceNumber, 0);
2890 }
2891 dmabuf_release(&as->usbout.dma);
2892 usbout_release(as);
2893 }
2894 if (file->f_mode & FMODE_READ) {
2895 usbin_stop(as);
2896 if (dev && as->usbin.interface >= 0) {
2897 iface = &dev->actconfig->interface[as->usbin.interface];
2898 usb_set_interface(dev, iface->altsetting->bInterfaceNumber, 0);
2899 }
2900 dmabuf_release(&as->usbin.dma);
2901 usbin_release(as);
2902 }
2903 as->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE);
2904 release(s);
2905 wake_up(&open_wait);
2906 unlock_kernel();
2907 return 0;
2908}
2909
2910static struct file_operations usb_audio_fops = {
2911 owner: THIS_MODULE,
2912 llseek: no_llseek,
2913 read: usb_audio_read,
2914 write: usb_audio_write,
2915 poll: usb_audio_poll,
2916 ioctl: usb_audio_ioctl,
2917 mmap: usb_audio_mmap,
2918 open: usb_audio_open,
2919 release: usb_audio_release,
2920};
2921
2922
2923
2924static void * usb_audio_probe(struct usb_device *dev, unsigned int ifnum,
2925 const struct usb_device_id *id);
2926static void usb_audio_disconnect(struct usb_device *dev, void *ptr);
2927
2928static struct usb_device_id usb_audio_ids [] = {
2929 { match_flags: (USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS),
2930 bInterfaceClass: USB_CLASS_AUDIO, bInterfaceSubClass: 1},
2931 { }
2932};
2933
2934MODULE_DEVICE_TABLE (usb, usb_audio_ids);
2935
2936static struct usb_driver usb_audio_driver = {
2937 name: "audio",
2938 probe: usb_audio_probe,
2939 disconnect: usb_audio_disconnect,
2940 driver_list: LIST_HEAD_INIT(usb_audio_driver.driver_list),
2941 id_table: usb_audio_ids,
2942};
2943
2944static void *find_descriptor(void *descstart, unsigned int desclen, void *after,
2945 u8 dtype, int iface, int altsetting)
2946{
2947 u8 *p, *end, *next;
2948 int ifc = -1, as = -1;
2949
2950 p = descstart;
2951 end = p + desclen;
2952 for (; p < end;) {
2953 if (p[0] < 2)
2954 return NULL;
2955 next = p + p[0];
2956 if (next > end)
2957 return NULL;
2958 if (p[1] == USB_DT_INTERFACE) {
2959
2960 if (p[0] < 9)
2961 return NULL;
2962 ifc = p[2];
2963 as = p[3];
2964 }
2965 if (p[1] == dtype && (!after || (void *)p > after) &&
2966 (iface == -1 || iface == ifc) && (altsetting == -1 || altsetting == as)) {
2967 return p;
2968 }
2969 p = next;
2970 }
2971 return NULL;
2972}
2973
2974static void *find_csinterface_descriptor(void *descstart, unsigned int desclen, void *after, u8 dsubtype, int iface, int altsetting)
2975{
2976 unsigned char *p;
2977
2978 p = find_descriptor(descstart, desclen, after, USB_DT_CS_INTERFACE, iface, altsetting);
2979 while (p) {
2980 if (p[0] >= 3 && p[2] == dsubtype)
2981 return p;
2982 p = find_descriptor(descstart, desclen, p, USB_DT_CS_INTERFACE, iface, altsetting);
2983 }
2984 return NULL;
2985}
2986
2987static void *find_audiocontrol_unit(void *descstart, unsigned int desclen, void *after, u8 unit, int iface)
2988{
2989 unsigned char *p;
2990
2991 p = find_descriptor(descstart, desclen, after, USB_DT_CS_INTERFACE, iface, -1);
2992 while (p) {
2993 if (p[0] >= 4 && p[2] >= INPUT_TERMINAL && p[2] <= EXTENSION_UNIT && p[3] == unit)
2994 return p;
2995 p = find_descriptor(descstart, desclen, p, USB_DT_CS_INTERFACE, iface, -1);
2996 }
2997 return NULL;
2998}
2999
3000static void usb_audio_parsestreaming(struct usb_audio_state *s, unsigned char *buffer, unsigned int buflen, int asifin, int asifout)
3001{
3002 struct usb_device *dev = s->usbdev;
3003 struct usb_audiodev *as;
3004 struct usb_config_descriptor *config = dev->actconfig;
3005 struct usb_interface_descriptor *alts;
3006 struct usb_interface *iface;
3007 struct audioformat *fp;
3008 unsigned char *fmt, *csep;
3009 unsigned int i, j, k, format;
3010
3011 if (!(as = kmalloc(sizeof(struct usb_audiodev), GFP_KERNEL)))
3012 return;
3013 memset(as, 0, sizeof(struct usb_audiodev));
3014 init_waitqueue_head(&as->usbin.dma.wait);
3015 init_waitqueue_head(&as->usbout.dma.wait);
3016 spin_lock_init(&as->lock);
3017 spin_lock_init(&as->usbin.durb[0].urb.lock);
3018 spin_lock_init(&as->usbin.durb[1].urb.lock);
3019 spin_lock_init(&as->usbin.surb[0].urb.lock);
3020 spin_lock_init(&as->usbin.surb[1].urb.lock);
3021 spin_lock_init(&as->usbout.durb[0].urb.lock);
3022 spin_lock_init(&as->usbout.durb[1].urb.lock);
3023 spin_lock_init(&as->usbout.surb[0].urb.lock);
3024 spin_lock_init(&as->usbout.surb[1].urb.lock);
3025 as->state = s;
3026 as->usbin.interface = asifin;
3027 as->usbout.interface = asifout;
3028
3029 if (asifin >= 0) {
3030 as->usbin.flags = FLG_CONNECTED;
3031 iface = &config->interface[asifin];
3032 for (i = 0; i < iface->num_altsetting; i++) {
3033 alts = &iface->altsetting[i];
3034 if (alts->bInterfaceClass != USB_CLASS_AUDIO || alts->bInterfaceSubClass != 2)
3035 continue;
3036 if (alts->bNumEndpoints < 1) {
3037 if (i != 0) {
3038 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u does not have an endpoint\n",
3039 dev->devnum, asifin, i);
3040 }
3041 continue;
3042 }
3043 if ((alts->endpoint[0].bmAttributes & 0x03) != 0x01 ||
3044 !(alts->endpoint[0].bEndpointAddress & 0x80)) {
3045 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u first endpoint not isochronous in\n",
3046 dev->devnum, asifin, i);
3047 continue;
3048 }
3049 fmt = find_csinterface_descriptor(buffer, buflen, NULL, AS_GENERAL, asifin, i);
3050 if (!fmt) {
3051 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n",
3052 dev->devnum, asifin, i);
3053 continue;
3054 }
3055 if (fmt[0] < 7 || fmt[6] != 0 || (fmt[5] != 1 && fmt[5] != 2)) {
3056 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u format not supported\n",
3057 dev->devnum, asifin, i);
3058 continue;
3059 }
3060 format = (fmt[5] == 2) ?
3061 (AFMT_U32_LE | AFMT_U24_LE | AFMT_U16_LE | AFMT_U8) :
3062 (AFMT_S32_LE | AFMT_S24_LE | AFMT_S16_LE | AFMT_S8);
3063 fmt = find_csinterface_descriptor(buffer, buflen, NULL, FORMAT_TYPE, asifin, i);
3064 if (!fmt) {
3065 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n",
3066 dev->devnum, asifin, i);
3067 continue;
3068 }
3069 if (fmt[0] < 8+3*(fmt[7] ? fmt[7] : 2) || fmt[3] != 1) {
3070 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not supported\n",
3071 dev->devnum, asifin, i);
3072 continue;
3073 }
3074 if (fmt[4] < 1 || fmt[4] > MAXCHANNELS || fmt[5] < 1 || fmt[5] > 4) {
3075 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u unsupported channels %u framesize %u\n",
3076 dev->devnum, asifin, i, fmt[4], fmt[5]);
3077 continue;
3078 }
3079 csep = find_descriptor(buffer, buflen, NULL, USB_DT_CS_ENDPOINT, asifin, i);
3080 if (!csep || csep[0] < 7 || csep[2] != EP_GENERAL) {
3081 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u no or invalid class specific endpoint descriptor\n",
3082 dev->devnum, asifin, i);
3083 continue;
3084 }
3085 if (as->numfmtin >= MAXFORMATS)
3086 continue;
3087 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u channels %u framesize %u configured\n",
3088 dev->devnum, asifin, i, fmt[4], fmt[5]);
3089 fp = &as->fmtin[as->numfmtin++];
3090 switch (fmt[5]) {
3091 case 1:
3092 format &= (AFMT_U8 | AFMT_S8);
3093 break;
3094 case 2:
3095 format &= (AFMT_U16_LE | AFMT_S16_LE);
3096 break;
3097 case 3:
3098 format &= (AFMT_U24_LE | AFMT_S24_LE);
3099 break;
3100 case 4:
3101 format &= (AFMT_U32_LE | AFMT_S32_LE);
3102 break;
3103 }
3104
3105 format |= (fmt[4]-1) << 24;
3106
3107 fp->format = format;
3108 fp->altsetting = i;
3109 fp->sratelo = fp->sratehi = fmt[8] | (fmt[9] << 8) | (fmt[10] << 16);
3110 printk(KERN_INFO "usbaudio: valid input sample rate %u\n", fp->sratelo);
3111 for (j = fmt[7] ? (fmt[7]-1) : 1; j > 0; j--) {
3112 k = fmt[8+3*j] | (fmt[9+3*j] << 8) | (fmt[10+3*j] << 16);
3113 printk(KERN_INFO "usbaudio: valid input sample rate %u\n", k);
3114 if (k > fp->sratehi)
3115 fp->sratehi = k;
3116 if (k < fp->sratelo)
3117 fp->sratelo = k;
3118 }
3119 fp->attributes = csep[3];
3120 printk(KERN_INFO "usbaudio: device %u interface %u altsetting %u: format 0x%08x sratelo %u sratehi %u attributes 0x%02x\n",
3121 dev->devnum, asifin, i, fp->format, fp->sratelo, fp->sratehi, fp->attributes);
3122 }
3123 }
3124
3125 if (asifout >= 0) {
3126 as->usbout.flags = FLG_CONNECTED;
3127 iface = &config->interface[asifout];
3128 for (i = 0; i < iface->num_altsetting; i++) {
3129 alts = &iface->altsetting[i];
3130 if (alts->bInterfaceClass != USB_CLASS_AUDIO || alts->bInterfaceSubClass != 2)
3131 continue;
3132 if (alts->bNumEndpoints < 1) {
3133 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u does not have an endpoint\n",
3134 dev->devnum, asifout, i);
3135 continue;
3136 }
3137 if ((alts->endpoint[0].bmAttributes & 0x03) != 0x01 ||
3138 (alts->endpoint[0].bEndpointAddress & 0x80)) {
3139 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u first endpoint not isochronous out\n",
3140 dev->devnum, asifout, i);
3141 continue;
3142 }
3143
3144 fmt = find_csinterface_descriptor(buffer, buflen, NULL, AS_GENERAL, asifout, i);
3145 if (!fmt) {
3146 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n",
3147 dev->devnum, asifout, i);
3148 continue;
3149 }
3150 if (fmt[0] < 7 || fmt[6] != 0 || (fmt[5] != 1 && fmt[5] != 2)) {
3151 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u format not supported\n",
3152 dev->devnum, asifout, i);
3153 continue;
3154 }
3155 format = (fmt[5] == 2) ?
3156 (AFMT_U32_LE | AFMT_U24_LE | AFMT_U16_LE | AFMT_U8) :
3157 (AFMT_S32_LE | AFMT_S24_LE | AFMT_S16_LE | AFMT_S8);
3158
3159
3160 if (dev->descriptor.idVendor == 0x04fa && dev->descriptor.idProduct == 0x4201)
3161 format = (AFMT_S16_LE | AFMT_S8);
3162 fmt = find_csinterface_descriptor(buffer, buflen, NULL, FORMAT_TYPE, asifout, i);
3163 if (!fmt) {
3164 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not found\n",
3165 dev->devnum, asifout, i);
3166 continue;
3167 }
3168 if (fmt[0] < 8+3*(fmt[7] ? fmt[7] : 2) || fmt[3] != 1) {
3169 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u FORMAT_TYPE descriptor not supported\n",
3170 dev->devnum, asifout, i);
3171 continue;
3172 }
3173 if (fmt[4] < 1 || fmt[4] > MAXCHANNELS || fmt[5] < 1 || fmt[5] > 4) {
3174 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u unsupported channels %u framesize %u\n",
3175 dev->devnum, asifout, i, fmt[4], fmt[5]);
3176 continue;
3177 }
3178 csep = find_descriptor(buffer, buflen, NULL, USB_DT_CS_ENDPOINT, asifout, i);
3179 if (!csep || csep[0] < 7 || csep[2] != EP_GENERAL) {
3180 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u no or invalid class specific endpoint descriptor\n",
3181 dev->devnum, asifout, i);
3182 continue;
3183 }
3184 if (as->numfmtout >= MAXFORMATS)
3185 continue;
3186 printk(KERN_ERR "usbaudio: device %u interface %u altsetting %u channels %u framesize %u configured\n",
3187 dev->devnum, asifout, i, fmt[4], fmt[5]);
3188 fp = &as->fmtout[as->numfmtout++];
3189
3190 switch (fmt[5]) {
3191 case 1:
3192 format &= (AFMT_U8 | AFMT_S8);
3193 break;
3194 case 2:
3195 format &= (AFMT_U16_LE | AFMT_S16_LE);
3196 break;
3197 case 3:
3198 format &= (AFMT_U24_LE | AFMT_S24_LE);
3199 break;
3200 case 4:
3201 format &= (AFMT_U32_LE | AFMT_S32_LE);
3202 break;
3203 }
3204
3205 format |= (fmt[4]-1) << 24;
3206
3207 fp->format = format;
3208 fp->altsetting = i;
3209 fp->sratelo = fp->sratehi = fmt[8] | (fmt[9] << 8) | (fmt[10] << 16);
3210 printk(KERN_INFO "usbaudio: valid output sample rate %u\n", fp->sratelo);
3211 for (j = fmt[7] ? (fmt[7]-1) : 1; j > 0; j--) {
3212 k = fmt[8+3*j] | (fmt[9+3*j] << 8) | (fmt[10+3*j] << 16);
3213 printk(KERN_INFO "usbaudio: valid output sample rate %u\n", k);
3214 if (k > fp->sratehi)
3215 fp->sratehi = k;
3216 if (k < fp->sratelo)
3217 fp->sratelo = k;
3218 }
3219 fp->attributes = csep[3];
3220 printk(KERN_INFO "usbaudio: device %u interface %u altsetting %u: format 0x%08x sratelo %u sratehi %u attributes 0x%02x\n",
3221 dev->devnum, asifout, i, fp->format, fp->sratelo, fp->sratehi, fp->attributes);
3222 }
3223 }
3224 if (as->numfmtin == 0 && as->numfmtout == 0) {
3225 kfree(as);
3226 return;
3227 }
3228 if ((as->dev_audio = register_sound_dsp(&usb_audio_fops, -1)) < 0) {
3229 printk(KERN_ERR "usbaudio: cannot register dsp\n");
3230 kfree(as);
3231 return;
3232 }
3233 printk(KERN_INFO "usbaudio: registered dsp 14,%d\n", as->dev_audio);
3234
3235 list_add_tail(&as->list, &s->audiolist);
3236}
3237
3238struct consmixstate {
3239 struct usb_audio_state *s;
3240 unsigned char *buffer;
3241 unsigned int buflen;
3242 unsigned int ctrlif;
3243 struct mixerchannel mixch[SOUND_MIXER_NRDEVICES];
3244 unsigned int nrmixch;
3245 unsigned int mixchmask;
3246 unsigned long unitbitmap[32/sizeof(unsigned long)];
3247
3248 unsigned int nrchannels;
3249 unsigned int termtype;
3250 unsigned int chconfig;
3251};
3252
3253static struct mixerchannel *getmixchannel(struct consmixstate *state, unsigned int nr)
3254{
3255 struct mixerchannel *c;
3256
3257 if (nr >= SOUND_MIXER_NRDEVICES) {
3258 printk(KERN_ERR "usbaudio: invalid OSS mixer channel %u\n", nr);
3259 return NULL;
3260 }
3261 if (!(state->mixchmask & (1 << nr))) {
3262 printk(KERN_WARNING "usbaudio: OSS mixer channel %u already in use\n", nr);
3263 return NULL;
3264 }
3265 c = &state->mixch[state->nrmixch++];
3266 c->osschannel = nr;
3267 state->mixchmask &= ~(1 << nr);
3268 return c;
3269}
3270
3271static unsigned int getvolchannel(struct consmixstate *state)
3272{
3273 unsigned int u;
3274
3275 if ((state->termtype & 0xff00) == 0x0000 && (state->mixchmask & SOUND_MASK_VOLUME))
3276 return SOUND_MIXER_VOLUME;
3277 if ((state->termtype & 0xff00) == 0x0100) {
3278 if (state->mixchmask & SOUND_MASK_PCM)
3279 return SOUND_MIXER_PCM;
3280 if (state->mixchmask & SOUND_MASK_ALTPCM)
3281 return SOUND_MIXER_ALTPCM;
3282 }
3283 if ((state->termtype & 0xff00) == 0x0200 && (state->mixchmask & SOUND_MASK_MIC))
3284 return SOUND_MIXER_MIC;
3285 if ((state->termtype & 0xff00) == 0x0300 && (state->mixchmask & SOUND_MASK_SPEAKER))
3286 return SOUND_MIXER_SPEAKER;
3287 if ((state->termtype & 0xff00) == 0x0500) {
3288 if (state->mixchmask & SOUND_MASK_PHONEIN)
3289 return SOUND_MIXER_PHONEIN;
3290 if (state->mixchmask & SOUND_MASK_PHONEOUT)
3291 return SOUND_MIXER_PHONEOUT;
3292 }
3293 if (state->termtype >= 0x710 && state->termtype <= 0x711 && (state->mixchmask & SOUND_MASK_RADIO))
3294 return SOUND_MIXER_RADIO;
3295 if (state->termtype >= 0x709 && state->termtype <= 0x70f && (state->mixchmask & SOUND_MASK_VIDEO))
3296 return SOUND_MIXER_VIDEO;
3297 u = ffs(state->mixchmask & (SOUND_MASK_LINE | SOUND_MASK_CD | SOUND_MASK_LINE1 | SOUND_MASK_LINE2 | SOUND_MASK_LINE3 |
3298 SOUND_MASK_DIGITAL1 | SOUND_MASK_DIGITAL2 | SOUND_MASK_DIGITAL3));
3299 return u-1;
3300}
3301
3302static void prepmixch(struct consmixstate *state)
3303{
3304 struct usb_device *dev = state->s->usbdev;
3305 struct mixerchannel *ch;
3306 unsigned char buf[2];
3307 __s16 v1;
3308 unsigned int v2, v3;
3309
3310 if (!state->nrmixch || state->nrmixch > SOUND_MIXER_NRDEVICES)
3311 return;
3312 ch = &state->mixch[state->nrmixch-1];
3313 switch (ch->selector) {
3314 case 0:
3315 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_MIN, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3316 (ch->chnum << 8) | 1, state->ctrlif | (ch->unitid << 8), buf, 2, HZ) < 0)
3317 goto err;
3318 ch->minval = buf[0] | (buf[1] << 8);
3319 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_MAX, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3320 (ch->chnum << 8) | 1, state->ctrlif | (ch->unitid << 8), buf, 2, HZ) < 0)
3321 goto err;
3322 ch->maxval = buf[0] | (buf[1] << 8);
3323 v2 = ch->maxval - ch->minval;
3324 if (!v2)
3325 v2 = 1;
3326 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3327 (ch->chnum << 8) | 1, state->ctrlif | (ch->unitid << 8), buf, 2, HZ) < 0)
3328 goto err;
3329 v1 = buf[0] | (buf[1] << 8);
3330 v3 = v1 - ch->minval;
3331 v3 = 100 * v3 / v2;
3332 if (v3 > 100)
3333 v3 = 100;
3334 ch->value = v3;
3335 if (ch->flags & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT)) {
3336 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3337 ((ch->chnum + !!(ch->flags & MIXFLG_STEREOIN)) << 8) | (1 + !!(ch->flags & MIXFLG_STEREOOUT)),
3338 state->ctrlif | (ch->unitid << 8), buf, 2, HZ) < 0)
3339 goto err;
3340 v1 = buf[0] | (buf[1] << 8);
3341 v3 = v1 - ch->minval;
3342 v3 = 100 * v3 / v2;
3343 if (v3 > 100)
3344 v3 = 100;
3345 }
3346 ch->value |= v3 << 8;
3347 break;
3348
3349
3350 case VOLUME_CONTROL:
3351 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_MIN, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3352 (ch->selector << 8) | ch->chnum, state->ctrlif | (ch->unitid << 8), buf, 2, HZ) < 0)
3353 goto err;
3354 ch->minval = buf[0] | (buf[1] << 8);
3355 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_MAX, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3356 (ch->selector << 8) | ch->chnum, state->ctrlif | (ch->unitid << 8), buf, 2, HZ) < 0)
3357 goto err;
3358 ch->maxval = buf[0] | (buf[1] << 8);
3359 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3360 (ch->selector << 8) | ch->chnum, state->ctrlif | (ch->unitid << 8), buf, 2, HZ) < 0)
3361 goto err;
3362 v1 = buf[0] | (buf[1] << 8);
3363 v2 = ch->maxval - ch->minval;
3364 v3 = v1 - ch->minval;
3365 if (!v2)
3366 v2 = 1;
3367 v3 = 100 * v3 / v2;
3368 if (v3 > 100)
3369 v3 = 100;
3370 ch->value = v3;
3371 if (ch->flags & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT)) {
3372 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3373 (ch->selector << 8) | (ch->chnum + 1), state->ctrlif | (ch->unitid << 8), buf, 2, HZ) < 0)
3374 goto err;
3375 v1 = buf[0] | (buf[1] << 8);
3376 v3 = v1 - ch->minval;
3377 v3 = 100 * v3 / v2;
3378 if (v3 > 100)
3379 v3 = 100;
3380 }
3381 ch->value |= v3 << 8;
3382 break;
3383
3384 case BASS_CONTROL:
3385 case MID_CONTROL:
3386 case TREBLE_CONTROL:
3387 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_MIN, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3388 (ch->selector << 8) | ch->chnum, state->ctrlif | (ch->unitid << 8), buf, 1, HZ) < 0)
3389 goto err;
3390 ch->minval = buf[0] << 8;
3391 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_MAX, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3392 (ch->selector << 8) | ch->chnum, state->ctrlif | (ch->unitid << 8), buf, 1, HZ) < 0)
3393 goto err;
3394 ch->maxval = buf[0] << 8;
3395 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3396 (ch->selector << 8) | ch->chnum, state->ctrlif | (ch->unitid << 8), buf, 1, HZ) < 0)
3397 goto err;
3398 v1 = buf[0] << 8;
3399 v2 = ch->maxval - ch->minval;
3400 v3 = v1 - ch->minval;
3401 if (!v2)
3402 v2 = 1;
3403 v3 = 100 * v3 / v2;
3404 if (v3 > 100)
3405 v3 = 100;
3406 ch->value = v3;
3407 if (ch->flags & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT)) {
3408 if (usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), GET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
3409 (ch->selector << 8) | (ch->chnum + 1), state->ctrlif | (ch->unitid << 8), buf, 1, HZ) < 0)
3410 goto err;
3411 v1 = buf[0] << 8;
3412 v3 = v1 - ch->minval;
3413 v3 = 100 * v3 / v2;
3414 if (v3 > 100)
3415 v3 = 100;
3416 }
3417 ch->value |= v3 << 8;
3418 break;
3419
3420 default:
3421 goto err;
3422 }
3423 return;
3424
3425 err:
3426 printk(KERN_ERR "usbaudio: mixer request device %u if %u unit %u ch %u selector %u failed\n",
3427 dev->devnum, state->ctrlif, ch->unitid, ch->chnum, ch->selector);
3428 if (state->nrmixch)
3429 state->nrmixch--;
3430}
3431
3432
3433static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unitid);
3434
3435static inline int checkmixbmap(unsigned char *bmap, unsigned char flg, unsigned int inidx, unsigned int numoch)
3436{
3437 unsigned int idx;
3438
3439 idx = inidx*numoch;
3440 if (!(bmap[-(idx >> 3)] & (0x80 >> (idx & 7))))
3441 return 0;
3442 if (!(flg & (MIXFLG_STEREOIN | MIXFLG_STEREOOUT)))
3443 return 1;
3444 idx = (inidx+!!(flg & MIXFLG_STEREOIN))*numoch+!!(flg & MIXFLG_STEREOOUT);
3445 if (!(bmap[-(idx >> 3)] & (0x80 >> (idx & 7))))
3446 return 0;
3447 return 1;
3448}
3449
3450static void usb_audio_mixerunit(struct consmixstate *state, unsigned char *mixer)
3451{
3452 unsigned int nroutch = mixer[5+mixer[4]];
3453 unsigned int chidx[SOUND_MIXER_NRDEVICES+1];
3454 unsigned int termt[SOUND_MIXER_NRDEVICES];
3455 unsigned char flg = (nroutch >= 2) ? MIXFLG_STEREOOUT : 0;
3456 unsigned char *bmap = &mixer[9+mixer[4]];
3457 unsigned int bmapsize;
3458 struct mixerchannel *ch;
3459 unsigned int i;
3460
3461 if (!mixer[4]) {
3462 printk(KERN_ERR "usbaudio: unit %u invalid MIXER_UNIT descriptor\n", mixer[3]);
3463 return;
3464 }
3465 if (mixer[4] > SOUND_MIXER_NRDEVICES) {
3466 printk(KERN_ERR "usbaudio: mixer unit %u: too many input pins\n", mixer[3]);
3467 return;
3468 }
3469 chidx[0] = 0;
3470 for (i = 0; i < mixer[4]; i++) {
3471 usb_audio_recurseunit(state, mixer[5+i]);
3472 chidx[i+1] = chidx[i] + state->nrchannels;
3473 termt[i] = state->termtype;
3474 }
3475 state->termtype = 0;
3476 state->chconfig = mixer[6+mixer[4]] | (mixer[7+mixer[4]] << 8);
3477 bmapsize = (nroutch * chidx[mixer[4]] + 7) >> 3;
3478 bmap += bmapsize - 1;
3479 if (mixer[0] < 10+mixer[4]+bmapsize) {
3480 printk(KERN_ERR "usbaudio: unit %u invalid MIXER_UNIT descriptor (bitmap too small)\n", mixer[3]);
3481 return;
3482 }
3483 for (i = 0; i < mixer[4]; i++) {
3484 state->termtype = termt[i];
3485 if (chidx[i+1]-chidx[i] >= 2) {
3486 flg |= MIXFLG_STEREOIN;
3487 if (checkmixbmap(bmap, flg, chidx[i], nroutch)) {
3488 ch = getmixchannel(state, getvolchannel(state));
3489 if (ch) {
3490 ch->unitid = mixer[3];
3491 ch->selector = 0;
3492 ch->chnum = chidx[i]+1;
3493 ch->flags = flg;
3494 prepmixch(state);
3495 }
3496 continue;
3497 }
3498 }
3499 flg &= ~MIXFLG_STEREOIN;
3500 if (checkmixbmap(bmap, flg, chidx[i], nroutch)) {
3501 ch = getmixchannel(state, getvolchannel(state));
3502 if (ch) {
3503 ch->unitid = mixer[3];
3504 ch->selector = 0;
3505 ch->chnum = chidx[i]+1;
3506 ch->flags = flg;
3507 prepmixch(state);
3508 }
3509 }
3510 }
3511 state->termtype = 0;
3512}
3513
3514static struct mixerchannel *slctsrc_findunit(struct consmixstate *state, __u8 unitid)
3515{
3516 unsigned int i;
3517
3518 for (i = 0; i < state->nrmixch; i++)
3519 if (state->mixch[i].unitid == unitid)
3520 return &state->mixch[i];
3521 return NULL;
3522}
3523
3524static void usb_audio_selectorunit(struct consmixstate *state, unsigned char *selector)
3525{
3526 unsigned int chnum, i, mixch;
3527 struct mixerchannel *mch;
3528
3529 if (!selector[4]) {
3530 printk(KERN_ERR "usbaudio: unit %u invalid SELECTOR_UNIT descriptor\n", selector[3]);
3531 return;
3532 }
3533 mixch = state->nrmixch;
3534 usb_audio_recurseunit(state, selector[5]);
3535 if (state->nrmixch != mixch) {
3536 mch = &state->mixch[state->nrmixch-1];
3537 mch->slctunitid = selector[3] | (1 << 8);
3538 } else if ((mch = slctsrc_findunit(state, selector[5]))) {
3539 mch->slctunitid = selector[3] | (1 << 8);
3540 } else {
3541 printk(KERN_INFO "usbaudio: selector unit %u: ignoring channel 1\n", selector[3]);
3542 }
3543 chnum = state->nrchannels;
3544 for (i = 1; i < selector[4]; i++) {
3545 mixch = state->nrmixch;
3546 usb_audio_recurseunit(state, selector[5+i]);
3547 if (chnum != state->nrchannels) {
3548 printk(KERN_ERR "usbaudio: selector unit %u: input pins with varying channel numbers\n", selector[3]);
3549 state->termtype = 0;
3550 state->chconfig = 0;
3551 state->nrchannels = 0;
3552 return;
3553 }
3554 if (state->nrmixch != mixch) {
3555 mch = &state->mixch[state->nrmixch-1];
3556 mch->slctunitid = selector[3] | ((i + 1) << 8);
3557 } else if ((mch = slctsrc_findunit(state, selector[5+i]))) {
3558 mch->slctunitid = selector[3] | ((i + 1) << 8);
3559 } else {
3560 printk(KERN_INFO "usbaudio: selector unit %u: ignoring channel %u\n", selector[3], i+1);
3561 }
3562 }
3563 state->termtype = 0;
3564 state->chconfig = 0;
3565}
3566
3567
3568
3569static void usb_audio_processingunit(struct consmixstate *state, unsigned char *proc)
3570{
3571 unsigned int i;
3572
3573 for (i = 0; i < proc[6]; i++)
3574 usb_audio_recurseunit(state, proc[7+i]);
3575 state->nrchannels = proc[7+proc[6]];
3576 state->termtype = 0;
3577 state->chconfig = proc[8+proc[6]] | (proc[9+proc[6]] << 8);
3578}
3579
3580
3581
3582static void usb_audio_featureunit(struct consmixstate *state, unsigned char *ftr)
3583{
3584 struct mixerchannel *ch;
3585 unsigned short chftr, mchftr;
3586#if 0
3587 struct usb_device *dev = state->s->usbdev;
3588 unsigned char data[1];
3589#endif
3590 unsigned char nr_logical_channels, i;
3591
3592 usb_audio_recurseunit(state, ftr[4]);
3593
3594 if (ftr[5] == 0 ) {
3595 printk(KERN_ERR "usbaudio: wrong controls size in feature unit %u\n",ftr[3]);
3596 return;
3597 }
3598
3599 if (state->nrchannels == 0) {
3600 printk(KERN_ERR "usbaudio: feature unit %u source has no channels\n", ftr[3]);
3601 return;
3602 }
3603 if (state->nrchannels > 2)
3604 printk(KERN_WARNING "usbaudio: feature unit %u: OSS mixer interface does not support more than 2 channels\n", ftr[3]);
3605
3606 nr_logical_channels=(ftr[0]-7)/ftr[5]-1;
3607
3608 if (nr_logical_channels != state->nrchannels) {
3609 printk(KERN_WARNING "usbaudio: warning: found %d of %d logical channels.\n", state->nrchannels,nr_logical_channels);
3610
3611 if (state->nrchannels == 1 && nr_logical_channels==0) {
3612 printk(KERN_INFO "usbaudio: assuming the channel found is the master channel (got a Philips camera?). Should be fine.\n");
3613 } else if (state->nrchannels == 1 && nr_logical_channels==2) {
3614 printk(KERN_INFO "usbaudio: assuming that a stereo channel connected directly to a mixer is missing in search (got Labtec headset?). Should be fine.\n");
3615 state->nrchannels=nr_logical_channels;
3616 } else {
3617 printk(KERN_WARNING "usbaudio: no idea what's going on..., contact linux-usb-devel@lists.sourceforge.net\n");
3618 }
3619 }
3620
3621
3622 mchftr = ftr[6];
3623
3624 if (nr_logical_channels) {
3625 chftr = ftr[6+ftr[5]];
3626 for (i = 2; i <= nr_logical_channels; i++)
3627 chftr &= ftr[6+i*ftr[5]];
3628 } else {
3629 chftr = 0;
3630 }
3631
3632
3633 if (chftr & 2) {
3634 ch = getmixchannel(state, getvolchannel(state));
3635 if (ch) {
3636 ch->unitid = ftr[3];
3637 ch->selector = VOLUME_CONTROL;
3638 ch->chnum = 1;
3639 ch->flags = (state->nrchannels > 1) ? (MIXFLG_STEREOIN | MIXFLG_STEREOOUT) : 0;
3640 prepmixch(state);
3641 }
3642 } else if (mchftr & 2) {
3643 ch = getmixchannel(state, getvolchannel(state));
3644 if (ch) {
3645 ch->unitid = ftr[3];
3646 ch->selector = VOLUME_CONTROL;
3647 ch->chnum = 0;
3648 ch->flags = 0;
3649 prepmixch(state);
3650 }
3651 }
3652
3653 if (chftr & 4) {
3654 ch = getmixchannel(state, SOUND_MIXER_BASS);
3655 if (ch) {
3656 ch->unitid = ftr[3];
3657 ch->selector = BASS_CONTROL;
3658 ch->chnum = 1;
3659 ch->flags = (state->nrchannels > 1) ? (MIXFLG_STEREOIN | MIXFLG_STEREOOUT) : 0;
3660 prepmixch(state);
3661 }
3662 } else if (mchftr & 4) {
3663 ch = getmixchannel(state, SOUND_MIXER_BASS);
3664 if (ch) {
3665 ch->unitid = ftr[3];
3666 ch->selector = BASS_CONTROL;
3667 ch->chnum = 0;
3668 ch->flags = 0;
3669 prepmixch(state);
3670 }
3671 }
3672
3673 if (chftr & 16) {
3674 ch = getmixchannel(state, SOUND_MIXER_TREBLE);
3675 if (ch) {
3676 ch->unitid = ftr[3];
3677 ch->selector = TREBLE_CONTROL;
3678 ch->chnum = 1;
3679 ch->flags = (state->nrchannels > 1) ? (MIXFLG_STEREOIN | MIXFLG_STEREOOUT) : 0;
3680 prepmixch(state);
3681 }
3682 } else if (mchftr & 16) {
3683 ch = getmixchannel(state, SOUND_MIXER_TREBLE);
3684 if (ch) {
3685 ch->unitid = ftr[3];
3686 ch->selector = TREBLE_CONTROL;
3687 ch->chnum = 0;
3688 ch->flags = 0;
3689 prepmixch(state);
3690 }
3691 }
3692#if 0
3693
3694
3695 if ((chftr & 1) || (mchftr & 1)) {
3696 printk(KERN_DEBUG "usbaudio: unmuting feature unit %u interface %u\n", ftr[3], state->ctrlif);
3697 data[0] = 0;
3698 if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
3699 (MUTE_CONTROL << 8) | 0xff, state->ctrlif | (ftr[3] << 8), data, 1, HZ) < 0)
3700 printk(KERN_WARNING "usbaudio: failure to unmute feature unit %u interface %u\n", ftr[3], state->ctrlif);
3701 }
3702#endif
3703}
3704
3705static void usb_audio_recurseunit(struct consmixstate *state, unsigned char unitid)
3706{
3707 unsigned char *p1;
3708 unsigned int i, j;
3709
3710 if (test_and_set_bit(unitid, &state->unitbitmap)) {
3711 printk(KERN_INFO "usbaudio: mixer path revisits unit %d\n", unitid);
3712 return;
3713 }
3714 p1 = find_audiocontrol_unit(state->buffer, state->buflen, NULL, unitid, state->ctrlif);
3715 if (!p1) {
3716 printk(KERN_ERR "usbaudio: unit %d not found!\n", unitid);
3717 return;
3718 }
3719 state->nrchannels = 0;
3720 state->termtype = 0;
3721 state->chconfig = 0;
3722 switch (p1[2]) {
3723 case INPUT_TERMINAL:
3724 if (p1[0] < 12) {
3725 printk(KERN_ERR "usbaudio: unit %u: invalid INPUT_TERMINAL descriptor\n", unitid);
3726 return;
3727 }
3728 state->nrchannels = p1[7];
3729 state->termtype = p1[4] | (p1[5] << 8);
3730 state->chconfig = p1[8] | (p1[9] << 8);
3731 return;
3732
3733 case MIXER_UNIT:
3734 if (p1[0] < 10 || p1[0] < 10+p1[4]) {
3735 printk(KERN_ERR "usbaudio: unit %u: invalid MIXER_UNIT descriptor\n", unitid);
3736 return;
3737 }
3738 usb_audio_mixerunit(state, p1);
3739 return;
3740
3741 case SELECTOR_UNIT:
3742 if (p1[0] < 6 || p1[0] < 6+p1[4]) {
3743 printk(KERN_ERR "usbaudio: unit %u: invalid SELECTOR_UNIT descriptor\n", unitid);
3744 return;
3745 }
3746 usb_audio_selectorunit(state, p1);
3747 return;
3748
3749 case FEATURE_UNIT:
3750 if (p1[0] < 7 || p1[0] < 7+p1[5]) {
3751 printk(KERN_ERR "usbaudio: unit %u: invalid FEATURE_UNIT descriptor\n", unitid);
3752 return;
3753 }
3754 usb_audio_featureunit(state, p1);
3755 return;
3756
3757 case PROCESSING_UNIT:
3758 if (p1[0] < 13 || p1[0] < 13+p1[6] || p1[0] < 13+p1[6]+p1[11+p1[6]] || p1[0] < 13+p1[6]+p1[11+p1[6]]+p1[13+p1[6]+p1[11+p1[6]]]) {
3759 printk(KERN_ERR "usbaudio: unit %u: invalid PROCESSING_UNIT descriptor\n", unitid);
3760 return;
3761 }
3762 usb_audio_processingunit(state, p1);
3763 return;
3764
3765 case EXTENSION_UNIT:
3766 if (p1[0] < 13 || p1[0] < 13+p1[6] || p1[0] < 13+p1[6]+p1[11+p1[6]]) {
3767 printk(KERN_ERR "usbaudio: unit %u: invalid EXTENSION_UNIT descriptor\n", unitid);
3768 return;
3769 }
3770 for (j = i = 0; i < p1[6]; i++) {
3771 usb_audio_recurseunit(state, p1[7+i]);
3772 if (!i)
3773 j = state->termtype;
3774 else if (j != state->termtype)
3775 j = 0;
3776 }
3777 state->nrchannels = p1[7+p1[6]];
3778 state->chconfig = p1[8+p1[6]] | (p1[9+p1[6]] << 8);
3779 state->termtype = j;
3780 return;
3781
3782 default:
3783 printk(KERN_ERR "usbaudio: unit %u: unexpected type 0x%02x\n", unitid, p1[2]);
3784 return;
3785 }
3786}
3787
3788static void usb_audio_constructmixer(struct usb_audio_state *s, unsigned char *buffer, unsigned int buflen, unsigned int ctrlif, unsigned char *oterm)
3789{
3790 struct usb_mixerdev *ms;
3791 struct consmixstate state;
3792
3793 memset(&state, 0, sizeof(state));
3794 state.s = s;
3795 state.nrmixch = 0;
3796 state.mixchmask = ~0;
3797 state.buffer = buffer;
3798 state.buflen = buflen;
3799 state.ctrlif = ctrlif;
3800 set_bit(oterm[3], &state.unitbitmap);
3801 printk(KERN_DEBUG "usbaudio: constructing mixer for Terminal %u type 0x%04x\n",
3802 oterm[3], oterm[4] | (oterm[5] << 8));
3803 usb_audio_recurseunit(&state, oterm[7]);
3804 if (!state.nrmixch) {
3805 printk(KERN_INFO "usbaudio: no mixer controls found for Terminal %u\n", oterm[3]);
3806 return;
3807 }
3808 if (!(ms = kmalloc(sizeof(struct usb_mixerdev)+state.nrmixch*sizeof(struct mixerchannel), GFP_KERNEL)))
3809 return;
3810 memset(ms, 0, sizeof(struct usb_mixerdev));
3811 memcpy(&ms->ch, &state.mixch, state.nrmixch*sizeof(struct mixerchannel));
3812 ms->state = s;
3813 ms->iface = ctrlif;
3814 ms->numch = state.nrmixch;
3815 if ((ms->dev_mixer = register_sound_mixer(&usb_mixer_fops, -1)) < 0) {
3816 printk(KERN_ERR "usbaudio: cannot register mixer\n");
3817 kfree(ms);
3818 return;
3819 }
3820 printk(KERN_INFO "usbaudio: registered mixer 14,%d\n", ms->dev_mixer);
3821 list_add_tail(&ms->list, &s->mixerlist);
3822}
3823
3824static void *usb_audio_parsecontrol(struct usb_device *dev, unsigned char *buffer, unsigned int buflen, unsigned int ctrlif)
3825{
3826 struct usb_audio_state *s;
3827 struct usb_config_descriptor *config = dev->actconfig;
3828 struct usb_interface *iface;
3829 unsigned char ifin[USB_MAXINTERFACES], ifout[USB_MAXINTERFACES];
3830 unsigned char *p1;
3831 unsigned int i, j, k, numifin = 0, numifout = 0;
3832
3833 if (!(s = kmalloc(sizeof(struct usb_audio_state), GFP_KERNEL)))
3834 return NULL;
3835 memset(s, 0, sizeof(struct usb_audio_state));
3836 INIT_LIST_HEAD(&s->audiolist);
3837 INIT_LIST_HEAD(&s->mixerlist);
3838 s->usbdev = dev;
3839 s->count = 1;
3840
3841
3842 if (!(p1 = find_csinterface_descriptor(buffer, buflen, NULL, HEADER, ctrlif, -1))) {
3843 printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u no HEADER found\n",
3844 dev->devnum, ctrlif);
3845 goto ret;
3846 }
3847 if (p1[0] < 8 + p1[7]) {
3848 printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u HEADER error\n",
3849 dev->devnum, ctrlif);
3850 goto ret;
3851 }
3852 if (!p1[7])
3853 printk(KERN_INFO "usbaudio: device %d audiocontrol interface %u has no AudioStreaming and MidiStreaming interfaces\n",
3854 dev->devnum, ctrlif);
3855 for (i = 0; i < p1[7]; i++) {
3856 j = p1[8+i];
3857 if (j >= config->bNumInterfaces) {
3858 printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u does not exist\n",
3859 dev->devnum, ctrlif, j);
3860 continue;
3861 }
3862 iface = &config->interface[j];
3863 if (iface->altsetting[0].bInterfaceClass != USB_CLASS_AUDIO) {
3864 printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u is not an AudioClass interface\n",
3865 dev->devnum, ctrlif, j);
3866 continue;
3867 }
3868 if (iface->altsetting[0].bInterfaceSubClass == 3) {
3869 printk(KERN_INFO "usbaudio: device %d audiocontrol interface %u interface %u MIDIStreaming not supported\n",
3870 dev->devnum, ctrlif, j);
3871 continue;
3872 }
3873 if (iface->altsetting[0].bInterfaceSubClass != 2) {
3874 printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u invalid AudioClass subtype\n",
3875 dev->devnum, ctrlif, j);
3876 continue;
3877 }
3878 if (iface->num_altsetting == 0) {
3879 printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u has no working interface.\n", dev->devnum, ctrlif);
3880 continue;
3881 }
3882 if (iface->num_altsetting == 1) {
3883 printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u has only 1 altsetting.\n", dev->devnum, ctrlif);
3884 continue;
3885 }
3886 if (iface->altsetting[0].bNumEndpoints > 0) {
3887
3888 for (k = 0; k < iface->altsetting[0].bNumEndpoints; k++) {
3889 if (iface->altsetting[0].endpoint[k].wMaxPacketSize > 0) {
3890 printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u endpoint %d does not have 0 bandwidth at alt[0]\n", dev->devnum, ctrlif, k);
3891 break;
3892 }
3893 }
3894 if (k < iface->altsetting[0].bNumEndpoints)
3895 continue;
3896 }
3897 if (iface->altsetting[1].bNumEndpoints < 1) {
3898 printk(KERN_ERR "usbaudio: device %d audiocontrol interface %u interface %u has no endpoint\n",
3899 dev->devnum, ctrlif, j);
3900 continue;
3901 }
3902
3903
3904 if (iface->altsetting[1].endpoint[0].bEndpointAddress & USB_DIR_IN) {
3905 if (numifin < USB_MAXINTERFACES) {
3906 ifin[numifin++] = j;
3907 usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1);
3908 }
3909 } else {
3910 if (numifout < USB_MAXINTERFACES) {
3911 ifout[numifout++] = j;
3912 usb_driver_claim_interface(&usb_audio_driver, iface, (void *)-1);
3913 }
3914 }
3915 }
3916 printk(KERN_INFO "usbaudio: device %d audiocontrol interface %u has %u input and %u output AudioStreaming interfaces\n",
3917 dev->devnum, ctrlif, numifin, numifout);
3918 for (i = 0; i < numifin && i < numifout; i++)
3919 usb_audio_parsestreaming(s, buffer, buflen, ifin[i], ifout[i]);
3920 for (j = i; j < numifin; j++)
3921 usb_audio_parsestreaming(s, buffer, buflen, ifin[i], -1);
3922 for (j = i; j < numifout; j++)
3923 usb_audio_parsestreaming(s, buffer, buflen, -1, ifout[i]);
3924
3925 p1 = find_csinterface_descriptor(buffer, buflen, NULL, OUTPUT_TERMINAL, ctrlif, -1);
3926 while (p1) {
3927 if (p1[0] >= 9)
3928 usb_audio_constructmixer(s, buffer, buflen, ctrlif, p1);
3929 p1 = find_csinterface_descriptor(buffer, buflen, p1, OUTPUT_TERMINAL, ctrlif, -1);
3930 }
3931
3932ret:
3933 if (list_empty(&s->audiolist) && list_empty(&s->mixerlist)) {
3934 kfree(s);
3935 return NULL;
3936 }
3937
3938 down(&open_sem);
3939 list_add_tail(&s->audiodev, &audiodevs);
3940 up(&open_sem);
3941 printk(KERN_DEBUG "usb_audio_parsecontrol: usb_audio_state at %p\n", s);
3942 return s;
3943}
3944
3945
3946
3947static void *usb_audio_probe(struct usb_device *dev, unsigned int ifnum,
3948 const struct usb_device_id *id)
3949{
3950 struct usb_config_descriptor *config = dev->actconfig;
3951 unsigned char *buffer;
3952 unsigned char buf[8];
3953 unsigned int i, buflen;
3954 int ret;
3955
3956#if 0
3957 printk(KERN_DEBUG "usbaudio: Probing if %i: IC %x, ISC %x\n", ifnum,
3958 config->interface[ifnum].altsetting[0].bInterfaceClass,
3959 config->interface[ifnum].altsetting[0].bInterfaceSubClass);
3960#endif
3961
3962
3963
3964
3965
3966 i = dev->actconfig - config;
3967
3968 if (usb_set_configuration(dev, config->bConfigurationValue) < 0) {
3969 printk(KERN_ERR "usbaudio: set_configuration failed (ConfigValue 0x%x)\n", config->bConfigurationValue);
3970 return NULL;
3971 }
3972 ret = usb_get_descriptor(dev, USB_DT_CONFIG, i, buf, 8);
3973 if (ret < 0) {
3974 printk(KERN_ERR "usbaudio: cannot get first 8 bytes of config descriptor %d of device %d (error %d)\n", i, dev->devnum, ret);
3975 return NULL;
3976 }
3977 if (buf[1] != USB_DT_CONFIG || buf[0] < 9) {
3978 printk(KERN_ERR "usbaudio: invalid config descriptor %d of device %d\n", i, dev->devnum);
3979 return NULL;
3980 }
3981 buflen = buf[2] | (buf[3] << 8);
3982 if (!(buffer = kmalloc(buflen, GFP_KERNEL)))
3983 return NULL;
3984 ret = usb_get_descriptor(dev, USB_DT_CONFIG, i, buffer, buflen);
3985 if (ret < 0) {
3986 kfree(buffer);
3987 printk(KERN_ERR "usbaudio: cannot get config descriptor %d of device %d (error %d)\n", i, dev->devnum, ret);
3988 return NULL;
3989 }
3990 return usb_audio_parsecontrol(dev, buffer, buflen, ifnum);
3991}
3992
3993
3994
3995
3996static void usb_audio_disconnect(struct usb_device *dev, void *ptr)
3997{
3998 struct usb_audio_state *s = (struct usb_audio_state *)ptr;
3999 struct list_head *list;
4000 struct usb_audiodev *as;
4001 struct usb_mixerdev *ms;
4002
4003
4004 if (s == (struct usb_audio_state *)-1) {
4005 dprintk((KERN_DEBUG "usbaudio: note, usb_audio_disconnect called with -1\n"));
4006 return;
4007 }
4008 if (!s->usbdev) {
4009 dprintk((KERN_DEBUG "usbaudio: error, usb_audio_disconnect already called for %p!\n", s));
4010 return;
4011 }
4012 down(&open_sem);
4013 list_del(&s->audiodev);
4014 INIT_LIST_HEAD(&s->audiodev);
4015 s->usbdev = NULL;
4016
4017 for(list = s->audiolist.next; list != &s->audiolist; list = list->next) {
4018 as = list_entry(list, struct usb_audiodev, list);
4019 usbin_disc(as);
4020 usbout_disc(as);
4021 wake_up(&as->usbin.dma.wait);
4022 wake_up(&as->usbout.dma.wait);
4023 if (as->dev_audio >= 0) {
4024 unregister_sound_dsp(as->dev_audio);
4025 printk(KERN_INFO "usbaudio: unregister dsp 14,%d\n", as->dev_audio);
4026 }
4027 as->dev_audio = -1;
4028 }
4029 for(list = s->mixerlist.next; list != &s->mixerlist; list = list->next) {
4030 ms = list_entry(list, struct usb_mixerdev, list);
4031 if (ms->dev_mixer >= 0) {
4032 unregister_sound_mixer(ms->dev_mixer);
4033 printk(KERN_INFO "usbaudio: unregister mixer 14,%d\n", ms->dev_mixer);
4034 }
4035 ms->dev_mixer = -1;
4036 }
4037 release(s);
4038 wake_up(&open_wait);
4039}
4040
4041static int __init usb_audio_init(void)
4042{
4043 usb_register(&usb_audio_driver);
4044 info(DRIVER_VERSION ":" DRIVER_DESC);
4045 return 0;
4046}
4047
4048
4049static void __exit usb_audio_cleanup(void)
4050{
4051 usb_deregister(&usb_audio_driver);
4052}
4053
4054module_init(usb_audio_init);
4055module_exit(usb_audio_cleanup);
4056
4057MODULE_AUTHOR( DRIVER_AUTHOR );
4058MODULE_DESCRIPTION( DRIVER_DESC );
4059MODULE_LICENSE("GPL");
4060
4061