fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / usb / misc / emi62.c
index 6b11910..23153ea 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/usb.h>
+#include <linux/delay.h>
 
 #define MAX_INTEL_HEX_RECORD_LENGTH 16
 typedef struct _INTEL_HEX_RECORD
@@ -60,13 +61,12 @@ static void __exit emi62_exit (void);
 static int emi62_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request)
 {
        int result;
-       unsigned char *buffer =  kmalloc (length, GFP_KERNEL);
+       unsigned char *buffer =  kmemdup(data, length, GFP_KERNEL);
 
        if (!buffer) {
                err("emi62: kmalloc(%d) failed.", length);
                return -ENOMEM;
        }
-       memcpy (buffer, data, length);
        /* Note: usb_control_msg returns negative value on error or length of the
         *               data that was written! */
        result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300);
@@ -123,6 +123,7 @@ static int emi62_load_firmware (struct usb_device *dev)
 
        /* De-assert reset (let the CPU run) */
        err = emi62_set_reset(dev,0);
+       msleep(250);    /* let device settle */
 
        /* 2. We upload the FPGA firmware into the EMI
         * Note: collect up to 1023 (yes!) bytes and send them with
@@ -166,6 +167,7 @@ static int emi62_load_firmware (struct usb_device *dev)
                err("%s - error loading firmware: error = %d", __FUNCTION__, err);
                goto wraperr;
        }
+       msleep(250);    /* let device settle */
 
        /* 4. We put the part of the firmware that lies in the external RAM into the EZ-USB */
 
@@ -228,6 +230,9 @@ static int emi62_load_firmware (struct usb_device *dev)
                err("%s - error loading firmware: error = %d", __FUNCTION__, err);
                goto wraperr;
        }
+       msleep(250);    /* let device settle */
+
+       kfree(buf);
 
        /* return 1 to fail the driver inialization
         * and give real driver change to load */
@@ -253,10 +258,8 @@ static int emi62_probe(struct usb_interface *intf, const struct usb_device_id *i
 
        info("%s start", __FUNCTION__); 
 
-       if((dev->descriptor.idVendor == EMI62_VENDOR_ID) && (dev->descriptor.idProduct == EMI62_PRODUCT_ID)) {
-               emi62_load_firmware(dev);
-       }
-       
+       emi62_load_firmware(dev);
+
        /* do not return the driver context, let real audio driver do that */
        return -EIO;
 }
@@ -265,8 +268,7 @@ static void emi62_disconnect(struct usb_interface *intf)
 {
 }
 
-struct usb_driver emi62_driver = {
-       .owner          = THIS_MODULE,
+static struct usb_driver emi62_driver = {
        .name           = "emi62 - firmware loader",
        .probe          = emi62_probe,
        .disconnect     = emi62_disconnect,