Received: by 2002:a25:6193:0:0:0:0:0 with SMTP id v141csp623312ybb; Wed, 25 Mar 2020 06:35:10 -0700 (PDT) X-Google-Smtp-Source: ADFU+vv8EWbqbqDy/YE7qq1uLKKzx2dU7WRXsDCgVbV9Zaf6E/2IRLAaRHVICUBYY+q7n6bem6lT X-Received: by 2002:a9d:943:: with SMTP id 61mr2512883otp.3.1585143310808; Wed, 25 Mar 2020 06:35:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585143310; cv=none; d=google.com; s=arc-20160816; b=tcq7J9tGgW2YopYKfu6OAFshJXqiA0k+W1YGPa8bMuEQ6NnIF1VzyT5aONGkkcA5wq 9M1o7DmPDgWmwWlNa+cKd2WdCKNXrnUxTBdf7P7OudYiuIoCl4FMG78yZtyyA+gGja6p 3aatydIq5xveFFAurADCW/1T2AA3O3b+b8CIZ0Z/3274XgLmQyQ0V7n1R/swCup64Zld xHbMU9ZudoGsy+Y/JP600bY2SEtbY7PeoXWO/Q/Wi8ImjHy6tIKEnIJeY8NYTr85vRGb HSC7h+9gQVmbmpWEdhaSWayqBr+/vn4aqL7bCkJooXMGUmTL93OaO21XdBEjaaO/f5fS T70A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:ironport-sdr:ironport-sdr; bh=d89/P2OswyC3l7EBWlMfaUKJfOGm4q3cdiygnScarrQ=; b=yEGwv1ds3CWIzvP/1rVUxsS/+I6+3bEhwGal8Vx17M/nFECcYYYXVDia9pQAjuMmuK 96wwAfqtGEdbGE9Mw8fEG7VRMivHorFb1c7xZQ2j9AWaVUU2JcCqf4VOfJg03zMDZ6RF xgQCvwyi0GYL0/crXztxvY1KpN2lZxeFbyyVSWn8rqAniKApyXBW9z/LQb+kBtk6LBoK B4SJH4+vE5gg5oYEPZGEJ47HQM+pMh2BjoNLpPgc01fB33n5EvuQPY4siwpJTZVQIid3 +04eKNqpx7d0Jcj5JO71NHwlEgyAczEVPuua0WwVWxTIqOlGerAIvqCDwYYBPuaeQIUC gn9A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u10si10596146oib.91.2020.03.25.06.34.57; Wed, 25 Mar 2020 06:35:10 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727604AbgCYNeO (ORCPT + 99 others); Wed, 25 Mar 2020 09:34:14 -0400 Received: from esa3.mentor.iphmx.com ([68.232.137.180]:53108 "EHLO esa3.mentor.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727114AbgCYNeN (ORCPT ); Wed, 25 Mar 2020 09:34:13 -0400 IronPort-SDR: dldMw3uZ11AF2omLHgpTpz9dTRNxEYd+QOywbx8ftOr+nQd2Wk3HcuEod5iXbHcwSxCjOxkjH+ nzYjYYOCGcUf0j6vsQbHd258tTzF/erwYZ7UHYe4Qf4RVGSBBppyO+t012BAsglgNVPfLNf/iV eiUgyTapJQR1qwG62Y68W2ouH58Zs/0LQIn+jcdvNXWnDqZw5yZAPVpjgk6vMxknD11Igq0DER kVo/9dZUuuPQJnFjWaCxmJ3OfOiLzSYK8ey0C3oxtqy6BM5bqrygmxK/O1XGUwJMuEBOyoyTj9 vlo= X-IronPort-AV: E=Sophos;i="5.72,304,1580803200"; d="scan'208";a="47099651" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 25 Mar 2020 05:34:13 -0800 IronPort-SDR: ARyyJIUSLJgehWsGVwiUEGRkkuib1Y6WxTn8E67deJ21YYVechmNSTzM8Y6CqxXEJ8WvFyBwSX YAqsQWFa+cgJOmn9yTmLfrHT2fhboyHkvBjnBj/c1GsEcZfWDZgVONxDs+M7NCvbtFmHIHDr7d bv2GSf+zI3yyP+2i3c4GDo+MT0KRanBzy3OoCUsEHR1dQFM2OS3R29rvWM6D+m7dV+jA8WJp9M LDJhU+0S9DVH6jWQy4Xl9/A03aaw1gFB/aITClv6SQVMCmHjTsV9hzDT2VLI8jz1xw4+lD3Y8y Aic= From: Jiada Wang To: , , , , , CC: , , , , Subject: [PATCH v9 08/55] Input: atmel_mxt_ts - implement T15 Key Array support Date: Wed, 25 Mar 2020 06:32:47 -0700 Message-ID: <20200325133334.19346-9-jiada_wang@mentor.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200325133334.19346-1-jiada_wang@mentor.com> References: <20200325133334.19346-1-jiada_wang@mentor.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nick Dyer There is a key array object in many maXTouch chips which allows some X/Y lines to be used as a key array. This patch maps them to a series of keys which may be configured in a platform data array. Signed-off-by: Nick Dyer Acked-by: Benson Leung Acked-by: Yufeng Shen (cherry picked from ndyer/linux/for-upstream commit 15bb074b5abf3a101f7b79544213f1c110ea4cab) [gdavis: Resolve forward port conflicts due to applying upstream commit 96a938aa214e ("Input: atmel_mxt_ts - remove platform data support").] Signed-off-by: George G. Davis [jiada: Fix compilation warning] Signed-off-by: Jiada Wang --- drivers/input/touchscreen/atmel_mxt_ts.c | 85 ++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index df2e0ba76e63..d05249b02781 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -314,6 +314,9 @@ struct mxt_data { struct mxt_dbg dbg; struct gpio_desc *reset_gpio; bool use_retrigen_workaround; + unsigned long t15_keystatus; + int t15_num_keys; + const unsigned int *t15_keymap; /* Cached parameters from object table */ u16 T5_address; @@ -324,6 +327,8 @@ struct mxt_data { u16 T71_address; u8 T9_reportid_min; u8 T9_reportid_max; + u8 T15_reportid_min; + u8 T15_reportid_max; u16 T18_address; u8 T19_reportid; u8 T42_reportid_min; @@ -987,6 +992,38 @@ static void mxt_proc_t100_message(struct mxt_data *data, u8 *message) data->update_input = true; } +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; + int key; + bool curr_state, new_state; + bool sync = false; + unsigned long keystates = le32_to_cpu((__force __le32)msg[2]); + + for (key = 0; key < data->t15_num_keys; key++) { + curr_state = test_bit(key, &data->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, &data->t15_keystatus); + input_event(input_dev, EV_KEY, + data->t15_keymap[key], 1); + sync = true; + } else if (curr_state && !new_state) { + dev_dbg(dev, "T15 key release: %u\n", key); + __clear_bit(key, &data->t15_keystatus); + input_event(input_dev, EV_KEY, + data->t15_keymap[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; @@ -1045,6 +1082,9 @@ static int mxt_proc_message(struct mxt_data *data, u8 *message) } else if (report_id == data->T19_reportid) { mxt_input_button(data, message); data->update_input = true; + } else if (report_id >= data->T15_reportid_min + && report_id <= data->T15_reportid_max) { + mxt_proc_t15_messages(data, message); } else { mxt_dump_message(data, message); } @@ -1706,6 +1746,8 @@ static void mxt_free_object_table(struct mxt_data *data) data->T71_address = 0; data->T9_reportid_min = 0; data->T9_reportid_max = 0; + data->T15_reportid_min = 0; + data->T15_reportid_max = 0; data->T18_address = 0; data->T19_reportid = 0; data->T42_reportid_min = 0; @@ -1784,6 +1826,10 @@ static int mxt_parse_object_table(struct mxt_data *data, object->num_report_ids - 1; data->num_touchids = object->num_report_ids; break; + case MXT_TOUCH_KEYARRAY_T15: + data->T15_reportid_min = min_id; + data->T15_reportid_max = max_id; + break; case MXT_SPT_COMMSCONFIG_T18: data->T18_address = object->start_address; break; @@ -2077,6 +2123,7 @@ static int mxt_initialize_input_device(struct mxt_data *data) int error; unsigned int num_mt_slots; unsigned int mt_flags = 0; + int i; switch (data->multitouch) { case MXT_TOUCH_MULTI_T9: @@ -2190,6 +2237,15 @@ static int mxt_initialize_input_device(struct mxt_data *data) 0, 255, 0, 0); } + /* For T15 Key Array */ + if (data->T15_reportid_min) { + data->t15_keystatus = 0; + + for (i = 0; i < data->t15_num_keys; i++) + input_set_capability(input_dev, EV_KEY, + data->t15_keymap[i]); + } + input_set_drvdata(input_dev, data); error = input_register_device(input_dev); @@ -3148,8 +3204,10 @@ static void mxt_input_close(struct input_dev *dev) static int mxt_parse_device_properties(struct mxt_data *data) { static const char keymap_property[] = "linux,gpio-keymap"; + static const char buttons_property[] = "atmel,key-buttons"; struct device *dev = &data->client->dev; u32 *keymap; + u32 *buttonmap; int n_keys; int error; @@ -3179,6 +3237,33 @@ static int mxt_parse_device_properties(struct mxt_data *data) data->t19_num_keys = n_keys; } + if (device_property_present(dev, buttons_property)) { + n_keys = device_property_read_u32_array(dev, buttons_property, + NULL, 0); + if (n_keys <= 0) { + error = n_keys < 0 ? n_keys : -EINVAL; + dev_err(dev, "invalid/malformed '%s' property: %d\n", + buttons_property, error); + return error; + } + + buttonmap = devm_kmalloc_array(dev, n_keys, sizeof(*buttonmap), + GFP_KERNEL); + if (!buttonmap) + return -ENOMEM; + + error = device_property_read_u32_array(dev, buttons_property, + buttonmap, n_keys); + if (error) { + dev_err(dev, "failed to parse '%s' property: %d\n", + buttons_property, error); + return error; + } + + data->t15_keymap = buttonmap; + data->t15_num_keys = n_keys; + } + return 0; } -- 2.17.1