Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
[pandora-kernel.git] / drivers / i2c / busses / i2c-isa.c
index 03672c9..4380653 100644 (file)
@@ -43,7 +43,7 @@
 static u32 isa_func(struct i2c_adapter *adapter);
 
 /* This is the actual algorithm we define */
-static struct i2c_algorithm isa_algorithm = {
+static const struct i2c_algorithm isa_algorithm = {
        .functionality  = isa_func,
 };
 
@@ -72,16 +72,6 @@ static ssize_t show_adapter_name(struct device *dev,
 }
 static DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL);
 
-static int i2c_isa_device_probe(struct device *dev)
-{
-       return -ENODEV;
-}
-
-static int i2c_isa_device_remove(struct device *dev)
-{
-       return 0;
-}
-
 
 /* We implement an interface which resembles i2c_{add,del}_driver,
    but for i2c-isa drivers. We don't have to remember and handle lists
@@ -92,20 +82,21 @@ int i2c_isa_add_driver(struct i2c_driver *driver)
        int res;
 
        /* Add the driver to the list of i2c drivers in the driver core */
-       driver->driver.name = driver->name;
-       driver->driver.owner = driver->owner;
        driver->driver.bus = &i2c_bus_type;
-       driver->driver.probe = i2c_isa_device_probe;
-       driver->driver.remove = i2c_isa_device_remove;
        res = driver_register(&driver->driver);
        if (res)
                return res;
-       dev_dbg(&isa_adapter.dev, "Driver %s registered\n", driver->name);
+       dev_dbg(&isa_adapter.dev, "Driver %s registered\n", driver->driver.name);
 
        /* Now look for clients */
-       driver->attach_adapter(&isa_adapter);
-
-       return 0;
+       res = driver->attach_adapter(&isa_adapter);
+       if (res) {
+               dev_err(&isa_adapter.dev,
+                       "Driver %s failed to attach adapter, unregistering\n",
+                       driver->driver.name);
+               driver_unregister(&driver->driver);
+       }
+       return res;
 }
 
 int i2c_isa_del_driver(struct i2c_driver *driver)
@@ -124,14 +115,14 @@ int i2c_isa_del_driver(struct i2c_driver *driver)
                if ((res = driver->detach_client(client))) {
                        dev_err(&isa_adapter.dev, "Failed, driver "
                                "%s not unregistered!\n",
-                               driver->name);
+                               driver->driver.name);
                        return res;
                }
        }
 
        /* Get the driver off the core list */
        driver_unregister(&driver->driver);
-       dev_dbg(&isa_adapter.dev, "Driver %s unregistered\n", driver->name);
+       dev_dbg(&isa_adapter.dev, "Driver %s unregistered\n", driver->driver.name);
 
        return 0;
 }
@@ -139,7 +130,9 @@ int i2c_isa_del_driver(struct i2c_driver *driver)
 
 static int __init i2c_isa_init(void)
 {
-       init_MUTEX(&isa_adapter.clist_lock);
+       int err;
+
+       mutex_init(&isa_adapter.clist_lock);
        INIT_LIST_HEAD(&isa_adapter.clients);
 
        isa_adapter.nr = ANY_I2C_ISA_BUS;
@@ -147,8 +140,16 @@ static int __init i2c_isa_init(void)
        sprintf(isa_adapter.dev.bus_id, "i2c-%d", isa_adapter.nr);
        isa_adapter.dev.driver = &i2c_adapter_driver;
        isa_adapter.dev.release = &i2c_adapter_dev_release;
-       device_register(&isa_adapter.dev);
-       device_create_file(&isa_adapter.dev, &dev_attr_name);
+       err = device_register(&isa_adapter.dev);
+       if (err) {
+               printk(KERN_ERR "i2c-isa: Failed to register device\n");
+               goto exit;
+       }
+       err = device_create_file(&isa_adapter.dev, &dev_attr_name);
+       if (err) {
+               printk(KERN_ERR "i2c-isa: Failed to create name file\n");
+               goto exit_unregister;
+       }
 
        /* Add this adapter to the i2c_adapter class */
        memset(&isa_adapter.class_dev, 0x00, sizeof(struct class_device));
@@ -156,11 +157,24 @@ static int __init i2c_isa_init(void)
        isa_adapter.class_dev.class = &i2c_adapter_class;
        strlcpy(isa_adapter.class_dev.class_id, isa_adapter.dev.bus_id,
                BUS_ID_SIZE);
-       class_device_register(&isa_adapter.class_dev);
+       err = class_device_register(&isa_adapter.class_dev);
+       if (err) {
+               printk(KERN_ERR "i2c-isa: Failed to register class device\n");
+               goto exit_remove_name;
+       }
 
        dev_dbg(&isa_adapter.dev, "%s registered\n", isa_adapter.name);
 
        return 0;
+
+exit_remove_name:
+       device_remove_file(&isa_adapter.dev, &dev_attr_name);
+exit_unregister:
+       init_completion(&isa_adapter.dev_released); /* Needed? */
+       device_unregister(&isa_adapter.dev);
+       wait_for_completion(&isa_adapter.dev_released);
+exit:
+       return err;
 }
 
 static void __exit i2c_isa_exit(void)
@@ -176,7 +190,7 @@ static void __exit i2c_isa_exit(void)
        list_for_each_safe(item, _n, &isa_adapter.clients) {
                client = list_entry(item, struct i2c_client, list);
                dev_err(&isa_adapter.dev, "Driver %s still has an active "
-                       "ISA client at 0x%x\n", client->driver->name,
+                       "ISA client at 0x%x\n", client->driver->driver.name,
                        client->addr);
        }
        if (client != NULL)