i2c: Add support for device alias names
[safe/jmp/linux-2.6] / drivers / i2c / i2c-core.c
index a58f89a..26384da 100644 (file)
@@ -17,7 +17,7 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               */
 /* ------------------------------------------------------------------------- */
 
-/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>.
+/* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>.
    All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl>
    SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> and
    Jean Delvare <khali@linux-fr.org> */
 #include <linux/platform_device.h>
 #include <linux/mutex.h>
 #include <linux/completion.h>
+#include <linux/hardirq.h>
+#include <linux/irqflags.h>
+#include <linux/semaphore.h>
 #include <asm/uaccess.h>
 
 #include "i2c-core.h"
 
 
-static LIST_HEAD(adapters);
-static LIST_HEAD(drivers);
-static DEFINE_MUTEX(core_lists);
+static DEFINE_MUTEX(core_lock);
 static DEFINE_IDR(i2c_adapter_idr);
 
 #define is_newstyle_driver(d) ((d)->probe || (d)->remove)
 
 /* ------------------------------------------------------------------------- */
 
+static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,
+                                               const struct i2c_client *client)
+{
+       while (id->name[0]) {
+               if (strcmp(client->name, id->name) == 0)
+                       return id;
+               id++;
+       }
+       return NULL;
+}
+
 static int i2c_device_match(struct device *dev, struct device_driver *drv)
 {
        struct i2c_client       *client = to_i2c_client(dev);
@@ -58,6 +70,10 @@ static int i2c_device_match(struct device *dev, struct device_driver *drv)
        if (!is_newstyle_driver(driver))
                return 0;
 
+       /* match on an id table if there is one */
+       if (driver->id_table)
+               return i2c_match_id(driver->id_table, client) != NULL;
+
        /* new style drivers use the same kind of driver matching policy
         * as platform devices or SPI:  compare device and driver IDs.
         */
@@ -67,20 +83,22 @@ static int i2c_device_match(struct device *dev, struct device_driver *drv)
 #ifdef CONFIG_HOTPLUG
 
 /* uevent helps with hotplug: modprobe -q $(MODALIAS) */
-static int i2c_device_uevent(struct device *dev, char **envp, int num_envp,
-                     char *buffer, int buffer_size)
+static int i2c_device_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
        struct i2c_client       *client = to_i2c_client(dev);
-       int                     i = 0, length = 0;
 
        /* by definition, legacy drivers can't hotplug */
-       if (dev->driver || !client->driver_name)
+       if (dev->driver)
                return 0;
 
-       if (add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
-                       "MODALIAS=%s", client->driver_name))
-               return -ENOMEM;
-       envp[i] = NULL;
+       if (client->driver_name[0]) {
+               if (add_uevent_var(env, "MODALIAS=%s", client->driver_name))
+                       return -ENOMEM;
+       } else {
+               if (add_uevent_var(env, "MODALIAS=%s%s",
+                                  I2C_MODULE_PREFIX, client->name))
+                       return -ENOMEM;
+       }
        dev_dbg(dev, "uevent\n");
        return 0;
 }
@@ -93,12 +111,22 @@ static int i2c_device_probe(struct device *dev)
 {
        struct i2c_client       *client = to_i2c_client(dev);
        struct i2c_driver       *driver = to_i2c_driver(dev->driver);
+       const struct i2c_device_id *id;
+       int status;
 
        if (!driver->probe)
                return -ENODEV;
        client->driver = driver;
        dev_dbg(dev, "probe\n");
-       return driver->probe(client);
+
+       if (driver->id_table)
+               id = i2c_match_id(driver->id_table, client);
+       else
+               id = NULL;
+       status = driver->probe(client, id);
+       if (status)
+               client->driver = NULL;
+       return status;
 }
 
 static int i2c_device_remove(struct device *dev)
@@ -178,9 +206,9 @@ static ssize_t show_client_name(struct device *dev, struct device_attribute *att
 static ssize_t show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
 {
        struct i2c_client *client = to_i2c_client(dev);
-       return client->driver_name
+       return client->driver_name[0]
                ? sprintf(buf, "%s\n", client->driver_name)
-               : 0;
+               : sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name);
 }
 
 static struct device_attribute i2c_dev_attrs[] = {
@@ -190,7 +218,7 @@ static struct device_attribute i2c_dev_attrs[] = {
        { },
 };
 
-struct bus_type i2c_bus_type = {
+static struct bus_type i2c_bus_type = {
        .name           = "i2c",
        .dev_attrs      = i2c_dev_attrs,
        .match          = i2c_device_match,
@@ -201,12 +229,31 @@ struct bus_type i2c_bus_type = {
        .suspend        = i2c_device_suspend,
        .resume         = i2c_device_resume,
 };
-EXPORT_SYMBOL_GPL(i2c_bus_type);
+
+
+/**
+ * i2c_verify_client - return parameter as i2c_client, or NULL
+ * @dev: device, probably from some driver model iterator
+ *
+ * When traversing the driver model tree, perhaps using driver model
+ * iterators like @device_for_each_child(), you can't assume very much
+ * about the nodes you find.  Use this function to avoid oopses caused
+ * by wrongly treating some non-I2C device as an i2c_client.
+ */
+struct i2c_client *i2c_verify_client(struct device *dev)
+{
+       return (dev->bus == &i2c_bus_type)
+                       ? to_i2c_client(dev)
+                       : NULL;
+}
+EXPORT_SYMBOL(i2c_verify_client);
+
 
 /**
  * i2c_new_device - instantiate an i2c device for use with a new style driver
  * @adap: the adapter managing the device
  * @info: describes one I2C device; bus_num is ignored
+ * Context: can sleep
  *
  * Create a device to work with a new style i2c driver, where binding is
  * handled through driver model probe()/remove() methods.  This call is not
@@ -229,7 +276,9 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
        client->adapter = adap;
 
        client->dev.platform_data = info->platform_data;
-       client->flags = info->flags;
+       device_init_wakeup(&client->dev, info->flags & I2C_CLIENT_WAKE);
+
+       client->flags = info->flags & ~I2C_CLIENT_WAKE;
        client->addr = info->addr;
        client->irq = info->irq;
 
@@ -255,6 +304,7 @@ EXPORT_SYMBOL_GPL(i2c_new_device);
 /**
  * i2c_unregister_device - reverse effect of i2c_new_device()
  * @client: value returned from i2c_new_device()
+ * Context: can sleep
  */
 void i2c_unregister_device(struct i2c_client *client)
 {
@@ -277,16 +327,65 @@ void i2c_unregister_device(struct i2c_client *client)
 EXPORT_SYMBOL_GPL(i2c_unregister_device);
 
 
+static int dummy_probe(struct i2c_client *client,
+                      const struct i2c_device_id *id)
+{
+       return 0;
+}
+
+static int dummy_remove(struct i2c_client *client)
+{
+       return 0;
+}
+
+static struct i2c_driver dummy_driver = {
+       .driver.name    = "dummy",
+       .probe          = dummy_probe,
+       .remove         = dummy_remove,
+};
+
+/**
+ * i2c_new_dummy - return a new i2c device bound to a dummy driver
+ * @adapter: the adapter managing the device
+ * @address: seven bit address to be used
+ * @type: optional label used for i2c_client.name
+ * Context: can sleep
+ *
+ * This returns an I2C client bound to the "dummy" driver, intended for use
+ * with devices that consume multiple addresses.  Examples of such chips
+ * include various EEPROMS (like 24c04 and 24c08 models).
+ *
+ * These dummy devices have two main uses.  First, most I2C and SMBus calls
+ * except i2c_transfer() need a client handle; the dummy will be that handle.
+ * And second, this prevents the specified address from being bound to a
+ * different driver.
+ *
+ * This returns the new i2c client, which should be saved for later use with
+ * i2c_unregister_device(); or NULL to indicate an error.
+ */
+struct i2c_client *
+i2c_new_dummy(struct i2c_adapter *adapter, u16 address, const char *type)
+{
+       struct i2c_board_info info = {
+               .driver_name    = "dummy",
+               .addr           = address,
+       };
+
+       if (type)
+               strlcpy(info.type, type, sizeof info.type);
+       return i2c_new_device(adapter, &info);
+}
+EXPORT_SYMBOL_GPL(i2c_new_dummy);
+
 /* ------------------------------------------------------------------------- */
 
 /* I2C bus adapters -- one roots each I2C or SMBUS segment */
 
-void i2c_adapter_dev_release(struct device *dev)
+static void i2c_adapter_dev_release(struct device *dev)
 {
        struct i2c_adapter *adap = to_i2c_adapter(dev);
        complete(&adap->dev_released);
 }
-EXPORT_SYMBOL_GPL(i2c_adapter_dev_release);    /* exported to i2c-isa */
 
 static ssize_t
 show_adapter_name(struct device *dev, struct device_attribute *attr, char *buf)
@@ -300,12 +399,11 @@ static struct device_attribute i2c_adapter_attrs[] = {
        { },
 };
 
-struct class i2c_adapter_class = {
+static struct class i2c_adapter_class = {
        .owner                  = THIS_MODULE,
        .name                   = "i2c-adapter",
        .dev_attrs              = i2c_adapter_attrs,
 };
-EXPORT_SYMBOL_GPL(i2c_adapter_class);          /* exported to i2c-isa */
 
 static void i2c_scan_static_board_info(struct i2c_adapter *adapter)
 {
@@ -323,18 +421,27 @@ static void i2c_scan_static_board_info(struct i2c_adapter *adapter)
        mutex_unlock(&__i2c_board_lock);
 }
 
+static int i2c_do_add_adapter(struct device_driver *d, void *data)
+{
+       struct i2c_driver *driver = to_i2c_driver(d);
+       struct i2c_adapter *adap = data;
+
+       if (driver->attach_adapter) {
+               /* We ignore the return code; if it fails, too bad */
+               driver->attach_adapter(adap);
+       }
+       return 0;
+}
+
 static int i2c_register_adapter(struct i2c_adapter *adap)
 {
-       int res = 0;
-       struct list_head   *item;
-       struct i2c_driver  *driver;
+       int res = 0, dummy;
 
        mutex_init(&adap->bus_lock);
        mutex_init(&adap->clist_lock);
        INIT_LIST_HEAD(&adap->clients);
 
-       mutex_lock(&core_lists);
-       list_add_tail(&adap->list, &adapters);
+       mutex_lock(&core_lock);
 
        /* Add the adapter to the driver core.
         * If the parent pointer is not set up,
@@ -359,19 +466,14 @@ static int i2c_register_adapter(struct i2c_adapter *adap)
                i2c_scan_static_board_info(adap);
 
        /* let legacy drivers scan this bus for matching devices */
-       list_for_each(item,&drivers) {
-               driver = list_entry(item, struct i2c_driver, list);
-               if (driver->attach_adapter)
-                       /* We ignore the return code; if it fails, too bad */
-                       driver->attach_adapter(adap);
-       }
+       dummy = bus_for_each_drv(&i2c_bus_type, NULL, adap,
+                                i2c_do_add_adapter);
 
 out_unlock:
-       mutex_unlock(&core_lists);
+       mutex_unlock(&core_lock);
        return res;
 
 out_list:
-       list_del(&adap->list);
        idr_remove(&i2c_adapter_idr, adap->nr);
        goto out_unlock;
 }
@@ -379,6 +481,7 @@ out_list:
 /**
  * i2c_add_adapter - declare i2c adapter, use dynamic bus number
  * @adapter: the adapter to add
+ * Context: can sleep
  *
  * This routine is used to declare an I2C adapter when its bus number
  * doesn't matter.  Examples: for I2C adapters dynamically added by
@@ -396,11 +499,11 @@ retry:
        if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0)
                return -ENOMEM;
 
-       mutex_lock(&core_lists);
+       mutex_lock(&core_lock);
        /* "above" here means "above or equal to", sigh */
        res = idr_get_new_above(&i2c_adapter_idr, adapter,
                                __i2c_first_dynamic_bus_num, &id);
-       mutex_unlock(&core_lists);
+       mutex_unlock(&core_lock);
 
        if (res < 0) {
                if (res == -EAGAIN)
@@ -416,10 +519,11 @@ EXPORT_SYMBOL(i2c_add_adapter);
 /**
  * i2c_add_numbered_adapter - declare i2c adapter, use static bus number
  * @adap: the adapter to register (with adap->nr initialized)
+ * Context: can sleep
  *
  * This routine is used to declare an I2C adapter when its bus number
- * matters.  Example: for I2C adapters from system-on-chip CPUs, or
- * otherwise built in to the system's mainboard, and where i2c_board_info
+ * matters.  For example, use it for I2C adapters from system-on-chip CPUs,
+ * or otherwise built in to the system's mainboard, and where i2c_board_info
  * is used to properly configure I2C devices.
  *
  * If no devices have pre-been declared for this bus, then be sure to
@@ -444,7 +548,7 @@ retry:
        if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0)
                return -ENOMEM;
 
-       mutex_lock(&core_lists);
+       mutex_lock(&core_lock);
        /* "above" here means "above or equal to", sigh;
         * we need the "equal to" result to force the result
         */
@@ -453,7 +557,7 @@ retry:
                status = -EBUSY;
                idr_remove(&i2c_adapter_idr, id);
        }
-       mutex_unlock(&core_lists);
+       mutex_unlock(&core_lock);
        if (status == -EAGAIN)
                goto retry;
 
@@ -463,38 +567,50 @@ retry:
 }
 EXPORT_SYMBOL_GPL(i2c_add_numbered_adapter);
 
+static int i2c_do_del_adapter(struct device_driver *d, void *data)
+{
+       struct i2c_driver *driver = to_i2c_driver(d);
+       struct i2c_adapter *adapter = data;
+       int res;
+
+       if (!driver->detach_adapter)
+               return 0;
+       res = driver->detach_adapter(adapter);
+       if (res)
+               dev_err(&adapter->dev, "detach_adapter failed (%d) "
+                       "for driver [%s]\n", res, driver->driver.name);
+       return res;
+}
+
+/**
+ * i2c_del_adapter - unregister I2C adapter
+ * @adap: the adapter being unregistered
+ * Context: can sleep
+ *
+ * This unregisters an I2C adapter which was previously registered
+ * by @i2c_add_adapter or @i2c_add_numbered_adapter.
+ */
 int i2c_del_adapter(struct i2c_adapter *adap)
 {
        struct list_head  *item, *_n;
-       struct i2c_adapter *adap_from_list;
-       struct i2c_driver *driver;
        struct i2c_client *client;
        int res = 0;
 
-       mutex_lock(&core_lists);
+       mutex_lock(&core_lock);
 
        /* First make sure that this adapter was ever added */
-       list_for_each_entry(adap_from_list, &adapters, list) {
-               if (adap_from_list == adap)
-                       break;
-       }
-       if (adap_from_list != adap) {
+       if (idr_find(&i2c_adapter_idr, adap->nr) != adap) {
                pr_debug("i2c-core: attempting to delete unregistered "
                         "adapter [%s]\n", adap->name);
                res = -EINVAL;
                goto out_unlock;
        }
 
-       list_for_each(item,&drivers) {
-               driver = list_entry(item, struct i2c_driver, list);
-               if (driver->detach_adapter)
-                       if ((res = driver->detach_adapter(adap))) {
-                               dev_err(&adap->dev, "detach_adapter failed "
-                                       "for driver [%s]\n",
-                                       driver->driver.name);
-                               goto out_unlock;
-                       }
-       }
+       /* Tell drivers about this removal */
+       res = bus_for_each_drv(&i2c_bus_type, NULL, adap,
+                              i2c_do_del_adapter);
+       if (res)
+               goto out_unlock;
 
        /* detach any active clients. This must be done first, because
         * it can fail; in which case we give up. */
@@ -522,7 +638,6 @@ int i2c_del_adapter(struct i2c_adapter *adap)
        /* clean up the sysfs representation */
        init_completion(&adap->dev_released);
        device_unregister(&adap->dev);
-       list_del(&adap->list);
 
        /* wait for sysfs to drop all references */
        wait_for_completion(&adap->dev_released);
@@ -533,7 +648,7 @@ int i2c_del_adapter(struct i2c_adapter *adap)
        dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name);
 
  out_unlock:
-       mutex_unlock(&core_lists);
+       mutex_unlock(&core_lock);
        return res;
 }
 EXPORT_SYMBOL(i2c_del_adapter);
@@ -576,21 +691,23 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
        if (res)
                return res;
 
-       mutex_lock(&core_lists);
+       mutex_lock(&core_lock);
 
-       list_add_tail(&driver->list,&drivers);
        pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name);
 
        /* legacy drivers scan i2c busses directly */
        if (driver->attach_adapter) {
                struct i2c_adapter *adapter;
 
-               list_for_each_entry(adapter, &adapters, list) {
+               down(&i2c_adapter_class.sem);
+               list_for_each_entry(adapter, &i2c_adapter_class.devices,
+                                   dev.node) {
                        driver->attach_adapter(adapter);
                }
+               up(&i2c_adapter_class.sem);
        }
 
-       mutex_unlock(&core_lists);
+       mutex_unlock(&core_lock);
        return 0;
 }
 EXPORT_SYMBOL(i2c_register_driver);
@@ -598,14 +715,15 @@ EXPORT_SYMBOL(i2c_register_driver);
 /**
  * i2c_del_driver - unregister I2C driver
  * @driver: the driver being unregistered
+ * Context: can sleep
  */
 void i2c_del_driver(struct i2c_driver *driver)
 {
-       struct list_head   *item1, *item2, *_n;
+       struct list_head   *item2, *_n;
        struct i2c_client  *client;
        struct i2c_adapter *adap;
 
-       mutex_lock(&core_lists);
+       mutex_lock(&core_lock);
 
        /* new-style driver? */
        if (is_newstyle_driver(driver))
@@ -615,8 +733,8 @@ void i2c_del_driver(struct i2c_driver *driver)
         * attached. If so, detach them to be able to kill the driver
         * afterwards.
         */
-       list_for_each(item1,&adapters) {
-               adap = list_entry(item1, struct i2c_adapter, list);
+       down(&i2c_adapter_class.sem);
+       list_for_each_entry(adap, &i2c_adapter_class.devices, dev.node) {
                if (driver->detach_adapter) {
                        if (driver->detach_adapter(adap)) {
                                dev_err(&adap->dev, "detach_adapter failed "
@@ -640,77 +758,63 @@ void i2c_del_driver(struct i2c_driver *driver)
                        }
                }
        }
+       up(&i2c_adapter_class.sem);
 
  unregister:
        driver_unregister(&driver->driver);
-       list_del(&driver->list);
        pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);
 
-       mutex_unlock(&core_lists);
+       mutex_unlock(&core_lock);
 }
 EXPORT_SYMBOL(i2c_del_driver);
 
 /* ------------------------------------------------------------------------- */
 
-static int __i2c_check_addr(struct i2c_adapter *adapter, unsigned int addr)
+static int __i2c_check_addr(struct device *dev, void *addrp)
 {
-       struct list_head   *item;
-       struct i2c_client  *client;
+       struct i2c_client       *client = i2c_verify_client(dev);
+       int                     addr = *(int *)addrp;
 
-       list_for_each(item,&adapter->clients) {
-               client = list_entry(item, struct i2c_client, list);
-               if (client->addr == addr)
-                       return -EBUSY;
-       }
+       if (client && client->addr == addr)
+               return -EBUSY;
        return 0;
 }
 
-int i2c_check_addr(struct i2c_adapter *adapter, int addr)
+static int i2c_check_addr(struct i2c_adapter *adapter, int addr)
 {
-       int rval;
-
-       mutex_lock(&adapter->clist_lock);
-       rval = __i2c_check_addr(adapter, addr);
-       mutex_unlock(&adapter->clist_lock);
-
-       return rval;
+       return device_for_each_child(&adapter->dev, &addr, __i2c_check_addr);
 }
-EXPORT_SYMBOL(i2c_check_addr);
 
 int i2c_attach_client(struct i2c_client *client)
 {
        struct i2c_adapter *adapter = client->adapter;
        int res = 0;
 
-       mutex_lock(&adapter->clist_lock);
-       if (__i2c_check_addr(client->adapter, client->addr)) {
-               res = -EBUSY;
-               goto out_unlock;
-       }
-       list_add_tail(&client->list,&adapter->clients);
-
-       client->usage_count = 0;
-
        client->dev.parent = &client->adapter->dev;
        client->dev.bus = &i2c_bus_type;
 
        if (client->driver)
                client->dev.driver = &client->driver->driver;
 
-       if (client->driver && !is_newstyle_driver(client->driver))
+       if (client->driver && !is_newstyle_driver(client->driver)) {
                client->dev.release = i2c_client_release;
-       else
+               client->dev.uevent_suppress = 1;
+       } else
                client->dev.release = i2c_client_dev_release;
 
        snprintf(&client->dev.bus_id[0], sizeof(client->dev.bus_id),
                "%d-%04x", i2c_adapter_id(adapter), client->addr);
-       dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n",
-               client->name, client->dev.bus_id);
        res = device_register(&client->dev);
        if (res)
-               goto out_list;
+               goto out_err;
+
+       mutex_lock(&adapter->clist_lock);
+       list_add_tail(&client->list, &adapter->clients);
        mutex_unlock(&adapter->clist_lock);
 
+       dev_dbg(&adapter->dev, "client [%s] registered with bus id %s\n",
+               client->name, client->dev.bus_id);
+
        if (adapter->client_register)  {
                if (adapter->client_register(client)) {
                        dev_dbg(&adapter->dev, "client_register "
@@ -721,12 +825,9 @@ int i2c_attach_client(struct i2c_client *client)
 
        return 0;
 
-out_list:
-       list_del(&client->list);
+out_err:
        dev_err(&adapter->dev, "Failed to attach i2c client %s at 0x%02x "
                "(%d)\n", client->name, client->addr, res);
-out_unlock:
-       mutex_unlock(&adapter->clist_lock);
        return res;
 }
 EXPORT_SYMBOL(i2c_attach_client);
@@ -736,12 +837,6 @@ int i2c_detach_client(struct i2c_client *client)
        struct i2c_adapter *adapter = client->adapter;
        int res = 0;
 
-       if (client->usage_count > 0) {
-               dev_warn(&client->dev, "Client [%s] still busy, "
-                        "can't detach\n", client->name);
-               return -EBUSY;
-       }
-
        if (adapter->client_unregister)  {
                res = adapter->client_unregister(client);
                if (res) {
@@ -754,9 +849,10 @@ int i2c_detach_client(struct i2c_client *client)
 
        mutex_lock(&adapter->clist_lock);
        list_del(&client->list);
+       mutex_unlock(&adapter->clist_lock);
+
        init_completion(&client->released);
        device_unregister(&client->dev);
-       mutex_unlock(&adapter->clist_lock);
        wait_for_completion(&client->released);
 
  out:
@@ -764,72 +860,58 @@ int i2c_detach_client(struct i2c_client *client)
 }
 EXPORT_SYMBOL(i2c_detach_client);
 
-static int i2c_inc_use_client(struct i2c_client *client)
+/**
+ * i2c_use_client - increments the reference count of the i2c client structure
+ * @client: the client being referenced
+ *
+ * Each live reference to a client should be refcounted. The driver model does
+ * that automatically as part of driver binding, so that most drivers don't
+ * need to do this explicitly: they hold a reference until they're unbound
+ * from the device.
+ *
+ * A pointer to the client with the incremented reference counter is returned.
+ */
+struct i2c_client *i2c_use_client(struct i2c_client *client)
 {
-
-       if (!try_module_get(client->driver->driver.owner))
-               return -ENODEV;
-       if (!try_module_get(client->adapter->owner)) {
-               module_put(client->driver->driver.owner);
-               return -ENODEV;
-       }
-
-       return 0;
+       get_device(&client->dev);
+       return client;
 }
+EXPORT_SYMBOL(i2c_use_client);
 
-static void i2c_dec_use_client(struct i2c_client *client)
+/**
+ * i2c_release_client - release a use of the i2c client structure
+ * @client: the client being no longer referenced
+ *
+ * Must be called when a user of a client is finished with it.
+ */
+void i2c_release_client(struct i2c_client *client)
 {
-       module_put(client->driver->driver.owner);
-       module_put(client->adapter->owner);
+       put_device(&client->dev);
 }
+EXPORT_SYMBOL(i2c_release_client);
 
-int i2c_use_client(struct i2c_client *client)
-{
-       int ret;
-
-       ret = i2c_inc_use_client(client);
-       if (ret)
-               return ret;
-
-       client->usage_count++;
-
-       return 0;
-}
-EXPORT_SYMBOL(i2c_use_client);
+struct i2c_cmd_arg {
+       unsigned        cmd;
+       void            *arg;
+};
 
-int i2c_release_client(struct i2c_client *client)
+static int i2c_cmd(struct device *dev, void *_arg)
 {
-       if (!client->usage_count) {
-               pr_debug("i2c-core: %s used one too many times\n",
-                        __FUNCTION__);
-               return -EPERM;
-       }
-
-       client->usage_count--;
-       i2c_dec_use_client(client);
+       struct i2c_client       *client = i2c_verify_client(dev);
+       struct i2c_cmd_arg      *arg = _arg;
 
+       if (client && client->driver && client->driver->command)
+               client->driver->command(client, arg->cmd, arg->arg);
        return 0;
 }
-EXPORT_SYMBOL(i2c_release_client);
 
 void i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
 {
-       struct list_head  *item;
-       struct i2c_client *client;
+       struct i2c_cmd_arg      cmd_arg;
 
-       mutex_lock(&adap->clist_lock);
-       list_for_each(item,&adap->clients) {
-               client = list_entry(item, struct i2c_client, list);
-               if (!try_module_get(client->driver->driver.owner))
-                       continue;
-               if (NULL != client->driver->command) {
-                       mutex_unlock(&adap->clist_lock);
-                       client->driver->command(client,cmd,arg);
-                       mutex_lock(&adap->clist_lock);
-               }
-               module_put(client->driver->driver.owner);
-       }
-       mutex_unlock(&adap->clist_lock);
+       cmd_arg.cmd = cmd;
+       cmd_arg.arg = arg;
+       device_for_each_child(&adap->dev, &cmd_arg, i2c_cmd);
 }
 EXPORT_SYMBOL(i2c_clients_command);
 
@@ -840,11 +922,24 @@ static int __init i2c_init(void)
        retval = bus_register(&i2c_bus_type);
        if (retval)
                return retval;
-       return class_register(&i2c_adapter_class);
+       retval = class_register(&i2c_adapter_class);
+       if (retval)
+               goto bus_err;
+       retval = i2c_add_driver(&dummy_driver);
+       if (retval)
+               goto class_err;
+       return 0;
+
+class_err:
+       class_unregister(&i2c_adapter_class);
+bus_err:
+       bus_unregister(&i2c_bus_type);
+       return retval;
 }
 
 static void __exit i2c_exit(void)
 {
+       i2c_del_driver(&dummy_driver);
        class_unregister(&i2c_adapter_class);
        bus_unregister(&i2c_bus_type);
 }
@@ -871,7 +966,15 @@ int i2c_transfer(struct i2c_adapter * adap, struct i2c_msg *msgs, int num)
                }
 #endif
 
-               mutex_lock_nested(&adap->bus_lock, adap->level);
+               if (in_atomic() || irqs_disabled()) {
+                       ret = mutex_trylock(&adap->bus_lock);
+                       if (!ret)
+                               /* I2C activity is ongoing. */
+                               return -EAGAIN;
+               } else {
+                       mutex_lock_nested(&adap->bus_lock, adap->level);
+               }
+
                ret = adap->algo->master_xfer(adap,msgs,num);
                mutex_unlock(&adap->bus_lock);
 
@@ -922,28 +1025,6 @@ int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
 }
 EXPORT_SYMBOL(i2c_master_recv);
 
-int i2c_control(struct i2c_client *client,
-       unsigned int cmd, unsigned long arg)
-{
-       int ret = 0;
-       struct i2c_adapter *adap = client->adapter;
-
-       dev_dbg(&client->adapter->dev, "i2c ioctl, cmd: 0x%x, arg: %#lx\n", cmd, arg);
-       switch (cmd) {
-               case I2C_RETRIES:
-                       adap->retries = arg;
-                       break;
-               case I2C_TIMEOUT:
-                       adap->timeout = arg;
-                       break;
-               default:
-                       if (adap->algo->algo_control!=NULL)
-                               ret = adap->algo->algo_control(adap,cmd,arg);
-       }
-       return ret;
-}
-EXPORT_SYMBOL(i2c_control);
-
 /* ----------------------------------------------------
  * the i2c address scanning function
  * Will not work for 10-bit addresses!
@@ -992,7 +1073,7 @@ static int i2c_probe_address(struct i2c_adapter *adapter, int addr, int kind,
 }
 
 int i2c_probe(struct i2c_adapter *adapter,
-             struct i2c_client_address_data *address_data,
+             const struct i2c_client_address_data *address_data,
              int (*found_proc) (struct i2c_adapter *, int, int))
 {
        int i, err;
@@ -1001,7 +1082,7 @@ int i2c_probe(struct i2c_adapter *adapter,
        /* Force entries are done first, and are not affected by ignore
           entries */
        if (address_data->forces) {
-               unsigned short **forces = address_data->forces;
+               const unsigned short * const *forces = address_data->forces;
                int kind;
 
                for (kind = 0; forces[kind]; kind++) {
@@ -1099,7 +1180,6 @@ i2c_new_probed_device(struct i2c_adapter *adap,
                return NULL;
        }
 
-       mutex_lock(&adap->clist_lock);
        for (i = 0; addr_list[i] != I2C_CLIENT_END; i++) {
                /* Check address validity */
                if (addr_list[i] < 0x03 || addr_list[i] > 0x77) {
@@ -1109,7 +1189,7 @@ i2c_new_probed_device(struct i2c_adapter *adap,
                }
 
                /* Check address availability */
-               if (__i2c_check_addr(adap, addr_list[i])) {
+               if (i2c_check_addr(adap, addr_list[i])) {
                        dev_dbg(&adap->dev, "Address 0x%02x already in "
                                "use, not probing\n", addr_list[i]);
                        continue;
@@ -1137,7 +1217,6 @@ i2c_new_probed_device(struct i2c_adapter *adap,
                                break;
                }
        }
-       mutex_unlock(&adap->clist_lock);
 
        if (addr_list[i] == I2C_CLIENT_END) {
                dev_dbg(&adap->dev, "Probing failed, no device found\n");
@@ -1153,12 +1232,12 @@ struct i2c_adapter* i2c_get_adapter(int id)
 {
        struct i2c_adapter *adapter;
 
-       mutex_lock(&core_lists);
+       mutex_lock(&core_lock);
        adapter = (struct i2c_adapter *)idr_find(&i2c_adapter_idr, id);
        if (adapter && !try_module_get(adapter->owner))
                adapter = NULL;
 
-       mutex_unlock(&core_lists);
+       mutex_unlock(&core_lock);
        return adapter;
 }
 EXPORT_SYMBOL(i2c_get_adapter);
@@ -1298,6 +1377,37 @@ s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
 }
 EXPORT_SYMBOL(i2c_smbus_write_word_data);
 
+/**
+ * i2c_smbus_read_block_data - SMBus block read request
+ * @client: Handle to slave device
+ * @command: Command byte issued to let the slave know what data should
+ *     be returned
+ * @values: Byte array into which data will be read; big enough to hold
+ *     the data returned by the slave.  SMBus allows at most 32 bytes.
+ *
+ * Returns the number of bytes read in the slave's response, else a
+ * negative number to indicate some kind of error.
+ *
+ * Note that using this function requires that the client's adapter support
+ * the I2C_FUNC_SMBUS_READ_BLOCK_DATA functionality.  Not all adapter drivers
+ * support this; its emulation through I2C messaging relies on a specific
+ * mechanism (I2C_M_RECV_LEN) which may not be implemented.
+ */
+s32 i2c_smbus_read_block_data(struct i2c_client *client, u8 command,
+                             u8 *values)
+{
+       union i2c_smbus_data data;
+
+       if (i2c_smbus_xfer(client->adapter, client->addr, client->flags,
+                          I2C_SMBUS_READ, command,
+                          I2C_SMBUS_BLOCK_DATA, &data))
+               return -1;
+
+       memcpy(values, &data.block[1], data.block[0]);
+       return data.block[0];
+}
+EXPORT_SYMBOL(i2c_smbus_read_block_data);
+
 s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command,
                               u8 length, const u8 *values)
 {
@@ -1314,10 +1424,14 @@ s32 i2c_smbus_write_block_data(struct i2c_client *client, u8 command,
 EXPORT_SYMBOL(i2c_smbus_write_block_data);
 
 /* Returns the number of read bytes */
-s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command, u8 *values)
+s32 i2c_smbus_read_i2c_block_data(struct i2c_client *client, u8 command,
+                                 u8 length, u8 *values)
 {
        union i2c_smbus_data data;
 
+       if (length > I2C_SMBUS_BLOCK_MAX)
+               length = I2C_SMBUS_BLOCK_MAX;
+       data.block[0] = length;
        if (i2c_smbus_xfer(client->adapter,client->addr,client->flags,
                              I2C_SMBUS_READ,command,
                              I2C_SMBUS_I2C_BLOCK_DATA,&data))
@@ -1425,7 +1539,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
                read_write = I2C_SMBUS_READ;
                if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
                        dev_err(&adapter->dev, "%s called with invalid "
-                               "block proc call size (%d)\n", __FUNCTION__,
+                               "block proc call size (%d)\n", __func__,
                                data->block[0]);
                        return -1;
                }
@@ -1438,7 +1552,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
                break;
        case I2C_SMBUS_I2C_BLOCK_DATA:
                if (read_write == I2C_SMBUS_READ) {
-                       msg[1].len = I2C_SMBUS_BLOCK_MAX;
+                       msg[1].len = data->block[0];
                } else {
                        msg[0].len = data->block[0] + 1;
                        if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) {
@@ -1494,9 +1608,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
                                data->word = msgbuf1[0] | (msgbuf1[1] << 8);
                                break;
                        case I2C_SMBUS_I2C_BLOCK_DATA:
-                               /* fixed at 32 for now */
-                               data->block[0] = I2C_SMBUS_BLOCK_MAX;
-                               for (i = 0; i < I2C_SMBUS_BLOCK_MAX; i++)
+                               for (i = 0; i < data->block[0]; i++)
                                        data->block[i+1] = msgbuf1[i];
                                break;
                        case I2C_SMBUS_BLOCK_DATA: