Update of /cvsroot/alsa/alsa-kernel/usb
In directory usw-pr-cvs1:/tmp/cvs-serv10636

Modified Files:
        usbaudio.c usbaudio.h usbmidi.c 
Log Message:
- pass struct usb_interface pointer to the usb-midi parser.
  in usb-midi functions, this instance is used instead of parsing
  the interface from dev and ifnum.

- allocate the descriptor buffer only for parsing the audio device.

- clean up, new probe/disconnect callbacks for 2.4 API.



Index: usbaudio.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- usbaudio.c  4 Oct 2002 13:18:24 -0000       1.16
+++ usbaudio.c  4 Oct 2002 16:05:17 -0000       1.17
@@ -1308,12 +1308,10 @@
  * entry point for linux usb interface
  */
 
-static void * _usb_audio_probe(struct usb_device *dev, unsigned int ifnum,
-                             const struct usb_device_id *id);
-static void _usb_audio_disconnect(struct usb_device *dev, void *ptr);
 #ifdef OLD_USB
-#define usb_audio_probe                _usb_audio_probe
-#define usb_audio_disconnect   _usb_audio_disconnect
+static void * usb_audio_probe(struct usb_device *dev, unsigned int ifnum,
+                             const struct usb_device_id *id);
+static void usb_audio_disconnect(struct usb_device *dev, void *ptr);
 #else
 static int usb_audio_probe(struct usb_interface *intf,
                           const struct usb_device_id *id);
@@ -1828,7 +1826,8 @@
  * parse audio control descriptor and create pcm/midi streams
  */
 
-static int snd_usb_create_midi_interface(snd_usb_audio_t *chip, int ifnum,
+static int snd_usb_create_midi_interface(snd_usb_audio_t *chip,
+                                        struct usb_interface *iface,
                                         const snd_usb_audio_quirk_t *quirk);
 
 static int snd_usb_create_streams(snd_usb_audio_t *chip, int ctrlif,
@@ -1868,7 +1867,7 @@
                }
                if (iface->altsetting[0].bInterfaceClass == USB_CLASS_AUDIO &&
                    iface->altsetting[0].bInterfaceSubClass == 
USB_SUBCLASS_MIDI_STREAMING) {
-                       if (snd_usb_create_midi_interface(chip, j, NULL) < 0) {
+                       if (snd_usb_create_midi_interface(chip, iface, NULL) < 0) {
                                snd_printk(KERN_ERR "%d:%u:%d: cannot create sequencer 
device\n", dev->devnum, ctrlif, j);
                                continue;
                        }
@@ -1889,7 +1888,8 @@
        return 0;
 }
 
-static int snd_usb_create_midi_interface(snd_usb_audio_t *chip, int ifnum,
+static int snd_usb_create_midi_interface(snd_usb_audio_t *chip,
+                                        struct usb_interface *iface,
                                         const snd_usb_audio_quirk_t *quirk)
 {
 #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
@@ -1906,18 +1906,20 @@
        strcpy(seq_device->name, chip->card->shortname);
        umidi = (snd_usb_midi_t *)SNDRV_SEQ_DEVICE_ARGPTR(seq_device);
        umidi->chip = chip;
-       umidi->ifnum = ifnum;
+       umidi->iface = iface;
+       umidi->ifnum = iface->altsetting->bInterfaceNumber;
        umidi->quirk = quirk;
        umidi->seq_client = -1;
 #endif
        return 0;
 }
 
-static inline int snd_usb_create_quirk(snd_usb_audio_t *chip, int ifnum,
+static inline int snd_usb_create_quirk(snd_usb_audio_t *chip,
+                                      struct usb_interface *iface,
                                       const snd_usb_audio_quirk_t *quirk)
 {
        /* in the future, there may be quirks for PCM devices */
-       return snd_usb_create_midi_interface(chip, ifnum, quirk);
+       return snd_usb_create_midi_interface(chip, iface, quirk);
 }
 
 
@@ -2068,16 +2070,16 @@
  * only at the first time.  the successive calls of this function will
  * append the pcm interface to the corresponding card.
  */
-static void *_usb_audio_probe(struct usb_device *dev, unsigned int ifnum,
-                            const struct usb_device_id *id)
+static void *snd_usb_audio_probe(struct usb_device *dev,
+                                struct usb_interface *intf,
+                                const struct usb_device_id *id)
 {
        struct usb_config_descriptor *config = dev->actconfig;  
        const snd_usb_audio_quirk_t *quirk = (const snd_usb_audio_quirk_t 
*)id->driver_info;
-       unsigned char *buffer;
-       unsigned int index;
-       int i, buflen;
+       int i;
        snd_card_t *card;
        snd_usb_audio_t *chip;
+       int ifnum = intf->altsetting->bInterfaceNumber;
 
        if (quirk && quirk->ifnum != QUIRK_ANY_INTERFACE && ifnum != quirk->ifnum)
                goto __err_val;
@@ -2087,11 +2089,6 @@
                goto __err_val;
        }
 
-       index = dev->actconfig - config;
-       buflen = alloc_desc_buffer(dev, index, &buffer);
-       if (buflen <= 0)
-               goto __err_val;
-
        /*
         * found a config.  now register to ALSA
         */
@@ -2133,12 +2130,24 @@
        }
 
        if (!quirk) {
-               if (snd_usb_create_streams(chip, ifnum, buffer, buflen) < 0)
+               /* USB audio interface */
+               unsigned char *buffer;
+               unsigned int index;
+               int buflen;
+
+               index = dev->actconfig - config;
+               buflen = alloc_desc_buffer(dev, index, &buffer);
+               if (buflen <= 0)
                        goto __error;
-               if (snd_usb_create_mixer(chip, ifnum, buffer, buflen) < 0)
+               if (snd_usb_create_streams(chip, ifnum, buffer, buflen) < 0 ||
+                   snd_usb_create_mixer(chip, ifnum, buffer, buflen) < 0) {
+                       kfree(buffer);
                        goto __error;
+               }
+               kfree(buffer);
        } else {
-               if (snd_usb_create_quirk(chip, ifnum, quirk) < 0)
+               /* USB midi interface */
+               if (snd_usb_create_quirk(chip, intf, quirk) < 0)
                        goto __error;
        }
 
@@ -2151,12 +2160,10 @@
 
        chip->num_interfaces++;
        up(&register_mutex);
-       kfree(buffer);
        return chip;
 
  __error:
        up(&register_mutex);
-       kfree(buffer);
  __err_val:
        return NULL;
 }
@@ -2165,7 +2172,7 @@
  * we need to take care of counter, since disconnection can be called also
  * many times as well as usb_audio_probe(). 
  */
-static void _usb_audio_disconnect(struct usb_device *dev, void *ptr)
+static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
 {
        snd_usb_audio_t *chip;
 
@@ -2179,17 +2186,32 @@
 }
 
 
-#ifndef OLD_USB
+#ifdef OLD_USB
+
 /*
- * new 2.5 USB kernel API
+ * 2.4 USB kernel API
  */
+static void *usb_audio_probe(struct usb_device *dev, unsigned int ifnum,
+                            const struct usb_device_id *id)
+{
+       return snd_usb_audio_probe(dev, usb_ifnum_to_if(dev, ifnum), id);
+}
+
+static void usb_audio_disconnect(struct usb_device *dev, void *ptr)
+{
+       snd_usb_audio_disconnect(dev, ptr);
+}
 
+#else
+
+/*
+ * new 2.5 USB kernel API
+ */
 static int usb_audio_probe(struct usb_interface *intf,
                           const struct usb_device_id *id)
 {
        void *chip;
-       chip = _usb_audio_probe(interface_to_usbdev(intf),
-                               intf->altsetting->bInterfaceNumber, id);
+       chip = snd_usb_audio_probe(interface_to_usbdev(intf), intf, id);
        if (chip) {
                dev_set_drvdata(&intf->dev, chip);
                return 0;
@@ -2199,8 +2221,8 @@
 
 static void usb_audio_disconnect(struct usb_interface *intf)
 {
-       _usb_audio_disconnect(interface_to_usbdev(intf),
-                             dev_get_drvdata(&intf->dev));
+       snd_usb_audio_disconnect(interface_to_usbdev(intf),
+                                dev_get_drvdata(&intf->dev));
 }
 #endif
 

Index: usbaudio.h
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbaudio.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- usbaudio.h  4 Oct 2002 13:18:24 -0000       1.3
+++ usbaudio.h  4 Oct 2002 16:05:28 -0000       1.4
@@ -187,6 +187,7 @@
 struct snd_usb_midi {
        /* filled by usbaudio.c */
        snd_usb_audio_t *chip;
+       struct usb_interface *iface;
        int ifnum;
        const snd_usb_audio_quirk_t *quirk;
 

Index: usbmidi.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbmidi.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- usbmidi.c   4 Oct 2002 13:18:24 -0000       1.6
+++ usbmidi.c   4 Oct 2002 16:05:30 -0000       1.7
@@ -536,22 +536,6 @@
        snd_magic_kfree(ep);
 }
 
-#ifndef OLD_USB
-/* this code is not exported from USB core anymore */
-struct usb_interface *local_usb_ifnum_to_if(struct usb_device *dev, unsigned ifnum)
-{
-       int i;
-        
-       for (i = 0; i < dev->actconfig->bNumInterfaces; i++)
-               if (dev->actconfig->interface[i].altsetting[0].bInterfaceNumber == 
ifnum)
-                       return &dev->actconfig->interface[i];
-                                                        
-       return NULL;
-}
-#else
-#define local_usb_ifnum_to_if usb_ifnum_to_if
-#endif
-
 /*
  * For Roland devices, use the alternate setting which uses interrupt
  * transfers for input.
@@ -564,7 +548,7 @@
 
        if (umidi->chip->dev->descriptor.idVendor != 0x0582)
                return NULL;
-       intf = local_usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
+       intf = umidi->iface;
        if (!intf || intf->num_altsetting != 2)
                return NULL;
 
@@ -587,7 +571,7 @@
 
 static usb_endpoint_descriptor_t* snd_usbmidi_get_midiman_int_epd(snd_usb_midi_t* 
umidi)
 {
-       usb_interface_t* intf = local_usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
+       usb_interface_t* intf = umidi->iface;
        if (!intf)
                return NULL;
        return &intf->altsetting[0].endpoint[0];
@@ -919,7 +903,7 @@
        usb_ms_endpoint_descriptor_t* ms_ep;
        int i, epidx;
 
-       intf = local_usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
+       intf = umidi->iface;
        if (!intf)
                return -ENXIO;
        intfd = &intf->altsetting[0];
@@ -978,7 +962,7 @@
        usb_endpoint_descriptor_t* epd;
 
        if (endpoint->epnum == -1) {
-               intf = local_usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
+               intf = umidi->iface;
                if (!intf || intf->num_altsetting < 1)
                        return -ENOENT;
                intfd = intf->altsetting;
@@ -1000,7 +984,7 @@
        usb_interface_descriptor_t* intfd;
        uint8_t* cs_desc;
 
-       intf = local_usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
+       intf = umidi->iface;
        if (!intf)
                return -ENOENT;
        intfd = intf->altsetting;
@@ -1035,7 +1019,7 @@
        usb_endpoint_descriptor_t* epd;
        int cable, err;
 
-       intf = local_usb_ifnum_to_if(umidi->chip->dev, umidi->ifnum);
+       intf = umidi->iface;
        if (!intf)
                return -ENOENT;
        intfd = intf->altsetting;



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to