]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/usb/misc/cypress_cy7c63.c
USB: option: Add Kyocera KPC680 ids
[linux-2.6-omap-h63xx.git] / drivers / usb / misc / cypress_cy7c63.c
index 9c46746d5d002ab0881918e39ab363f71a4fb926..937940404b7a316600aff66c83e1d36372b81405 100644 (file)
@@ -1,7 +1,7 @@
 /*
 * cypress_cy7c63.c
 *
-* Copyright (c) 2006 Oliver Bock (o.bock@fh-wolfenbuettel.de)
+* Copyright (c) 2006-2007 Oliver Bock (bock@tfh-berlin.de)
 *
 *      This driver is based on the Cypress USB Driver by Marcus Maul
 *      (cyport) and the 2.0 version of Greg Kroah-Hartman's
@@ -21,6 +21,9 @@
 *      Supported functions:    Read/Write Ports
 *
 *
+*      For up-to-date information please visit:
+*      http://www.obock.de/kernel/cypress
+*
 *      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 the Free Software Foundation, version 2.
@@ -31,7 +34,7 @@
 #include <linux/kernel.h>
 #include <linux/usb.h>
 
-#define DRIVER_AUTHOR          "Oliver Bock (o.bock@fh-wolfenbuettel.de)"
+#define DRIVER_AUTHOR          "Oliver Bock (bock@tfh-berlin.de)"
 #define DRIVER_DESC            "Cypress CY7C63xxx USB driver"
 
 #define CYPRESS_VENDOR_ID      0xa2c
@@ -209,7 +212,7 @@ static int cypress_probe(struct usb_interface *interface,
        dev = kzalloc(sizeof(*dev), GFP_KERNEL);
        if (dev == NULL) {
                dev_err(&interface->dev, "Out of memory!\n");
-               goto error;
+               goto error_mem;
        }
 
        dev->udev = usb_get_dev(interface_to_usbdev(interface));
@@ -218,15 +221,26 @@ static int cypress_probe(struct usb_interface *interface,
        usb_set_intfdata(interface, dev);
 
        /* create device attribute files */
-       device_create_file(&interface->dev, &dev_attr_port0);
-       device_create_file(&interface->dev, &dev_attr_port1);
+       retval = device_create_file(&interface->dev, &dev_attr_port0);
+       if (retval)
+               goto error;
+       retval = device_create_file(&interface->dev, &dev_attr_port1);
+       if (retval)
+               goto error;
 
        /* let the user know that the device is now attached */
        dev_info(&interface->dev,
                 "Cypress CY7C63xxx device now attached\n");
+       return 0;
 
-       retval = 0;
 error:
+       device_remove_file(&interface->dev, &dev_attr_port0);
+       device_remove_file(&interface->dev, &dev_attr_port1);
+       usb_set_intfdata(interface, NULL);
+       usb_put_dev(dev->udev);
+       kfree(dev);
+
+error_mem:
        return retval;
 }
 
@@ -235,11 +249,13 @@ static void cypress_disconnect(struct usb_interface *interface)
        struct cypress *dev;
 
        dev = usb_get_intfdata(interface);
-       usb_set_intfdata(interface, NULL);
 
        /* remove device attribute files */
        device_remove_file(&interface->dev, &dev_attr_port0);
        device_remove_file(&interface->dev, &dev_attr_port1);
+       /* the intfdata can be set to NULL only after the
+        * device files have been removed */
+       usb_set_intfdata(interface, NULL);
 
        usb_put_dev(dev->udev);