--- v2
+++ v6
@@ -1,62 +1,78 @@
-Write each object using a single bulk i2c write transfer.
+For objects with multiple instances, dump them all, prepending each with
+its "Instance #".
+[rydberg@euromail.se: break out mxt_show_instance()]
Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
-Reviewed-by: Joonyoung Shim <jy0922.shim@samsung.com>
+Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
---
- drivers/input/touchscreen/atmel_mxt_ts.c | 28 ++++++++++++++--------------
- 1 files changed, 14 insertions(+), 14 deletions(-)
+ drivers/input/touchscreen/atmel_mxt_ts.c | 36 +++++++++++++++++++++--------
+ 1 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
-index a865967..3abc5b0 100644
+index c8cfd7b..ee37b0b 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
-@@ -628,33 +628,33 @@ end:
- static int mxt_check_reg_init(struct mxt_data *data)
+@@ -877,6 +877,24 @@ static void mxt_calc_resolution(struct mxt_data *data)
+ }
+ }
+
++static ssize_t mxt_show_instance(char *buf, int count,
++ struct mxt_object *object, int instance,
++ const u8 *val)
++{
++ int i;
++
++ if (object->instances > 0)
++ count += scnprintf(buf + count, PAGE_SIZE - count,
++ "Instance %u\n", instance);
++
++ for (i = 0; i < object->size + 1; i++)
++ count += scnprintf(buf + count, PAGE_SIZE - count,
++ "\t[%2u]: %02x (%d)\n", i, val[i], val[i]);
++ count += scnprintf(buf + count, PAGE_SIZE - count, "\n");
++
++ return count;
++}
++
+ static ssize_t mxt_object_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
- const struct mxt_platform_data *pdata = data->pdata;
-- struct mxt_object *object;
- struct device *dev = &data->client->dev;
-- int index = 0;
-- int i, j, config_offset, config_size;
-+ int i, offset;
-+ int ret;
+@@ -885,7 +903,6 @@ static ssize_t mxt_object_show(struct device *dev,
+ int count = 0;
+ int i, j;
+ int error;
+- u8 val;
+ u8 *obuf;
- if (!pdata->config) {
- dev_dbg(dev, "No cfg data defined, skipping reg init\n");
- return 0;
+ /* Pre-allocate buffer large enough to hold max sized object. */
+@@ -903,20 +920,19 @@ static ssize_t mxt_object_show(struct device *dev,
+ count += scnprintf(buf + count, PAGE_SIZE - count,
+ "T%u:\n", object->type);
+
+- error = __mxt_read_reg(data->client, object->start_address,
+- object->size + 1, obuf);
+- if (error)
+- break;
++ for (j = 0; j < object->instances + 1; j++) {
++ u16 size = object->size + 1;
++ u16 addr = object->start_address + j * size;
+
+- for (j = 0; j < object->size + 1; j++) {
+- val = obuf[j];
++ error = __mxt_read_reg(data->client, addr, size, obuf);
++ if (error)
++ goto done;
+
+- count += scnprintf(buf + count, PAGE_SIZE - count,
+- "\t[%2d]: %02x (%d)\n", j, val, val);
++ count = mxt_show_instance(buf, count, object, j, obuf);
+ }
+- count += scnprintf(buf + count, PAGE_SIZE - count, "\n");
}
-- for (i = 0; i < data->info.object_num; i++) {
-- object = data->object_table + i;
-+ for (offset = 0, i = 0; i < data->info.object_num; i++) {
-+ struct mxt_object *object = &data->object_table[i];
-+ size_t config_size;
-
- if (!mxt_object_writable(object->type))
- continue;
-
- config_size = object->size * object->instances;
-- for (j = 0; j < config_size; j++) {
-- config_offset = index + j;
-- if (config_offset > pdata->config_length) {
-- dev_err(dev, "Not enough config data!\n");
-- return -EINVAL;
-- }
-- mxt_write_object(data, object->type, j,
-- pdata->config[config_offset]);
-+ if (offset + config_size > pdata->config_length) {
-+ dev_err(dev, "Not enough config data!\n");
-+ return -EINVAL;
- }
-- index += config_size;
-+
-+ ret = mxt_write_reg(data->client, object->start_address,
-+ config_size, &pdata->config[offset]);
-+ if (ret)
-+ return ret;
-+ offset += config_size;
- }
-
- return 0;
++done:
+ kfree(obuf);
+ return error ?: count;
+ }
--
1.7.7.3