summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/atmel_mxt_ts.c
diff options
context:
space:
mode:
authorNick Dyer <nick.dyer@itdev.co.uk>2012-03-20 16:16:49 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:37:43 -0700
commitad79af68669ed08e3c8c5e3dbf642a31cb44be02 (patch)
tree379e7073a4a73950cd98586183620c0972981bcf /drivers/input/touchscreen/atmel_mxt_ts.c
parent666169b64b1085c6bb8b4cf7557fd940357aa614 (diff)
Input: atmel_mxt_ts - Optimise read of object table and information block
The object table and information block are contiguous in i2c address space, so it is possible to read them in a single i2c transaction. Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk> Rebase-Id: Rfc7ee5a811ca472ba743819fb51d0d03c43cd889
Diffstat (limited to 'drivers/input/touchscreen/atmel_mxt_ts.c')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c97
1 files changed, 24 insertions, 73 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 2e98fc01787f..02815fdfa183 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -472,7 +472,7 @@ static int mxt_unlock_bootloader(struct mxt_data *data)
return 0;
}
-static int __mxt_read_reg(struct i2c_client *client,
+static int mxt_read_reg(struct i2c_client *client,
u16 reg, u16 len, void *val)
{
struct i2c_msg xfer[2];
@@ -501,11 +501,6 @@ static int __mxt_read_reg(struct i2c_client *client,
return 0;
}
-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)
{
u8 buf[3];
@@ -545,13 +540,6 @@ int mxt_write_block(struct i2c_client *client, u16 addr, u16 length, u8 *value)
return -EIO;
}
-static int mxt_read_object_table(struct i2c_client *client,
- u16 reg, u8 *object_buf)
-{
- return __mxt_read_reg(client, reg, MXT_OBJECT_SIZE,
- object_buf);
-}
-
static struct mxt_object *mxt_get_object(struct mxt_data *data, u8 type)
{
struct mxt_object *object;
@@ -579,7 +567,7 @@ static int mxt_read_message(struct mxt_data *data,
return -EINVAL;
reg = object->start_address;
- ret = __mxt_read_reg(data->client, reg,
+ ret = mxt_read_reg(data->client, reg,
sizeof(struct mxt_message), message);
if (ret == 0 && message->reportid != MXT_RPTID_NOMSG
@@ -625,7 +613,7 @@ static int mxt_read_object(struct mxt_data *data,
return -EINVAL;
reg = object->start_address;
- return __mxt_read_reg(data->client, reg + offset, 1, val);
+ return mxt_read_reg(data->client, reg + offset, 1, val);
}
static int mxt_write_object(struct mxt_data *data,
@@ -1184,65 +1172,36 @@ static int mxt_check_reg_init(struct mxt_data *data)
return 0;
}
-static int mxt_get_info(struct mxt_data *data)
-{
- struct i2c_client *client = data->client;
- struct mxt_info *info = &data->info;
- int error;
- u8 val;
-
- error = mxt_read_reg(client, MXT_FAMILY_ID, &val);
- if (error)
- return error;
- info->family_id = val;
-
- error = mxt_read_reg(client, MXT_VARIANT_ID, &val);
- if (error)
- return error;
- info->variant_id = val;
-
- error = mxt_read_reg(client, MXT_VERSION, &val);
- if (error)
- return error;
- info->version = val;
-
- error = mxt_read_reg(client, MXT_BUILD, &val);
- if (error)
- return error;
- info->build = val;
-
- error = mxt_read_reg(client, MXT_OBJECT_NUM, &val);
- if (error)
- return error;
- info->object_num = val;
-
- return 0;
-}
-
static int mxt_get_object_table(struct mxt_data *data)
{
+ struct i2c_client *client = data->client;
struct device *dev = &data->client->dev;
int error;
int i;
- u16 reg;
u16 end_address;
u8 reportid = 0;
- u8 buf[MXT_OBJECT_SIZE];
+ u8 buf[data->info.object_num][MXT_OBJECT_SIZE];
data->mem_size = 0;
- for (i = 0; i < data->info.object_num; i++) {
- struct mxt_object *object = data->object_table + i;
+ data->object_table = kcalloc(data->info.object_num,
+ sizeof(struct mxt_object), GFP_KERNEL);
+ if (!data->object_table) {
+ dev_err(dev, "Failed to allocate object table\n");
+ return -ENOMEM;
+ }
- reg = MXT_OBJECT_START + MXT_OBJECT_SIZE * i;
- error = mxt_read_object_table(data->client, reg, buf);
+ error = mxt_read_reg(client, MXT_OBJECT_START, sizeof(buf), buf);
if (error)
return error;
- object->type = buf[0];
- object->start_address = (buf[2] << 8) | buf[1];
- object->size = buf[3] + 1;
- object->instances = buf[4] + 1;
- object->num_report_ids = buf[5];
+ for (i = 0; i < data->info.object_num; i++) {
+ struct mxt_object *object = data->object_table + i;
+
+ object->type = buf[i][0];
+ object->start_address = (buf[i][2] << 8) | buf[i][1];
+ object->size = buf[i][3] + 1;
+ object->instances = buf[i][4] + 1;
+ object->num_report_ids = buf[i][5];
if (object->num_report_ids) {
reportid += object->num_report_ids * object->instances;
@@ -1279,12 +1238,12 @@ static int mxt_read_resolution(struct mxt_data *data)
unsigned char val;
/* Update matrix size in info struct */
- error = mxt_read_reg(client, MXT_MATRIX_X_SIZE, &val);
+ error = mxt_read_reg(client, MXT_MATRIX_X_SIZE, 1, &val);
if (error)
return error;
data->info.matrix_xsize = val;
- error = mxt_read_reg(client, MXT_MATRIX_Y_SIZE, &val);
+ error = mxt_read_reg(client, MXT_MATRIX_Y_SIZE, 1, &val);
if (error)
return error;
data->info.matrix_ysize = val;
@@ -1348,7 +1307,7 @@ static int mxt_initialize(struct mxt_data *data)
struct mxt_info *info = &data->info;
int error;
- error = mxt_get_info(data);
+ error = mxt_read_reg(client, 0, sizeof(*info), info);
if (error) {
error = mxt_probe_bootloader(data);
@@ -1369,14 +1328,6 @@ static int mxt_initialize(struct mxt_data *data)
data->state = APPMODE;
- data->object_table = kcalloc(info->object_num,
- sizeof(struct mxt_object),
- GFP_KERNEL);
- if (!data->object_table) {
- dev_err(&client->dev, "Failed to allocate memory\n");
- return -ENOMEM;
- }
-
/* Get object table information */
error = mxt_get_object_table(data);
if (error) {
@@ -1657,7 +1608,7 @@ static ssize_t mxt_mem_access_read(struct file *filp, struct kobject *kobj,
return ret;
if (count > 0)
- ret = __mxt_read_reg(data->client, off, count, buf);
+ ret = mxt_read_reg(data->client, off, count, buf);
return ret == 0 ? count : ret;
}