From patchwork Fri Aug 16 08:38:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Jiada" X-Patchwork-Id: 11097317 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0D1581395 for ; Fri, 16 Aug 2019 08:40:42 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F081F20564 for ; Fri, 16 Aug 2019 08:40:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E3E2B2811A; Fri, 16 Aug 2019 08:40:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 87E6920564 for ; Fri, 16 Aug 2019 08:40:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727291AbfHPIiX (ORCPT ); Fri, 16 Aug 2019 04:38:23 -0400 Received: from esa3.mentor.iphmx.com ([68.232.137.180]:42029 "EHLO esa3.mentor.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727188AbfHPIiX (ORCPT ); Fri, 16 Aug 2019 04:38:23 -0400 IronPort-SDR: jrTJUyIB8wLCLCIgUmDd9dUQXFacnNTPpEPbbYgf+2bpyMbOlLtphDvvH64KZIYAkdrPffLJYQ 8e+ppzLL3wTfboN3c7pmOWB0cikDNCRDqfDsGOsPyI+2SaK8kepJLAh7aNaO0RO5YeWAYeC2ly HudXk4SFT2FkIhNaLSw6GIT1/62ffghEE7FFNqGvlcYVtBZhklSlaknjArZzgjmGJq8N0FHtqx q3DTEPtI6pwXPTGeFYvoeAYSSa5u9PO88W2pw+jbhT2Cwz0tjXPocoZWZgmCfKoYvjt1YoQJtx xMY= X-IronPort-AV: E=Sophos;i="5.64,391,1559548800"; d="scan'208";a="40507245" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 16 Aug 2019 00:38:21 -0800 IronPort-SDR: Ld2RW3s3aku5NrPIGsQOXbKSNwBwtAoQGuUS3kcWHQcJ5r12xyAuJqQ5Sww1WhMoSRQaikSohZ uQEwXKRhivIlYb1zv9zl/UD8lPWr8XNAb6Y29IqSW8XMDATJCt5sovEpBUQjnhjkfVOkYILHrc r3Ex7chWRG+e0Mv8DRhtPTncwT1Z8cp1MeLNe3F5udgKjeDwD75b4Se0COw+caxAgl/h6N1JeO uotPXZORj8mKlJCwB5UGR7nHGlT/aeIBnHxbCfPoj3OiuEt0vNfD7Q9roHqJqRHucW9L+plh+y QhA= From: Jiada Wang To: , CC: , , , Subject: [PATCH v1 55/63] Input: atmel_mxt_ts: Use msecs_to_jiffies() instead of HZ Date: Fri, 16 Aug 2019 17:38:22 +0900 Message-ID: <20190816083830.19553-1-jiada_wang@mentor.com> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 X-ClientProxiedBy: svr-orw-mbx-04.mgc.mentorg.com (147.34.90.204) To svr-orw-mbx-03.mgc.mentorg.com (147.34.90.203) Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Dean Jenkins Replace HZ / 10 with msecs_to_jiffies(100) in the schedule_delayed_work() calls in mxt_fw_work() and mxt_check_bootloader() because it is cleaner. Signed-off-by: Dean Jenkins Signed-off-by: Sanjeev Chugh Signed-off-by: George G. Davis Signed-off-by: Jiada Wang --- drivers/input/touchscreen/atmel_mxt_ts.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 35d92751e49f..40263ef79e8e 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -842,7 +842,7 @@ static int mxt_check_bootloader(struct mxt_data *data) f->previous = state; /* Poll after 0.1s if no interrupt received */ - schedule_delayed_work(&f->work, HZ / 10); + schedule_delayed_work(&f->work, msecs_to_jiffies(100)); return 0; @@ -3773,7 +3773,7 @@ static int mxt_load_fw(struct device *dev) goto release_firmware; /* Poll after 0.1s if no interrupt received */ - schedule_delayed_work(&data->flash->work, HZ / 10); + schedule_delayed_work(&data->flash->work, msecs_to_jiffies(100)); /* Wait for flash. */ ret = mxt_wait_for_completion(data, &data->flash->flash_completion, From patchwork Fri Aug 16 08:38:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Jiada" X-Patchwork-Id: 11097255 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0DDAF14F7 for ; Fri, 16 Aug 2019 08:38:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EFF75289E1 for ; Fri, 16 Aug 2019 08:38:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E42B4289DC; Fri, 16 Aug 2019 08:38:30 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8C06D289D4 for ; Fri, 16 Aug 2019 08:38:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727307AbfHPIiZ (ORCPT ); Fri, 16 Aug 2019 04:38:25 -0400 Received: from esa3.mentor.iphmx.com ([68.232.137.180]:42029 "EHLO esa3.mentor.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727188AbfHPIiY (ORCPT ); Fri, 16 Aug 2019 04:38:24 -0400 IronPort-SDR: RJZm/sqCpAg/9VhwN7nFAbJLn6zQut+eBmzykLESb6oVm33d2okNSH4uQMqp13U+ppgCfd2f/Q HuU/ADWwk/YE1z4fenYxGdNmqVweUsWFAgrv/Q15CzvN/6xp+UMsgOcHSEqeSQFlFDLctkSZ5N bmd5tMbU4alooeyJ6H3J95QTjcrhddfZTg/TJIABJkq/wmj59UNmb99ttHAKRLXok2Ziyr2STM Ke31aMH2q+FTSeoHeViCibXC9hzDmcHHjznp3IezuHLwDHPd5CoQYEveahGkP8L3pbeahbs4Cc PZo= X-IronPort-AV: E=Sophos;i="5.64,391,1559548800"; d="scan'208";a="40507246" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 16 Aug 2019 00:38:24 -0800 IronPort-SDR: TwI2cGILNfUXPy7hIcq5ZgXVHAbdNuBgd6LTOssOO22f7jyC3P2uOeqUeU85sQ9H3WvkwduU1K vOKjizE8KbbV/Sgr33GE9jzjItMAYGgV17mEH4FK/UBG06KvAQRxNiRyE8zXf2BmtLrwaDtl1P WsiFyhZnDaW70d0BYsmgHrGM+OsQ56g6LywRGTrm4UhqotkgSUB2n0jWOpCje3HYGSmFTLglB7 O5GUOY2MKNq35dhIxYvtwla2IIupSJq3m8sNgxk/MJOQRi9hVmWq6EdUwuDWPEvSYquYHmxqQE lcU= From: Jiada Wang To: , CC: , , , Subject: [PATCH v1 56/63] Input: atmel_mxt_ts: Use complete when in_bootloader true Date: Fri, 16 Aug 2019 17:38:23 +0900 Message-ID: <20190816083830.19553-2-jiada_wang@mentor.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190816083830.19553-1-jiada_wang@mentor.com> References: <20190816083830.19553-1-jiada_wang@mentor.com> MIME-Version: 1.0 X-ClientProxiedBy: svr-orw-mbx-04.mgc.mentorg.com (147.34.90.204) To svr-orw-mbx-03.mgc.mentorg.com (147.34.90.203) Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Dean Jenkins In mxt_interrupt(), complete(&data->chg_completion) was called everytime mxt_interrupt() ran which is unnecessary. mxt_regulator_enable() sets data->in_bootloader to true and waits for the completion indication for data->chg_completion to be set by mxt_interrupt(). mxt_interrupt() already has a test for data->in_bootloader being true so move complete(&data->chg_completion) inside that test. Here is some analysis of some old commits relating to the usage of complete(&data->chg_completion): e6c4b6160d2 ("Input: atmel_mxt_ts - rename bl_completion to chg_completion") This old commit moved the "complete" statement from inside a test for data->in_bootloader being true to run everytime mxt_interrupt() executed. It is unclear why this was done. This new commit reverses that modification back to the original implementation. 4c814dd5c6ae ("Input: atmel_mxt_ts - make bootloader interrupt driven") This old commit modified mxt_load_fw() to no longer use the data->chg_completion solution so only mxt_regulator_enable() uses the data->chg_completion solution. Therefore, only mxt_regulator_enable() now needs to be supported by the data->chg_completion solution. Signed-off-by: Dean Jenkins Signed-off-by: Sanjeev Chugh Signed-off-by: George G. Davis Signed-off-by: Jiada Wang --- drivers/input/touchscreen/atmel_mxt_ts.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 40263ef79e8e..64a1a6815d56 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -1631,9 +1631,9 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id) struct mxt_data *data = dev_id; int ret; - complete(&data->chg_completion); - if (data->in_bootloader) { + complete(&data->chg_completion); + if (data->flash && &data->flash->work) cancel_delayed_work_sync(&data->flash->work); From patchwork Fri Aug 16 08:38:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Jiada" X-Patchwork-Id: 11097313 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9C8A01395 for ; Fri, 16 Aug 2019 08:40:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 88488289D4 for ; Fri, 16 Aug 2019 08:40:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 7BE4C289E1; Fri, 16 Aug 2019 08:40:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D09FC289D4 for ; Fri, 16 Aug 2019 08:40:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727329AbfHPIia (ORCPT ); Fri, 16 Aug 2019 04:38:30 -0400 Received: from esa3.mentor.iphmx.com ([68.232.137.180]:42029 "EHLO esa3.mentor.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727319AbfHPIi3 (ORCPT ); Fri, 16 Aug 2019 04:38:29 -0400 IronPort-SDR: onTg/jMwgLY3WfH9G3+ZOGmQ7xnNgt118nuGmrYtMlKKBDJa/P6r5yxql9LX9YW9ipwrhvxTKn CEi/1lP/t8vt+EpGkeESJl67uI3DNVCDVSe6d5cT+wtWZfWdMDCV3IaswyIqbRWSE4UtMsKHAW nDF8lv0bxTCha0wtdVTDuZEF1+hHC2hEAUqOs09z6K09Cqn2KxGnpEfXPeFSQt8/QK7Q9Ah4D/ sQBNy0vVJw9Nao6FxcSnvv1pNHXdsq/67nBqydNXwed4GXyKQ3KYYFTpmLhnzlnSYkMv3nMnns LKI= X-IronPort-AV: E=Sophos;i="5.64,391,1559548800"; d="scan'208";a="40507247" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 16 Aug 2019 00:38:27 -0800 IronPort-SDR: DNgBvGw+k+ek8yM5XMem4mMRsDpg38mq+Nf/DYrr6D53TaHI+DCU5i+FOzQ42bqoLI0o8+5LqK fRoPjNnHaEu/IRaIJQt0bVP38EcuoyRHNrpt/zexw+j2uZIv6Ro2jsMjbVpc1XwdF1Rktx5Ar8 0sAoy+JGc8SVzqxBbcZqWyQk13D+43Y8CoLVY+cpPicjU77tW1IKO7xt32d3umZms22BNNjY4T dak5r4XaNSRzNa/T44Tcsx3byP9XryJlEOzVukQ9q1bWaK9KmMLBGwv/vXrmfioZiwHpS08J/C Q3w= From: Jiada Wang To: , CC: , , , Subject: [PATCH v1 57/63] input: touchscreen: atmel_mxt_ts: Added sysfs entry for touchscreen status Date: Fri, 16 Aug 2019 17:38:24 +0900 Message-ID: <20190816083830.19553-3-jiada_wang@mentor.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190816083830.19553-1-jiada_wang@mentor.com> References: <20190816083830.19553-1-jiada_wang@mentor.com> MIME-Version: 1.0 X-ClientProxiedBy: svr-orw-mbx-04.mgc.mentorg.com (147.34.90.204) To svr-orw-mbx-03.mgc.mentorg.com (147.34.90.203) Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Naveen Chakka To know the current communication status of the touch controller during runtime, sysfs interface is added sysfs interface: /sys/class/i2c-dev/i2c-*/device/*/touch_dev_stat Executing the above sysfs interface provides two output values 1)Status of the touch device value 0 represents device is inactive value 1 represents device is active 2)Error counter value represents the number of times device in inactive since last read Signed-off-by: Naveen Chakka Signed-off-by: Sanjeev Chugh Signed-off-by: George G. Davis Signed-off-by: Jiada Wang --- drivers/input/touchscreen/atmel_mxt_ts.c | 111 +++++++++++++++++++++-- 1 file changed, 104 insertions(+), 7 deletions(-) diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 64a1a6815d56..234e3031ba42 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -222,6 +223,7 @@ enum t100_type { #define MXT_CHG_DELAY 100 /* msec */ #define MXT_POWERON_DELAY 150 /* msec */ #define MXT_BOOTLOADER_WAIT 36E5 /* 1 minute */ +#define MXT_WATCHDOG_TIMEOUT 1000 /* msec */ /* Command to unlock bootloader */ #define MXT_UNLOCK_CMD_MSB 0xaa @@ -317,6 +319,12 @@ struct mxt_flash { struct delayed_work work; }; +struct mxt_statusinfo { + bool dev_status; + bool intp_triggered; + u32 error_count; +}; + /* Each client has this additional data */ struct mxt_data { struct i2c_client *client; @@ -373,6 +381,9 @@ struct mxt_data { const char *pcfg_name; const char *input_name; struct mxt_flash *flash; + struct work_struct watchdog_work; + struct timer_list watchdog_timer; + struct mxt_statusinfo mxt_status; /* Cached parameters from object table */ u16 T5_address; @@ -1626,11 +1637,30 @@ static int mxt_process_messages(struct mxt_data *data) return total_handled; } +static void mxt_start_wd_timer(struct mxt_data *data) +{ + mod_timer(&data->watchdog_timer, jiffies + + msecs_to_jiffies(MXT_WATCHDOG_TIMEOUT)); +} + +static void mxt_stop_wd_timer(struct mxt_data *data) +{ + /* + * Ensure we wait until the watchdog timer + * running on a different CPU finishes + */ + del_timer_sync(&data->watchdog_timer); + cancel_work_sync(&data->watchdog_work); + del_timer_sync(&data->watchdog_timer); +} + static irqreturn_t mxt_interrupt(int irq, void *dev_id) { struct mxt_data *data = dev_id; int ret; + data->mxt_status.intp_triggered = true; + if (data->in_bootloader) { complete(&data->chg_completion); @@ -1638,21 +1668,25 @@ static irqreturn_t mxt_interrupt(int irq, void *dev_id) cancel_delayed_work_sync(&data->flash->work); ret = mxt_check_bootloader(data); - return IRQ_RETVAL(ret); + ret = IRQ_RETVAL(ret); + goto exit; } - if (!data->object_table) - return IRQ_HANDLED; + if (!data->object_table) { + ret = IRQ_HANDLED; + goto exit; + } if (data->T44_address) ret = mxt_process_messages_t44(data); else ret = mxt_process_messages(data); - if (ret <= 0) - return IRQ_NONE; - else - return IRQ_HANDLED; + ret = (ret <= 0) ? IRQ_NONE : IRQ_HANDLED; + +exit: + data->mxt_status.intp_triggered = false; + return ret; } static int mxt_t6_command(struct mxt_data *data, u16 cmd_offset, @@ -2983,6 +3017,38 @@ static int mxt_bootloader_status(struct mxt_data *data) return 0; } +static void mxt_watchdog_timer(struct timer_list *t) +{ + struct mxt_data *data = from_timer(data, t, watchdog_timer); + + dev_dbg(&data->client->dev, "%s: Timer triggered\n", __func__); + + if (!work_pending(&data->watchdog_work)) { + if (!data->mxt_status.intp_triggered) + schedule_work(&data->watchdog_work); + } + + mxt_start_wd_timer(data); +} + +static void mxt_watchdog_work(struct work_struct *work) +{ + struct mxt_data *data = + container_of(work, struct mxt_data, watchdog_work); + u16 info_buf; + int ret = 0; + u8 size = 2; + + ret = __mxt_read_reg(data->client, 0, size, &info_buf); + + if (ret) { + data->mxt_status.error_count++; + data->mxt_status.dev_status = false; + } else { + data->mxt_status.dev_status = true; + } +} + static int mxt_initialize(struct mxt_data *data) { struct i2c_client *client = data->client; @@ -4010,6 +4076,22 @@ static const struct attribute_group mxt_fw_attr_group = { .attrs = mxt_fw_attrs, }; +static ssize_t mxt_touch_device_status(struct device *dev, struct + device_attribute *attr, char *buf) +{ + struct mxt_data *data = dev_get_drvdata(dev); + int ret = 0; + + if (data->mxt_status.dev_status) + data->mxt_status.error_count = 0; + + ret = snprintf(buf, PAGE_SIZE, "%d %d\n", data->mxt_status.dev_status, + data->mxt_status.error_count); + /* clear the error counter once it is read */ + data->mxt_status.error_count = 0; + return ret; +} + static DEVICE_ATTR(fw_version, S_IRUGO, mxt_fw_version_show, NULL); static DEVICE_ATTR(hw_version, S_IRUGO, mxt_hw_version_show, NULL); static DEVICE_ATTR(object, S_IRUGO, mxt_object_show, NULL); @@ -4021,6 +4103,7 @@ static DEVICE_ATTR(debug_v2_enable, S_IWUSR | S_IRUSR, NULL, mxt_debug_v2_enable_store); static DEVICE_ATTR(debug_notify, S_IRUGO, mxt_debug_notify_show, NULL); static DEVICE_ATTR(t25, 0600, mxt_t25_selftest_show, mxt_t25_selftest_store); +static DEVICE_ATTR(touch_dev_stat, 0444, mxt_touch_device_status, NULL); static struct attribute *mxt_attrs[] = { &dev_attr_fw_version.attr, @@ -4032,6 +4115,7 @@ static struct attribute *mxt_attrs[] = { &dev_attr_debug_v2_enable.attr, &dev_attr_debug_notify.attr, &dev_attr_t25.attr, + &dev_attr_touch_dev_stat.attr, NULL }; @@ -4518,6 +4602,13 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) return error; } + INIT_WORK(&data->watchdog_work, mxt_watchdog_work); + + /* setup watchdog timer */ + timer_setup(&data->watchdog_timer, mxt_watchdog_timer, 0); + + mxt_start_wd_timer(data); + error = mxt_initialize(data); if (error) goto err_free_object; @@ -4525,8 +4616,11 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) return 0; err_free_object: + cancel_work_sync(&data->watchdog_work); + mxt_stop_wd_timer(data); mxt_free_input_device(data); mxt_free_object_table(data); + del_timer(&data->watchdog_timer); sysfs_remove_group(&client->dev.kobj, &mxt_fw_attr_group); if (data->reset_gpio) { sysfs_remove_link(&client->dev.kobj, "reset"); @@ -4554,6 +4648,9 @@ static int mxt_remove(struct i2c_client *client) mxt_free_input_device(data); mxt_free_object_table(data); + cancel_work_sync(&data->watchdog_work); + mxt_stop_wd_timer(data); + return 0; } From patchwork Fri Aug 16 08:38:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Jiada" X-Patchwork-Id: 11097311 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 793A71395 for ; Fri, 16 Aug 2019 08:40:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 69C49289D4 for ; Fri, 16 Aug 2019 08:40:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5DFE3289E1; Fri, 16 Aug 2019 08:40:30 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0F284289D4 for ; Fri, 16 Aug 2019 08:40:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727315AbfHPIk1 (ORCPT ); Fri, 16 Aug 2019 04:40:27 -0400 Received: from esa3.mentor.iphmx.com ([68.232.137.180]:42029 "EHLO esa3.mentor.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727333AbfHPIib (ORCPT ); Fri, 16 Aug 2019 04:38:31 -0400 IronPort-SDR: Ly78b6QebDGjPRsRWo/DQT8E5vqEupeRcJoVVX5/GPzdLaK6e1hSgco8Kv7Ksza2tf2nTdCPkI xPR0i8ZB7rmYFWmHKLcEZs2VOIXUL4I+2s+bUc8PcU9kOtHY8smrTzOiM6p6ls0laStrFYwdOB pmFVhu2Azydxo2i9bdOU3JN0PIpOig1F7nPdMD9hTXXxDfcXYN0/SLTg9iq2NOLYSIxqWPj5G8 hiY0rUgYOJDt4med7lmRcjR2imzkp49Do6sotOFKHtyorND/7fIhE1jjPsY8PeVcB/hHtl5Gaw lsg= X-IronPort-AV: E=Sophos;i="5.64,391,1559548800"; d="scan'208";a="40507250" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 16 Aug 2019 00:38:30 -0800 IronPort-SDR: 2k0m6Ynn8cFlHoqfMBk1ZPmQ1p0/8WV836a51VjtBgp0aKLZwqgoRrRF59OZQ8TeezQ1mHngvF V7ZO6eVqD+ZBGm3V7N8KLsJKtEE4r7k9stItbpaFGZQsFjJ3kfU2dteBy2b55HtvwdKbuZd0Kk IazP7mUAGkUm6ZJvsPRZ+gusfW/C3G8Er9WXYIZYzaSmGhPVm36Jb3H7U5yl6soBJvH6lkbkAz SKkXa1jR1hBPAXKw5WPkqTtIwn58ccM08YTsaRUsO5e+Qxh1y2YKSNalRMKXGL4RkAMXvr6MQr M0Y= From: Jiada Wang To: , CC: , , , Subject: [PATCH v1 58/63] Input: atmel_mxt_ts: Remove sysfs attributes during driver detach Date: Fri, 16 Aug 2019 17:38:25 +0900 Message-ID: <20190816083830.19553-4-jiada_wang@mentor.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190816083830.19553-1-jiada_wang@mentor.com> References: <20190816083830.19553-1-jiada_wang@mentor.com> MIME-Version: 1.0 X-ClientProxiedBy: svr-orw-mbx-04.mgc.mentorg.com (147.34.90.204) To svr-orw-mbx-03.mgc.mentorg.com (147.34.90.203) Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Sanjeev Chugh This change prevents a scenario when sysfs attributes for Atmel touch controller driver are being accessed by userland while touch driver module unloading has already begun. At present, sysfs attribute files are created at device probe but they are not removed while driver is being detached. This change will prevent calls to generic driver layer when the sysfs driver attributes files are already deleted. Therefore, kernel will not attempt to invoke driver routines for showing the sysfs atrributes. Signed-off-by: Sanjeev Chugh Signed-off-by: George G. Davis Signed-off-by: Jiada Wang --- drivers/input/touchscreen/atmel_mxt_ts.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 234e3031ba42..431c2c54eab0 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -2255,10 +2255,12 @@ static int mxt_update_cfg(struct mxt_data *data, const struct firmware *fw) static void mxt_free_input_device(struct mxt_data *data) { if (data->input_dev) { - struct input_dev *dev = data->input_dev; + struct input_dev *input_dev = data->input_dev; data->input_dev = NULL; - input_unregister_device(dev); + sysfs_remove_group(&input_dev->dev.kobj, + &data->gpio_attrs); + input_unregister_device(input_dev); } } From patchwork Fri Aug 16 08:38:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Jiada" X-Patchwork-Id: 11097257 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D61A01395 for ; Fri, 16 Aug 2019 08:38:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C60D0289CA for ; Fri, 16 Aug 2019 08:38:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BA490289DC; Fri, 16 Aug 2019 08:38:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 632AA289CA for ; Fri, 16 Aug 2019 08:38:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727367AbfHPIif (ORCPT ); Fri, 16 Aug 2019 04:38:35 -0400 Received: from esa3.mentor.iphmx.com ([68.232.137.180]:42029 "EHLO esa3.mentor.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727366AbfHPIie (ORCPT ); Fri, 16 Aug 2019 04:38:34 -0400 IronPort-SDR: XERSumQLEwzao22T1ipSoftfuHzTe66UGffkKgp67DHuqL/RMHZLLK0s1Nl1BWGKv4X8oQP2UY 2qA2A3AcR9NJhmpqOErGP0p4RJDJCmwIpuBlYgnikRt3LJ8EbjHBCt6leqlXM8d+vKVix6VAxg TKNpebvMmGuW5HME0L9ZnIFOHLjcbgfD/xhoQWpneNJqKEZfB54DqdYFk4ylmhh3piwbao3G/q ltD1wj01rddUHhNX/MHicHr7fn6pe4LLhfqlz9yhpb5E5DCxVf5Z8sRfMnJCrFPQl4mtO1U7C6 qJk= X-IronPort-AV: E=Sophos;i="5.64,391,1559548800"; d="scan'208";a="40507251" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa3.mentor.iphmx.com with ESMTP; 16 Aug 2019 00:38:33 -0800 IronPort-SDR: T2VK5ySOgnjFEA/4txlIECe+/Xsy0+IXGiNFBMWiT5xDLZmg1LT3Gz8btLAPk5oTZ+IuOUDxJZ jzpP/q7IFXGoVI8K/as0d+WcMTDxGdUhVCSkZcLr0Wg2PDO7lF23ALiQ7ktWwhGZBYD4ub2EV5 Wyl17Vb6e8UvZUyshjBjUZzuRskpwRuwwvs3C21ye8sDUZLJrKno9yqAuxZVFDVTjOB3rNPzNn hBawcgLu1i5mBAxTTr5syVjtoc04zYAAWwtAiUNf5GDhm57GwN7vmw+yUqHwPscF94UU5HXvXk mtc= From: Jiada Wang To: , CC: , , , Subject: [PATCH v1 59/63] Input: atmel_mxt_ts: Prevent crash due to freeing of input device Date: Fri, 16 Aug 2019 17:38:26 +0900 Message-ID: <20190816083830.19553-5-jiada_wang@mentor.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190816083830.19553-1-jiada_wang@mentor.com> References: <20190816083830.19553-1-jiada_wang@mentor.com> MIME-Version: 1.0 X-ClientProxiedBy: svr-orw-mbx-04.mgc.mentorg.com (147.34.90.204) To svr-orw-mbx-03.mgc.mentorg.com (147.34.90.203) Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Bhuvanesh Surachari Move sysfs creation after intializing the input device to prevent crash due to freeing of input device by function via sysfs. Signed-off-by: Bhuvanesh Surachari Signed-off-by: Sanjeev Chugh Signed-off-by: George G. Davis Signed-off-by: Jiada Wang --- drivers/input/touchscreen/atmel_mxt_ts.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c index 431c2c54eab0..8e95f46a30d7 100644 --- a/drivers/input/touchscreen/atmel_mxt_ts.c +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -2962,6 +2962,8 @@ static int mxt_initialize_input_device(struct mxt_data *data) goto err_free_mem; } + data->input_dev = input_dev; + if (data->gpio_attrs.attrs) { error = sysfs_create_group(&input_dev->dev.kobj, &data->gpio_attrs); @@ -2972,11 +2974,10 @@ static int mxt_initialize_input_device(struct mxt_data *data) } } - data->input_dev = input_dev; - return 0; err_free_mem: + data->input_dev = NULL; input_free_device(input_dev); return error; } @@ -4597,13 +4598,6 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) msleep(MXT_RESET_TIME); } - error = sysfs_create_group(&client->dev.kobj, &mxt_fw_attr_group); - if (error) { - dev_err(&client->dev, "Failure %d creating fw sysfs group\n", - error); - return error; - } - INIT_WORK(&data->watchdog_work, mxt_watchdog_work); /* setup watchdog timer */ @@ -4613,11 +4607,18 @@ static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id) error = mxt_initialize(data); if (error) - goto err_free_object; + goto err_del_wd_timer; + + error = sysfs_create_group(&client->dev.kobj, &mxt_fw_attr_group); + if (error) { + dev_err(&client->dev, "Failure %d creating fw sysfs group\n", + error); + goto err_del_wd_timer; + } return 0; -err_free_object: +err_del_wd_timer: cancel_work_sync(&data->watchdog_work); mxt_stop_wd_timer(data); mxt_free_input_device(data);