diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /sound/usb/usx2y | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (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.c | 158 | ||||
-rw-r--r-- | sound/usb/usx2y/us122l.h | 6 | ||||
-rw-r--r-- | sound/usb/usx2y/usX2Yhwdep.c | 9 | ||||
-rw-r--r-- | sound/usb/usx2y/usb_stream.c | 1 | ||||
-rw-r--r-- | sound/usb/usx2y/usbusx2y.c | 29 | ||||
-rw-r--r-- | sound/usb/usx2y/usbusx2y.h | 6 | ||||
-rw-r--r-- | sound/usb/usx2y/usbusx2yaudio.c | 35 | ||||
-rw-r--r-- | sound/usb/usx2y/usx2yhwdeppcm.c | 9 |
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 | |||
72 | static 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) | |||
179 | static int usb_stream_hwdep_release(struct snd_hwdep *hw, struct file *file) | 210 | static 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, | |||
264 | static void us122l_stop(struct us122l *us122l) | 302 | static 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; |
336 | out: | 374 | out: |
@@ -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) | |||
477 | static void snd_us122l_free(struct snd_card *card) | 527 | static 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, | |||
550 | static int snd_us122l_probe(struct usb_interface *intf, | 600 | static 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); |
666 | unlock: | 732 | unlock: |
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 | ||
5 | struct us122l { | 5 | struct 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 | ||
177 | static int usX2Y_create_alsa_devices(struct snd_card *card) | 178 | static 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 | ||
24 | struct usX2Ydev { | 24 | struct 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 | ||