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(®ister_mutex);
- kfree(buffer);
return chip;
__error:
up(®ister_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