Message ID | 1446766632-30305-1-git-send-email-aduggan@synaptics.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
On Fri, Nov 6, 2015 at 12:37 AM, Andrew Duggan <aduggan@synaptics.com> wrote: > From: Benjamin Tissoires <benjamin.tissoires@redhat.com> > > 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 <benjamin.tissoires@redhat.com> > Tested-by: Andrew Duggan <aduggan@synaptics.com> (...) > + } else if (pdata->attn_gpio == RMI_POLLING) { (...) > +#define RMI_POLLING -1 Aeuck ... this thing should be rewritten to use GPIO descriptors instead of this old number-based stuff. I'll go in and see if I can take a stab at it. Yours, Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Nov 05, 2015 at 03:37:12PM -0800, Andrew Duggan wrote: > From: Benjamin Tissoires <benjamin.tissoires@redhat.com> > > 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. I'd love to get rid of polling altogether... > > Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> > Tested-by: Andrew Duggan <aduggan@synaptics.com> > --- > 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 <linux/wait.h> > #include <linux/debugfs.h> > > +#define RMI_POLLING -1 > +#define RMI_CUSTOM_IRQ -2 > + > enum rmi_attn_polarity { > RMI_ATTN_ACTIVE_LOW = 0, > RMI_ATTN_ACTIVE_HIGH = 1 > -- > 2.1.4 >
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 <linux/wait.h> #include <linux/debugfs.h> +#define RMI_POLLING -1 +#define RMI_CUSTOM_IRQ -2 + enum rmi_attn_polarity { RMI_ATTN_ACTIVE_LOW = 0, RMI_ATTN_ACTIVE_HIGH = 1