From: Andrew Duggan <aduggan@synaptics.com> To: <linux-input@vger.kernel.org>, <linux-kernel@vger.kernel.org> Cc: Benjamin Tissoires <benjamin.tissoires@redhat.com>, Dmitry Torokhov <dmitry.torokhov@gmail.com>, Linus Walleij <linus.walleij@linaro.org>, Benjamin Tissoires <benjamin.tissoires@gmail.com>, Christopher Heiny <cheiny@synaptics.com>, Stephen Chandler Paul <cpaul@redhat.com> Subject: [PATCH 03/26] Input: synaptics-rmi4 - explicitly request polling when needed Date: Thu, 5 Nov 2015 15:37:12 -0800 [thread overview] Message-ID: <1446766632-30305-1-git-send-email-aduggan@synaptics.com> (raw) 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> --- 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
WARNING: multiple messages have this Message-ID (diff)
From: Andrew Duggan <aduggan@synaptics.com> To: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Benjamin Tissoires <benjamin.tissoires@redhat.com>, Dmitry Torokhov <dmitry.torokhov@gmail.com>, Linus Walleij <linus.walleij@linaro.org>, Benjamin Tissoires <benjamin.tissoires@gmail.com>, Christopher Heiny <cheiny@synaptics.com>, Stephen Chandler Paul <cpaul@redhat.com> Subject: [PATCH 03/26] Input: synaptics-rmi4 - explicitly request polling when needed Date: Thu, 5 Nov 2015 15:37:12 -0800 [thread overview] Message-ID: <1446766632-30305-1-git-send-email-aduggan@synaptics.com> (raw) 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> --- 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
next reply other threads:[~2015-11-05 23:37 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-11-05 23:37 Andrew Duggan [this message] 2015-11-05 23:37 ` [PATCH 03/26] Input: synaptics-rmi4 - explicitly request polling when needed Andrew Duggan 2015-11-09 12:58 ` Linus Walleij 2015-11-09 23:14 ` Dmitry Torokhov -- strict thread matches above, loose matches on Subject: below -- 2015-11-05 23:34 [PATCH 00/26] Consolidate patches and add support for new devices Andrew Duggan 2015-11-05 23:34 ` [PATCH 03/26] Input: synaptics-rmi4 - explicitly request polling when needed Andrew Duggan 2015-11-05 23:34 ` Andrew Duggan
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1446766632-30305-1-git-send-email-aduggan@synaptics.com \ --to=aduggan@synaptics.com \ --cc=benjamin.tissoires@gmail.com \ --cc=benjamin.tissoires@redhat.com \ --cc=cheiny@synaptics.com \ --cc=cpaul@redhat.com \ --cc=dmitry.torokhov@gmail.com \ --cc=linus.walleij@linaro.org \ --cc=linux-input@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.