* [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver
@ 2015-11-05 23:36 Andrew Duggan
2015-11-09 12:52 ` Linus Walleij
2015-11-09 23:13 ` Dmitry Torokhov
0 siblings, 2 replies; 6+ messages in thread
From: Andrew Duggan @ 2015-11-05 23:36 UTC (permalink / raw)
To: linux-input, linux-kernel
Cc: Benjamin Tissoires, Dmitry Torokhov, Linus Walleij,
Benjamin Tissoires, Christopher Heiny, Stephen Chandler Paul
From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
When .unified_input is set to true in the platform data, the
functions should rely on the common input node created by rmi_driver
to forward events instead of having their own input node.
This node is named "Synaptics PRODUCT_ID" to be able to
differentiate the various models.
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: Andrew Duggan <aduggan@synaptics.com>
---
drivers/input/rmi4/rmi_driver.c | 43 +++++++++++++++++++++++++++++++++++++++++
drivers/input/rmi4/rmi_driver.h | 6 ++++++
drivers/input/rmi4/rmi_f01.c | 7 +++++++
include/linux/rmi.h | 2 ++
4 files changed, 58 insertions(+)
diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
index b9db709..95f9386 100644
--- a/drivers/input/rmi4/rmi_driver.c
+++ b/drivers/input/rmi4/rmi_driver.c
@@ -310,6 +310,9 @@ static int process_interrupt_requests(struct rmi_device *rmi_dev)
if (entry->irq_mask)
process_one_interrupt(data, entry);
+ if (data->input)
+ input_sync(data->input);
+
return 0;
}
@@ -330,6 +333,25 @@ static int rmi_driver_set_input_params(struct rmi_device *rmi_dev,
return 0;
}
+static void rmi_driver_set_input_name(struct rmi_device *rmi_dev,
+ struct input_dev *input)
+{
+ struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
+ char *device_name = rmi_f01_get_product_ID(data->f01_container);
+ char *name;
+
+ if (!device_name)
+ return;
+
+ name = devm_kasprintf(&rmi_dev->dev, GFP_KERNEL,
+ "Synaptics %s", device_name);
+ if (!name)
+ return;
+
+ input->name = name;
+}
+
+
static int rmi_driver_set_irq_bits(struct rmi_device *rmi_dev,
unsigned long *mask)
{
@@ -720,6 +742,8 @@ static int rmi_driver_remove(struct device *dev)
const struct rmi_device_platform_data *pdata =
rmi_get_platform_data(rmi_dev);
+ if (data->input)
+ input_unregister_device(data->input);
disable_sensor(rmi_dev);
rmi_free_function_list(rmi_dev);
@@ -832,6 +856,15 @@ static int rmi_driver_probe(struct device *dev)
data->current_irq_mask = irq_memory + size * 2;
data->new_irq_mask = irq_memory + size * 3;
+ if (pdata->unified_input) {
+ data->input = input_allocate_device();
+ if (data->input) {
+ rmi_driver_set_input_params(rmi_dev, data->input);
+ sprintf(data->input_phys, "%s/input0", dev_name(dev));
+ data->input->phys = data->input_phys;
+ }
+ }
+
irq_count = 0;
dev_dbg(dev, "Creating functions.");
retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function);
@@ -866,6 +899,15 @@ static int rmi_driver_probe(struct device *dev)
mutex_init(&data->suspend_mutex);
}
+ if (data->input) {
+ rmi_driver_set_input_name(rmi_dev, data->input);
+ if (input_register_device(data->input)) {
+ dev_err(dev, "%s: Failed to register input device.\n",
+ __func__);
+ goto err_destroy_functions;
+ }
+ }
+
if (gpio_is_valid(pdata->attn_gpio)) {
static const char GPIO_LABEL[] = "attn";
unsigned long gpio_flags = GPIOF_DIR_IN;
@@ -921,6 +963,7 @@ static int rmi_driver_probe(struct device *dev)
return 0;
err_destroy_functions:
+ input_free_device(data->input);
rmi_free_function_list(rmi_dev);
kfree(irq_memory);
err_free_mem:
diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_driver.h
index dda564f..36ca34b 100644
--- a/drivers/input/rmi4/rmi_driver.h
+++ b/drivers/input/rmi4/rmi_driver.h
@@ -13,6 +13,7 @@
#include <linux/ctype.h>
#include <linux/hrtimer.h>
#include <linux/ktime.h>
+#include <linux/input.h>
#include "rmi_bus.h"
#define RMI_DRIVER_VERSION "1.6"
@@ -29,6 +30,8 @@
#define RMI_PDT_PROPS_HAS_BSR 0x02
+#define NAME_BUFFER_SIZE 256
+
struct rmi_driver_data {
struct list_head function_list;
@@ -49,6 +52,8 @@ struct rmi_driver_data {
unsigned long *current_irq_mask;
unsigned long *new_irq_mask;
struct mutex irq_mutex;
+ struct input_dev *input;
+ char input_phys[NAME_BUFFER_SIZE];
/* Following are used when polling. */
struct hrtimer poll_timer;
@@ -112,6 +117,7 @@ void rmi_unregister_physical_driver(void);
int rmi_register_f01_handler(void);
void rmi_unregister_f01_handler(void);
+char *rmi_f01_get_product_ID(struct rmi_function *fn);
#ifdef CONFIG_RMI4_F11
int rmi_register_f11_handler(void);
diff --git a/drivers/input/rmi4/rmi_f01.c b/drivers/input/rmi4/rmi_f01.c
index ee5f4a1..2d72dc8 100644
--- a/drivers/input/rmi4/rmi_f01.c
+++ b/drivers/input/rmi4/rmi_f01.c
@@ -176,6 +176,13 @@ static int rmi_f01_read_properties(struct rmi_device *rmi_dev,
return 0;
}
+char *rmi_f01_get_product_ID(struct rmi_function *fn)
+{
+ struct f01_data *f01 = dev_get_drvdata(&fn->dev);
+
+ return f01->properties.product_id;
+}
+
static int rmi_f01_probe(struct rmi_function *fn)
{
struct rmi_device *rmi_dev = fn->rmi_dev;
diff --git a/include/linux/rmi.h b/include/linux/rmi.h
index ca35b2f..1d22985 100644
--- a/include/linux/rmi.h
+++ b/include/linux/rmi.h
@@ -277,6 +277,8 @@ struct rmi_device_platform_data {
struct rmi_f30_gpioled_map *gpioled_map;
struct rmi_button_map *f41_button_map;
+ bool unified_input;
+
#ifdef CONFIG_RMI4_FWLIB
char *firmware_name;
#endif
--
2.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver
2015-11-05 23:36 [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver Andrew Duggan
@ 2015-11-09 12:52 ` Linus Walleij
2015-11-09 23:13 ` Dmitry Torokhov
1 sibling, 0 replies; 6+ messages in thread
From: Linus Walleij @ 2015-11-09 12:52 UTC (permalink / raw)
To: Andrew Duggan
Cc: Linux Input, linux-kernel@vger.kernel.org, Benjamin Tissoires,
Dmitry Torokhov, Benjamin Tissoires, Christopher Heiny,
Stephen Chandler Paul
On Fri, Nov 6, 2015 at 12:36 AM, Andrew Duggan <aduggan@synaptics.com> wrote:
> From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>
> When .unified_input is set to true in the platform data, the
> functions should rely on the common input node created by rmi_driver
> to forward events instead of having their own input node.
>
> This node is named "Synaptics PRODUCT_ID" to be able to
> differentiate the various models.
>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> Tested-by: Andrew Duggan <aduggan@synaptics.com>
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver
2015-11-05 23:36 [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver Andrew Duggan
2015-11-09 12:52 ` Linus Walleij
@ 2015-11-09 23:13 ` Dmitry Torokhov
2015-11-10 9:23 ` Benjamin Tissoires
1 sibling, 1 reply; 6+ messages in thread
From: Dmitry Torokhov @ 2015-11-09 23:13 UTC (permalink / raw)
To: Andrew Duggan
Cc: linux-input, linux-kernel, Benjamin Tissoires, Linus Walleij,
Benjamin Tissoires, Christopher Heiny, Stephen Chandler Paul
On Thu, Nov 05, 2015 at 03:36:56PM -0800, Andrew Duggan wrote:
> From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>
> When .unified_input is set to true in the platform data, the
> functions should rely on the common input node created by rmi_driver
> to forward events instead of having their own input node.
>
> This node is named "Synaptics PRODUCT_ID" to be able to
> differentiate the various models.
>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> Tested-by: Andrew Duggan <aduggan@synaptics.com>
> ---
> drivers/input/rmi4/rmi_driver.c | 43 +++++++++++++++++++++++++++++++++++++++++
> drivers/input/rmi4/rmi_driver.h | 6 ++++++
> drivers/input/rmi4/rmi_f01.c | 7 +++++++
> include/linux/rmi.h | 2 ++
> 4 files changed, 58 insertions(+)
>
> diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
> index b9db709..95f9386 100644
> --- a/drivers/input/rmi4/rmi_driver.c
> +++ b/drivers/input/rmi4/rmi_driver.c
> @@ -310,6 +310,9 @@ static int process_interrupt_requests(struct rmi_device *rmi_dev)
> if (entry->irq_mask)
> process_one_interrupt(data, entry);
>
> + if (data->input)
> + input_sync(data->input);
> +
> return 0;
> }
>
> @@ -330,6 +333,25 @@ static int rmi_driver_set_input_params(struct rmi_device *rmi_dev,
> return 0;
> }
>
> +static void rmi_driver_set_input_name(struct rmi_device *rmi_dev,
> + struct input_dev *input)
> +{
> + struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
> + char *device_name = rmi_f01_get_product_ID(data->f01_container);
> + char *name;
> +
> + if (!device_name)
> + return;
Should we still give device some name?
> +
> + name = devm_kasprintf(&rmi_dev->dev, GFP_KERNEL,
> + "Synaptics %s", device_name);
> + if (!name)
> + return;
Are we guaranteed that devm_kasprintf only called in probe() path?
What about errors?
> +
> + input->name = name;
> +}
> +
> +
> static int rmi_driver_set_irq_bits(struct rmi_device *rmi_dev,
> unsigned long *mask)
> {
> @@ -720,6 +742,8 @@ static int rmi_driver_remove(struct device *dev)
> const struct rmi_device_platform_data *pdata =
> rmi_get_platform_data(rmi_dev);
>
> + if (data->input)
> + input_unregister_device(data->input);
Isn't this too early? Can sensor still be sending data here? (Looking...
yeah, it looks like it can. Bad.)
> disable_sensor(rmi_dev);
> rmi_free_function_list(rmi_dev);
>
> @@ -832,6 +856,15 @@ static int rmi_driver_probe(struct device *dev)
> data->current_irq_mask = irq_memory + size * 2;
> data->new_irq_mask = irq_memory + size * 3;
>
> + if (pdata->unified_input) {
> + data->input = input_allocate_device();
> + if (data->input) {
> + rmi_driver_set_input_params(rmi_dev, data->input);
> + sprintf(data->input_phys, "%s/input0", dev_name(dev));
> + data->input->phys = data->input_phys;
> + }
Bail if error?
> + }
> +
> irq_count = 0;
> dev_dbg(dev, "Creating functions.");
> retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function);
> @@ -866,6 +899,15 @@ static int rmi_driver_probe(struct device *dev)
> mutex_init(&data->suspend_mutex);
> }
>
> + if (data->input) {
> + rmi_driver_set_input_name(rmi_dev, data->input);
> + if (input_register_device(data->input)) {
> + dev_err(dev, "%s: Failed to register input device.\n",
> + __func__);
> + goto err_destroy_functions;
> + }
> + }
> +
> if (gpio_is_valid(pdata->attn_gpio)) {
> static const char GPIO_LABEL[] = "attn";
> unsigned long gpio_flags = GPIOF_DIR_IN;
> @@ -921,6 +963,7 @@ static int rmi_driver_probe(struct device *dev)
> return 0;
>
> err_destroy_functions:
> + input_free_device(data->input);
> rmi_free_function_list(rmi_dev);
> kfree(irq_memory);
> err_free_mem:
> diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_driver.h
> index dda564f..36ca34b 100644
> --- a/drivers/input/rmi4/rmi_driver.h
> +++ b/drivers/input/rmi4/rmi_driver.h
> @@ -13,6 +13,7 @@
> #include <linux/ctype.h>
> #include <linux/hrtimer.h>
> #include <linux/ktime.h>
> +#include <linux/input.h>
> #include "rmi_bus.h"
>
> #define RMI_DRIVER_VERSION "1.6"
> @@ -29,6 +30,8 @@
>
> #define RMI_PDT_PROPS_HAS_BSR 0x02
>
> +#define NAME_BUFFER_SIZE 256
> +
> struct rmi_driver_data {
> struct list_head function_list;
>
> @@ -49,6 +52,8 @@ struct rmi_driver_data {
> unsigned long *current_irq_mask;
> unsigned long *new_irq_mask;
> struct mutex irq_mutex;
> + struct input_dev *input;
> + char input_phys[NAME_BUFFER_SIZE];
>
> /* Following are used when polling. */
> struct hrtimer poll_timer;
> @@ -112,6 +117,7 @@ void rmi_unregister_physical_driver(void);
>
> int rmi_register_f01_handler(void);
> void rmi_unregister_f01_handler(void);
> +char *rmi_f01_get_product_ID(struct rmi_function *fn);
>
> #ifdef CONFIG_RMI4_F11
> int rmi_register_f11_handler(void);
> diff --git a/drivers/input/rmi4/rmi_f01.c b/drivers/input/rmi4/rmi_f01.c
> index ee5f4a1..2d72dc8 100644
> --- a/drivers/input/rmi4/rmi_f01.c
> +++ b/drivers/input/rmi4/rmi_f01.c
> @@ -176,6 +176,13 @@ static int rmi_f01_read_properties(struct rmi_device *rmi_dev,
> return 0;
> }
>
> +char *rmi_f01_get_product_ID(struct rmi_function *fn)
> +{
> + struct f01_data *f01 = dev_get_drvdata(&fn->dev);
> +
> + return f01->properties.product_id;
> +}
Should we have something like rmi_to_input_id() that is similar to
usb_to_input_id()?
> +
> static int rmi_f01_probe(struct rmi_function *fn)
> {
> struct rmi_device *rmi_dev = fn->rmi_dev;
> diff --git a/include/linux/rmi.h b/include/linux/rmi.h
> index ca35b2f..1d22985 100644
> --- a/include/linux/rmi.h
> +++ b/include/linux/rmi.h
> @@ -277,6 +277,8 @@ struct rmi_device_platform_data {
> struct rmi_f30_gpioled_map *gpioled_map;
> struct rmi_button_map *f41_button_map;
>
> + bool unified_input;
> +
> #ifdef CONFIG_RMI4_FWLIB
> char *firmware_name;
> #endif
> --
> 2.1.4
>
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver
2015-11-09 23:13 ` Dmitry Torokhov
@ 2015-11-10 9:23 ` Benjamin Tissoires
2015-11-26 0:13 ` Andrew Duggan
0 siblings, 1 reply; 6+ messages in thread
From: Benjamin Tissoires @ 2015-11-10 9:23 UTC (permalink / raw)
To: Dmitry Torokhov
Cc: Andrew Duggan, linux-input, linux-kernel@vger.kernel.org,
Benjamin Tissoires, Linus Walleij, Christopher Heiny,
Stephen Chandler Paul
On Tue, Nov 10, 2015 at 12:13 AM, Dmitry Torokhov
<dmitry.torokhov@gmail.com> wrote:
> On Thu, Nov 05, 2015 at 03:36:56PM -0800, Andrew Duggan wrote:
>> From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>>
>> When .unified_input is set to true in the platform data, the
>> functions should rely on the common input node created by rmi_driver
>> to forward events instead of having their own input node.
>>
>> This node is named "Synaptics PRODUCT_ID" to be able to
>> differentiate the various models.
>>
>> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>> Tested-by: Andrew Duggan <aduggan@synaptics.com>
>> ---
>> drivers/input/rmi4/rmi_driver.c | 43 +++++++++++++++++++++++++++++++++++++++++
>> drivers/input/rmi4/rmi_driver.h | 6 ++++++
>> drivers/input/rmi4/rmi_f01.c | 7 +++++++
>> include/linux/rmi.h | 2 ++
>> 4 files changed, 58 insertions(+)
>>
>> diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
>> index b9db709..95f9386 100644
>> --- a/drivers/input/rmi4/rmi_driver.c
>> +++ b/drivers/input/rmi4/rmi_driver.c
>> @@ -310,6 +310,9 @@ static int process_interrupt_requests(struct rmi_device *rmi_dev)
>> if (entry->irq_mask)
>> process_one_interrupt(data, entry);
>>
>> + if (data->input)
>> + input_sync(data->input);
>> +
>> return 0;
>> }
>>
>> @@ -330,6 +333,25 @@ static int rmi_driver_set_input_params(struct rmi_device *rmi_dev,
>> return 0;
>> }
>>
>> +static void rmi_driver_set_input_name(struct rmi_device *rmi_dev,
>> + struct input_dev *input)
>> +{
>> + struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
>> + char *device_name = rmi_f01_get_product_ID(data->f01_container);
>> + char *name;
>> +
>> + if (!device_name)
>> + return;
>
> Should we still give device some name?
Actually, I think the test is need needed. rmi_f01_get_product_ID()
returns a pointer to an array embedded in struct f01_data.
rmi_driver_set_input_name() is called after f01 has been initialized
and I think if there is an error while processing f01 we bail out. So
basically device_name can not be null. (If I read the code correctly).
>
>> +
>> + name = devm_kasprintf(&rmi_dev->dev, GFP_KERNEL,
>> + "Synaptics %s", device_name);
>> + if (!name)
>> + return;
>
> Are we guaranteed that devm_kasprintf only called in probe() path?
Right now, yes. This function is called only in probe.
> What about errors?
>
Indeed, I should have tackled these first :(
>> +
>> + input->name = name;
>> +}
>> +
>> +
>> static int rmi_driver_set_irq_bits(struct rmi_device *rmi_dev,
>> unsigned long *mask)
>> {
>> @@ -720,6 +742,8 @@ static int rmi_driver_remove(struct device *dev)
>> const struct rmi_device_platform_data *pdata =
>> rmi_get_platform_data(rmi_dev);
>>
>> + if (data->input)
>> + input_unregister_device(data->input);
>
> Isn't this too early? Can sensor still be sending data here? (Looking...
> yeah, it looks like it can. Bad.)
oops, my bad.
>
>> disable_sensor(rmi_dev);
>> rmi_free_function_list(rmi_dev);
>>
>> @@ -832,6 +856,15 @@ static int rmi_driver_probe(struct device *dev)
>> data->current_irq_mask = irq_memory + size * 2;
>> data->new_irq_mask = irq_memory + size * 3;
>>
>> + if (pdata->unified_input) {
>> + data->input = input_allocate_device();
>> + if (data->input) {
>> + rmi_driver_set_input_params(rmi_dev, data->input);
>> + sprintf(data->input_phys, "%s/input0", dev_name(dev));
>> + data->input->phys = data->input_phys;
>> + }
>
> Bail if error?
yes, we need to change it
>
>> + }
>> +
>> irq_count = 0;
>> dev_dbg(dev, "Creating functions.");
>> retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function);
>> @@ -866,6 +899,15 @@ static int rmi_driver_probe(struct device *dev)
>> mutex_init(&data->suspend_mutex);
>> }
>>
>> + if (data->input) {
>> + rmi_driver_set_input_name(rmi_dev, data->input);
>> + if (input_register_device(data->input)) {
>> + dev_err(dev, "%s: Failed to register input device.\n",
>> + __func__);
>> + goto err_destroy_functions;
>> + }
>> + }
>> +
>> if (gpio_is_valid(pdata->attn_gpio)) {
>> static const char GPIO_LABEL[] = "attn";
>> unsigned long gpio_flags = GPIOF_DIR_IN;
>> @@ -921,6 +963,7 @@ static int rmi_driver_probe(struct device *dev)
>> return 0;
>>
>> err_destroy_functions:
>> + input_free_device(data->input);
>> rmi_free_function_list(rmi_dev);
>> kfree(irq_memory);
>> err_free_mem:
>> diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_driver.h
>> index dda564f..36ca34b 100644
>> --- a/drivers/input/rmi4/rmi_driver.h
>> +++ b/drivers/input/rmi4/rmi_driver.h
>> @@ -13,6 +13,7 @@
>> #include <linux/ctype.h>
>> #include <linux/hrtimer.h>
>> #include <linux/ktime.h>
>> +#include <linux/input.h>
>> #include "rmi_bus.h"
>>
>> #define RMI_DRIVER_VERSION "1.6"
>> @@ -29,6 +30,8 @@
>>
>> #define RMI_PDT_PROPS_HAS_BSR 0x02
>>
>> +#define NAME_BUFFER_SIZE 256
>> +
>> struct rmi_driver_data {
>> struct list_head function_list;
>>
>> @@ -49,6 +52,8 @@ struct rmi_driver_data {
>> unsigned long *current_irq_mask;
>> unsigned long *new_irq_mask;
>> struct mutex irq_mutex;
>> + struct input_dev *input;
>> + char input_phys[NAME_BUFFER_SIZE];
>>
>> /* Following are used when polling. */
>> struct hrtimer poll_timer;
>> @@ -112,6 +117,7 @@ void rmi_unregister_physical_driver(void);
>>
>> int rmi_register_f01_handler(void);
>> void rmi_unregister_f01_handler(void);
>> +char *rmi_f01_get_product_ID(struct rmi_function *fn);
>>
>> #ifdef CONFIG_RMI4_F11
>> int rmi_register_f11_handler(void);
>> diff --git a/drivers/input/rmi4/rmi_f01.c b/drivers/input/rmi4/rmi_f01.c
>> index ee5f4a1..2d72dc8 100644
>> --- a/drivers/input/rmi4/rmi_f01.c
>> +++ b/drivers/input/rmi4/rmi_f01.c
>> @@ -176,6 +176,13 @@ static int rmi_f01_read_properties(struct rmi_device *rmi_dev,
>> return 0;
>> }
>>
>> +char *rmi_f01_get_product_ID(struct rmi_function *fn)
>> +{
>> + struct f01_data *f01 = dev_get_drvdata(&fn->dev);
>> +
>> + return f01->properties.product_id;
>> +}
>
> Should we have something like rmi_to_input_id() that is similar to
> usb_to_input_id()?
Works for me.
>
>> +
>> static int rmi_f01_probe(struct rmi_function *fn)
>> {
>> struct rmi_device *rmi_dev = fn->rmi_dev;
>> diff --git a/include/linux/rmi.h b/include/linux/rmi.h
>> index ca35b2f..1d22985 100644
>> --- a/include/linux/rmi.h
>> +++ b/include/linux/rmi.h
>> @@ -277,6 +277,8 @@ struct rmi_device_platform_data {
>> struct rmi_f30_gpioled_map *gpioled_map;
>> struct rmi_button_map *f41_button_map;
>>
>> + bool unified_input;
>> +
>> #ifdef CONFIG_RMI4_FWLIB
>> char *firmware_name;
>> #endif
>> --
>> 2.1.4
>>
>
> Thanks.
>
Thanks for the review!
Cheers,
Benjamin
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver
2015-11-10 9:23 ` Benjamin Tissoires
@ 2015-11-26 0:13 ` Andrew Duggan
0 siblings, 0 replies; 6+ messages in thread
From: Andrew Duggan @ 2015-11-26 0:13 UTC (permalink / raw)
To: Benjamin Tissoires, Dmitry Torokhov
Cc: linux-input, linux-kernel@vger.kernel.org, Benjamin Tissoires,
Linus Walleij, Christopher Heiny, Stephen Chandler Paul
On 11/10/2015 01:23 AM, Benjamin Tissoires wrote:
> On Tue, Nov 10, 2015 at 12:13 AM, Dmitry Torokhov
> <dmitry.torokhov@gmail.com> wrote:
> diff --git a/drivers/input/rmi4/rmi_f01.c b/drivers/input/rmi4/rmi_f01.c
> index ee5f4a1..2d72dc8 100644
> --- a/drivers/input/rmi4/rmi_f01.c
> +++ b/drivers/input/rmi4/rmi_f01.c
> @@ -176,6 +176,13 @@ static int rmi_f01_read_properties(struct rmi_device *rmi_dev,
> return 0;
> }
>
> +char *rmi_f01_get_product_ID(struct rmi_function *fn)
> +{
> + struct f01_data *f01 = dev_get_drvdata(&fn->dev);
> +
> + return f01->properties.product_id;
> +}
>> Should we have something like rmi_to_input_id() that is similar to
>> usb_to_input_id()?
> Works for me.
>
In the patch set I just submitted I did not implement a
rmi_to_input_id() function mostly because the product id in RMI is a
string with a few possible formats. There isn't really a good way to
convert it into a u16 which is what struct input_id is expecting. We
would still need a function to return the string so I just left it the
way it is.
Andrew
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 00/26] Consolidate patches and add support for new devices
@ 2015-11-05 23:34 Andrew Duggan
2015-11-05 23:34 ` [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver Andrew Duggan
0 siblings, 1 reply; 6+ messages in thread
From: Andrew Duggan @ 2015-11-05 23:34 UTC (permalink / raw)
To: linux-input, linux-kernel
Cc: Andrew Duggan, Dmitry Torokhov, Linus Walleij, Benjamin Tissoires,
Christopher Heiny, Stephen Chandler Paul
NOTE: This patch set applies to synaptics-rmi4 branch in
Dmitry Torokhov's input tree.
This patch set consolidates some outstanding patches and then builds on
that to add support for new devices. The first 11 patches were provided
by Benjamin Tissoires with slight modifications. The remainder of the
patches remove unused functionality, consolidates the code for
2D sensors, and adds support for newer devices which use F12 for
reporting 2D sensing.
This patchset applies cleanly to the synaptics-rmi4 branch, but does not
successfully build because the synaptics-rmi4 branch is based on the 3.14
kernel and the patches make use of functionality introduced in later
kernels. I would suggest updating the synaptics-rmi4 branch to something
more resent. I also have some additional patches which convert hid-rmi
into a transport driver for rmi_core. I held off submitting since 3.14
doesn't contain hid-rmi. However, if we want to stick with 3.14 I can
make the appropriate modifications.
Thanks,
Andrew
Andrew Duggan (14):
Input: synaptics-rmi4: Use generic interrupt handling
Input: synaptics-rmi4: Add device tree support for RMI4 I2C devices
Input: synaptics-rmi4: Clean up Makefile
Input: synaptics-rmi4: Remove unused debugfs code
Input: synaptics-rmi4: Use ifdef to check if CONFIG_PM_SLEEP is set
Input: synaptics-rmi4: Remove unused firmware_name variable
Input: synaptics-rmi4: Add SPI transport driver
Input: synaptics-rmi4: Add support for packet register descriptors
Input: synaptics-rmi4: Create common functions for 2D sensors
Input: synaptics-rmi4: Add support for F12
Input: synaptics-rmi4: move structures and definitions to rmi.h
Input: synaptics-rmi4: use device managed memory for the data packet
buffer
Input: synaptics-rmi4: remove sensor_name in platform data
Input: synaptics-rmi4: Change the rmi device's name to be less generic
Benjamin Tissoires (12):
Input: synaptics-rmi4 - embed the function modules in rmi_core
Input: synaptics-rmi4 - add a common input device in rmi_driver
Input: synaptics-rmi4 - explicitly request polling when needed
Input: synaptics-rmi4 - prevent oopses when irq arrives while the
device is not bound
Input: synaptics-rmi4 - call rmi_driver_process_config_requests in
enable_sensor
Input: synaptics-rmi4 - add a reset callback
Input: synaptics-rmi4 - f11: fix bitmap irq check
Input: synaptics-rmi4 - f11: use the unified input node if available
Input: synaptics-rmi4 - f11: clean up rmi_f11_finger_handler
Input: synaptics-rmi4 - f11: allow the top software button property to
be set
Input: synaptics-rmi4 - f11: add support for kernel tracking
Input: synaptics-rmi4 - Add F30 support
.../bindings/input/rmi4/rmi_2d_sensor.txt | 55 +++
.../devicetree/bindings/input/rmi4/rmi_f01.txt | 40 ++
.../devicetree/bindings/input/rmi4/rmi_i2c.txt | 55 +++
.../devicetree/bindings/input/rmi4/rmi_spi.txt | 57 +++
.../devicetree/bindings/vendor-prefixes.txt | 1 +
drivers/input/rmi4/Kconfig | 47 +-
drivers/input/rmi4/Makefile | 23 +-
drivers/input/rmi4/rmi_2d_sensor.c | 370 ++++++++++++++
drivers/input/rmi4/rmi_2d_sensor.h | 87 ++++
drivers/input/rmi4/rmi_bus.c | 205 ++++----
drivers/input/rmi4/rmi_bus.h | 129 +----
drivers/input/rmi4/rmi_driver.c | 468 +++++++++++++-----
drivers/input/rmi4/rmi_driver.h | 119 ++---
drivers/input/rmi4/rmi_f01.c | 57 ++-
drivers/input/rmi4/rmi_f11.c | 540 ++++++---------------
drivers/input/rmi4/rmi_f12.c | 461 ++++++++++++++++++
drivers/input/rmi4/rmi_f30.c | 403 +++++++++++++++
drivers/input/rmi4/rmi_i2c.c | 62 +--
drivers/input/rmi4/rmi_spi.c | 464 ++++++++++++++++++
include/linux/rmi.h | 270 +++++++++--
20 files changed, 3027 insertions(+), 886 deletions(-)
create mode 100644 Documentation/devicetree/bindings/input/rmi4/rmi_2d_sensor.txt
create mode 100644 Documentation/devicetree/bindings/input/rmi4/rmi_f01.txt
create mode 100644 Documentation/devicetree/bindings/input/rmi4/rmi_i2c.txt
create mode 100644 Documentation/devicetree/bindings/input/rmi4/rmi_spi.txt
create mode 100644 drivers/input/rmi4/rmi_2d_sensor.c
create mode 100644 drivers/input/rmi4/rmi_2d_sensor.h
create mode 100644 drivers/input/rmi4/rmi_f12.c
create mode 100644 drivers/input/rmi4/rmi_f30.c
create mode 100644 drivers/input/rmi4/rmi_spi.c
--
2.1.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver
2015-11-05 23:34 [PATCH 00/26] Consolidate patches and add support for new devices Andrew Duggan
@ 2015-11-05 23:34 ` Andrew Duggan
0 siblings, 0 replies; 6+ messages in thread
From: Andrew Duggan @ 2015-11-05 23:34 UTC (permalink / raw)
To: linux-input, linux-kernel
Cc: Benjamin Tissoires, Dmitry Torokhov, Linus Walleij,
Benjamin Tissoires, Christopher Heiny, Stephen Chandler Paul
From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
When .unified_input is set to true in the platform data, the
functions should rely on the common input node created by rmi_driver
to forward events instead of having their own input node.
This node is named "Synaptics PRODUCT_ID" to be able to
differentiate the various models.
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: Andrew Duggan <aduggan@synaptics.com>
---
drivers/input/rmi4/rmi_driver.c | 43 +++++++++++++++++++++++++++++++++++++++++
drivers/input/rmi4/rmi_driver.h | 6 ++++++
drivers/input/rmi4/rmi_f01.c | 7 +++++++
include/linux/rmi.h | 2 ++
4 files changed, 58 insertions(+)
diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
index b9db709..95f9386 100644
--- a/drivers/input/rmi4/rmi_driver.c
+++ b/drivers/input/rmi4/rmi_driver.c
@@ -310,6 +310,9 @@ static int process_interrupt_requests(struct rmi_device *rmi_dev)
if (entry->irq_mask)
process_one_interrupt(data, entry);
+ if (data->input)
+ input_sync(data->input);
+
return 0;
}
@@ -330,6 +333,25 @@ static int rmi_driver_set_input_params(struct rmi_device *rmi_dev,
return 0;
}
+static void rmi_driver_set_input_name(struct rmi_device *rmi_dev,
+ struct input_dev *input)
+{
+ struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
+ char *device_name = rmi_f01_get_product_ID(data->f01_container);
+ char *name;
+
+ if (!device_name)
+ return;
+
+ name = devm_kasprintf(&rmi_dev->dev, GFP_KERNEL,
+ "Synaptics %s", device_name);
+ if (!name)
+ return;
+
+ input->name = name;
+}
+
+
static int rmi_driver_set_irq_bits(struct rmi_device *rmi_dev,
unsigned long *mask)
{
@@ -720,6 +742,8 @@ static int rmi_driver_remove(struct device *dev)
const struct rmi_device_platform_data *pdata =
rmi_get_platform_data(rmi_dev);
+ if (data->input)
+ input_unregister_device(data->input);
disable_sensor(rmi_dev);
rmi_free_function_list(rmi_dev);
@@ -832,6 +856,15 @@ static int rmi_driver_probe(struct device *dev)
data->current_irq_mask = irq_memory + size * 2;
data->new_irq_mask = irq_memory + size * 3;
+ if (pdata->unified_input) {
+ data->input = input_allocate_device();
+ if (data->input) {
+ rmi_driver_set_input_params(rmi_dev, data->input);
+ sprintf(data->input_phys, "%s/input0", dev_name(dev));
+ data->input->phys = data->input_phys;
+ }
+ }
+
irq_count = 0;
dev_dbg(dev, "Creating functions.");
retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function);
@@ -866,6 +899,15 @@ static int rmi_driver_probe(struct device *dev)
mutex_init(&data->suspend_mutex);
}
+ if (data->input) {
+ rmi_driver_set_input_name(rmi_dev, data->input);
+ if (input_register_device(data->input)) {
+ dev_err(dev, "%s: Failed to register input device.\n",
+ __func__);
+ goto err_destroy_functions;
+ }
+ }
+
if (gpio_is_valid(pdata->attn_gpio)) {
static const char GPIO_LABEL[] = "attn";
unsigned long gpio_flags = GPIOF_DIR_IN;
@@ -921,6 +963,7 @@ static int rmi_driver_probe(struct device *dev)
return 0;
err_destroy_functions:
+ input_free_device(data->input);
rmi_free_function_list(rmi_dev);
kfree(irq_memory);
err_free_mem:
diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_driver.h
index dda564f..36ca34b 100644
--- a/drivers/input/rmi4/rmi_driver.h
+++ b/drivers/input/rmi4/rmi_driver.h
@@ -13,6 +13,7 @@
#include <linux/ctype.h>
#include <linux/hrtimer.h>
#include <linux/ktime.h>
+#include <linux/input.h>
#include "rmi_bus.h"
#define RMI_DRIVER_VERSION "1.6"
@@ -29,6 +30,8 @@
#define RMI_PDT_PROPS_HAS_BSR 0x02
+#define NAME_BUFFER_SIZE 256
+
struct rmi_driver_data {
struct list_head function_list;
@@ -49,6 +52,8 @@ struct rmi_driver_data {
unsigned long *current_irq_mask;
unsigned long *new_irq_mask;
struct mutex irq_mutex;
+ struct input_dev *input;
+ char input_phys[NAME_BUFFER_SIZE];
/* Following are used when polling. */
struct hrtimer poll_timer;
@@ -112,6 +117,7 @@ void rmi_unregister_physical_driver(void);
int rmi_register_f01_handler(void);
void rmi_unregister_f01_handler(void);
+char *rmi_f01_get_product_ID(struct rmi_function *fn);
#ifdef CONFIG_RMI4_F11
int rmi_register_f11_handler(void);
diff --git a/drivers/input/rmi4/rmi_f01.c b/drivers/input/rmi4/rmi_f01.c
index ee5f4a1..2d72dc8 100644
--- a/drivers/input/rmi4/rmi_f01.c
+++ b/drivers/input/rmi4/rmi_f01.c
@@ -176,6 +176,13 @@ static int rmi_f01_read_properties(struct rmi_device *rmi_dev,
return 0;
}
+char *rmi_f01_get_product_ID(struct rmi_function *fn)
+{
+ struct f01_data *f01 = dev_get_drvdata(&fn->dev);
+
+ return f01->properties.product_id;
+}
+
static int rmi_f01_probe(struct rmi_function *fn)
{
struct rmi_device *rmi_dev = fn->rmi_dev;
diff --git a/include/linux/rmi.h b/include/linux/rmi.h
index ca35b2f..1d22985 100644
--- a/include/linux/rmi.h
+++ b/include/linux/rmi.h
@@ -277,6 +277,8 @@ struct rmi_device_platform_data {
struct rmi_f30_gpioled_map *gpioled_map;
struct rmi_button_map *f41_button_map;
+ bool unified_input;
+
#ifdef CONFIG_RMI4_FWLIB
char *firmware_name;
#endif
--
2.1.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-11-26 0:13 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-05 23:36 [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver Andrew Duggan
2015-11-09 12:52 ` Linus Walleij
2015-11-09 23:13 ` Dmitry Torokhov
2015-11-10 9:23 ` Benjamin Tissoires
2015-11-26 0:13 ` Andrew Duggan
-- 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 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver Andrew Duggan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).