Read each object with a single i2c transaction instead of byte-by-byte. Signed-off-by: Daniel Kurtz <djkurtz@xxxxxxxxxxxx> --- drivers/input/touchscreen/atmel_mxt_ts.c | 42 ++++++++++++----------------- 1 files changed, 17 insertions(+), 25 deletions(-) diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index ac8c50a..4363511 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -490,6 +490,13 @@ mxt_get_object(struct mxt_data *data, u8 type) return NULL; } +static int mxt_read_object(struct mxt_data *data, struct mxt_object *object, + void *val) +{ + return mxt_read_reg(data->client, object->start_address, object->size, + val); +} + static int mxt_read_message(struct mxt_data *data, struct mxt_message *message) { @@ -505,20 +512,6 @@ static int mxt_read_message(struct mxt_data *data, message); } -static int mxt_read_object(struct mxt_data *data, - u8 type, u8 offset, u8 *val) -{ - struct mxt_object *object; - u16 reg; - - object = mxt_get_object(data, type); - if (!object) - return -EINVAL; - - reg = object->start_address; - return mxt_read_reg(data->client, reg + offset, 1, val); -} - static int mxt_write_object(struct mxt_data *data, u8 type, u8 offset, u8 val) { @@ -916,17 +909,16 @@ static void mxt_calc_resolution(struct mxt_data *data) } static ssize_t mxt_object_show(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, char *buf) { struct mxt_data *data = dev_get_drvdata(dev); - struct mxt_object *object; int count = 0; int i, j; int error; - u8 val; + u8 obuf[256]; for (i = 0; i < data->info.object_num; i++) { - object = data->object_table + i; + struct mxt_object *object = &data->object_table[i]; count += snprintf(buf + count, PAGE_SIZE - count, "Object[%d] (Type %d)\n", @@ -936,20 +928,20 @@ static ssize_t mxt_object_show(struct device *dev, if (!mxt_object_readable(object->type)) { count += snprintf(buf + count, PAGE_SIZE - count, - "\n"); + "\n"); if (count >= PAGE_SIZE) return PAGE_SIZE - 1; continue; } - for (j = 0; j < object->size; j++) { - error = mxt_read_object(data, - object->type, j, &val); - if (error) - return error; + error = mxt_read_object(data, object, obuf); + if (error) + return error; + for (j = 0; j < object->size; j++) { count += snprintf(buf + count, PAGE_SIZE - count, - "\t[%2d]: %02x (%d)\n", j, val, val); + "\t[%2d]: %02x (%d)\n", j, obuf[j], + obuf[j]); if (count >= PAGE_SIZE) return PAGE_SIZE - 1; } -- 1.7.7.3 -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html