All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.