]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/input/touchscreen/cyttsp_i2c_common.c
Merge 3.12-rc6 into staging-next.
[karo-tx-linux.git] / drivers / input / touchscreen / cyttsp_i2c_common.c
index 07c553fbcef2a4ecf77018afa5fe829f1116d20c..1d7b6f154168cc213e75ea64ee4f973782d0a108 100644 (file)
 #include <linux/types.h>
 
 int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf,
-                                     u8 addr, u8 length, void *values)
+                                     u16 addr, u8 length, void *values)
 {
        struct i2c_client *client = to_i2c_client(dev);
+       u8 client_addr = client->addr | ((addr >> 8) & 0x1);
+       u8 addr_lo = addr & 0xFF;
        struct i2c_msg msgs[] = {
                {
-                       .addr = client->addr,
+                       .addr = client_addr,
                        .flags = 0,
                        .len = 1,
-                       .buf = &addr,
+                       .buf = &addr_lo,
                },
                {
-                       .addr = client->addr,
+                       .addr = client_addr,
                        .flags = I2C_M_RD,
                        .len = length,
                        .buf = values,
@@ -60,17 +62,29 @@ int cyttsp_i2c_read_block_data(struct device *dev, u8 *xfer_buf,
 EXPORT_SYMBOL_GPL(cyttsp_i2c_read_block_data);
 
 int cyttsp_i2c_write_block_data(struct device *dev, u8 *xfer_buf,
-                                      u8 addr, u8 length, const void *values)
+                                      u16 addr, u8 length, const void *values)
 {
        struct i2c_client *client = to_i2c_client(dev);
+       u8 client_addr = client->addr | ((addr >> 8) & 0x1);
+       u8 addr_lo = addr & 0xFF;
+       struct i2c_msg msgs[] = {
+               {
+                       .addr = client_addr,
+                       .flags = 0,
+                       .len = length + 1,
+                       .buf = xfer_buf,
+               },
+       };
        int retval;
 
-       xfer_buf[0] = addr;
+       xfer_buf[0] = addr_lo;
        memcpy(&xfer_buf[1], values, length);
 
-       retval = i2c_master_send(client, xfer_buf, length + 1);
+       retval = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
+       if (retval < 0)
+               return retval;
 
-       return retval < 0 ? retval : 0;
+       return retval != ARRAY_SIZE(msgs) ? -EIO : 0;
 }
 EXPORT_SYMBOL_GPL(cyttsp_i2c_write_block_data);