[PATCH v5 6/9] Input: atmel_mxt_ts - add diagnostic data support for mXT1386
From: Nick Dyer <hidden>
Date: 2016-06-22 22:10:07
Also in:
linux-input, lkml
Subsystem:
atmel maxtouch driver, input (keyboard, mouse, joystick, touchscreen) drivers, the rest · Maintainers:
Nick Dyer, Dmitry Torokhov, Linus Torvalds
The mXT1386 family of chips have a different architecture which splits the diagnostic data into 3 columns. Signed-off-by: Nick Dyer <redacted> --- drivers/input/touchscreen/atmel_mxt_ts.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 3f7e357..739d138 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c@@ -137,6 +137,10 @@ struct t9_range { #define MXT_DIAGNOSTIC_DELTAS 0x10 #define MXT_DIAGNOSTIC_SIZE 128 +#define MXT_FAMILY_1386 160 +#define MXT1386_COLUMNS 3 +#define MXT1386_PAGES_PER_COLUMN 8 + struct t37_debug { #ifdef CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 u8 mode;
@@ -2140,13 +2144,27 @@ recheck: static u16 mxt_get_debug_value(struct mxt_data *data, unsigned int x, unsigned int y) { + struct mxt_info *info = &data->info; struct mxt_dbg *dbg = &data->dbg; unsigned int ofs, page; + unsigned int col = 0; + unsigned int col_width; + + if (info->family_id == MXT_FAMILY_1386) { + col_width = info->matrix_ysize / MXT1386_COLUMNS; + col = y / col_width; + y = y % col_width; + } else { + col_width = info->matrix_ysize; + } - ofs = (y + (x * data->info.matrix_ysize)) * sizeof(u16); + ofs = (y + (x * col_width)) * sizeof(u16); page = ofs / MXT_DIAGNOSTIC_SIZE; ofs %= MXT_DIAGNOSTIC_SIZE; + if (info->family_id == MXT_FAMILY_1386) + page += col * MXT1386_PAGES_PER_COLUMN; + return get_unaligned_le16(&dbg->t37_buf[page].data[ofs]); }
@@ -2416,6 +2434,7 @@ static const struct video_device mxt_video_device = { static void mxt_debug_init(struct mxt_data *data) { + struct mxt_info *info = &data->info; struct mxt_dbg *dbg = &data->dbg; struct mxt_object *object; int error;
@@ -2439,8 +2458,14 @@ static void mxt_debug_init(struct mxt_data *data) /* Calculate size of data and allocate buffer */ dbg->t37_nodes = data->xsize * data->ysize; - dbg->t37_pages = DIV_ROUND_UP(data->xsize * data->info.matrix_ysize * - sizeof(u16), sizeof(dbg->t37_buf->data)); + + if (info->family_id == MXT_FAMILY_1386) + dbg->t37_pages = MXT1386_COLUMNS * MXT1386_PAGES_PER_COLUMN; + else + dbg->t37_pages = DIV_ROUND_UP(data->xsize * + data->info.matrix_ysize * + sizeof(u16), + sizeof(dbg->t37_buf->data)); dbg->t37_buf = devm_kmalloc_array(&data->client->dev, dbg->t37_pages, sizeof(struct t37_debug), GFP_KERNEL);
--
2.5.0