aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/touchscreen/atmel_mxt_ts.c
diff options
context:
space:
mode:
authorDaniel Kurtz <djkurtz@chromium.org>2012-06-28 21:08:12 +0800
committerHenrik Rydberg <rydberg@euromail.se>2012-06-29 15:58:04 +0200
commit9638ab7c9c3b352d54f4f7e80027bd6e1c0584e8 (patch)
treeee0687ee8d93c567d459e0395a2922fed2f555ed /drivers/input/touchscreen/atmel_mxt_ts.c
parentInput: atmel_mxt_ts - return errors from i2c layer (diff)
downloadlinux-dev-9638ab7c9c3b352d54f4f7e80027bd6e1c0584e8.tar.xz
linux-dev-9638ab7c9c3b352d54f4f7e80027bd6e1c0584e8.zip
Input: atmel_mxt_ts - add variable length __mxt_write_reg
The i2c bus requires 4 bytes to do a 1-byte write (1 byte i2c address + 2 byte offset + 1 byte data). By taking a length with writes, the driver can amortize transaction overhead by performing larger transactions where appropriate. This patch just sets up the new API. Later patches refactor writes to take advantage of the larger transactions. Signed-off-by: Daniel Kurtz <djkurtz@chromium.org> Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to '')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index a68b2279e8df..dd2577b796a4 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -431,17 +431,24 @@ static int mxt_read_reg(struct i2c_client *client, u16 reg, u8 *val)
return __mxt_read_reg(client, reg, 1, val);
}
-static int mxt_write_reg(struct i2c_client *client, u16 reg, u8 val)
+static int __mxt_write_reg(struct i2c_client *client, u16 reg, u16 len,
+ const void *val)
{
- u8 buf[3];
+ u8 *buf;
+ size_t count;
int ret;
+ count = len + 2;
+ buf = kmalloc(count, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
buf[0] = reg & 0xff;
buf[1] = (reg >> 8) & 0xff;
- buf[2] = val;
+ memcpy(&buf[2], val, len);
- ret = i2c_master_send(client, buf, 3);
- if (ret == 3) {
+ ret = i2c_master_send(client, buf, count);
+ if (ret == count) {
ret = 0;
} else {
if (ret >= 0)
@@ -450,9 +457,15 @@ static int mxt_write_reg(struct i2c_client *client, u16 reg, u8 val)
__func__, ret);
}
+ kfree(buf);
return ret;
}
+static int mxt_write_reg(struct i2c_client *client, u16 reg, u8 val)
+{
+ return __mxt_write_reg(client, reg, 1, &val);
+}
+
static int mxt_read_object_table(struct i2c_client *client,
u16 reg, u8 *object_buf)
{