On Fri, Mar 30, 2012 at 12:49:18AM +0800, Daniel Kurtz wrote: > Read each object with a single i2c transaction instead of byte-by-byte. > > Also, don't read T5, which is the message processor object. Reading > it is counter-productive since it either holds garbage (there is no > pending message), or, it holds a real message which should be handled > by the messages handling code (the isr). > > Signed-off-by: Daniel Kurtz <djkurtz@xxxxxxxxxxxx> > --- > drivers/input/touchscreen/atmel_mxt_ts.c | 43 ++++++++++++------------------ > 1 files changed, 17 insertions(+), 26 deletions(-) > > diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c > index b6e7109..a865967 100644 > --- a/drivers/input/touchscreen/atmel_mxt_ts.c > +++ b/drivers/input/touchscreen/atmel_mxt_ts.c > @@ -262,7 +262,6 @@ struct mxt_data { > static bool mxt_object_readable(unsigned int type) > { > switch (type) { > - case MXT_GEN_MESSAGE_T5: > case MXT_GEN_COMMAND_T6: > case MXT_GEN_POWER_T7: > case MXT_GEN_ACQUIRE_T8: > @@ -459,6 +458,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) > { > @@ -474,20 +480,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) > { > @@ -885,17 +877,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]; How large buffer do you need? > > 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", > @@ -905,20 +896,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; Odd return value - why not use scnprintf()? > 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; Ditto. > } > -- > 1.7.7.3 > Thanks, Henrik -- 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