* [PATCH] snd-usb-us122l: added support for US-144
@ 2009-09-22 1:49 Tobias Hansen
2009-09-22 13:14 ` Takashi Iwai
0 siblings, 1 reply; 9+ messages in thread
From: Tobias Hansen @ 2009-09-22 1:49 UTC (permalink / raw)
To: alsa-devel
[-- Attachment #1: Type: text/plain, Size: 651 bytes --]
Hi,
here is a patch that adds support for the Tascam US-144 to
snd-usb-us122l when uhci-hcd is used (ehci-hcd has to be disabled). With
ehci-hcd the US-144 behaves completely differently.
The difference between US-122L and US-144 on uhci-hcd is, that US-144
uses endpoints on two interfaces, while on US-122L all endpoints are on
one interface. US-122L should still work, but I don't have a US-122L to
test that.
Audio in and out and Midi in were tested with US-144 and work.
This is my first contribution to the linux kernel, so please have a
critical look on it. ;)
Taken against snd-usb-us122l 0.5 / alsa 1.0.20.
Regards,
Tobias Hansen
[-- Attachment #2: snd-usb-us122l_us144-support_v0.1.patch --]
[-- Type: text/x-patch, Size: 3709 bytes --]
diff -uNr a/sound/usb/usx2y/us122l.c b/sound/usb/usx2y/us122l.c
--- a/sound/usb/usx2y/us122l.c 2009-09-10 00:13:59.000000000 +0200
+++ b/sound/usb/usx2y/us122l.c 2009-09-22 03:01:24.162254000 +0200
@@ -66,6 +66,28 @@
iface, &quirk);
}
+static int us144_create_usbmidi(struct snd_card *card)
+{
+ static struct snd_usb_midi_endpoint_info quirk_data = {
+ .out_ep = 4,
+ .in_ep = 3,
+ .out_cables = 0x001,
+ .in_cables = 0x001
+ };
+ static struct snd_usb_audio_quirk quirk = {
+ .vendor_name = "US144",
+ .product_name = NAME_ALLCAPS,
+ .ifnum = 0,
+ .type = QUIRK_MIDI_US122L,
+ .data = &quirk_data
+ };
+ struct usb_device *dev = US122L(card)->chip.dev;
+ struct usb_interface *iface = usb_ifnum_to_if(dev, 0);
+
+ return snd_usb_create_midi_interface(&US122L(card)->chip,
+ iface, &quirk);
+}
+
/*
* Wrapper for usb_control_msg().
* Allocates a temp buffer to prevent dmaing from/to the stack.
@@ -171,6 +193,11 @@
if (!us122l->first)
us122l->first = file;
+
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ iface = usb_ifnum_to_if(us122l->chip.dev, 0);
+ usb_autopm_get_interface(iface);
+ }
iface = usb_ifnum_to_if(us122l->chip.dev, 1);
usb_autopm_get_interface(iface);
return 0;
@@ -179,8 +206,14 @@
static int usb_stream_hwdep_release(struct snd_hwdep *hw, struct file *file)
{
struct us122l *us122l = hw->private_data;
- struct usb_interface *iface = usb_ifnum_to_if(us122l->chip.dev, 1);
+ struct usb_interface *iface;
snd_printdd(KERN_DEBUG "%p %p\n", hw, file);
+
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ iface = usb_ifnum_to_if(us122l->chip.dev, 0);
+ usb_autopm_put_interface(iface);
+ }
+ iface = usb_ifnum_to_if(us122l->chip.dev, 1);
usb_autopm_put_interface(iface);
if (us122l->first == file)
us122l->first = NULL;
@@ -443,6 +476,13 @@
int err;
struct us122l *us122l = US122L(card);
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ err = usb_set_interface(us122l->chip.dev, 0, 1);
+ if (err) {
+ snd_printk(KERN_ERR "usb_set_interface error \n");
+ return false;
+ }
+ }
err = usb_set_interface(us122l->chip.dev, 1, 1);
if (err) {
snd_printk(KERN_ERR "usb_set_interface error \n");
@@ -455,7 +495,10 @@
if (!us122l_start(us122l, 44100, 256))
return false;
- err = us122l_create_usbmidi(card);
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144)
+ err = us144_create_usbmidi(card);
+ else
+ err = us122l_create_usbmidi(card);
if (err < 0) {
snd_printk(KERN_ERR "us122l_create_usbmidi error %i \n", err);
us122l_stop(us122l);
@@ -530,7 +573,7 @@
if (err < 0)
return err;
- snd_card_set_dev(card, &intf->dev);
+ snd_card_set_dev(card, &device->dev);
if (!us122l_create_card(card)) {
snd_card_free(card);
return -EINVAL;
@@ -642,6 +685,13 @@
mutex_lock(&us122l->mutex);
/* needed, doesn't restart without: */
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ err = usb_set_interface(us122l->chip.dev, 0, 1);
+ if (err) {
+ snd_printk(KERN_ERR "usb_set_interface error \n");
+ goto unlock;
+ }
+ }
err = usb_set_interface(us122l->chip.dev, 1, 1);
if (err) {
snd_printk(KERN_ERR "usb_set_interface error \n");
@@ -675,11 +725,11 @@
.idVendor = 0x0644,
.idProduct = USB_ID_US122L
},
-/* { */ /* US-144 maybe works when @USB1.1. Untested. */
-/* .match_flags = USB_DEVICE_ID_MATCH_DEVICE, */
-/* .idVendor = 0x0644, */
-/* .idProduct = USB_ID_US144 */
-/* }, */
+ { /* US-144 only works at USB1.1! Disable module ehci-hcd. */
+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
+ .idVendor = 0x0644,
+ .idProduct = USB_ID_US144
+ },
{ /* terminator */ }
};
[-- Attachment #3: Type: text/plain, Size: 160 bytes --]
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] snd-usb-us122l: added support for US-144
2009-09-22 1:49 [PATCH] snd-usb-us122l: added support for US-144 Tobias Hansen
@ 2009-09-22 13:14 ` Takashi Iwai
2009-09-22 13:56 ` Tobias Hansen
0 siblings, 1 reply; 9+ messages in thread
From: Takashi Iwai @ 2009-09-22 13:14 UTC (permalink / raw)
To: Tobias Hansen; +Cc: alsa-devel
At Tue, 22 Sep 2009 03:49:11 +0200,
Tobias Hansen wrote:
>
> @@ -443,6 +476,13 @@
> int err;
> struct us122l *us122l = US122L(card);
>
> + if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
> + err = usb_set_interface(us122l->chip.dev, 0, 1);
> + if (err) {
> + snd_printk(KERN_ERR "usb_set_interface error \n");
> + return false;
> + }
> + }
> err = usb_set_interface(us122l->chip.dev, 1, 1);
> if (err) {
> snd_printk(KERN_ERR "usb_set_interface error \n");
Strictly speaking, the first interface should be reset in the error
path...
> @@ -530,7 +573,7 @@
> if (err < 0)
> return err;
>
> - snd_card_set_dev(card, &intf->dev);
> + snd_card_set_dev(card, &device->dev);
> if (!us122l_create_card(card)) {
> snd_card_free(card);
> return -EINVAL;
Any reason to change this again?
This actually reverts the fix in the upstream:
3f5d3465be8f6e04f43d9b6d543fe28d4be07d78
ALSA: usx2y - reparent sound device
Also, please give your sign-off. See
$LINUX/Documentation/SubmittingPatches for details.
Could you repost with it?
thanks,
Takashi
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] snd-usb-us122l: added support for US-144
2009-09-22 13:14 ` Takashi Iwai
@ 2009-09-22 13:56 ` Tobias Hansen
2009-09-22 14:04 ` Takashi Iwai
0 siblings, 1 reply; 9+ messages in thread
From: Tobias Hansen @ 2009-09-22 13:56 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel
Takashi Iwai wrote:
> At Tue, 22 Sep 2009 03:49:11 +0200,
> Tobias Hansen wrote:
>
>> @@ -443,6 +476,13 @@
>> int err;
>> struct us122l *us122l = US122L(card);
>>
>> + if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
>> + err = usb_set_interface(us122l->chip.dev, 0, 1);
>> + if (err) {
>> + snd_printk(KERN_ERR "usb_set_interface error \n");
>> + return false;
>> + }
>> + }
>> err = usb_set_interface(us122l->chip.dev, 1, 1);
>> if (err) {
>> snd_printk(KERN_ERR "usb_set_interface error \n");
>>
>
> Strictly speaking, the first interface should be reset in the error
> path...
>
You mean setting it to alt_setting 0 in every error path? I can do that,
although alt_setting 0 is never used.
>
>> @@ -530,7 +573,7 @@
>> if (err < 0)
>> return err;
>>
>> - snd_card_set_dev(card, &intf->dev);
>> + snd_card_set_dev(card, &device->dev);
>> if (!us122l_create_card(card)) {
>> snd_card_free(card);
>> return -EINVAL;
>>
>
> Any reason to change this again?
> This actually reverts the fix in the upstream:
> 3f5d3465be8f6e04f43d9b6d543fe28d4be07d78
> ALSA: usx2y - reparent sound device
>
I don't know why to take one interface when US-144 uses two interfaces
at once. But I also don't know what this does anyhow.. Should I change
it back?
> Also, please give your sign-off. See
> $LINUX/Documentation/SubmittingPatches for details.
> Could you repost with it?
>
Ok. The driver now also checks if the US-144 is attached to USB 2 and
refuses to probe then.
--- linux-2.6/sound/usb/usx2y/us122l.c.orig 2009-09-10
00:13:59.000000000 +0200
+++ linux-2.6/sound/usb/usx2y/us122l.c 2009-09-22 15:08:34.666293000
+0200
@@ -66,6 +66,28 @@ static int us122l_create_usbmidi(struct
iface, &quirk);
}
+static int us144_create_usbmidi(struct snd_card *card)
+{
+ static struct snd_usb_midi_endpoint_info quirk_data = {
+ .out_ep = 4,
+ .in_ep = 3,
+ .out_cables = 0x001,
+ .in_cables = 0x001
+ };
+ static struct snd_usb_audio_quirk quirk = {
+ .vendor_name = "US144",
+ .product_name = NAME_ALLCAPS,
+ .ifnum = 0,
+ .type = QUIRK_MIDI_US122L,
+ .data = &quirk_data
+ };
+ struct usb_device *dev = US122L(card)->chip.dev;
+ struct usb_interface *iface = usb_ifnum_to_if(dev, 0);
+
+ return snd_usb_create_midi_interface(&US122L(card)->chip,
+ iface, &quirk);
+}
+
/*
* Wrapper for usb_control_msg().
* Allocates a temp buffer to prevent dmaing from/to the stack.
@@ -171,6 +193,11 @@ static int usb_stream_hwdep_open(struct
if (!us122l->first)
us122l->first = file;
+
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ iface = usb_ifnum_to_if(us122l->chip.dev, 0);
+ usb_autopm_get_interface(iface);
+ }
iface = usb_ifnum_to_if(us122l->chip.dev, 1);
usb_autopm_get_interface(iface);
return 0;
@@ -179,8 +206,14 @@ static int usb_stream_hwdep_open(struct
static int usb_stream_hwdep_release(struct snd_hwdep *hw, struct file
*file)
{
struct us122l *us122l = hw->private_data;
- struct usb_interface *iface = usb_ifnum_to_if(us122l->chip.dev, 1);
+ struct usb_interface *iface;
snd_printdd(KERN_DEBUG "%p %p\n", hw, file);
+
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ iface = usb_ifnum_to_if(us122l->chip.dev, 0);
+ usb_autopm_put_interface(iface);
+ }
+ iface = usb_ifnum_to_if(us122l->chip.dev, 1);
usb_autopm_put_interface(iface);
if (us122l->first == file)
us122l->first = NULL;
@@ -443,6 +476,13 @@ static bool us122l_create_card(struct sn
int err;
struct us122l *us122l = US122L(card);
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ err = usb_set_interface(us122l->chip.dev, 0, 1);
+ if (err) {
+ snd_printk(KERN_ERR "usb_set_interface error \n");
+ return false;
+ }
+ }
err = usb_set_interface(us122l->chip.dev, 1, 1);
if (err) {
snd_printk(KERN_ERR "usb_set_interface error \n");
@@ -455,7 +495,10 @@ static bool us122l_create_card(struct sn
if (!us122l_start(us122l, 44100, 256))
return false;
- err = us122l_create_usbmidi(card);
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144)
+ err = us144_create_usbmidi(card);
+ else
+ err = us122l_create_usbmidi(card);
if (err < 0) {
snd_printk(KERN_ERR "us122l_create_usbmidi error %i \n", err);
us122l_stop(us122l);
@@ -518,11 +561,10 @@ static int usx2y_create_card(struct usb_
return 0;
}
-static int us122l_usb_probe(struct usb_interface *intf,
+static int us122l_usb_probe(struct usb_device *device,
const struct usb_device_id *device_id,
struct snd_card **cardp)
{
- struct usb_device *device = interface_to_usbdev(intf);
struct snd_card *card;
int err;
@@ -530,7 +572,7 @@ static int us122l_usb_probe(struct usb_i
if (err < 0)
return err;
- snd_card_set_dev(card, &intf->dev);
+ snd_card_set_dev(card, &device->dev);
if (!us122l_create_card(card)) {
snd_card_free(card);
return -EINVAL;
@@ -542,7 +584,8 @@ static int us122l_usb_probe(struct usb_i
return err;
}
- usb_get_dev(device);
+ usb_get_intf(usb_ifnum_to_if(device, 0));
+ usb_get_intf(usb_ifnum_to_if(device, 1));
*cardp = card;
return 0;
}
@@ -550,17 +593,24 @@ static int us122l_usb_probe(struct usb_i
static int snd_us122l_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
+ struct usb_device *device = interface_to_usbdev(intf);
struct snd_card *card;
int err;
+
+ if (device->descriptor.idProduct == USB_ID_US144
+ && device->speed == USB_SPEED_HIGH) {
+ snd_printk(KERN_ERR "disable ehci-hcd to run US-144 \n");
+ return -ENOENT;
+ }
snd_printdd(KERN_DEBUG"%p:%i\n",
intf, intf->cur_altsetting->desc.bInterfaceNumber);
if (intf->cur_altsetting->desc.bInterfaceNumber != 1)
return 0;
- err = us122l_usb_probe(usb_get_intf(intf), id, &card);
+ err = us122l_usb_probe(usb_get_dev(device), id, &card);
if (err < 0) {
- usb_put_intf(intf);
+ usb_put_dev(device);
return err;
}
@@ -591,7 +641,8 @@ static void snd_us122l_disconnect(struct
snd_usbmidi_disconnect(p);
}
- usb_put_intf(intf);
+ usb_put_intf(usb_ifnum_to_if(us122l->chip.dev, 0));
+ usb_put_intf(usb_ifnum_to_if(us122l->chip.dev, 1));
usb_put_dev(us122l->chip.dev);
while (atomic_read(&us122l->mmap_count))
@@ -642,6 +693,13 @@ static int snd_us122l_resume(struct usb_
mutex_lock(&us122l->mutex);
/* needed, doesn't restart without: */
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ err = usb_set_interface(us122l->chip.dev, 0, 1);
+ if (err) {
+ snd_printk(KERN_ERR "usb_set_interface error \n");
+ goto unlock;
+ }
+ }
err = usb_set_interface(us122l->chip.dev, 1, 1);
if (err) {
snd_printk(KERN_ERR "usb_set_interface error \n");
@@ -675,11 +733,11 @@ static struct usb_device_id snd_us122l_u
.idVendor = 0x0644,
.idProduct = USB_ID_US122L
},
-/* { */ /* US-144 maybe works when @USB1.1. Untested. */
-/* .match_flags = USB_DEVICE_ID_MATCH_DEVICE, */
-/* .idVendor = 0x0644, */
-/* .idProduct = USB_ID_US144 */
-/* }, */
+ { /* US-144 only works at USB1.1! Disable module ehci-hcd. */
+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
+ .idVendor = 0x0644,
+ .idProduct = USB_ID_US144
+ },
{ /* terminator */ }
};
Signed-off-by: Tobias Hansen <Tobias.Hansen@physik.uni-hamburg.de>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] snd-usb-us122l: added support for US-144
2009-09-22 13:56 ` Tobias Hansen
@ 2009-09-22 14:04 ` Takashi Iwai
2009-09-22 14:52 ` Tobias Hansen
0 siblings, 1 reply; 9+ messages in thread
From: Takashi Iwai @ 2009-09-22 14:04 UTC (permalink / raw)
To: Tobias Hansen; +Cc: alsa-devel
At Tue, 22 Sep 2009 15:56:03 +0200,
Tobias Hansen wrote:
>
> Takashi Iwai wrote:
> > At Tue, 22 Sep 2009 03:49:11 +0200,
> > Tobias Hansen wrote:
> >
> >> @@ -443,6 +476,13 @@
> >> int err;
> >> struct us122l *us122l = US122L(card);
> >>
> >> + if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
> >> + err = usb_set_interface(us122l->chip.dev, 0, 1);
> >> + if (err) {
> >> + snd_printk(KERN_ERR "usb_set_interface error \n");
> >> + return false;
> >> + }
> >> + }
> >> err = usb_set_interface(us122l->chip.dev, 1, 1);
> >> if (err) {
> >> snd_printk(KERN_ERR "usb_set_interface error \n");
> >>
> >
> > Strictly speaking, the first interface should be reset in the error
> > path...
> >
> You mean setting it to alt_setting 0 in every error path? I can do that,
> although alt_setting 0 is never used.
> >
> >> @@ -530,7 +573,7 @@
> >> if (err < 0)
> >> return err;
> >>
> >> - snd_card_set_dev(card, &intf->dev);
> >> + snd_card_set_dev(card, &device->dev);
> >> if (!us122l_create_card(card)) {
> >> snd_card_free(card);
> >> return -EINVAL;
> >>
> >
> > Any reason to change this again?
> > This actually reverts the fix in the upstream:
> > 3f5d3465be8f6e04f43d9b6d543fe28d4be07d78
> > ALSA: usx2y - reparent sound device
> >
> I don't know why to take one interface when US-144 uses two interfaces
> at once. But I also don't know what this does anyhow.. Should I change
> it back?
Yes. Udev requires that the card instance to be the child of usb
interface.
> > Also, please give your sign-off. See
> > $LINUX/Documentation/SubmittingPatches for details.
> > Could you repost with it?
> >
> Ok. The driver now also checks if the US-144 is attached to USB 2 and
> refuses to probe then.
Read the document above again :)
The right patch format consists of a summary line, the change log
texts, your sign-off, then the patch body.
thanks,
Takashi
>
>
>
> --- linux-2.6/sound/usb/usx2y/us122l.c.orig 2009-09-10
> 00:13:59.000000000 +0200
> +++ linux-2.6/sound/usb/usx2y/us122l.c 2009-09-22 15:08:34.666293000
> +0200
> @@ -66,6 +66,28 @@ static int us122l_create_usbmidi(struct
> iface, &quirk);
> }
>
> +static int us144_create_usbmidi(struct snd_card *card)
> +{
> + static struct snd_usb_midi_endpoint_info quirk_data = {
> + .out_ep = 4,
> + .in_ep = 3,
> + .out_cables = 0x001,
> + .in_cables = 0x001
> + };
> + static struct snd_usb_audio_quirk quirk = {
> + .vendor_name = "US144",
> + .product_name = NAME_ALLCAPS,
> + .ifnum = 0,
> + .type = QUIRK_MIDI_US122L,
> + .data = &quirk_data
> + };
> + struct usb_device *dev = US122L(card)->chip.dev;
> + struct usb_interface *iface = usb_ifnum_to_if(dev, 0);
> +
> + return snd_usb_create_midi_interface(&US122L(card)->chip,
> + iface, &quirk);
> +}
> +
> /*
> * Wrapper for usb_control_msg().
> * Allocates a temp buffer to prevent dmaing from/to the stack.
> @@ -171,6 +193,11 @@ static int usb_stream_hwdep_open(struct
>
> if (!us122l->first)
> us122l->first = file;
> +
> + if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
> + iface = usb_ifnum_to_if(us122l->chip.dev, 0);
> + usb_autopm_get_interface(iface);
> + }
> iface = usb_ifnum_to_if(us122l->chip.dev, 1);
> usb_autopm_get_interface(iface);
> return 0;
> @@ -179,8 +206,14 @@ static int usb_stream_hwdep_open(struct
> static int usb_stream_hwdep_release(struct snd_hwdep *hw, struct file
> *file)
> {
> struct us122l *us122l = hw->private_data;
> - struct usb_interface *iface = usb_ifnum_to_if(us122l->chip.dev, 1);
> + struct usb_interface *iface;
> snd_printdd(KERN_DEBUG "%p %p\n", hw, file);
> +
> + if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
> + iface = usb_ifnum_to_if(us122l->chip.dev, 0);
> + usb_autopm_put_interface(iface);
> + }
> + iface = usb_ifnum_to_if(us122l->chip.dev, 1);
> usb_autopm_put_interface(iface);
> if (us122l->first == file)
> us122l->first = NULL;
> @@ -443,6 +476,13 @@ static bool us122l_create_card(struct sn
> int err;
> struct us122l *us122l = US122L(card);
>
> + if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
> + err = usb_set_interface(us122l->chip.dev, 0, 1);
> + if (err) {
> + snd_printk(KERN_ERR "usb_set_interface error \n");
> + return false;
> + }
> + }
> err = usb_set_interface(us122l->chip.dev, 1, 1);
> if (err) {
> snd_printk(KERN_ERR "usb_set_interface error \n");
> @@ -455,7 +495,10 @@ static bool us122l_create_card(struct sn
> if (!us122l_start(us122l, 44100, 256))
> return false;
>
> - err = us122l_create_usbmidi(card);
> + if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144)
> + err = us144_create_usbmidi(card);
> + else
> + err = us122l_create_usbmidi(card);
> if (err < 0) {
> snd_printk(KERN_ERR "us122l_create_usbmidi error %i \n", err);
> us122l_stop(us122l);
> @@ -518,11 +561,10 @@ static int usx2y_create_card(struct usb_
> return 0;
> }
>
> -static int us122l_usb_probe(struct usb_interface *intf,
> +static int us122l_usb_probe(struct usb_device *device,
> const struct usb_device_id *device_id,
> struct snd_card **cardp)
> {
> - struct usb_device *device = interface_to_usbdev(intf);
> struct snd_card *card;
> int err;
>
> @@ -530,7 +572,7 @@ static int us122l_usb_probe(struct usb_i
> if (err < 0)
> return err;
>
> - snd_card_set_dev(card, &intf->dev);
> + snd_card_set_dev(card, &device->dev);
> if (!us122l_create_card(card)) {
> snd_card_free(card);
> return -EINVAL;
> @@ -542,7 +584,8 @@ static int us122l_usb_probe(struct usb_i
> return err;
> }
>
> - usb_get_dev(device);
> + usb_get_intf(usb_ifnum_to_if(device, 0));
> + usb_get_intf(usb_ifnum_to_if(device, 1));
> *cardp = card;
> return 0;
> }
> @@ -550,17 +593,24 @@ static int us122l_usb_probe(struct usb_i
> static int snd_us122l_probe(struct usb_interface *intf,
> const struct usb_device_id *id)
> {
> + struct usb_device *device = interface_to_usbdev(intf);
> struct snd_card *card;
> int err;
> +
> + if (device->descriptor.idProduct == USB_ID_US144
> + && device->speed == USB_SPEED_HIGH) {
> + snd_printk(KERN_ERR "disable ehci-hcd to run US-144 \n");
> + return -ENOENT;
> + }
>
> snd_printdd(KERN_DEBUG"%p:%i\n",
> intf, intf->cur_altsetting->desc.bInterfaceNumber);
> if (intf->cur_altsetting->desc.bInterfaceNumber != 1)
> return 0;
>
> - err = us122l_usb_probe(usb_get_intf(intf), id, &card);
> + err = us122l_usb_probe(usb_get_dev(device), id, &card);
> if (err < 0) {
> - usb_put_intf(intf);
> + usb_put_dev(device);
> return err;
> }
>
> @@ -591,7 +641,8 @@ static void snd_us122l_disconnect(struct
> snd_usbmidi_disconnect(p);
> }
>
> - usb_put_intf(intf);
> + usb_put_intf(usb_ifnum_to_if(us122l->chip.dev, 0));
> + usb_put_intf(usb_ifnum_to_if(us122l->chip.dev, 1));
> usb_put_dev(us122l->chip.dev);
>
> while (atomic_read(&us122l->mmap_count))
> @@ -642,6 +693,13 @@ static int snd_us122l_resume(struct usb_
>
> mutex_lock(&us122l->mutex);
> /* needed, doesn't restart without: */
> + if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
> + err = usb_set_interface(us122l->chip.dev, 0, 1);
> + if (err) {
> + snd_printk(KERN_ERR "usb_set_interface error \n");
> + goto unlock;
> + }
> + }
> err = usb_set_interface(us122l->chip.dev, 1, 1);
> if (err) {
> snd_printk(KERN_ERR "usb_set_interface error \n");
> @@ -675,11 +733,11 @@ static struct usb_device_id snd_us122l_u
> .idVendor = 0x0644,
> .idProduct = USB_ID_US122L
> },
> -/* { */ /* US-144 maybe works when @USB1.1. Untested. */
> -/* .match_flags = USB_DEVICE_ID_MATCH_DEVICE, */
> -/* .idVendor = 0x0644, */
> -/* .idProduct = USB_ID_US144 */
> -/* }, */
> + { /* US-144 only works at USB1.1! Disable module ehci-hcd. */
> + .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
> + .idVendor = 0x0644,
> + .idProduct = USB_ID_US144
> + },
> { /* terminator */ }
> };
>
> Signed-off-by: Tobias Hansen <Tobias.Hansen@physik.uni-hamburg.de>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] snd-usb-us122l: added support for US-144
2009-09-22 14:04 ` Takashi Iwai
@ 2009-09-22 14:52 ` Tobias Hansen
2009-09-22 20:14 ` Takashi Iwai
0 siblings, 1 reply; 9+ messages in thread
From: Tobias Hansen @ 2009-09-22 14:52 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel
Takashi Iwai wrote:
>
> Yes. Udev requires that the card instance to be the child of usb
> interface.
>
Ok, done.
>
> Read the document above again :)
> The right patch format consists of a summary line, the change log
> texts, your sign-off, then the patch body.
>
Ok, here is the next try. ;) I didn't find very precise instructions on
the patch format, so if it is still not good, please tell me what to change.
snd-usb-us122l: add support for US-144
Adds support for US-144 when attached on USB1.1.
Unlike the US-122L it uses both USB interfaces 0 and 1.
Signed-off-by: Tobias Hansen <Tobias.Hansen@physik.uni-hamburg.de>
---
--- linux-2.6/sound/usb/usx2y/us122l.c.orig 2009-09-10 00:13:59.000000000 +0200
+++ linux-2.6/sound/usb/usx2y/us122l.c 2009-09-22 16:15:53.166294000 +0200
@@ -66,6 +66,28 @@ static int us122l_create_usbmidi(struct
iface, &quirk);
}
+static int us144_create_usbmidi(struct snd_card *card)
+{
+ static struct snd_usb_midi_endpoint_info quirk_data = {
+ .out_ep = 4,
+ .in_ep = 3,
+ .out_cables = 0x001,
+ .in_cables = 0x001
+ };
+ static struct snd_usb_audio_quirk quirk = {
+ .vendor_name = "US144",
+ .product_name = NAME_ALLCAPS,
+ .ifnum = 0,
+ .type = QUIRK_MIDI_US122L,
+ .data = &quirk_data
+ };
+ struct usb_device *dev = US122L(card)->chip.dev;
+ struct usb_interface *iface = usb_ifnum_to_if(dev, 0);
+
+ return snd_usb_create_midi_interface(&US122L(card)->chip,
+ iface, &quirk);
+}
+
/*
* Wrapper for usb_control_msg().
* Allocates a temp buffer to prevent dmaing from/to the stack.
@@ -171,6 +193,11 @@ static int usb_stream_hwdep_open(struct
if (!us122l->first)
us122l->first = file;
+
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ iface = usb_ifnum_to_if(us122l->chip.dev, 0);
+ usb_autopm_get_interface(iface);
+ }
iface = usb_ifnum_to_if(us122l->chip.dev, 1);
usb_autopm_get_interface(iface);
return 0;
@@ -179,8 +206,14 @@ static int usb_stream_hwdep_open(struct
static int usb_stream_hwdep_release(struct snd_hwdep *hw, struct file *file)
{
struct us122l *us122l = hw->private_data;
- struct usb_interface *iface = usb_ifnum_to_if(us122l->chip.dev, 1);
+ struct usb_interface *iface;
snd_printdd(KERN_DEBUG "%p %p\n", hw, file);
+
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ iface = usb_ifnum_to_if(us122l->chip.dev, 0);
+ usb_autopm_put_interface(iface);
+ }
+ iface = usb_ifnum_to_if(us122l->chip.dev, 1);
usb_autopm_put_interface(iface);
if (us122l->first == file)
us122l->first = NULL;
@@ -443,6 +476,13 @@ static bool us122l_create_card(struct sn
int err;
struct us122l *us122l = US122L(card);
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ err = usb_set_interface(us122l->chip.dev, 0, 1);
+ if (err) {
+ snd_printk(KERN_ERR "usb_set_interface error \n");
+ return false;
+ }
+ }
err = usb_set_interface(us122l->chip.dev, 1, 1);
if (err) {
snd_printk(KERN_ERR "usb_set_interface error \n");
@@ -455,7 +495,10 @@ static bool us122l_create_card(struct sn
if (!us122l_start(us122l, 44100, 256))
return false;
- err = us122l_create_usbmidi(card);
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144)
+ err = us144_create_usbmidi(card);
+ else
+ err = us122l_create_usbmidi(card);
if (err < 0) {
snd_printk(KERN_ERR "us122l_create_usbmidi error %i \n", err);
us122l_stop(us122l);
@@ -542,6 +585,7 @@ static int us122l_usb_probe(struct usb_i
return err;
}
+ usb_get_intf(usb_ifnum_to_if(device, 0));
usb_get_dev(device);
*cardp = card;
return 0;
@@ -550,8 +594,15 @@ static int us122l_usb_probe(struct usb_i
static int snd_us122l_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
+ struct usb_device *device = interface_to_usbdev(intf);
struct snd_card *card;
int err;
+
+ if (device->descriptor.idProduct == USB_ID_US144
+ && device->speed == USB_SPEED_HIGH) {
+ snd_printk(KERN_ERR "disable ehci-hcd to run US-144 \n");
+ return -ENOENT;
+ }
snd_printdd(KERN_DEBUG"%p:%i\n",
intf, intf->cur_altsetting->desc.bInterfaceNumber);
@@ -591,7 +642,8 @@ static void snd_us122l_disconnect(struct
snd_usbmidi_disconnect(p);
}
- usb_put_intf(intf);
+ usb_put_intf(usb_ifnum_to_if(us122l->chip.dev, 0));
+ usb_put_intf(usb_ifnum_to_if(us122l->chip.dev, 1));
usb_put_dev(us122l->chip.dev);
while (atomic_read(&us122l->mmap_count))
@@ -642,6 +694,13 @@ static int snd_us122l_resume(struct usb_
mutex_lock(&us122l->mutex);
/* needed, doesn't restart without: */
+ if (us122l->chip.dev->descriptor.idProduct == USB_ID_US144) {
+ err = usb_set_interface(us122l->chip.dev, 0, 1);
+ if (err) {
+ snd_printk(KERN_ERR "usb_set_interface error \n");
+ goto unlock;
+ }
+ }
err = usb_set_interface(us122l->chip.dev, 1, 1);
if (err) {
snd_printk(KERN_ERR "usb_set_interface error \n");
@@ -675,11 +734,11 @@ static struct usb_device_id snd_us122l_u
.idVendor = 0x0644,
.idProduct = USB_ID_US122L
},
-/* { */ /* US-144 maybe works when @USB1.1. Untested. */
-/* .match_flags = USB_DEVICE_ID_MATCH_DEVICE, */
-/* .idVendor = 0x0644, */
-/* .idProduct = USB_ID_US144 */
-/* }, */
+ { /* US-144 only works at USB1.1! Disable module ehci-hcd. */
+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
+ .idVendor = 0x0644,
+ .idProduct = USB_ID_US144
+ },
{ /* terminator */ }
};
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] snd-usb-us122l: added support for US-144
2009-09-22 14:52 ` Tobias Hansen
@ 2009-09-22 20:14 ` Takashi Iwai
0 siblings, 0 replies; 9+ messages in thread
From: Takashi Iwai @ 2009-09-22 20:14 UTC (permalink / raw)
To: Tobias Hansen; +Cc: alsa-devel
At Tue, 22 Sep 2009 16:52:08 +0200,
Tobias Hansen wrote:
>
> Takashi Iwai wrote:
> >
> > Yes. Udev requires that the card instance to be the child of usb
> > interface.
> >
> Ok, done.
> >
> > Read the document above again :)
> > The right patch format consists of a summary line, the change log
> > texts, your sign-off, then the patch body.
> >
> Ok, here is the next try. ;) I didn't find very precise instructions on
> the patch format, so if it is still not good, please tell me what to change.
>
>
>
> snd-usb-us122l: add support for US-144
>
> Adds support for US-144 when attached on USB1.1.
> Unlike the US-122L it uses both USB interfaces 0 and 1.
>
> Signed-off-by: Tobias Hansen <Tobias.Hansen@physik.uni-hamburg.de>
Thanks, now applied.
Takashi
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] snd-usb-us122l: added support for US-144
@ 2009-10-12 14:33 Tobias Hansen
0 siblings, 0 replies; 9+ messages in thread
From: Tobias Hansen @ 2009-10-12 14:33 UTC (permalink / raw)
To: ericluiggi; +Cc: alsa-devel
At Sun, 27 Sep 2009 10:40:24 -0700,
Eric Luiggi wrote:
>
>
> Hi Tobias,
>
> I'd like to get my US-144 interface working on jaunty and am willing to
> help out with testing for this US-144 solution. Please send patch
> instructions.
Hi,
here are installation instructions: http://wiki.ubuntuusers.de/Benutzer/BigMc/Tascam_US-144
Regards, Tobias
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] snd-usb-us122l: added support for US-144
2009-09-27 17:40 Eric Luiggi
@ 2009-09-29 7:24 ` Takashi Iwai
0 siblings, 0 replies; 9+ messages in thread
From: Takashi Iwai @ 2009-09-29 7:24 UTC (permalink / raw)
To: Eric Luiggi; +Cc: alsa-devel
At Sun, 27 Sep 2009 10:40:24 -0700,
Eric Luiggi wrote:
>
>
> Hi Tobias,
>
> I'd like to get my US-144 interface working on jaunty and am willing to
> help out with testing for this US-144 solution. Please send patch
> instructions.
It's already merged into sound git tree, thus you can use alsa-driver-snapshot
tarball below for testing.
ftp://ftp.kernel.org/pub/linux/kernel/people/tiwai/snapshot/alsa-driver-snapshot.tar.gz
thanks,
Takashi
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] snd-usb-us122l: added support for US-144
@ 2009-09-27 17:40 Eric Luiggi
2009-09-29 7:24 ` Takashi Iwai
0 siblings, 1 reply; 9+ messages in thread
From: Eric Luiggi @ 2009-09-27 17:40 UTC (permalink / raw)
To: alsa-devel
Hi Tobias,
I'd like to get my US-144 interface working on jaunty and am willing to
help out with testing for this US-144 solution. Please send patch
instructions.
Thanks,
Eric
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2009-10-12 14:32 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-22 1:49 [PATCH] snd-usb-us122l: added support for US-144 Tobias Hansen
2009-09-22 13:14 ` Takashi Iwai
2009-09-22 13:56 ` Tobias Hansen
2009-09-22 14:04 ` Takashi Iwai
2009-09-22 14:52 ` Tobias Hansen
2009-09-22 20:14 ` Takashi Iwai
2009-09-27 17:40 Eric Luiggi
2009-09-29 7:24 ` Takashi Iwai
2009-10-12 14:33 Tobias Hansen
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.