i2c: Support i2c_transfer in atomic contexts
[pandora-kernel.git] / drivers / i2c / i2c-core.c
index f95b1b6..ddd1b83 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 <asm/uaccess.h>
+#include <asm/semaphore.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)
@@ -320,18 +321,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,
@@ -356,19 +366,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;
 }
@@ -394,11 +399,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)
@@ -443,7 +448,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
         */
@@ -452,7 +457,7 @@ retry:
                status = -EBUSY;
                idr_remove(&i2c_adapter_idr, id);
        }
-       mutex_unlock(&core_lists);
+       mutex_unlock(&core_lock);
        if (status == -EAGAIN)
                goto retry;
 
@@ -462,6 +467,21 @@ 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
@@ -473,35 +493,24 @@ EXPORT_SYMBOL_GPL(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. */
@@ -529,7 +538,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);
@@ -540,7 +548,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);
@@ -583,21 +591,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);
@@ -609,11 +619,11 @@ EXPORT_SYMBOL(i2c_register_driver);
  */
 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))
@@ -623,8 +633,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 "
@@ -648,13 +658,13 @@ 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);
 
@@ -673,7 +683,7 @@ static int __i2c_check_addr(struct i2c_adapter *adapter, unsigned int addr)
        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;
 
@@ -683,7 +693,6 @@ int i2c_check_addr(struct i2c_adapter *adapter, int addr)
 
        return rval;
 }
-EXPORT_SYMBOL(i2c_check_addr);
 
 int i2c_attach_client(struct i2c_client *client)
 {
@@ -697,8 +706,6 @@ int i2c_attach_client(struct i2c_client *client)
        }
        list_add_tail(&client->list,&adapter->clients);
 
-       client->usage_count = 0;
-
        client->dev.parent = &client->adapter->dev;
        client->dev.bus = &i2c_bus_type;
 
@@ -745,12 +752,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) {
@@ -773,51 +774,33 @@ int i2c_detach_client(struct i2c_client *client)
 }
 EXPORT_SYMBOL(i2c_detach_client);
 
-static int i2c_inc_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;
-}
-
-static void i2c_dec_use_client(struct i2c_client *client)
-{
-       module_put(client->driver->driver.owner);
-       module_put(client->adapter->owner);
-}
-
-int i2c_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)
 {
-       int ret;
-
-       ret = i2c_inc_use_client(client);
-       if (ret)
-               return ret;
-
-       client->usage_count++;
-
-       return 0;
+       get_device(&client->dev);
+       return client;
 }
 EXPORT_SYMBOL(i2c_use_client);
 
-int i2c_release_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)
 {
-       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);
-
-       return 0;
+       put_device(&client->dev);
 }
 EXPORT_SYMBOL(i2c_release_client);
 
@@ -880,7 +863,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);
 
@@ -931,28 +922,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!
@@ -1001,7 +970,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;
@@ -1010,7 +979,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++) {
@@ -1162,12 +1131,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);
@@ -1307,7 +1276,22 @@ s32 i2c_smbus_write_word_data(struct i2c_client *client, u8 command, u16 value)
 }
 EXPORT_SYMBOL(i2c_smbus_write_word_data);
 
-/* Returns the number of read bytes */
+/**
+ * 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)
 {