aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb/usx2y
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /sound/usb/usx2y
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff)
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'sound/usb/usx2y')
-rw-r--r--sound/usb/usx2y/us122l.c158
-rw-r--r--sound/usb/usx2y/us122l.h6
-rw-r--r--sound/usb/usx2y/usX2Yhwdep.c9
-rw-r--r--sound/usb/usx2y/usb_stream.c1
-rw-r--r--sound/usb/usx2y/usbusx2y.c29
-rw-r--r--sound/usb/usx2y/usbusx2y.h6
-rw-r--r--sound/usb/usx2y/usbusx2yaudio.c35
-rw-r--r--sound/usb/usx2y/usx2yhwdeppcm.c9
8 files changed, 170 insertions, 83 deletions
diff --git a/sound/usb/usx2y/us122l.c b/sound/usb/usx2y/us122l.c
index 99f33766cd51..9ca9a13a78da 100644
--- a/sound/usb/usx2y/us122l.c
+++ b/sound/usb/usx2y/us122l.c
@@ -16,6 +16,9 @@
16 * Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 16 * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */ 17 */
18 18
19#include <linux/slab.h>
20#include <linux/usb.h>
21#include <linux/usb/audio.h>
19#include <sound/core.h> 22#include <sound/core.h>
20#include <sound/hwdep.h> 23#include <sound/hwdep.h>
21#include <sound/pcm.h> 24#include <sound/pcm.h>
@@ -59,11 +62,33 @@ static int us122l_create_usbmidi(struct snd_card *card)
59 .type = QUIRK_MIDI_US122L, 62 .type = QUIRK_MIDI_US122L,
60 .data = &quirk_data 63 .data = &quirk_data
61 }; 64 };
62 struct usb_device *dev = US122L(card)->chip.dev; 65 struct usb_device *dev = US122L(card)->dev;
63 struct usb_interface *iface = usb_ifnum_to_if(dev, 1); 66 struct usb_interface *iface = usb_ifnum_to_if(dev, 1);
64 67
65 return snd_usb_create_midi_interface(&US122L(card)->chip, 68 return snd_usbmidi_create(card, iface,
66 iface, &quirk); 69 &US122L(card)->midi_list, &quirk);
70}
71
72static int us144_create_usbmidi(struct snd_card *card)
73{
74 static struct snd_usb_midi_endpoint_info quirk_data = {
75 .out_ep = 4,
76 .in_ep = 3,
77 .out_cables = 0x001,
78 .in_cables = 0x001
79 };
80 static struct snd_usb_audio_quirk quirk = {
81 .vendor_name = "US144",
82 .product_name = NAME_ALLCAPS,
83 .ifnum = 0,
84 .type = QUIRK_MIDI_US122L,
85 .data = &quirk_data
86 };
87 struct usb_device *dev = US122L(card)->dev;
88 struct usb_interface *iface = usb_ifnum_to_if(dev, 0);
89
90 return snd_usbmidi_create(card, iface,
91 &US122L(card)->midi_list, &quirk);
67} 92}
68 93
69/* 94/*
@@ -171,7 +196,13 @@ static int usb_stream_hwdep_open(struct snd_hwdep *hw, struct file *file)
171 196
172 if (!us122l->first) 197 if (!us122l->first)
173 us122l->first = file; 198 us122l->first = file;
174 iface = usb_ifnum_to_if(us122l->chip.dev, 1); 199
200 if (us122l->dev->descriptor.idProduct == USB_ID_US144 ||
201 us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
202 iface = usb_ifnum_to_if(us122l->dev, 0);
203 usb_autopm_get_interface(iface);
204 }
205 iface = usb_ifnum_to_if(us122l->dev, 1);
175 usb_autopm_get_interface(iface); 206 usb_autopm_get_interface(iface);
176 return 0; 207 return 0;
177} 208}
@@ -179,8 +210,15 @@ static int usb_stream_hwdep_open(struct snd_hwdep *hw, struct file *file)
179static int usb_stream_hwdep_release(struct snd_hwdep *hw, struct file *file) 210static int usb_stream_hwdep_release(struct snd_hwdep *hw, struct file *file)
180{ 211{
181 struct us122l *us122l = hw->private_data; 212 struct us122l *us122l = hw->private_data;
182 struct usb_interface *iface = usb_ifnum_to_if(us122l->chip.dev, 1); 213 struct usb_interface *iface;
183 snd_printdd(KERN_DEBUG "%p %p\n", hw, file); 214 snd_printdd(KERN_DEBUG "%p %p\n", hw, file);
215
216 if (us122l->dev->descriptor.idProduct == USB_ID_US144 ||
217 us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
218 iface = usb_ifnum_to_if(us122l->dev, 0);
219 usb_autopm_put_interface(iface);
220 }
221 iface = usb_ifnum_to_if(us122l->dev, 1);
184 usb_autopm_put_interface(iface); 222 usb_autopm_put_interface(iface);
185 if (us122l->first == file) 223 if (us122l->first == file)
186 us122l->first = NULL; 224 us122l->first = NULL;
@@ -264,7 +302,7 @@ static unsigned int usb_stream_hwdep_poll(struct snd_hwdep *hw,
264static void us122l_stop(struct us122l *us122l) 302static void us122l_stop(struct us122l *us122l)
265{ 303{
266 struct list_head *p; 304 struct list_head *p;
267 list_for_each(p, &us122l->chip.midi_list) 305 list_for_each(p, &us122l->midi_list)
268 snd_usbmidi_input_stop(p); 306 snd_usbmidi_input_stop(p);
269 307
270 usb_stream_stop(&us122l->sk); 308 usb_stream_stop(&us122l->sk);
@@ -280,9 +318,9 @@ static int us122l_set_sample_rate(struct usb_device *dev, int rate)
280 data[0] = rate; 318 data[0] = rate;
281 data[1] = rate >> 8; 319 data[1] = rate >> 8;
282 data[2] = rate >> 16; 320 data[2] = rate >> 16;
283 err = us122l_ctl_msg(dev, usb_sndctrlpipe(dev, 0), SET_CUR, 321 err = us122l_ctl_msg(dev, usb_sndctrlpipe(dev, 0), UAC_SET_CUR,
284 USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT, 322 USB_TYPE_CLASS|USB_RECIP_ENDPOINT|USB_DIR_OUT,
285 SAMPLING_FREQ_CONTROL << 8, ep, data, 3, 1000); 323 UAC_EP_CS_ATTR_SAMPLE_RATE << 8, ep, data, 3, 1000);
286 if (err < 0) 324 if (err < 0)
287 snd_printk(KERN_ERR "%d: cannot set freq %d to ep 0x%x\n", 325 snd_printk(KERN_ERR "%d: cannot set freq %d to ep 0x%x\n",
288 dev->devnum, rate, ep); 326 dev->devnum, rate, ep);
@@ -297,7 +335,7 @@ static bool us122l_start(struct us122l *us122l,
297 unsigned use_packsize = 0; 335 unsigned use_packsize = 0;
298 bool success = false; 336 bool success = false;
299 337
300 if (us122l->chip.dev->speed == USB_SPEED_HIGH) { 338 if (us122l->dev->speed == USB_SPEED_HIGH) {
301 /* The us-122l's descriptor defaults to iso max_packsize 78, 339 /* The us-122l's descriptor defaults to iso max_packsize 78,
302 which isn't needed for samplerates <= 48000. 340 which isn't needed for samplerates <= 48000.
303 Lets save some memory: 341 Lets save some memory:
@@ -314,11 +352,11 @@ static bool us122l_start(struct us122l *us122l,
314 break; 352 break;
315 } 353 }
316 } 354 }
317 if (!usb_stream_new(&us122l->sk, us122l->chip.dev, 1, 2, 355 if (!usb_stream_new(&us122l->sk, us122l->dev, 1, 2,
318 rate, use_packsize, period_frames, 6)) 356 rate, use_packsize, period_frames, 6))
319 goto out; 357 goto out;
320 358
321 err = us122l_set_sample_rate(us122l->chip.dev, rate); 359 err = us122l_set_sample_rate(us122l->dev, rate);
322 if (err < 0) { 360 if (err < 0) {
323 us122l_stop(us122l); 361 us122l_stop(us122l);
324 snd_printk(KERN_ERR "us122l_set_sample_rate error \n"); 362 snd_printk(KERN_ERR "us122l_set_sample_rate error \n");
@@ -330,7 +368,7 @@ static bool us122l_start(struct us122l *us122l,
330 snd_printk(KERN_ERR "us122l_start error %i \n", err); 368 snd_printk(KERN_ERR "us122l_start error %i \n", err);
331 goto out; 369 goto out;
332 } 370 }
333 list_for_each(p, &us122l->chip.midi_list) 371 list_for_each(p, &us122l->midi_list)
334 snd_usbmidi_input_start(p); 372 snd_usbmidi_input_start(p);
335 success = true; 373 success = true;
336out: 374out:
@@ -357,7 +395,7 @@ static int usb_stream_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
357 err = -ENXIO; 395 err = -ENXIO;
358 goto free; 396 goto free;
359 } 397 }
360 high_speed = us122l->chip.dev->speed == USB_SPEED_HIGH; 398 high_speed = us122l->dev->speed == USB_SPEED_HIGH;
361 if ((cfg->sample_rate != 44100 && cfg->sample_rate != 48000 && 399 if ((cfg->sample_rate != 44100 && cfg->sample_rate != 48000 &&
362 (!high_speed || 400 (!high_speed ||
363 (cfg->sample_rate != 88200 && cfg->sample_rate != 96000))) || 401 (cfg->sample_rate != 88200 && cfg->sample_rate != 96000))) ||
@@ -417,7 +455,7 @@ static int usb_stream_hwdep_new(struct snd_card *card)
417{ 455{
418 int err; 456 int err;
419 struct snd_hwdep *hw; 457 struct snd_hwdep *hw;
420 struct usb_device *dev = US122L(card)->chip.dev; 458 struct usb_device *dev = US122L(card)->dev;
421 459
422 err = snd_hwdep_new(card, SND_USB_STREAM_ID, 0, &hw); 460 err = snd_hwdep_new(card, SND_USB_STREAM_ID, 0, &hw);
423 if (err < 0) 461 if (err < 0)
@@ -443,19 +481,31 @@ static bool us122l_create_card(struct snd_card *card)
443 int err; 481 int err;
444 struct us122l *us122l = US122L(card); 482 struct us122l *us122l = US122L(card);
445 483
446 err = usb_set_interface(us122l->chip.dev, 1, 1); 484 if (us122l->dev->descriptor.idProduct == USB_ID_US144 ||
485 us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
486 err = usb_set_interface(us122l->dev, 0, 1);
487 if (err) {
488 snd_printk(KERN_ERR "usb_set_interface error \n");
489 return false;
490 }
491 }
492 err = usb_set_interface(us122l->dev, 1, 1);
447 if (err) { 493 if (err) {
448 snd_printk(KERN_ERR "usb_set_interface error \n"); 494 snd_printk(KERN_ERR "usb_set_interface error \n");
449 return false; 495 return false;
450 } 496 }
451 497
452 pt_info_set(us122l->chip.dev, 0x11); 498 pt_info_set(us122l->dev, 0x11);
453 pt_info_set(us122l->chip.dev, 0x10); 499 pt_info_set(us122l->dev, 0x10);
454 500
455 if (!us122l_start(us122l, 44100, 256)) 501 if (!us122l_start(us122l, 44100, 256))
456 return false; 502 return false;
457 503
458 err = us122l_create_usbmidi(card); 504 if (us122l->dev->descriptor.idProduct == USB_ID_US144 ||
505 us122l->dev->descriptor.idProduct == USB_ID_US144MKII)
506 err = us144_create_usbmidi(card);
507 else
508 err = us122l_create_usbmidi(card);
459 if (err < 0) { 509 if (err < 0) {
460 snd_printk(KERN_ERR "us122l_create_usbmidi error %i \n", err); 510 snd_printk(KERN_ERR "us122l_create_usbmidi error %i \n", err);
461 us122l_stop(us122l); 511 us122l_stop(us122l);
@@ -465,7 +515,7 @@ static bool us122l_create_card(struct snd_card *card)
465 if (err < 0) { 515 if (err < 0) {
466/* release the midi resources */ 516/* release the midi resources */
467 struct list_head *p; 517 struct list_head *p;
468 list_for_each(p, &us122l->chip.midi_list) 518 list_for_each(p, &us122l->midi_list)
469 snd_usbmidi_disconnect(p); 519 snd_usbmidi_disconnect(p);
470 520
471 us122l_stop(us122l); 521 us122l_stop(us122l);
@@ -477,7 +527,7 @@ static bool us122l_create_card(struct snd_card *card)
477static void snd_us122l_free(struct snd_card *card) 527static void snd_us122l_free(struct snd_card *card)
478{ 528{
479 struct us122l *us122l = US122L(card); 529 struct us122l *us122l = US122L(card);
480 int index = us122l->chip.index; 530 int index = us122l->card_index;
481 if (index >= 0 && index < SNDRV_CARDS) 531 if (index >= 0 && index < SNDRV_CARDS)
482 snd_us122l_card_used[index] = 0; 532 snd_us122l_card_used[index] = 0;
483} 533}
@@ -497,13 +547,12 @@ static int usx2y_create_card(struct usb_device *device, struct snd_card **cardp)
497 sizeof(struct us122l), &card); 547 sizeof(struct us122l), &card);
498 if (err < 0) 548 if (err < 0)
499 return err; 549 return err;
500 snd_us122l_card_used[US122L(card)->chip.index = dev] = 1; 550 snd_us122l_card_used[US122L(card)->card_index = dev] = 1;
501 card->private_free = snd_us122l_free; 551 card->private_free = snd_us122l_free;
502 US122L(card)->chip.dev = device; 552 US122L(card)->dev = device;
503 US122L(card)->chip.card = card;
504 mutex_init(&US122L(card)->mutex); 553 mutex_init(&US122L(card)->mutex);
505 init_waitqueue_head(&US122L(card)->sk.sleep); 554 init_waitqueue_head(&US122L(card)->sk.sleep);
506 INIT_LIST_HEAD(&US122L(card)->chip.midi_list); 555 INIT_LIST_HEAD(&US122L(card)->midi_list);
507 strcpy(card->driver, "USB "NAME_ALLCAPS""); 556 strcpy(card->driver, "USB "NAME_ALLCAPS"");
508 sprintf(card->shortname, "TASCAM "NAME_ALLCAPS""); 557 sprintf(card->shortname, "TASCAM "NAME_ALLCAPS"");
509 sprintf(card->longname, "%s (%x:%x if %d at %03d/%03d)", 558 sprintf(card->longname, "%s (%x:%x if %d at %03d/%03d)",
@@ -511,8 +560,8 @@ static int usx2y_create_card(struct usb_device *device, struct snd_card **cardp)
511 le16_to_cpu(device->descriptor.idVendor), 560 le16_to_cpu(device->descriptor.idVendor),
512 le16_to_cpu(device->descriptor.idProduct), 561 le16_to_cpu(device->descriptor.idProduct),
513 0, 562 0,
514 US122L(card)->chip.dev->bus->busnum, 563 US122L(card)->dev->bus->busnum,
515 US122L(card)->chip.dev->devnum 564 US122L(card)->dev->devnum
516 ); 565 );
517 *cardp = card; 566 *cardp = card;
518 return 0; 567 return 0;
@@ -542,6 +591,7 @@ static int us122l_usb_probe(struct usb_interface *intf,
542 return err; 591 return err;
543 } 592 }
544 593
594 usb_get_intf(usb_ifnum_to_if(device, 0));
545 usb_get_dev(device); 595 usb_get_dev(device);
546 *cardp = card; 596 *cardp = card;
547 return 0; 597 return 0;
@@ -550,9 +600,17 @@ static int us122l_usb_probe(struct usb_interface *intf,
550static int snd_us122l_probe(struct usb_interface *intf, 600static int snd_us122l_probe(struct usb_interface *intf,
551 const struct usb_device_id *id) 601 const struct usb_device_id *id)
552{ 602{
603 struct usb_device *device = interface_to_usbdev(intf);
553 struct snd_card *card; 604 struct snd_card *card;
554 int err; 605 int err;
555 606
607 if ((device->descriptor.idProduct == USB_ID_US144 ||
608 device->descriptor.idProduct == USB_ID_US144MKII)
609 && device->speed == USB_SPEED_HIGH) {
610 snd_printk(KERN_ERR "disable ehci-hcd to run US-144 \n");
611 return -ENODEV;
612 }
613
556 snd_printdd(KERN_DEBUG"%p:%i\n", 614 snd_printdd(KERN_DEBUG"%p:%i\n",
557 intf, intf->cur_altsetting->desc.bInterfaceNumber); 615 intf, intf->cur_altsetting->desc.bInterfaceNumber);
558 if (intf->cur_altsetting->desc.bInterfaceNumber != 1) 616 if (intf->cur_altsetting->desc.bInterfaceNumber != 1)
@@ -584,15 +642,15 @@ static void snd_us122l_disconnect(struct usb_interface *intf)
584 mutex_lock(&us122l->mutex); 642 mutex_lock(&us122l->mutex);
585 us122l_stop(us122l); 643 us122l_stop(us122l);
586 mutex_unlock(&us122l->mutex); 644 mutex_unlock(&us122l->mutex);
587 us122l->chip.shutdown = 1;
588 645
589/* release the midi resources */ 646/* release the midi resources */
590 list_for_each(p, &us122l->chip.midi_list) { 647 list_for_each(p, &us122l->midi_list) {
591 snd_usbmidi_disconnect(p); 648 snd_usbmidi_disconnect(p);
592 } 649 }
593 650
594 usb_put_intf(intf); 651 usb_put_intf(usb_ifnum_to_if(us122l->dev, 0));
595 usb_put_dev(us122l->chip.dev); 652 usb_put_intf(usb_ifnum_to_if(us122l->dev, 1));
653 usb_put_dev(us122l->dev);
596 654
597 while (atomic_read(&us122l->mmap_count)) 655 while (atomic_read(&us122l->mmap_count))
598 msleep(500); 656 msleep(500);
@@ -615,7 +673,7 @@ static int snd_us122l_suspend(struct usb_interface *intf, pm_message_t message)
615 if (!us122l) 673 if (!us122l)
616 return 0; 674 return 0;
617 675
618 list_for_each(p, &us122l->chip.midi_list) 676 list_for_each(p, &us122l->midi_list)
619 snd_usbmidi_input_stop(p); 677 snd_usbmidi_input_stop(p);
620 678
621 mutex_lock(&us122l->mutex); 679 mutex_lock(&us122l->mutex);
@@ -642,16 +700,24 @@ static int snd_us122l_resume(struct usb_interface *intf)
642 700
643 mutex_lock(&us122l->mutex); 701 mutex_lock(&us122l->mutex);
644 /* needed, doesn't restart without: */ 702 /* needed, doesn't restart without: */
645 err = usb_set_interface(us122l->chip.dev, 1, 1); 703 if (us122l->dev->descriptor.idProduct == USB_ID_US144 ||
704 us122l->dev->descriptor.idProduct == USB_ID_US144MKII) {
705 err = usb_set_interface(us122l->dev, 0, 1);
706 if (err) {
707 snd_printk(KERN_ERR "usb_set_interface error \n");
708 goto unlock;
709 }
710 }
711 err = usb_set_interface(us122l->dev, 1, 1);
646 if (err) { 712 if (err) {
647 snd_printk(KERN_ERR "usb_set_interface error \n"); 713 snd_printk(KERN_ERR "usb_set_interface error \n");
648 goto unlock; 714 goto unlock;
649 } 715 }
650 716
651 pt_info_set(us122l->chip.dev, 0x11); 717 pt_info_set(us122l->dev, 0x11);
652 pt_info_set(us122l->chip.dev, 0x10); 718 pt_info_set(us122l->dev, 0x10);
653 719
654 err = us122l_set_sample_rate(us122l->chip.dev, 720 err = us122l_set_sample_rate(us122l->dev,
655 us122l->sk.s->cfg.sample_rate); 721 us122l->sk.s->cfg.sample_rate);
656 if (err < 0) { 722 if (err < 0) {
657 snd_printk(KERN_ERR "us122l_set_sample_rate error \n"); 723 snd_printk(KERN_ERR "us122l_set_sample_rate error \n");
@@ -661,7 +727,7 @@ static int snd_us122l_resume(struct usb_interface *intf)
661 if (err) 727 if (err)
662 goto unlock; 728 goto unlock;
663 729
664 list_for_each(p, &us122l->chip.midi_list) 730 list_for_each(p, &us122l->midi_list)
665 snd_usbmidi_input_start(p); 731 snd_usbmidi_input_start(p);
666unlock: 732unlock:
667 mutex_unlock(&us122l->mutex); 733 mutex_unlock(&us122l->mutex);
@@ -675,11 +741,21 @@ static struct usb_device_id snd_us122l_usb_id_table[] = {
675 .idVendor = 0x0644, 741 .idVendor = 0x0644,
676 .idProduct = USB_ID_US122L 742 .idProduct = USB_ID_US122L
677 }, 743 },
678/* { */ /* US-144 maybe works when @USB1.1. Untested. */ 744 { /* US-144 only works at USB1.1! Disable module ehci-hcd. */
679/* .match_flags = USB_DEVICE_ID_MATCH_DEVICE, */ 745 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
680/* .idVendor = 0x0644, */ 746 .idVendor = 0x0644,
681/* .idProduct = USB_ID_US144 */ 747 .idProduct = USB_ID_US144
682/* }, */ 748 },
749 {
750 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
751 .idVendor = 0x0644,
752 .idProduct = USB_ID_US122MKII
753 },
754 {
755 .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
756 .idVendor = 0x0644,
757 .idProduct = USB_ID_US144MKII
758 },
683 { /* terminator */ } 759 { /* terminator */ }
684}; 760};
685 761
diff --git a/sound/usb/usx2y/us122l.h b/sound/usb/usx2y/us122l.h
index 3d10c4b2a0f5..f263b3f96c86 100644
--- a/sound/usb/usx2y/us122l.h
+++ b/sound/usb/usx2y/us122l.h
@@ -3,7 +3,8 @@
3 3
4 4
5struct us122l { 5struct us122l {
6 struct snd_usb_audio chip; 6 struct usb_device *dev;
7 int card_index;
7 int stride; 8 int stride;
8 struct usb_stream_kernel sk; 9 struct usb_stream_kernel sk;
9 10
@@ -12,6 +13,7 @@ struct us122l {
12 unsigned second_periods_polled; 13 unsigned second_periods_polled;
13 struct file *master; 14 struct file *master;
14 struct file *slave; 15 struct file *slave;
16 struct list_head midi_list;
15 17
16 atomic_t mmap_count; 18 atomic_t mmap_count;
17}; 19};
@@ -23,5 +25,7 @@ struct us122l {
23 25
24#define USB_ID_US122L 0x800E 26#define USB_ID_US122L 0x800E
25#define USB_ID_US144 0x800F 27#define USB_ID_US144 0x800F
28#define USB_ID_US122MKII 0x8021
29#define USB_ID_US144MKII 0x8020
26 30
27#endif 31#endif
diff --git a/sound/usb/usx2y/usX2Yhwdep.c b/sound/usb/usx2y/usX2Yhwdep.c
index 52e04b2f35d3..04aafb43a13c 100644
--- a/sound/usb/usx2y/usX2Yhwdep.c
+++ b/sound/usb/usx2y/usX2Yhwdep.c
@@ -21,6 +21,7 @@
21 */ 21 */
22 22
23#include <linux/interrupt.h> 23#include <linux/interrupt.h>
24#include <linux/slab.h>
24#include <linux/usb.h> 25#include <linux/usb.h>
25#include <sound/core.h> 26#include <sound/core.h>
26#include <sound/memalloc.h> 27#include <sound/memalloc.h>
@@ -114,7 +115,7 @@ static int snd_usX2Y_hwdep_dsp_status(struct snd_hwdep *hw,
114 struct usX2Ydev *us428 = hw->private_data; 115 struct usX2Ydev *us428 = hw->private_data;
115 int id = -1; 116 int id = -1;
116 117
117 switch (le16_to_cpu(us428->chip.dev->descriptor.idProduct)) { 118 switch (le16_to_cpu(us428->dev->descriptor.idProduct)) {
118 case USB_ID_US122: 119 case USB_ID_US122:
119 id = USX2Y_TYPE_122; 120 id = USX2Y_TYPE_122;
120 break; 121 break;
@@ -164,14 +165,14 @@ static int usX2Y_create_usbmidi(struct snd_card *card)
164 .type = QUIRK_MIDI_FIXED_ENDPOINT, 165 .type = QUIRK_MIDI_FIXED_ENDPOINT,
165 .data = &quirk_data_2 166 .data = &quirk_data_2
166 }; 167 };
167 struct usb_device *dev = usX2Y(card)->chip.dev; 168 struct usb_device *dev = usX2Y(card)->dev;
168 struct usb_interface *iface = usb_ifnum_to_if(dev, 0); 169 struct usb_interface *iface = usb_ifnum_to_if(dev, 0);
169 struct snd_usb_audio_quirk *quirk = 170 struct snd_usb_audio_quirk *quirk =
170 le16_to_cpu(dev->descriptor.idProduct) == USB_ID_US428 ? 171 le16_to_cpu(dev->descriptor.idProduct) == USB_ID_US428 ?
171 &quirk_2 : &quirk_1; 172 &quirk_2 : &quirk_1;
172 173
173 snd_printdd("usX2Y_create_usbmidi \n"); 174 snd_printdd("usX2Y_create_usbmidi \n");
174 return snd_usb_create_midi_interface(&usX2Y(card)->chip, iface, quirk); 175 return snd_usbmidi_create(card, iface, &usX2Y(card)->midi_list, quirk);
175} 176}
176 177
177static int usX2Y_create_alsa_devices(struct snd_card *card) 178static int usX2Y_create_alsa_devices(struct snd_card *card)
@@ -202,7 +203,7 @@ static int snd_usX2Y_hwdep_dsp_load(struct snd_hwdep *hw,
202 snd_printdd( "dsp_load %s\n", dsp->name); 203 snd_printdd( "dsp_load %s\n", dsp->name);
203 204
204 if (access_ok(VERIFY_READ, dsp->image, dsp->length)) { 205 if (access_ok(VERIFY_READ, dsp->image, dsp->length)) {
205 struct usb_device* dev = priv->chip.dev; 206 struct usb_device* dev = priv->dev;
206 char *buf; 207 char *buf;
207 208
208 buf = memdup_user(dsp->image, dsp->length); 209 buf = memdup_user(dsp->image, dsp->length);
diff --git a/sound/usb/usx2y/usb_stream.c b/sound/usb/usx2y/usb_stream.c
index 12ae0340adc0..c400ade3ff08 100644
--- a/sound/usb/usx2y/usb_stream.c
+++ b/sound/usb/usx2y/usb_stream.c
@@ -17,6 +17,7 @@
17 */ 17 */
18 18
19#include <linux/usb.h> 19#include <linux/usb.h>
20#include <linux/gfp.h>
20 21
21#include "usb_stream.h" 22#include "usb_stream.h"
22 23
diff --git a/sound/usb/usx2y/usbusx2y.c b/sound/usb/usx2y/usbusx2y.c
index cb4bb8373ca2..cbd37f2c76d0 100644
--- a/sound/usb/usx2y/usbusx2y.c
+++ b/sound/usb/usx2y/usbusx2y.c
@@ -133,6 +133,7 @@
133#include <linux/init.h> 133#include <linux/init.h>
134#include <linux/module.h> 134#include <linux/module.h>
135#include <linux/moduleparam.h> 135#include <linux/moduleparam.h>
136#include <linux/slab.h>
136#include <linux/interrupt.h> 137#include <linux/interrupt.h>
137#include <linux/usb.h> 138#include <linux/usb.h>
138#include <sound/core.h> 139#include <sound/core.h>
@@ -239,8 +240,8 @@ static void i_usX2Y_In04Int(struct urb *urb)
239 for (j = 0; j < URBS_AsyncSeq && !err; ++j) 240 for (j = 0; j < URBS_AsyncSeq && !err; ++j)
240 if (0 == usX2Y->AS04.urb[j]->status) { 241 if (0 == usX2Y->AS04.urb[j]->status) {
241 struct us428_p4out *p4out = us428ctls->p4out + send; // FIXME if more than 1 p4out is new, 1 gets lost. 242 struct us428_p4out *p4out = us428ctls->p4out + send; // FIXME if more than 1 p4out is new, 1 gets lost.
242 usb_fill_bulk_urb(usX2Y->AS04.urb[j], usX2Y->chip.dev, 243 usb_fill_bulk_urb(usX2Y->AS04.urb[j], usX2Y->dev,
243 usb_sndbulkpipe(usX2Y->chip.dev, 0x04), &p4out->val.vol, 244 usb_sndbulkpipe(usX2Y->dev, 0x04), &p4out->val.vol,
244 p4out->type == eLT_Light ? sizeof(struct us428_lights) : 5, 245 p4out->type == eLT_Light ? sizeof(struct us428_lights) : 5,
245 i_usX2Y_Out04Int, usX2Y); 246 i_usX2Y_Out04Int, usX2Y);
246 err = usb_submit_urb(usX2Y->AS04.urb[j], GFP_ATOMIC); 247 err = usb_submit_urb(usX2Y->AS04.urb[j], GFP_ATOMIC);
@@ -253,7 +254,7 @@ static void i_usX2Y_In04Int(struct urb *urb)
253 if (err) 254 if (err)
254 snd_printk(KERN_ERR "In04Int() usb_submit_urb err=%i\n", err); 255 snd_printk(KERN_ERR "In04Int() usb_submit_urb err=%i\n", err);
255 256
256 urb->dev = usX2Y->chip.dev; 257 urb->dev = usX2Y->dev;
257 usb_submit_urb(urb, GFP_ATOMIC); 258 usb_submit_urb(urb, GFP_ATOMIC);
258} 259}
259 260
@@ -273,8 +274,8 @@ int usX2Y_AsyncSeq04_init(struct usX2Ydev *usX2Y)
273 err = -ENOMEM; 274 err = -ENOMEM;
274 break; 275 break;
275 } 276 }
276 usb_fill_bulk_urb( usX2Y->AS04.urb[i], usX2Y->chip.dev, 277 usb_fill_bulk_urb( usX2Y->AS04.urb[i], usX2Y->dev,
277 usb_sndbulkpipe(usX2Y->chip.dev, 0x04), 278 usb_sndbulkpipe(usX2Y->dev, 0x04),
278 usX2Y->AS04.buffer + URB_DataLen_AsyncSeq*i, 0, 279 usX2Y->AS04.buffer + URB_DataLen_AsyncSeq*i, 0,
279 i_usX2Y_Out04Int, usX2Y 280 i_usX2Y_Out04Int, usX2Y
280 ); 281 );
@@ -293,7 +294,7 @@ int usX2Y_In04_init(struct usX2Ydev *usX2Y)
293 } 294 }
294 295
295 init_waitqueue_head(&usX2Y->In04WaitQueue); 296 init_waitqueue_head(&usX2Y->In04WaitQueue);
296 usb_fill_int_urb(usX2Y->In04urb, usX2Y->chip.dev, usb_rcvintpipe(usX2Y->chip.dev, 0x4), 297 usb_fill_int_urb(usX2Y->In04urb, usX2Y->dev, usb_rcvintpipe(usX2Y->dev, 0x4),
297 usX2Y->In04Buf, 21, 298 usX2Y->In04Buf, 21,
298 i_usX2Y_In04Int, usX2Y, 299 i_usX2Y_In04Int, usX2Y,
299 10); 300 10);
@@ -348,13 +349,12 @@ static int usX2Y_create_card(struct usb_device *device, struct snd_card **cardp)
348 sizeof(struct usX2Ydev), &card); 349 sizeof(struct usX2Ydev), &card);
349 if (err < 0) 350 if (err < 0)
350 return err; 351 return err;
351 snd_usX2Y_card_used[usX2Y(card)->chip.index = dev] = 1; 352 snd_usX2Y_card_used[usX2Y(card)->card_index = dev] = 1;
352 card->private_free = snd_usX2Y_card_private_free; 353 card->private_free = snd_usX2Y_card_private_free;
353 usX2Y(card)->chip.dev = device; 354 usX2Y(card)->dev = device;
354 usX2Y(card)->chip.card = card;
355 init_waitqueue_head(&usX2Y(card)->prepare_wait_queue); 355 init_waitqueue_head(&usX2Y(card)->prepare_wait_queue);
356 mutex_init(&usX2Y(card)->prepare_mutex); 356 mutex_init(&usX2Y(card)->prepare_mutex);
357 INIT_LIST_HEAD(&usX2Y(card)->chip.midi_list); 357 INIT_LIST_HEAD(&usX2Y(card)->midi_list);
358 strcpy(card->driver, "USB "NAME_ALLCAPS""); 358 strcpy(card->driver, "USB "NAME_ALLCAPS"");
359 sprintf(card->shortname, "TASCAM "NAME_ALLCAPS""); 359 sprintf(card->shortname, "TASCAM "NAME_ALLCAPS"");
360 sprintf(card->longname, "%s (%x:%x if %d at %03d/%03d)", 360 sprintf(card->longname, "%s (%x:%x if %d at %03d/%03d)",
@@ -362,7 +362,7 @@ static int usX2Y_create_card(struct usb_device *device, struct snd_card **cardp)
362 le16_to_cpu(device->descriptor.idVendor), 362 le16_to_cpu(device->descriptor.idVendor),
363 le16_to_cpu(device->descriptor.idProduct), 363 le16_to_cpu(device->descriptor.idProduct),
364 0,//us428(card)->usbmidi.ifnum, 364 0,//us428(card)->usbmidi.ifnum,
365 usX2Y(card)->chip.dev->bus->busnum, usX2Y(card)->chip.dev->devnum 365 usX2Y(card)->dev->bus->busnum, usX2Y(card)->dev->devnum
366 ); 366 );
367 *cardp = card; 367 *cardp = card;
368 return 0; 368 return 0;
@@ -432,8 +432,8 @@ static void snd_usX2Y_card_private_free(struct snd_card *card)
432 usb_free_urb(usX2Y(card)->In04urb); 432 usb_free_urb(usX2Y(card)->In04urb);
433 if (usX2Y(card)->us428ctls_sharedmem) 433 if (usX2Y(card)->us428ctls_sharedmem)
434 snd_free_pages(usX2Y(card)->us428ctls_sharedmem, sizeof(*usX2Y(card)->us428ctls_sharedmem)); 434 snd_free_pages(usX2Y(card)->us428ctls_sharedmem, sizeof(*usX2Y(card)->us428ctls_sharedmem));
435 if (usX2Y(card)->chip.index >= 0 && usX2Y(card)->chip.index < SNDRV_CARDS) 435 if (usX2Y(card)->card_index >= 0 && usX2Y(card)->card_index < SNDRV_CARDS)
436 snd_usX2Y_card_used[usX2Y(card)->chip.index] = 0; 436 snd_usX2Y_card_used[usX2Y(card)->card_index] = 0;
437} 437}
438 438
439/* 439/*
@@ -445,13 +445,12 @@ static void usX2Y_usb_disconnect(struct usb_device *device, void* ptr)
445 struct snd_card *card = ptr; 445 struct snd_card *card = ptr;
446 struct usX2Ydev *usX2Y = usX2Y(card); 446 struct usX2Ydev *usX2Y = usX2Y(card);
447 struct list_head *p; 447 struct list_head *p;
448 usX2Y->chip.shutdown = 1;
449 usX2Y->chip_status = USX2Y_STAT_CHIP_HUP; 448 usX2Y->chip_status = USX2Y_STAT_CHIP_HUP;
450 usX2Y_unlinkSeq(&usX2Y->AS04); 449 usX2Y_unlinkSeq(&usX2Y->AS04);
451 usb_kill_urb(usX2Y->In04urb); 450 usb_kill_urb(usX2Y->In04urb);
452 snd_card_disconnect(card); 451 snd_card_disconnect(card);
453 /* release the midi resources */ 452 /* release the midi resources */
454 list_for_each(p, &usX2Y->chip.midi_list) { 453 list_for_each(p, &usX2Y->midi_list) {
455 snd_usbmidi_disconnect(p); 454 snd_usbmidi_disconnect(p);
456 } 455 }
457 if (usX2Y->us428ctls_sharedmem) 456 if (usX2Y->us428ctls_sharedmem)
diff --git a/sound/usb/usx2y/usbusx2y.h b/sound/usb/usx2y/usbusx2y.h
index 456b5fdbc339..1d174cea352b 100644
--- a/sound/usb/usx2y/usbusx2y.h
+++ b/sound/usb/usx2y/usbusx2y.h
@@ -22,7 +22,8 @@ struct snd_usX2Y_urbSeq {
22#include "usx2yhwdeppcm.h" 22#include "usx2yhwdeppcm.h"
23 23
24struct usX2Ydev { 24struct usX2Ydev {
25 struct snd_usb_audio chip; 25 struct usb_device *dev;
26 int card_index;
26 int stride; 27 int stride;
27 struct urb *In04urb; 28 struct urb *In04urb;
28 void *In04Buf; 29 void *In04Buf;
@@ -42,6 +43,9 @@ struct usX2Ydev {
42 struct snd_usX2Y_substream *subs[4]; 43 struct snd_usX2Y_substream *subs[4];
43 struct snd_usX2Y_substream * volatile prepare_subs; 44 struct snd_usX2Y_substream * volatile prepare_subs;
44 wait_queue_head_t prepare_wait_queue; 45 wait_queue_head_t prepare_wait_queue;
46 struct list_head midi_list;
47 struct list_head pcm_list;
48 int pcm_devs;
45}; 49};
46 50
47 51
diff --git a/sound/usb/usx2y/usbusx2yaudio.c b/sound/usb/usx2y/usbusx2yaudio.c
index 9efd27f6b52f..5d37d1ccf813 100644
--- a/sound/usb/usx2y/usbusx2yaudio.c
+++ b/sound/usb/usx2y/usbusx2yaudio.c
@@ -32,6 +32,7 @@
32 32
33 33
34#include <linux/interrupt.h> 34#include <linux/interrupt.h>
35#include <linux/slab.h>
35#include <linux/usb.h> 36#include <linux/usb.h>
36#include <sound/core.h> 37#include <sound/core.h>
37#include <sound/info.h> 38#include <sound/info.h>
@@ -199,7 +200,7 @@ static int usX2Y_urb_submit(struct snd_usX2Y_substream *subs, struct urb *urb, i
199 return -ENODEV; 200 return -ENODEV;
200 urb->start_frame = (frame + NRURBS * nr_of_packs()); // let hcd do rollover sanity checks 201 urb->start_frame = (frame + NRURBS * nr_of_packs()); // let hcd do rollover sanity checks
201 urb->hcpriv = NULL; 202 urb->hcpriv = NULL;
202 urb->dev = subs->usX2Y->chip.dev; /* we need to set this at each time */ 203 urb->dev = subs->usX2Y->dev; /* we need to set this at each time */
203 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { 204 if ((err = usb_submit_urb(urb, GFP_ATOMIC)) < 0) {
204 snd_printk(KERN_ERR "usb_submit_urb() returned %i\n", err); 205 snd_printk(KERN_ERR "usb_submit_urb() returned %i\n", err);
205 return err; 206 return err;
@@ -300,7 +301,7 @@ static void usX2Y_error_sequence(struct usX2Ydev *usX2Y,
300"Sequence Error!(hcd_frame=%i ep=%i%s;wait=%i,frame=%i).\n" 301"Sequence Error!(hcd_frame=%i ep=%i%s;wait=%i,frame=%i).\n"
301"Most propably some urb of usb-frame %i is still missing.\n" 302"Most propably some urb of usb-frame %i is still missing.\n"
302"Cause could be too long delays in usb-hcd interrupt handling.\n", 303"Cause could be too long delays in usb-hcd interrupt handling.\n",
303 usb_get_current_frame_number(usX2Y->chip.dev), 304 usb_get_current_frame_number(usX2Y->dev),
304 subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out", 305 subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out",
305 usX2Y->wait_iso_frame, urb->start_frame, usX2Y->wait_iso_frame); 306 usX2Y->wait_iso_frame, urb->start_frame, usX2Y->wait_iso_frame);
306 usX2Y_clients_stop(usX2Y); 307 usX2Y_clients_stop(usX2Y);
@@ -313,7 +314,7 @@ static void i_usX2Y_urb_complete(struct urb *urb)
313 314
314 if (unlikely(atomic_read(&subs->state) < state_PREPARED)) { 315 if (unlikely(atomic_read(&subs->state) < state_PREPARED)) {
315 snd_printdd("hcd_frame=%i ep=%i%s status=%i start_frame=%i\n", 316 snd_printdd("hcd_frame=%i ep=%i%s status=%i start_frame=%i\n",
316 usb_get_current_frame_number(usX2Y->chip.dev), 317 usb_get_current_frame_number(usX2Y->dev),
317 subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out", 318 subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out",
318 urb->status, urb->start_frame); 319 urb->status, urb->start_frame);
319 return; 320 return;
@@ -424,7 +425,7 @@ static int usX2Y_urbs_allocate(struct snd_usX2Y_substream *subs)
424 int i; 425 int i;
425 unsigned int pipe; 426 unsigned int pipe;
426 int is_playback = subs == subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]; 427 int is_playback = subs == subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK];
427 struct usb_device *dev = subs->usX2Y->chip.dev; 428 struct usb_device *dev = subs->usX2Y->dev;
428 429
429 pipe = is_playback ? usb_sndisocpipe(dev, subs->endpoint) : 430 pipe = is_playback ? usb_sndisocpipe(dev, subs->endpoint) :
430 usb_rcvisocpipe(dev, subs->endpoint); 431 usb_rcvisocpipe(dev, subs->endpoint);
@@ -500,7 +501,7 @@ static int usX2Y_urbs_start(struct snd_usX2Y_substream *subs)
500 unsigned long pack; 501 unsigned long pack;
501 if (0 == i) 502 if (0 == i)
502 atomic_set(&subs->state, state_STARTING3); 503 atomic_set(&subs->state, state_STARTING3);
503 urb->dev = usX2Y->chip.dev; 504 urb->dev = usX2Y->dev;
504 urb->transfer_flags = URB_ISO_ASAP; 505 urb->transfer_flags = URB_ISO_ASAP;
505 for (pack = 0; pack < nr_of_packs(); pack++) { 506 for (pack = 0; pack < nr_of_packs(); pack++) {
506 urb->iso_frame_desc[pack].offset = subs->maxpacksize * pack; 507 urb->iso_frame_desc[pack].offset = subs->maxpacksize * pack;
@@ -692,7 +693,7 @@ static int usX2Y_rate_set(struct usX2Ydev *usX2Y, int rate)
692 } 693 }
693 ((char*)(usbdata + i))[0] = ra[i].c1; 694 ((char*)(usbdata + i))[0] = ra[i].c1;
694 ((char*)(usbdata + i))[1] = ra[i].c2; 695 ((char*)(usbdata + i))[1] = ra[i].c2;
695 usb_fill_bulk_urb(us->urb[i], usX2Y->chip.dev, usb_sndbulkpipe(usX2Y->chip.dev, 4), 696 usb_fill_bulk_urb(us->urb[i], usX2Y->dev, usb_sndbulkpipe(usX2Y->dev, 4),
696 usbdata + i, 2, i_usX2Y_04Int, usX2Y); 697 usbdata + i, 2, i_usX2Y_04Int, usX2Y);
697#ifdef OLD_USB 698#ifdef OLD_USB
698 us->urb[i]->transfer_flags = USB_QUEUE_BULK; 699 us->urb[i]->transfer_flags = USB_QUEUE_BULK;
@@ -740,17 +741,17 @@ static int usX2Y_format_set(struct usX2Ydev *usX2Y, snd_pcm_format_t format)
740 alternate = 1; 741 alternate = 1;
741 usX2Y->stride = 4; 742 usX2Y->stride = 4;
742 } 743 }
743 list_for_each(p, &usX2Y->chip.midi_list) { 744 list_for_each(p, &usX2Y->midi_list) {
744 snd_usbmidi_input_stop(p); 745 snd_usbmidi_input_stop(p);
745 } 746 }
746 usb_kill_urb(usX2Y->In04urb); 747 usb_kill_urb(usX2Y->In04urb);
747 if ((err = usb_set_interface(usX2Y->chip.dev, 0, alternate))) { 748 if ((err = usb_set_interface(usX2Y->dev, 0, alternate))) {
748 snd_printk(KERN_ERR "usb_set_interface error \n"); 749 snd_printk(KERN_ERR "usb_set_interface error \n");
749 return err; 750 return err;
750 } 751 }
751 usX2Y->In04urb->dev = usX2Y->chip.dev; 752 usX2Y->In04urb->dev = usX2Y->dev;
752 err = usb_submit_urb(usX2Y->In04urb, GFP_KERNEL); 753 err = usb_submit_urb(usX2Y->In04urb, GFP_KERNEL);
753 list_for_each(p, &usX2Y->chip.midi_list) { 754 list_for_each(p, &usX2Y->midi_list) {
754 snd_usbmidi_input_start(p); 755 snd_usbmidi_input_start(p);
755 } 756 }
756 usX2Y->format = format; 757 usX2Y->format = format;
@@ -955,7 +956,7 @@ static int usX2Y_audio_stream_new(struct snd_card *card, int playback_endpoint,
955 struct snd_pcm *pcm; 956 struct snd_pcm *pcm;
956 int err, i; 957 int err, i;
957 struct snd_usX2Y_substream **usX2Y_substream = 958 struct snd_usX2Y_substream **usX2Y_substream =
958 usX2Y(card)->subs + 2 * usX2Y(card)->chip.pcm_devs; 959 usX2Y(card)->subs + 2 * usX2Y(card)->pcm_devs;
959 960
960 for (i = playback_endpoint ? SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE; 961 for (i = playback_endpoint ? SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE;
961 i <= SNDRV_PCM_STREAM_CAPTURE; ++i) { 962 i <= SNDRV_PCM_STREAM_CAPTURE; ++i) {
@@ -971,7 +972,7 @@ static int usX2Y_audio_stream_new(struct snd_card *card, int playback_endpoint,
971 usX2Y_substream[SNDRV_PCM_STREAM_PLAYBACK]->endpoint = playback_endpoint; 972 usX2Y_substream[SNDRV_PCM_STREAM_PLAYBACK]->endpoint = playback_endpoint;
972 usX2Y_substream[SNDRV_PCM_STREAM_CAPTURE]->endpoint = capture_endpoint; 973 usX2Y_substream[SNDRV_PCM_STREAM_CAPTURE]->endpoint = capture_endpoint;
973 974
974 err = snd_pcm_new(card, NAME_ALLCAPS" Audio", usX2Y(card)->chip.pcm_devs, 975 err = snd_pcm_new(card, NAME_ALLCAPS" Audio", usX2Y(card)->pcm_devs,
975 playback_endpoint ? 1 : 0, 1, 976 playback_endpoint ? 1 : 0, 1,
976 &pcm); 977 &pcm);
977 if (err < 0) { 978 if (err < 0) {
@@ -987,7 +988,7 @@ static int usX2Y_audio_stream_new(struct snd_card *card, int playback_endpoint,
987 pcm->private_free = snd_usX2Y_pcm_private_free; 988 pcm->private_free = snd_usX2Y_pcm_private_free;
988 pcm->info_flags = 0; 989 pcm->info_flags = 0;
989 990
990 sprintf(pcm->name, NAME_ALLCAPS" Audio #%d", usX2Y(card)->chip.pcm_devs); 991 sprintf(pcm->name, NAME_ALLCAPS" Audio #%d", usX2Y(card)->pcm_devs);
991 992
992 if ((playback_endpoint && 993 if ((playback_endpoint &&
993 0 > (err = snd_pcm_lib_preallocate_pages(pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream, 994 0 > (err = snd_pcm_lib_preallocate_pages(pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream,
@@ -1001,7 +1002,7 @@ static int usX2Y_audio_stream_new(struct snd_card *card, int playback_endpoint,
1001 snd_usX2Y_pcm_private_free(pcm); 1002 snd_usX2Y_pcm_private_free(pcm);
1002 return err; 1003 return err;
1003 } 1004 }
1004 usX2Y(card)->chip.pcm_devs++; 1005 usX2Y(card)->pcm_devs++;
1005 1006
1006 return 0; 1007 return 0;
1007} 1008}
@@ -1013,14 +1014,14 @@ int usX2Y_audio_create(struct snd_card *card)
1013{ 1014{
1014 int err = 0; 1015 int err = 0;
1015 1016
1016 INIT_LIST_HEAD(&usX2Y(card)->chip.pcm_list); 1017 INIT_LIST_HEAD(&usX2Y(card)->pcm_list);
1017 1018
1018 if (0 > (err = usX2Y_audio_stream_new(card, 0xA, 0x8))) 1019 if (0 > (err = usX2Y_audio_stream_new(card, 0xA, 0x8)))
1019 return err; 1020 return err;
1020 if (le16_to_cpu(usX2Y(card)->chip.dev->descriptor.idProduct) == USB_ID_US428) 1021 if (le16_to_cpu(usX2Y(card)->dev->descriptor.idProduct) == USB_ID_US428)
1021 if (0 > (err = usX2Y_audio_stream_new(card, 0, 0xA))) 1022 if (0 > (err = usX2Y_audio_stream_new(card, 0, 0xA)))
1022 return err; 1023 return err;
1023 if (le16_to_cpu(usX2Y(card)->chip.dev->descriptor.idProduct) != USB_ID_US122) 1024 if (le16_to_cpu(usX2Y(card)->dev->descriptor.idProduct) != USB_ID_US122)
1024 err = usX2Y_rate_set(usX2Y(card), 44100); // Lets us428 recognize output-volume settings, disturbs us122. 1025 err = usX2Y_rate_set(usX2Y(card), 44100); // Lets us428 recognize output-volume settings, disturbs us122.
1025 return err; 1026 return err;
1026} 1027}
diff --git a/sound/usb/usx2y/usx2yhwdeppcm.c b/sound/usb/usx2y/usx2yhwdeppcm.c
index 4b2304c2e02d..2a528e56afd5 100644
--- a/sound/usb/usx2y/usx2yhwdeppcm.c
+++ b/sound/usb/usx2y/usx2yhwdeppcm.c
@@ -51,6 +51,7 @@
51*/ 51*/
52 52
53#include <linux/delay.h> 53#include <linux/delay.h>
54#include <linux/gfp.h>
54#include "usbusx2yaudio.c" 55#include "usbusx2yaudio.c"
55 56
56#if defined(USX2Y_NRPACKS_VARIABLE) || (!defined(USX2Y_NRPACKS_VARIABLE) && USX2Y_NRPACKS == 1) 57#if defined(USX2Y_NRPACKS_VARIABLE) || (!defined(USX2Y_NRPACKS_VARIABLE) && USX2Y_NRPACKS == 1)
@@ -234,7 +235,7 @@ static void i_usX2Y_usbpcm_urb_complete(struct urb *urb)
234 235
235 if (unlikely(atomic_read(&subs->state) < state_PREPARED)) { 236 if (unlikely(atomic_read(&subs->state) < state_PREPARED)) {
236 snd_printdd("hcd_frame=%i ep=%i%s status=%i start_frame=%i\n", 237 snd_printdd("hcd_frame=%i ep=%i%s status=%i start_frame=%i\n",
237 usb_get_current_frame_number(usX2Y->chip.dev), 238 usb_get_current_frame_number(usX2Y->dev),
238 subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out", 239 subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out",
239 urb->status, urb->start_frame); 240 urb->status, urb->start_frame);
240 return; 241 return;
@@ -318,7 +319,7 @@ static int usX2Y_usbpcm_urbs_allocate(struct snd_usX2Y_substream *subs)
318 int i; 319 int i;
319 unsigned int pipe; 320 unsigned int pipe;
320 int is_playback = subs == subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK]; 321 int is_playback = subs == subs->usX2Y->subs[SNDRV_PCM_STREAM_PLAYBACK];
321 struct usb_device *dev = subs->usX2Y->chip.dev; 322 struct usb_device *dev = subs->usX2Y->dev;
322 323
323 pipe = is_playback ? usb_sndisocpipe(dev, subs->endpoint) : 324 pipe = is_playback ? usb_sndisocpipe(dev, subs->endpoint) :
324 usb_rcvisocpipe(dev, subs->endpoint); 325 usb_rcvisocpipe(dev, subs->endpoint);
@@ -441,7 +442,7 @@ static int usX2Y_usbpcm_urbs_start(struct snd_usX2Y_substream *subs)
441 unsigned long pack; 442 unsigned long pack;
442 if (0 == u) 443 if (0 == u)
443 atomic_set(&subs->state, state_STARTING3); 444 atomic_set(&subs->state, state_STARTING3);
444 urb->dev = usX2Y->chip.dev; 445 urb->dev = usX2Y->dev;
445 urb->transfer_flags = URB_ISO_ASAP; 446 urb->transfer_flags = URB_ISO_ASAP;
446 for (pack = 0; pack < nr_of_packs(); pack++) { 447 for (pack = 0; pack < nr_of_packs(); pack++) {
447 urb->iso_frame_desc[pack].offset = subs->maxpacksize * (pack + u * nr_of_packs()); 448 urb->iso_frame_desc[pack].offset = subs->maxpacksize * (pack + u * nr_of_packs());
@@ -741,7 +742,7 @@ int usX2Y_hwdep_pcm_new(struct snd_card *card)
741 int err; 742 int err;
742 struct snd_hwdep *hw; 743 struct snd_hwdep *hw;
743 struct snd_pcm *pcm; 744 struct snd_pcm *pcm;
744 struct usb_device *dev = usX2Y(card)->chip.dev; 745 struct usb_device *dev = usX2Y(card)->dev;
745 if (1 != nr_of_packs()) 746 if (1 != nr_of_packs())
746 return 0; 747 return 0;
747 748