Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754124AbbGBRvB (ORCPT ); Thu, 2 Jul 2015 13:51:01 -0400 Received: from [192.147.44.131] ([192.147.44.131]:44363 "EHLO us-mx1.synaptics.com" rhost-flags-FAIL-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1753963AbbGBRur (ORCPT ); Thu, 2 Jul 2015 13:50:47 -0400 X-PGP-Universal: processed; by securemail.synaptics.com on Thu, 02 Jul 2015 11:36:39 -0700 Message-ID: <559579CA.5070405@synaptics.com> Date: Thu, 2 Jul 2015 10:50:02 -0700 From: Andrew Duggan User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Benjamin Tissoires , Dmitry Torokhov , Christopher Heiny , Allie Xiong CC: Stephen Chandler Paul , , , , Vincent Chen Subject: Re: [PATCH 03/11] Input: synaptics-rmi4 - explicitly request polling when needed References: <1435087050-11444-1-git-send-email-benjamin.tissoires@redhat.com> <1435087050-11444-4-git-send-email-benjamin.tissoires@redhat.com> In-Reply-To: <1435087050-11444-4-git-send-email-benjamin.tissoires@redhat.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.4.10.145] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5032 Lines: 149 On 06/23/2015 12:17 PM, Benjamin Tissoires wrote: > 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 > --- This will also be needed by hid-rmi when it is eventually converted into a rmi transport driver. Reviewed-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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/