patch-2.2.7 linux/drivers/usb/audio.c
Next file: linux/drivers/usb/hub.c
Previous file: linux/drivers/usb/README.ohci
Back to the patch index
Back to the overall index
- Lines: 127
- Date:
Wed Apr 28 11:14:03 1999
- Orig file:
v2.2.6/linux/drivers/usb/audio.c
- Orig date:
Wed Dec 31 16:00:00 1969
diff -u --recursive --new-file v2.2.6/linux/drivers/usb/audio.c linux/drivers/usb/audio.c
@@ -0,0 +1,126 @@
+#include <linux/kernel.h>
+#include <linux/malloc.h>
+#include <linux/string.h>
+#include <linux/timer.h>
+#include <linux/sched.h>
+#include "usb.h"
+
+static int usb_audio_probe(struct usb_device *dev);
+static void usb_audio_disconnect(struct usb_device *dev);
+static LIST_HEAD(usb_audio_list);
+
+struct usb_audio
+{
+ struct usb_device *dev;
+ struct list_head list;
+};
+
+static struct usb_driver usb_audio_driver =
+{
+ "audio",
+ usb_audio_probe,
+ usb_audio_disconnect,
+ {NULL, NULL}
+};
+
+
+static int usb_audio_irq(int state, void *buffer, void *dev_id)
+{
+ struct usb_audio *aud = (struct usb_audio*) dev_id;
+ return 1;
+}
+
+static int usb_audio_probe(struct usb_device *dev)
+{
+ struct usb_interface_descriptor *interface;
+ struct usb_endpoint_descriptor *endpoint;
+ struct usb_audio *aud;
+
+ int i;
+ int na=0;
+
+ interface = &dev->config[0].interface[0];
+
+ for(i=0;i<dev->config[0].bNumInterfaces;i++)
+ {
+ int x;
+
+ endpoint = &interface->endpoint[i];
+
+ if(interface->bInterfaceClass != 1)
+ continue;
+
+ printk(KERN_INFO "USB audio device detected.\n");
+
+ switch(interface->bInterfaceSubClass)
+ {
+ case 0x01:
+ printk(KERN_INFO "audio: Control device.\n");
+ break;
+ case 0x02:
+ printk(KERN_INFO "audio: streaming.\n");
+ break;
+ case 0x03:
+ printk(KERN_INFO "audio: nonstreaming.\n");
+ break;
+ }
+ na++;
+ }
+
+ if(na==0)
+ return -1;
+
+ aud = kmalloc(sizeof(struct usb_audio), GFP_KERNEL);
+ if(aud)
+ {
+ memset(aud, 0, sizeof(*aud));
+ aud->dev = dev;
+ dev->private = aud;
+
+ endpoint = &interface->endpoint[0];
+
+// usb_set_configuration(dev, dev->config[0].bConfigurationValue);
+// usb_set_protocol(dev, 0);
+// usb_set_idle(dev, 0, 0);
+
+ usb_request_irq(dev,
+ usb_rcvctrlpipe(dev, endpoint->bEndpointAddress),
+ usb_audio_irq,
+ endpoint->bInterval,
+ aud);
+
+ list_add(&aud->list, &usb_audio_list);
+ }
+ return 0;
+}
+
+static void usb_audio_disconnect(struct usb_device *dev)
+{
+ struct usb_audio *aud = (struct usb_audio*) dev->private;
+ if(aud)
+ {
+ dev->private = NULL;
+ list_del(&aud->list);
+ kfree(aud);
+ }
+ printk(KERN_INFO "USB audio driver removed.\n");
+}
+
+int usb_audio_init(void)
+{
+ usb_register(&usb_audio_driver);
+ return 0;
+}
+
+/*
+ * Support functions for parsing
+ */
+
+void usb_audio_interface(struct usb_interface_descriptor *interface, u8 *data)
+{
+}
+
+void usb_audio_endpoint(struct usb_endpoint_descriptor *interface, u8 *data)
+{
+}
+
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)