diff options
author | Nick Dyer <nick.dyer@itdev.co.uk> | 2012-08-08 18:55:13 +0100 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 12:37:48 -0700 |
commit | 4cb3cf03ae9bf6add01c2d185df8c7609ead022c (patch) | |
tree | 0b96025afac3deb6cc4e35a22a33b3d818745bcd /drivers/input/touchscreen/atmel_mxt_ts.c | |
parent | 1f4344e15156bfabe685ecbca66a65fbd0e8c586 (diff) |
Input: atmel_mxt_ts - add i2c retries
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk>
Rebase-Id: Rc110f36fff658105933da7da41f75fae221f677a
Diffstat (limited to 'drivers/input/touchscreen/atmel_mxt_ts.c')
-rw-r--r-- | drivers/input/touchscreen/atmel_mxt_ts.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 40bd0988a674..4fa6b9a7eb28 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -194,6 +194,7 @@ #define MXT_RESET_TIME 200 /* msec */ #define MXT_RESET_NOCHGREAD 400 /* msec */ #define MXT_FWRESET_TIME 1000 /* msec */ +#define MXT_WAKEUP_TIME 25 /* msec */ /* Command to unlock bootloader */ #define MXT_UNLOCK_CMD_MSB 0xaa @@ -490,9 +491,11 @@ static int mxt_unlock_bootloader(struct mxt_data *data) static int mxt_read_reg(struct i2c_client *client, u16 reg, u16 len, void *val) { + struct device *dev = &client->dev; struct i2c_msg xfer[2]; u8 buf[2]; int ret; + u8 retry = 0; buf[0] = reg & 0xff; buf[1] = (reg >> 8) & 0xff; @@ -509,11 +512,19 @@ static int mxt_read_reg(struct i2c_client *client, xfer[1].len = len; xfer[1].buf = val; +retry_read: ret = i2c_transfer(client->adapter, xfer, ARRAY_SIZE(xfer)); if (ret != ARRAY_SIZE(xfer)) { - dev_err(&client->dev, "%s: i2c transfer failed (%d)\n", - __func__, ret); - return -EIO; + if (!retry) { + dev_dbg(dev, "%s: i2c retry\n", __func__); + msleep(MXT_WAKEUP_TIME); + retry = 1; + goto retry_read; + } else { + dev_err(dev, "%s: i2c transfer failed (%d)\n", + __func__, ret); + return -EIO; + } } return 0; @@ -521,15 +532,25 @@ static int mxt_read_reg(struct i2c_client *client, static int mxt_write_reg(struct i2c_client *client, u16 reg, u8 val) { + struct device *dev = &client->dev; + u8 retry = 0; u8 buf[3]; buf[0] = reg & 0xff; buf[1] = (reg >> 8) & 0xff; buf[2] = val; +retry_write: if (i2c_master_send(client, buf, 3) != 3) { - dev_err(&client->dev, "%s: i2c send failed\n", __func__); - return -EIO; + if (!retry) { + dev_dbg(dev, "%s: i2c retry\n", __func__); + msleep(MXT_WAKEUP_TIME); + retry = 1; + goto retry_write; + } else { + dev_err(dev, "%s: i2c send failed\n", __func__); + return -EIO; + } } return 0; |