USB: airprime: unlock mutex instead of trying to lock it again
[safe/jmp/linux-2.6] / drivers / usb / misc / emi62.c
index 189986a..1a2b79a 100644 (file)
@@ -1,7 +1,7 @@
 /* 
  * Emagic EMI 2|6 usb audio interface firmware loader.
  * Copyright (C) 2002
- *     Tapio Laxström (tapio.laxstrom@iptime.fi)
+ *     Tapio Laxström (tapio.laxstrom@iptime.fi)
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License, as published by
@@ -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);
@@ -78,7 +78,7 @@ static int emi62_writememory (struct usb_device *dev, int address, unsigned char
 static int emi62_set_reset (struct usb_device *dev, unsigned char reset_bit)
 {
        int response;
-       info("%s - %d", __FUNCTION__, reset_bit);
+       info("%s - %d", __func__, reset_bit);
        
        response = emi62_writememory (dev, CPUCS_REG, &reset_bit, 1, 0xa0);
        if (response < 0) {
@@ -100,7 +100,7 @@ static int emi62_load_firmware (struct usb_device *dev)
        dev_dbg(&dev->dev, "load_firmware\n");
        buf = kmalloc(FW_LOAD_SIZE, GFP_KERNEL);
        if (!buf) {
-               err( "%s - error loading firmware: error = %d", __FUNCTION__, -ENOMEM);
+               err( "%s - error loading firmware: error = %d", __func__, -ENOMEM);
                err = -ENOMEM;
                goto wraperr;
        }
@@ -108,7 +108,7 @@ static int emi62_load_firmware (struct usb_device *dev)
        /* Assert reset (stop the CPU in the EMI) */
        err = emi62_set_reset(dev,1);
        if (err < 0) {
-               err("%s - error loading firmware: error = %d", __FUNCTION__, err);
+               err("%s - error loading firmware: error = %d", __func__, err);
                goto wraperr;
        }
 
@@ -116,13 +116,18 @@ static int emi62_load_firmware (struct usb_device *dev)
        for (i=0; g_emi62_loader[i].type == 0; i++) {
                err = emi62_writememory(dev, g_emi62_loader[i].address, g_emi62_loader[i].data, g_emi62_loader[i].length, ANCHOR_LOAD_INTERNAL);
                if (err < 0) {
-                       err("%s - error loading firmware: error = %d", __FUNCTION__, err);
+                       err("%s - error loading firmware: error = %d", __func__, err);
                        goto wraperr;
                }
        }
 
        /* De-assert reset (let the CPU run) */
        err = emi62_set_reset(dev,0);
+       if (err < 0) {
+               err("%s - error loading firmware: error = %d", __func__, err);
+               goto wraperr;
+       }
+       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
@@ -139,7 +144,7 @@ static int emi62_load_firmware (struct usb_device *dev)
                }
                err = emi62_writememory(dev, addr, buf, i, ANCHOR_LOAD_FPGA);
                if (err < 0) {
-                       err("%s - error loading firmware: error = %d", __FUNCTION__, err);
+                       err("%s - error loading firmware: error = %d", __func__, err);
                        goto wraperr;
                }
        } while (i > 0);
@@ -147,7 +152,7 @@ static int emi62_load_firmware (struct usb_device *dev)
        /* Assert reset (stop the CPU in the EMI) */
        err = emi62_set_reset(dev,1);
        if (err < 0) {
-               err("%s - error loading firmware: error = %d", __FUNCTION__, err);
+               err("%s - error loading firmware: error = %d", __func__, err);
                goto wraperr;
        }
 
@@ -155,7 +160,7 @@ static int emi62_load_firmware (struct usb_device *dev)
        for (i=0; g_emi62_loader[i].type == 0; i++) {
                err = emi62_writememory(dev, g_emi62_loader[i].address, g_emi62_loader[i].data, g_emi62_loader[i].length, ANCHOR_LOAD_INTERNAL);
                if (err < 0) {
-                       err("%s - error loading firmware: error = %d", __FUNCTION__, err);
+                       err("%s - error loading firmware: error = %d", __func__, err);
                        goto wraperr;
                }
        }
@@ -163,9 +168,10 @@ static int emi62_load_firmware (struct usb_device *dev)
        /* De-assert reset (let the CPU run) */
        err = emi62_set_reset(dev,0);
        if (err < 0) {
-               err("%s - error loading firmware: error = %d", __FUNCTION__, err);
+               err("%s - error loading firmware: error = %d", __func__, 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 */
 
@@ -175,7 +181,7 @@ static int emi62_load_firmware (struct usb_device *dev)
                if (!INTERNAL_RAM(g_HexSpdifFw62[i].address)) {
                        err = emi62_writememory(dev, g_HexSpdifFw62[i].address, g_HexSpdifFw62[i].data, g_HexSpdifFw62[i].length, ANCHOR_LOAD_EXTERNAL);
                        if (err < 0) {
-                               err("%s - error loading firmware: error = %d", __FUNCTION__, err);
+                               err("%s - error loading firmware: error = %d", __func__, err);
                                goto wraperr;
                        }
                }
@@ -185,7 +191,7 @@ static int emi62_load_firmware (struct usb_device *dev)
                if (!INTERNAL_RAM(g_HexMidiFw62[i].address)) {
                        err = emi62_writememory(dev, g_HexMidiFw62[i].address, g_HexMidiFw62[i].data, g_HexMidiFw62[i].length, ANCHOR_LOAD_EXTERNAL);
                        if (err < 0) {
-                               err("%s - error loading firmware: error = %d\n", __FUNCTION__, err);
+                               err("%s - error loading firmware: error = %d\n", __func__, err);
                                goto wraperr;
                                return err;
                        }
@@ -195,7 +201,7 @@ static int emi62_load_firmware (struct usb_device *dev)
        /* Assert reset (stop the CPU in the EMI) */
        err = emi62_set_reset(dev,1);
        if (err < 0) {
-               err("%s - error loading firmware: error = %d", __FUNCTION__, err);
+               err("%s - error loading firmware: error = %d", __func__, err);
                goto wraperr;
        }
 
@@ -205,7 +211,7 @@ static int emi62_load_firmware (struct usb_device *dev)
                if (INTERNAL_RAM(g_HexSpdifFw62[i].address)) {
                        err = emi62_writememory(dev, g_HexSpdifFw62[i].address, g_HexSpdifFw62[i].data, g_HexSpdifFw62[i].length, ANCHOR_LOAD_INTERNAL);
                        if (err < 0) {
-                               err("%s - error loading firmware: error = %d", __FUNCTION__, err);
+                               err("%s - error loading firmware: error = %d", __func__, err);
                                goto wraperr;
                        }
                }
@@ -215,7 +221,7 @@ static int emi62_load_firmware (struct usb_device *dev)
                if (INTERNAL_RAM(g_HexMidiFw62[i].address)) {
                        err = emi62_writememory(dev, g_HexMidiFw62[i].address, g_HexMidiFw62[i].data, g_HexMidiFw62[i].length, ANCHOR_LOAD_INTERNAL);
                        if (err < 0) {
-                               err("%s - error loading firmware: error = %d\n", __FUNCTION__, err);
+                               err("%s - error loading firmware: error = %d\n", __func__, err);
                                goto wraperr;
                        }
                }
@@ -225,9 +231,10 @@ static int emi62_load_firmware (struct usb_device *dev)
        /* De-assert reset (let the CPU run) */
        err = emi62_set_reset(dev,0);
        if (err < 0) {
-               err("%s - error loading firmware: error = %d", __FUNCTION__, err);
+               err("%s - error loading firmware: error = %d", __func__, err);
                goto wraperr;
        }
+       msleep(250);    /* let device settle */
 
        kfree(buf);
 
@@ -253,7 +260,7 @@ static int emi62_probe(struct usb_interface *intf, const struct usb_device_id *i
        struct usb_device *dev = interface_to_usbdev(intf);
        dev_dbg(&intf->dev, "emi62_probe\n");
 
-       info("%s start", __FUNCTION__); 
+       info("%s start", __func__);
 
        emi62_load_firmware(dev);
 
@@ -266,7 +273,6 @@ static void emi62_disconnect(struct usb_interface *intf)
 }
 
 static struct usb_driver emi62_driver = {
-       .owner          = THIS_MODULE,
        .name           = "emi62 - firmware loader",
        .probe          = emi62_probe,
        .disconnect     = emi62_disconnect,
@@ -290,7 +296,7 @@ static void __exit emi62_exit (void)
 module_init(emi62_init);
 module_exit(emi62_exit);
 
-MODULE_AUTHOR("tapio laxström");
+MODULE_AUTHOR("Tapio Laxström");
 MODULE_DESCRIPTION("Emagic EMI 6|2m firmware loader.");
 MODULE_LICENSE("GPL");