summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/atmel_mxt_ts.c
diff options
context:
space:
mode:
authorNick Dyer <nick.dyer@itdev.co.uk>2012-08-09 17:32:35 +0100
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:37:49 -0700
commit660efb27b1116b0b42f312cd41a24aaa1bd09553 (patch)
tree84542d5cf6e396d04081d53c614fa48aa156e211 /drivers/input/touchscreen/atmel_mxt_ts.c
parent203f076d8ef6de9548588b5a89524babceb8712e (diff)
Input: atmel_mxt_ts - Implement T15 Key Array support
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk> Rebase-Id: R4cdcdad84084c23e9baab8c3f6f688ca6dbd07ee
Diffstat (limited to 'drivers/input/touchscreen/atmel_mxt_ts.c')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 028c67f439aa..be52d05d2b70 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -248,6 +248,11 @@
#define MXT_STYLUS_PRESSURE_MASK 0x3F
+/* T15 Key array */
+int mxt_t15_keys[] = { };
+
+static unsigned long mxt_t15_keystatus;
+
/* Touchscreen absolute values */
#define MXT_MAX_AREA 0xff
@@ -317,6 +322,8 @@ struct mxt_data {
u16 T7_address;
u8 T9_reportid_min;
u8 T9_reportid_max;
+ u8 T15_reportid_min;
+ u8 T15_reportid_max;
u8 T42_reportid_min;
u8 T42_reportid_max;
u16 T44_address;
@@ -774,6 +781,36 @@ static void mxt_proc_t9_messages(struct mxt_data *data, u8 *message)
}
}
+static void mxt_proc_t15_messages(struct mxt_data *data, u8 *msg)
+{
+ struct input_dev *input_dev = data->input_dev;
+ struct device *dev = &data->client->dev;
+ u8 key;
+ bool curr_state, new_state;
+ bool sync = false;
+ unsigned long keystates = le32_to_cpu(msg[2]);
+
+ for (key = 0; key < ARRAY_SIZE(mxt_t15_keys); key++) {
+ curr_state = test_bit(key, &mxt_t15_keystatus);
+ new_state = test_bit(key, &keystates);
+
+ if (!curr_state && new_state) {
+ dev_dbg(dev, "T15 key press: %u\n", key);
+ __set_bit(key, &mxt_t15_keystatus);
+ input_event(input_dev, EV_KEY, mxt_t15_keys[key], 1);
+ sync = true;
+ } else if (curr_state && !new_state) {
+ dev_dbg(dev, "T15 key release: %u\n", key);
+ __clear_bit(key, &mxt_t15_keystatus);
+ input_event(input_dev, EV_KEY, mxt_t15_keys[key], 0);
+ sync = true;
+ }
+ }
+
+ if (sync)
+ input_sync(input_dev);
+}
+
static void mxt_proc_t42_messages(struct mxt_data *data, u8 *msg)
{
struct device *dev = &data->client->dev;
@@ -876,6 +913,9 @@ static int mxt_proc_message(struct mxt_data *data, u8 *msg)
} else if (report_id >= data->T63_reportid_min
&& report_id <= data->T63_reportid_max) {
mxt_proc_t63_messages(data, msg);
+ } else if (report_id >= data->T15_reportid_min
+ && report_id <= data->T15_reportid_max) {
+ mxt_proc_t15_messages(data, msg);
} else if (report_id == data->T6_reportid) {
mxt_proc_t6_messages(data, msg);
} else if (report_id == data->T48_reportid) {
@@ -1541,6 +1581,10 @@ static int mxt_get_object_table(struct mxt_data *data)
case MXT_GEN_POWER_T7:
data->T7_address = object->start_address;
break;
+ case MXT_TOUCH_KEYARRAY_T15:
+ data->T15_reportid_max = object->max_reportid;
+ data->T15_reportid_min = object->min_reportid;
+ break;
case MXT_PROCI_TOUCHSUPPRESSION_T42:
data->T42_reportid_max = object->max_reportid;
data->T42_reportid_min = object->min_reportid;
@@ -2076,6 +2120,7 @@ static int mxt_initialize_input_device(struct mxt_data *data)
struct device *dev = &data->client->dev;
struct input_dev *input_dev;
int ret;
+ int key;
/* Initialize input device */
input_dev = input_allocate_device();
@@ -2130,6 +2175,12 @@ static int mxt_initialize_input_device(struct mxt_data *data)
0, MT_TOOL_MAX, 0, 0);
}
+ /* For T15 key array */
+ mxt_t15_keystatus = 0;
+ for (key = 0; key < ARRAY_SIZE(mxt_t15_keys); key++) {
+ input_set_capability(input_dev, EV_KEY, mxt_t15_keys[key]);
+ }
+
input_set_drvdata(input_dev, data);
i2c_set_clientdata(data->client, data);