From patchwork Thu Dec 16 23:30:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Harvey X-Patchwork-Id: 524789 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B4B2EC433EF for ; Thu, 16 Dec 2021 23:37:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229784AbhLPXhZ (ORCPT ); Thu, 16 Dec 2021 18:37:25 -0500 Received: from finn.gateworks.com ([108.161.129.64]:36216 "EHLO finn.localdomain" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229755AbhLPXhZ (ORCPT ); Thu, 16 Dec 2021 18:37:25 -0500 Received: from 068-189-091-139.biz.spectrum.com ([68.189.91.139] helo=tharvey.pdc.gateworks.com) by finn.localdomain with esmtp (Exim 4.93) (envelope-from ) id 1my0Cy-0093am-Mq; Thu, 16 Dec 2021 23:30:44 +0000 From: Tim Harvey To: linux-input@vger.kernel.org, Rob Herring , Dmitry Torokhov Cc: Tim Harvey , Nicolas Saenz Julienne Subject: [RFC PATCH 1/4] dt-bindings: input: touchscreen: edt-ft5x06: add poll-interval Date: Thu, 16 Dec 2021 15:30:38 -0800 Message-Id: <20211216233041.1220-2-tharvey@gateworks.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211216233041.1220-1-tharvey@gateworks.com> References: <20211216233041.1220-1-tharvey@gateworks.com> Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org Some devices might not provide an interrupt line for the touchscreen. In that case the driver defaults to using a polled interface. Cc: Nicolas Saenz Julienne Signed-off-by: Tim Harvey --- .../devicetree/bindings/input/touchscreen/edt-ft5x06.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.yaml b/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.yaml index 2e8da7470513..a0d4dabf03b8 100644 --- a/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.yaml +++ b/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.yaml @@ -47,6 +47,11 @@ properties: interrupts: maxItems: 1 + poll-interval: + description: Poll interval time in milliseconds, only relevant if no + interrupt was provided. + $ref: /schemas/types.yaml#/definitions/uint32 + reset-gpios: maxItems: 1 @@ -99,7 +104,6 @@ additionalProperties: false required: - compatible - reg - - interrupts examples: - | From patchwork Thu Dec 16 23:30:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Harvey X-Patchwork-Id: 525316 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 57060C433FE for ; Thu, 16 Dec 2021 23:37:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229775AbhLPXhX (ORCPT ); Thu, 16 Dec 2021 18:37:23 -0500 Received: from finn.gateworks.com ([108.161.129.64]:36212 "EHLO finn.localdomain" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229771AbhLPXhX (ORCPT ); Thu, 16 Dec 2021 18:37:23 -0500 Received: from 068-189-091-139.biz.spectrum.com ([68.189.91.139] helo=tharvey.pdc.gateworks.com) by finn.localdomain with esmtp (Exim 4.93) (envelope-from ) id 1my0Cz-0093am-8J; Thu, 16 Dec 2021 23:30:45 +0000 From: Tim Harvey To: linux-input@vger.kernel.org, Rob Herring , Dmitry Torokhov Cc: Tim Harvey , Nicolas Saenz Julienne , Dave Stevenson Subject: [RFC PATCH 2/4] input: edt-ft5x06 - add polled input support Date: Thu, 16 Dec 2021 15:30:39 -0800 Message-Id: <20211216233041.1220-3-tharvey@gateworks.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211216233041.1220-1-tharvey@gateworks.com> References: <20211216233041.1220-1-tharvey@gateworks.com> Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org Some hardware configurations might pass on providing an interrupt line. In that case there is always the option to use a polled input approach. This patch adapts the driver for it. The polled approach is only triggered if no interrupt is provided by the firmware or platform data. Cc: Nicolas Saenz Julienne Cc: Dave Stevenson Signed-off-by: Tim Harvey --- drivers/input/touchscreen/edt-ft5x06.c | 63 ++++++++++++++++++-------- 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c index bb2e1cbffba7..06662f2258b1 100644 --- a/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c @@ -187,9 +187,8 @@ static bool edt_ft5x06_ts_check_crc(struct edt_ft5x06_ts_data *tsdata, return true; } -static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id) +static void edt_ft5x06_process(struct edt_ft5x06_ts_data *tsdata) { - struct edt_ft5x06_ts_data *tsdata = dev_id; struct device *dev = &tsdata->client->dev; u8 cmd; u8 rdbuf[63]; @@ -216,7 +215,7 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id) break; default: - goto out; + return; } memset(rdbuf, 0, sizeof(rdbuf)); @@ -228,7 +227,7 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id) if (error) { dev_err_ratelimited(dev, "Unable to fetch data, error: %d\n", error); - goto out; + return; } /* M09/M12 does not send header or CRC */ @@ -238,11 +237,11 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id) dev_err_ratelimited(dev, "Unexpected header: %02x%02x%02x!\n", rdbuf[0], rdbuf[1], rdbuf[2]); - goto out; + return; } if (!edt_ft5x06_ts_check_crc(tsdata, rdbuf, datalen)) - goto out; + return; } for (i = 0; i < tsdata->max_support_points; i++) { @@ -274,11 +273,23 @@ static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id) input_mt_report_pointer_emulation(tsdata->input, true); input_sync(tsdata->input); +} -out: +static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id) +{ + struct edt_ft5x06_ts_data *tsdata = dev_id; + + edt_ft5x06_process(tsdata); return IRQ_HANDLED; } +static void edt_ft5x06_ts_poll(struct input_dev *dev) +{ + struct edt_ft5x06_ts_data *tsdata = input_get_drvdata(dev); + + edt_ft5x06_process(tsdata); +} + static int edt_ft5x06_register_write(struct edt_ft5x06_ts_data *tsdata, u8 addr, u8 value) { @@ -1080,6 +1091,7 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client, u8 buf[2] = { 0xfc, 0x00 }; struct input_dev *input; unsigned long irq_flags; + u32 poll_interval = 0; int error; char fw_version[EDT_NAME_LEN]; @@ -1234,17 +1246,32 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client, i2c_set_clientdata(client, tsdata); - irq_flags = irq_get_trigger_type(client->irq); - if (irq_flags == IRQF_TRIGGER_NONE) - irq_flags = IRQF_TRIGGER_FALLING; - irq_flags |= IRQF_ONESHOT; - - error = devm_request_threaded_irq(&client->dev, client->irq, - NULL, edt_ft5x06_ts_isr, irq_flags, - client->name, tsdata); - if (error) { - dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); - return error; + device_property_read_u32(&client->dev, "poll-interval", + &poll_interval); + if (poll_interval) { + error = input_setup_polling(input, edt_ft5x06_ts_poll); + if (error) { + dev_err(&client->dev, + "Unable to set up polling mode: %d\n", error); + return error; + } + input_set_drvdata(input, tsdata); + input_set_poll_interval(input, poll_interval); + dev_info(&client->dev, "Polling device at %dms\n", + poll_interval); + } else { + irq_flags = irq_get_trigger_type(client->irq); + if (irq_flags == IRQF_TRIGGER_NONE) + irq_flags = IRQF_TRIGGER_FALLING; + irq_flags |= IRQF_ONESHOT; + + error = devm_request_threaded_irq(&client->dev, client->irq, + NULL, edt_ft5x06_ts_isr, irq_flags, + client->name, tsdata); + if (error) { + dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); + return error; + } } error = devm_device_add_group(&client->dev, &edt_ft5x06_attr_group); From patchwork Thu Dec 16 23:30:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Harvey X-Patchwork-Id: 524791 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC351C433F5 for ; Thu, 16 Dec 2021 23:37:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229770AbhLPXhW (ORCPT ); Thu, 16 Dec 2021 18:37:22 -0500 Received: from finn.gateworks.com ([108.161.129.64]:36208 "EHLO finn.localdomain" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229755AbhLPXhW (ORCPT ); Thu, 16 Dec 2021 18:37:22 -0500 Received: from 068-189-091-139.biz.spectrum.com ([68.189.91.139] helo=tharvey.pdc.gateworks.com) by finn.localdomain with esmtp (Exim 4.93) (envelope-from ) id 1my0Cz-0093am-MQ; Thu, 16 Dec 2021 23:30:45 +0000 From: Tim Harvey To: linux-input@vger.kernel.org, Rob Herring , Dmitry Torokhov Cc: Tim Harvey Subject: [RFC PATCH 3/4] input: edt-ft5x06 - add support for DFROBOT touch controllers Date: Thu, 16 Dec 2021 15:30:40 -0800 Message-Id: <20211216233041.1220-4-tharvey@gateworks.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211216233041.1220-1-tharvey@gateworks.com> References: <20211216233041.1220-1-tharvey@gateworks.com> Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org Add support for the touch controller found on a DFROBOT DFR0550/DFR0776 touchscreen display. These touchscreen displays are intended to be compatible with the official Raspberry Pi 7in display which has an FTx06 touch controller directly attached to the 15pin connector to the host processor. However these displays have an FTx06 touch controller that connected to an I2C master on a STM32F103 micro controller which polls the FTx06 and emulates a virtual I2C device connected to the 15pin connector to the host processor. The emulated FTx06 implements a subset of the FTx06 register set but must be read with individual transactions between reading the number of points and the point data itself. Additionally there is no IRQ made available. Signed-off-by: Tim Harvey --- .../input/touchscreen/edt-ft5x06.yaml | 1 + drivers/input/touchscreen/edt-ft5x06.c | 65 ++++++++++++++++--- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.yaml b/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.yaml index a0d4dabf03b8..45a9cb1d4f14 100644 --- a/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.yaml +++ b/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.yaml @@ -40,6 +40,7 @@ properties: - edt,edt-ft5506 - evervision,ev-ft5726 - focaltech,ft6236 + - dfr,dfr0550 reg: maxItems: 1 diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c index 06662f2258b1..a3622d6e8e65 100644 --- a/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c @@ -84,6 +84,7 @@ enum edt_ver { EDT_M12, EV_FT, GENERIC_FT, + DFR, }; struct edt_reg_addr { @@ -134,6 +135,7 @@ struct edt_ft5x06_ts_data { struct edt_i2c_chip_data { int max_support_points; + bool dfr; }; static int edt_ft5x06_ts_readwrite(struct i2c_client *client, @@ -195,6 +197,7 @@ static void edt_ft5x06_process(struct edt_ft5x06_ts_data *tsdata) int i, type, x, y, id; int offset, tplen, datalen, crclen; int error; + int num_points; switch (tsdata->version) { case EDT_M06: @@ -202,6 +205,7 @@ static void edt_ft5x06_process(struct edt_ft5x06_ts_data *tsdata) offset = 5; /* where the actual touch data starts */ tplen = 4; /* data comes in so called frames */ crclen = 1; /* length of the crc data */ + datalen = tplen * tsdata->max_support_points + offset + crclen; break; case EDT_M09: @@ -212,6 +216,14 @@ static void edt_ft5x06_process(struct edt_ft5x06_ts_data *tsdata) offset = 3; tplen = 6; crclen = 0; + datalen = tplen * tsdata->max_support_points + offset + crclen; + break; + /* DFR needs to read 1 byte R2 for num points */ + case DFR: + cmd = 0x2; + offset = 3; + crclen = 0; + datalen = 1; break; default: @@ -219,7 +231,6 @@ static void edt_ft5x06_process(struct edt_ft5x06_ts_data *tsdata) } memset(rdbuf, 0, sizeof(rdbuf)); - datalen = tplen * tsdata->max_support_points + offset + crclen; error = edt_ft5x06_ts_readwrite(tsdata->client, sizeof(cmd), &cmd, @@ -242,11 +253,31 @@ static void edt_ft5x06_process(struct edt_ft5x06_ts_data *tsdata) if (!edt_ft5x06_ts_check_crc(tsdata, rdbuf, datalen)) return; + num_points = tsdata->max_support_points; + } else if (tsdata->version == DFR) { + num_points = min(rdbuf[0] & 0xf, tsdata->max_support_points); + } else { + num_points = min(rdbuf[2] & 0xf, tsdata->max_support_points); } - for (i = 0; i < tsdata->max_support_points; i++) { + for (i = 0; i < num_points; i++) { u8 *buf = &rdbuf[i * tplen + offset]; + /* DFR must read each point in separate transaction */ + if (tsdata->version == DFR) { + cmd = 3+6*i; + datalen = 4; + buf = rdbuf; + error = edt_ft5x06_ts_readwrite(tsdata->client, + sizeof(cmd), &cmd, + datalen, buf); + if (error) { + dev_err_ratelimited(dev, "Unable to fetch point data, error: %d\n", + error); + return; + } + } + type = buf[0] >> 6; /* ignore Reserved events */ if (type == TOUCH_EVENT_RESERVED) @@ -1072,6 +1103,9 @@ static void edt_ft5x06_ts_set_regs(struct edt_ft5x06_ts_data *tsdata) reg_addr->reg_num_x = NO_REGISTER; reg_addr->reg_num_y = NO_REGISTER; break; + + case DFR: + break; } } @@ -1206,21 +1240,29 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client, tsdata->input = input; tsdata->factory_mode = false; - error = edt_ft5x06_ts_identify(client, tsdata, fw_version); - if (error) { - dev_err(&client->dev, "touchscreen probe failed\n"); - return error; + if (chip_data->dfr) { + tsdata->version = DFR; + snprintf(tsdata->name, EDT_NAME_LEN, "DFROBOT"); + fw_version[0] = 0; + } else { + error = edt_ft5x06_ts_identify(client, tsdata, fw_version); + if (error) { + dev_err(&client->dev, "touchscreen probe failed\n"); + return error; + } } /* * Dummy read access. EP0700MLP1 returns bogus data on the first * register read access and ignores writes. */ - edt_ft5x06_ts_readwrite(tsdata->client, 2, buf, 2, buf); + if (!chip_data->dfr) /* this gets the DFR controller out of sync */ + edt_ft5x06_ts_readwrite(tsdata->client, 2, buf, 2, buf); edt_ft5x06_ts_set_regs(tsdata); edt_ft5x06_ts_get_defaults(&client->dev, tsdata); - edt_ft5x06_ts_get_parameters(tsdata); + if (!chip_data->dfr) + edt_ft5x06_ts_get_parameters(tsdata); dev_dbg(&client->dev, "Model \"%s\", Rev. \"%s\", %dx%d sensors\n", @@ -1423,12 +1465,18 @@ static const struct edt_i2c_chip_data edt_ft6236_data = { .max_support_points = 2, }; +static const struct edt_i2c_chip_data edt_dfr0550_data = { + .max_support_points = 5, + .dfr = true, +}; + static const struct i2c_device_id edt_ft5x06_ts_id[] = { { .name = "edt-ft5x06", .driver_data = (long)&edt_ft5x06_data }, { .name = "edt-ft5506", .driver_data = (long)&edt_ft5506_data }, { .name = "ev-ft5726", .driver_data = (long)&edt_ft5506_data }, /* Note no edt- prefix for compatibility with the ft6236.c driver */ { .name = "ft6236", .driver_data = (long)&edt_ft6236_data }, + { .name = "dfr0550", .driver_data = (long)&edt_dfr0550_data }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(i2c, edt_ft5x06_ts_id); @@ -1441,6 +1489,7 @@ static const struct of_device_id edt_ft5x06_of_match[] = { { .compatible = "evervision,ev-ft5726", .data = &edt_ft5506_data }, /* Note focaltech vendor prefix for compatibility with ft6236.c */ { .compatible = "focaltech,ft6236", .data = &edt_ft6236_data }, + { .compatible = "dfr,dfr0550", .data = &edt_dfr0550_data }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, edt_ft5x06_of_match); From patchwork Thu Dec 16 23:30:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tim Harvey X-Patchwork-Id: 525317 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CEFE6C433EF for ; Thu, 16 Dec 2021 23:37:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229577AbhLPXhX (ORCPT ); Thu, 16 Dec 2021 18:37:23 -0500 Received: from finn.gateworks.com ([108.161.129.64]:36210 "EHLO finn.localdomain" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229755AbhLPXhW (ORCPT ); Thu, 16 Dec 2021 18:37:22 -0500 Received: from 068-189-091-139.biz.spectrum.com ([68.189.91.139] helo=tharvey.pdc.gateworks.com) by finn.localdomain with esmtp (Exim 4.93) (envelope-from ) id 1my0D0-0093am-5y; Thu, 16 Dec 2021 23:30:46 +0000 From: Tim Harvey To: linux-input@vger.kernel.org, Rob Herring , Dmitry Torokhov Cc: Tim Harvey , Dave Stevenson Subject: [RFC PATCH 4/4] input: edt-ft5x06 - Handle unreliable TOUCH_UP events Date: Thu, 16 Dec 2021 15:30:41 -0800 Message-Id: <20211216233041.1220-5-tharvey@gateworks.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20211216233041.1220-1-tharvey@gateworks.com> References: <20211216233041.1220-1-tharvey@gateworks.com> Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org The ft5x06 is unreliable in sending touch up events, so some touch IDs can become stuck in the detected state. Ensure that IDs that are unreported by the controller are released. Signed-off-by: Dave Stevenson Signed-off-by: Tim Harvey --- drivers/input/touchscreen/edt-ft5x06.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c index a3622d6e8e65..53906fcbaa51 100644 --- a/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c @@ -126,6 +126,7 @@ struct edt_ft5x06_ts_data { int offset_y; int report_rate; int max_support_points; + unsigned int known_ids; char name[EDT_NAME_LEN]; @@ -198,6 +199,8 @@ static void edt_ft5x06_process(struct edt_ft5x06_ts_data *tsdata) int offset, tplen, datalen, crclen; int error; int num_points; + unsigned int active_ids = 0, known_ids = tsdata->known_ids; + long released_ids; switch (tsdata->version) { case EDT_M06: @@ -297,10 +300,21 @@ static void edt_ft5x06_process(struct edt_ft5x06_ts_data *tsdata) input_mt_slot(tsdata->input, id); if (input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, - type != TOUCH_EVENT_UP)) + type != TOUCH_EVENT_UP)) { touchscreen_report_pos(tsdata->input, &tsdata->prop, x, y, true); + active_ids |= BIT(id); + } else { + known_ids &= ~BIT(id); + } + } + + released_ids = known_ids & ~active_ids; + for_each_set_bit_from(i, &released_ids, tsdata->max_support_points) { + input_mt_slot(tsdata->input, i); + input_mt_report_slot_inactive(tsdata->input); } + tsdata->known_ids = active_ids; input_mt_report_pointer_emulation(tsdata->input, true); input_sync(tsdata->input);