From patchwork Thu Nov 5 23:37:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Duggan X-Patchwork-Id: 7564791 Return-Path: X-Original-To: patchwork-linux-input@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 365ECC05C6 for ; Thu, 5 Nov 2015 23:47:54 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 49B3E20769 for ; Thu, 5 Nov 2015 23:47:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 01FFE20635 for ; Thu, 5 Nov 2015 23:47:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965459AbbKEXhX (ORCPT ); Thu, 5 Nov 2015 18:37:23 -0500 Received: from us-mx2.synaptics.com ([192.147.44.131]:2496 "EHLO us-mx1.synaptics.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S965377AbbKEXhU (ORCPT ); Thu, 5 Nov 2015 18:37:20 -0500 Received: from unknown (HELO securemail.synaptics.com) ([172.20.21.135]) by us-mx1.synaptics.com with ESMTP; 05 Nov 2015 15:37:19 -0800 Received: from USW-OWA1.synaptics-inc.local ([10.20.24.16]) by securemail.synaptics.com (PGP Universal service); Thu, 05 Nov 2015 16:37:43 -0800 X-PGP-Universal: processed; by securemail.synaptics.com on Thu, 05 Nov 2015 16:37:43 -0800 Received: from noble.synaptics-inc.local (10.4.10.145) by USW-OWA1.synaptics-inc.local (10.20.24.16) with Microsoft SMTP Server (TLS) id 14.3.248.2; Thu, 5 Nov 2015 15:37:19 -0800 From: Andrew Duggan To: , CC: Benjamin Tissoires , Dmitry Torokhov , Linus Walleij , Benjamin Tissoires , Christopher Heiny , Stephen Chandler Paul Subject: [PATCH 03/26] Input: synaptics-rmi4 - explicitly request polling when needed Date: Thu, 5 Nov 2015 15:37:12 -0800 Message-ID: <1446766632-30305-1-git-send-email-aduggan@synaptics.com> X-Mailer: git-send-email 2.1.4 MIME-Version: 1.0 X-Originating-IP: [10.4.10.145] Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Benjamin Tissoires Host Notify does not work with neither IRQ nor polling. Allow a RMI4 driver to request or not polling depending on the attn_gpio. When neither the internal IRQ or polling systems are used, the transport driver can call rmi_process_interrupt_requests() to trigger a process of the alert. Signed-off-by: Benjamin Tissoires Tested-by: Andrew Duggan --- drivers/input/rmi4/rmi_driver.c | 18 +++++++++--------- drivers/input/rmi4/rmi_driver.h | 3 +++ include/linux/rmi.h | 3 +++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c index 95f9386..2fdc7e8 100644 --- a/drivers/input/rmi4/rmi_driver.c +++ b/drivers/input/rmi4/rmi_driver.c @@ -67,15 +67,13 @@ static irqreturn_t rmi_irq_thread(int irq, void *p) return IRQ_HANDLED; } -static int process_interrupt_requests(struct rmi_device *rmi_dev); - static void rmi_poll_work(struct work_struct *work) { struct rmi_driver_data *data = container_of(work, struct rmi_driver_data, poll_work); struct rmi_device *rmi_dev = data->rmi_dev; - process_interrupt_requests(rmi_dev); + rmi_process_interrupt_requests(rmi_dev); } /* @@ -124,7 +122,7 @@ static void disable_sensor(struct rmi_device *rmi_dev) if (!data->enabled) return; - if (!data->irq) + if (data->polling) disable_polling(rmi_dev); if (rmi_dev->xport->ops->disable_device) @@ -163,7 +161,7 @@ static int enable_sensor(struct rmi_device *rmi_dev) dev_name(&rmi_dev->dev), xport); if (retval) return retval; - } else { + } else if (data->polling) { retval = enable_polling(rmi_dev); if (retval < 0) return retval; @@ -171,7 +169,7 @@ static int enable_sensor(struct rmi_device *rmi_dev) data->enabled = true; - return process_interrupt_requests(rmi_dev); + return rmi_process_interrupt_requests(rmi_dev); } static void rmi_free_function_list(struct rmi_device *rmi_dev) @@ -274,7 +272,7 @@ static void process_one_interrupt(struct rmi_driver_data *data, } } -static int process_interrupt_requests(struct rmi_device *rmi_dev) +int rmi_process_interrupt_requests(struct rmi_device *rmi_dev) { struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev); struct device *dev = &rmi_dev->dev; @@ -315,6 +313,7 @@ static int process_interrupt_requests(struct rmi_device *rmi_dev) return 0; } +EXPORT_SYMBOL_GPL(rmi_process_interrupt_requests); /** * rmi_driver_set_input_params - set input device id and other data. @@ -421,7 +420,7 @@ static int rmi_driver_irq_handler(struct rmi_device *rmi_dev, int irq) return 0; } - return process_interrupt_requests(rmi_dev); + return rmi_process_interrupt_requests(rmi_dev); } static int rmi_driver_reset_handler(struct rmi_device *rmi_dev) @@ -949,10 +948,11 @@ static int rmi_driver_probe(struct device *dev) } } } - } else { + } else if (pdata->attn_gpio == RMI_POLLING) { data->poll_interval = ktime_set(0, (pdata->poll_interval_ms ? pdata->poll_interval_ms : DEFAULT_POLL_INTERVAL_MS) * 1000 * 1000); + data->polling = true; } if (data->f01_container->dev.driver) { diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_driver.h index 36ca34b..8a2d91a 100644 --- a/drivers/input/rmi4/rmi_driver.h +++ b/drivers/input/rmi4/rmi_driver.h @@ -43,6 +43,7 @@ struct rmi_driver_data { u32 attn_count; u32 irq_debug; /* Should be bool, but debugfs wants u32 */ bool gpio_held; + bool polling; int irq; int irq_flags; int num_of_irq_regs; @@ -115,6 +116,8 @@ bool rmi_is_physical_driver(struct device_driver *); int rmi_register_physical_driver(void); void rmi_unregister_physical_driver(void); +int rmi_process_interrupt_requests(struct rmi_device *rmi_dev); + int rmi_register_f01_handler(void); void rmi_unregister_f01_handler(void); char *rmi_f01_get_product_ID(struct rmi_function *fn); diff --git a/include/linux/rmi.h b/include/linux/rmi.h index 1d22985..b771f41 100644 --- a/include/linux/rmi.h +++ b/include/linux/rmi.h @@ -23,6 +23,9 @@ #include #include +#define RMI_POLLING -1 +#define RMI_CUSTOM_IRQ -2 + enum rmi_attn_polarity { RMI_ATTN_ACTIVE_LOW = 0, RMI_ATTN_ACTIVE_HIGH = 1