diff options
author | Nick Dyer <nick.dyer@itdev.co.uk> | 2012-08-09 17:32:35 +0100 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 12:37:49 -0700 |
commit | 660efb27b1116b0b42f312cd41a24aaa1bd09553 (patch) | |
tree | 84542d5cf6e396d04081d53c614fa48aa156e211 /drivers/input/touchscreen/atmel_mxt_ts.c | |
parent | 203f076d8ef6de9548588b5a89524babceb8712e (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.c | 51 |
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); |