Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
[sfrench/cifs-2.6.git] / drivers / i2c / i2c-dev.c
index ac5bd2a7ca9906115c1380423d249d3f92adbe84..64eee9551b2203f73654890921e766c4a7608c31 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/slab.h>
-#include <linux/smp_lock.h>
 #include <linux/init.h>
 #include <linux/list.h>
 #include <linux/i2c.h>
@@ -284,6 +283,7 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file,
                    (data_arg.size != I2C_SMBUS_WORD_DATA) &&
                    (data_arg.size != I2C_SMBUS_PROC_CALL) &&
                    (data_arg.size != I2C_SMBUS_BLOCK_DATA) &&
+                   (data_arg.size != I2C_SMBUS_I2C_BLOCK_BROKEN) &&
                    (data_arg.size != I2C_SMBUS_I2C_BLOCK_DATA) &&
                    (data_arg.size != I2C_SMBUS_BLOCK_PROC_CALL)) {
                        dev_dbg(&client->adapter->dev,
@@ -330,10 +330,18 @@ static int i2cdev_ioctl(struct inode *inode, struct file *file,
 
                if ((data_arg.size == I2C_SMBUS_PROC_CALL) ||
                    (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) ||
+                   (data_arg.size == I2C_SMBUS_I2C_BLOCK_DATA) ||
                    (data_arg.read_write == I2C_SMBUS_WRITE)) {
                        if (copy_from_user(&temp, data_arg.data, datasize))
                                return -EFAULT;
                }
+               if (data_arg.size == I2C_SMBUS_I2C_BLOCK_BROKEN) {
+                       /* Convert old I2C block commands to the new
+                          convention. This preserves binary compatibility. */
+                       data_arg.size = I2C_SMBUS_I2C_BLOCK_DATA;
+                       if (data_arg.read_write == I2C_SMBUS_READ)
+                               temp.block[0] = I2C_SMBUS_BLOCK_MAX;
+               }
                res = i2c_smbus_xfer(client->adapter,client->addr,client->flags,
                      data_arg.read_write,
                      data_arg.command,data_arg.size,&temp);
@@ -392,7 +400,7 @@ static int i2cdev_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations i2cdev_fops = {
+static const struct file_operations i2cdev_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = i2cdev_read,