All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/26] Consolidate patches and add support for new devices
@ 2015-11-05 23:34 ` Andrew Duggan
  0 siblings, 0 replies; 18+ 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] 18+ messages in thread

* [PATCH 00/26] Consolidate patches and add support for new devices
@ 2015-11-05 23:34 ` Andrew Duggan
  0 siblings, 0 replies; 18+ 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] 18+ messages in thread

* [PATCH 01/26] Input: synaptics-rmi4 - embed the function modules in rmi_core
  2015-11-05 23:34 ` Andrew Duggan
@ 2015-11-05 23:34   ` Andrew Duggan
  -1 siblings, 0 replies; 18+ 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>

the function modules can not be auto-loaded by udev. So at boot, the
functions are not there and the device is not properly populated.
Force the functions to be embedded in rmi_core so that when the touchpad
is there, the functions are there too.

There is not much use of having the functions separate anyway

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: Andrew Duggan <aduggan@synaptics.com>
---
 drivers/input/rmi4/Kconfig      |  5 +----
 drivers/input/rmi4/Makefile     |  2 +-
 drivers/input/rmi4/rmi_bus.c    | 12 +++++++++++-
 drivers/input/rmi4/rmi_driver.h |  8 ++++++++
 drivers/input/rmi4/rmi_f11.c    | 14 ++++++++------
 5 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/drivers/input/rmi4/Kconfig b/drivers/input/rmi4/Kconfig
index d0c7b6e..5e3890e 100644
--- a/drivers/input/rmi4/Kconfig
+++ b/drivers/input/rmi4/Kconfig
@@ -37,7 +37,7 @@ config RMI4_I2C
 	  This feature is not currently available as a loadable module.
 
 config RMI4_F11
-	tristate "RMI4 Function 11 (2D pointing)"
+	bool "RMI4 Function 11 (2D pointing)"
 	depends on RMI4_CORE
 	help
 	  Say Y here if you want to add support for RMI4 function 11.
@@ -46,9 +46,6 @@ config RMI4_F11
 	  touchpads.  For sensors that support relative pointing, F11 also
 	  provides mouse input.
 
-	  To compile this driver as a module, choose M here: the
-	  module will be called rmi-f11.
-
 config RMI4_F11_PEN
 	bool "RMI4 F11 Pen Support"
 	depends on RMI4_F11
diff --git a/drivers/input/rmi4/Makefile b/drivers/input/rmi4/Makefile
index 5c6bad5..63bc595 100644
--- a/drivers/input/rmi4/Makefile
+++ b/drivers/input/rmi4/Makefile
@@ -2,7 +2,7 @@ obj-$(CONFIG_RMI4_CORE) += rmi_core.o
 rmi_core-y := rmi_bus.o rmi_driver.o rmi_f01.o
 
 # Function drivers
-obj-$(CONFIG_RMI4_F11) += rmi_f11.o
+rmi_core-$(CONFIG_RMI4_F11) += rmi_f11.o
 
 # Transports
 obj-$(CONFIG_RMI4_I2C) += rmi_i2c.o
diff --git a/drivers/input/rmi4/rmi_bus.c b/drivers/input/rmi4/rmi_bus.c
index 6e0454a..bbc80e6 100644
--- a/drivers/input/rmi4/rmi_bus.c
+++ b/drivers/input/rmi4/rmi_bus.c
@@ -383,15 +383,24 @@ static int __init rmi_bus_init(void)
 		goto err_unregister_bus;
 	}
 
+	error = rmi_register_f11_handler();
+	if (error) {
+		pr_err("%s: error registering the RMI F11 handler: %d\n",
+			__func__, error);
+		goto err_unregister_f01;
+	}
+
 	error = rmi_register_physical_driver();
 	if (error) {
 		pr_err("%s: error registering the RMI physical driver: %d\n",
 			__func__, error);
-		goto err_unregister_f01;
+		goto err_unregister_f11;
 	}
 
 	return 0;
 
+err_unregister_f11:
+	rmi_unregister_f11_handler();
 err_unregister_f01:
 	rmi_unregister_f01_handler();
 err_unregister_bus:
@@ -409,6 +418,7 @@ static void __exit rmi_bus_exit(void)
 	 */
 
 	rmi_unregister_physical_driver();
+	rmi_unregister_f11_handler();
 	rmi_unregister_f01_handler();
 	rmi_bus_teardown_debugfs();
 	bus_unregister(&rmi_bus_type);
diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_driver.h
index 34f7a7d..dda564f 100644
--- a/drivers/input/rmi4/rmi_driver.h
+++ b/drivers/input/rmi4/rmi_driver.h
@@ -113,4 +113,12 @@ void rmi_unregister_physical_driver(void);
 int rmi_register_f01_handler(void);
 void rmi_unregister_f01_handler(void);
 
+#ifdef CONFIG_RMI4_F11
+int rmi_register_f11_handler(void);
+void rmi_unregister_f11_handler(void);
+#else
+static inline int rmi_register_f11_handler(void) { return 0; }
+static inline void rmi_unregister_f11_handler(void) {}
+#endif
+
 #endif
diff --git a/drivers/input/rmi4/rmi_f11.c b/drivers/input/rmi4/rmi_f11.c
index 7af4f68..2e1d506 100644
--- a/drivers/input/rmi4/rmi_f11.c
+++ b/drivers/input/rmi4/rmi_f11.c
@@ -1537,10 +1537,12 @@ static struct rmi_function_handler rmi_f11_handler = {
 	.attention	= rmi_f11_attention,
 };
 
-module_rmi_driver(rmi_f11_handler);
+int __init rmi_register_f11_handler(void)
+{
+	return rmi_register_function_handler(&rmi_f11_handler);
+}
 
-MODULE_AUTHOR("Christopher Heiny <cheiny@synaptics.com");
-MODULE_AUTHOR("Andrew Duggan <aduggan@synaptics.com");
-MODULE_DESCRIPTION("RMI F11 module");
-MODULE_LICENSE("GPL");
-MODULE_VERSION(RMI_DRIVER_VERSION);
+void rmi_unregister_f11_handler(void)
+{
+	rmi_unregister_function_handler(&rmi_f11_handler);
+}
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 01/26] Input: synaptics-rmi4 - embed the function modules in rmi_core
@ 2015-11-05 23:34   ` Andrew Duggan
  0 siblings, 0 replies; 18+ 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>

the function modules can not be auto-loaded by udev. So at boot, the
functions are not there and the device is not properly populated.
Force the functions to be embedded in rmi_core so that when the touchpad
is there, the functions are there too.

There is not much use of having the functions separate anyway

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: Andrew Duggan <aduggan@synaptics.com>
---
 drivers/input/rmi4/Kconfig      |  5 +----
 drivers/input/rmi4/Makefile     |  2 +-
 drivers/input/rmi4/rmi_bus.c    | 12 +++++++++++-
 drivers/input/rmi4/rmi_driver.h |  8 ++++++++
 drivers/input/rmi4/rmi_f11.c    | 14 ++++++++------
 5 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/drivers/input/rmi4/Kconfig b/drivers/input/rmi4/Kconfig
index d0c7b6e..5e3890e 100644
--- a/drivers/input/rmi4/Kconfig
+++ b/drivers/input/rmi4/Kconfig
@@ -37,7 +37,7 @@ config RMI4_I2C
 	  This feature is not currently available as a loadable module.
 
 config RMI4_F11
-	tristate "RMI4 Function 11 (2D pointing)"
+	bool "RMI4 Function 11 (2D pointing)"
 	depends on RMI4_CORE
 	help
 	  Say Y here if you want to add support for RMI4 function 11.
@@ -46,9 +46,6 @@ config RMI4_F11
 	  touchpads.  For sensors that support relative pointing, F11 also
 	  provides mouse input.
 
-	  To compile this driver as a module, choose M here: the
-	  module will be called rmi-f11.
-
 config RMI4_F11_PEN
 	bool "RMI4 F11 Pen Support"
 	depends on RMI4_F11
diff --git a/drivers/input/rmi4/Makefile b/drivers/input/rmi4/Makefile
index 5c6bad5..63bc595 100644
--- a/drivers/input/rmi4/Makefile
+++ b/drivers/input/rmi4/Makefile
@@ -2,7 +2,7 @@ obj-$(CONFIG_RMI4_CORE) += rmi_core.o
 rmi_core-y := rmi_bus.o rmi_driver.o rmi_f01.o
 
 # Function drivers
-obj-$(CONFIG_RMI4_F11) += rmi_f11.o
+rmi_core-$(CONFIG_RMI4_F11) += rmi_f11.o
 
 # Transports
 obj-$(CONFIG_RMI4_I2C) += rmi_i2c.o
diff --git a/drivers/input/rmi4/rmi_bus.c b/drivers/input/rmi4/rmi_bus.c
index 6e0454a..bbc80e6 100644
--- a/drivers/input/rmi4/rmi_bus.c
+++ b/drivers/input/rmi4/rmi_bus.c
@@ -383,15 +383,24 @@ static int __init rmi_bus_init(void)
 		goto err_unregister_bus;
 	}
 
+	error = rmi_register_f11_handler();
+	if (error) {
+		pr_err("%s: error registering the RMI F11 handler: %d\n",
+			__func__, error);
+		goto err_unregister_f01;
+	}
+
 	error = rmi_register_physical_driver();
 	if (error) {
 		pr_err("%s: error registering the RMI physical driver: %d\n",
 			__func__, error);
-		goto err_unregister_f01;
+		goto err_unregister_f11;
 	}
 
 	return 0;
 
+err_unregister_f11:
+	rmi_unregister_f11_handler();
 err_unregister_f01:
 	rmi_unregister_f01_handler();
 err_unregister_bus:
@@ -409,6 +418,7 @@ static void __exit rmi_bus_exit(void)
 	 */
 
 	rmi_unregister_physical_driver();
+	rmi_unregister_f11_handler();
 	rmi_unregister_f01_handler();
 	rmi_bus_teardown_debugfs();
 	bus_unregister(&rmi_bus_type);
diff --git a/drivers/input/rmi4/rmi_driver.h b/drivers/input/rmi4/rmi_driver.h
index 34f7a7d..dda564f 100644
--- a/drivers/input/rmi4/rmi_driver.h
+++ b/drivers/input/rmi4/rmi_driver.h
@@ -113,4 +113,12 @@ void rmi_unregister_physical_driver(void);
 int rmi_register_f01_handler(void);
 void rmi_unregister_f01_handler(void);
 
+#ifdef CONFIG_RMI4_F11
+int rmi_register_f11_handler(void);
+void rmi_unregister_f11_handler(void);
+#else
+static inline int rmi_register_f11_handler(void) { return 0; }
+static inline void rmi_unregister_f11_handler(void) {}
+#endif
+
 #endif
diff --git a/drivers/input/rmi4/rmi_f11.c b/drivers/input/rmi4/rmi_f11.c
index 7af4f68..2e1d506 100644
--- a/drivers/input/rmi4/rmi_f11.c
+++ b/drivers/input/rmi4/rmi_f11.c
@@ -1537,10 +1537,12 @@ static struct rmi_function_handler rmi_f11_handler = {
 	.attention	= rmi_f11_attention,
 };
 
-module_rmi_driver(rmi_f11_handler);
+int __init rmi_register_f11_handler(void)
+{
+	return rmi_register_function_handler(&rmi_f11_handler);
+}
 
-MODULE_AUTHOR("Christopher Heiny <cheiny@synaptics.com");
-MODULE_AUTHOR("Andrew Duggan <aduggan@synaptics.com");
-MODULE_DESCRIPTION("RMI F11 module");
-MODULE_LICENSE("GPL");
-MODULE_VERSION(RMI_DRIVER_VERSION);
+void rmi_unregister_f11_handler(void)
+{
+	rmi_unregister_function_handler(&rmi_f11_handler);
+}
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver
  2015-11-05 23:34 ` Andrew Duggan
@ 2015-11-05 23:34   ` Andrew Duggan
  -1 siblings, 0 replies; 18+ 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] 18+ messages in thread

* [PATCH 02/26] Input: synaptics-rmi4 - add a common input device in rmi_driver
@ 2015-11-05 23:34   ` Andrew Duggan
  0 siblings, 0 replies; 18+ 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] 18+ messages in thread

* [PATCH 03/26] Input: synaptics-rmi4 - explicitly request polling when needed
  2015-11-05 23:34 ` Andrew Duggan
@ 2015-11-05 23:34   ` Andrew Duggan
  -1 siblings, 0 replies; 18+ 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>

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


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 03/26] Input: synaptics-rmi4 - explicitly request polling when needed
@ 2015-11-05 23:34   ` Andrew Duggan
  0 siblings, 0 replies; 18+ 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>

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

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 04/26] Input: synaptics-rmi4 - prevent oopses when irq arrives while the device is not bound
  2015-11-05 23:34 ` Andrew Duggan
@ 2015-11-05 23:34   ` Andrew Duggan
  -1 siblings, 0 replies; 18+ 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>

If the device has been registered but is not populated, we should not
process any incoming interrupt.
Make sure the pointers we are following are valid.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: Andrew Duggan <aduggan@synaptics.com>
---
 drivers/input/rmi4/rmi_driver.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
index 2fdc7e8..fe5f2f9 100644
--- a/drivers/input/rmi4/rmi_driver.c
+++ b/drivers/input/rmi4/rmi_driver.c
@@ -279,6 +279,9 @@ int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
 	struct rmi_function *entry;
 	int error;
 
+	if (!data || !data->f01_container || !data->irq_status)
+		return 0;
+
 	error = rmi_read_block(rmi_dev,
 				data->f01_container->fd.data_base_addr + 1,
 				data->irq_status, data->num_of_irq_regs);
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 04/26] Input: synaptics-rmi4 - prevent oopses when irq arrives while the device is not bound
@ 2015-11-05 23:34   ` Andrew Duggan
  0 siblings, 0 replies; 18+ 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>

If the device has been registered but is not populated, we should not
process any incoming interrupt.
Make sure the pointers we are following are valid.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: Andrew Duggan <aduggan@synaptics.com>
---
 drivers/input/rmi4/rmi_driver.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
index 2fdc7e8..fe5f2f9 100644
--- a/drivers/input/rmi4/rmi_driver.c
+++ b/drivers/input/rmi4/rmi_driver.c
@@ -279,6 +279,9 @@ int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
 	struct rmi_function *entry;
 	int error;
 
+	if (!data || !data->f01_container || !data->irq_status)
+		return 0;
+
 	error = rmi_read_block(rmi_dev,
 				data->f01_container->fd.data_base_addr + 1,
 				data->irq_status, data->num_of_irq_regs);
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

* Re: [PATCH 00/26] Consolidate patches and add support for new devices
  2015-11-05 23:34 ` Andrew Duggan
                   ` (4 preceding siblings ...)
  (?)
@ 2015-11-09 12:49 ` Linus Walleij
  2015-11-09 22:54   ` Andrew Duggan
  -1 siblings, 1 reply; 18+ messages in thread
From: Linus Walleij @ 2015-11-09 12:49 UTC (permalink / raw)
  To: Andrew Duggan, Dmitry Torokhov
  Cc: Linux Input, linux-kernel, Benjamin Tissoires, Christopher Heiny,
	Stephen Chandler Paul

On Fri, Nov 6, 2015 at 12:34 AM, Andrew Duggan <aduggan@synaptics.com> wrote:

> NOTE: This patch set applies to synaptics-rmi4 branch in
> Dmitry Torokhov's input tree.
(...)
> 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
(...)
> I would suggest updating the synaptics-rmi4 branch to something
> more resent.

I suggest we stop seeing Dmitry's branch as "master" for RMI4 development.
Instead work on the v4.3-rc6-based branch you have at
https://github.com/aduggan/linux.git, and then (after the merge window)
rebase it to v4.4-rc1 and ask Dmitry to *drop* this old branch and pull in
your stuff instead, and then look at the end result of that.

Who knows, maybe he thinks it's clean enough to go into v4.5.
Or for parts of it to go into v4.5.

In any case, surely he's more helped by an up-to-date rebased branch
than having to rebase it himself too.

> This patch set consolidates some outstanding patches and then builds on
> that to add support for new devices.

Unless Dmitry is extremely interested in the development history,
I suggest to squash the whole thing down to a few patches that
begins by adding the bus and infrastructure and then one function per
patch.

> 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.

Another reason for us to reboot development based on *your*
branch.

I'll go over and review the patches though!

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 00/26] Consolidate patches and add support for new devices
  2015-11-09 12:49 ` [PATCH 00/26] Consolidate patches and add support for new devices Linus Walleij
@ 2015-11-09 22:54   ` Andrew Duggan
  2015-11-09 23:03     ` Dmitry Torokhov
  0 siblings, 1 reply; 18+ messages in thread
From: Andrew Duggan @ 2015-11-09 22:54 UTC (permalink / raw)
  To: Linus Walleij, Dmitry Torokhov
  Cc: Linux Input, linux-kernel, Benjamin Tissoires, Christopher Heiny,
	Stephen Chandler Paul

Hi Linus,

Thanks for reviewing!

On 11/09/2015 04:49 AM, Linus Walleij wrote:
> On Fri, Nov 6, 2015 at 12:34 AM, Andrew Duggan <aduggan@synaptics.com> wrote:
>
>> NOTE: This patch set applies to synaptics-rmi4 branch in
>> Dmitry Torokhov's input tree.
> (...)
>> 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
> (...)
>> I would suggest updating the synaptics-rmi4 branch to something
>> more resent.
> I suggest we stop seeing Dmitry's branch as "master" for RMI4 development.
> Instead work on the v4.3-rc6-based branch you have at
> https://github.com/aduggan/linux.git, and then (after the merge window)
> rebase it to v4.4-rc1 and ask Dmitry to *drop* this old branch and pull in
> your stuff instead, and then look at the end result of that.
>
> Who knows, maybe he thinks it's clean enough to go into v4.5.
> Or for parts of it to go into v4.5.
>
> In any case, surely he's more helped by an up-to-date rebased branch
> than having to rebase it himself too.
>
>> This patch set consolidates some outstanding patches and then builds on
>> that to add support for new devices.
> Unless Dmitry is extremely interested in the development history,
> I suggest to squash the whole thing down to a few patches that
> begins by adding the bus and infrastructure and then one function per
> patch.

Ok, I'll rebase things. I realized when I was creating that patch set 
that at some point everything would have to be rebased. But, for the 
time being I was trying to maintain the history to avoid having to 
re-review the existing code. But, at this point it is probably better to 
review the driver as a whole. We will have my current branch and 
Dmitry's branch around if we end up needing the history.

Thanks,
Andrew

>> 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.
> Another reason for us to reboot development based on *your*
> branch.
>
> I'll go over and review the patches though!
>
> Yours,
> Linus Walleij


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 00/26] Consolidate patches and add support for new devices
  2015-11-09 22:54   ` Andrew Duggan
@ 2015-11-09 23:03     ` Dmitry Torokhov
  0 siblings, 0 replies; 18+ messages in thread
From: Dmitry Torokhov @ 2015-11-09 23:03 UTC (permalink / raw)
  To: Andrew Duggan
  Cc: Linus Walleij, Linux Input, linux-kernel, Benjamin Tissoires,
	Christopher Heiny, Stephen Chandler Paul

On Mon, Nov 09, 2015 at 02:54:04PM -0800, Andrew Duggan wrote:
> Hi Linus,
> 
> Thanks for reviewing!
> 
> On 11/09/2015 04:49 AM, Linus Walleij wrote:
> >On Fri, Nov 6, 2015 at 12:34 AM, Andrew Duggan <aduggan@synaptics.com> wrote:
> >
> >>NOTE: This patch set applies to synaptics-rmi4 branch in
> >>Dmitry Torokhov's input tree.
> >(...)
> >>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
> >(...)
> >>I would suggest updating the synaptics-rmi4 branch to something
> >>more resent.
> >I suggest we stop seeing Dmitry's branch as "master" for RMI4 development.
> >Instead work on the v4.3-rc6-based branch you have at
> >https://github.com/aduggan/linux.git, and then (after the merge window)
> >rebase it to v4.4-rc1 and ask Dmitry to *drop* this old branch and pull in
> >your stuff instead, and then look at the end result of that.
> >
> >Who knows, maybe he thinks it's clean enough to go into v4.5.
> >Or for parts of it to go into v4.5.
> >
> >In any case, surely he's more helped by an up-to-date rebased branch
> >than having to rebase it himself too.
> >
> >>This patch set consolidates some outstanding patches and then builds on
> >>that to add support for new devices.
> >Unless Dmitry is extremely interested in the development history,
> >I suggest to squash the whole thing down to a few patches that
> >begins by adding the bus and infrastructure and then one function per
> >patch.
> 
> Ok, I'll rebase things. I realized when I was creating that patch
> set that at some point everything would have to be rebased. But, for
> the time being I was trying to maintain the history to avoid having
> to re-review the existing code. But, at this point it is probably
> better to review the driver as a whole. We will have my current
> branch and Dmitry's branch around if we end up needing the history.

OK, if you are rebasing/respoinning patches let's start with 4.3 - there
is nothing significantly new in input core in 4.4 and I'd rather start
at a stable point.

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 04/26] Input: synaptics-rmi4 - prevent oopses when irq arrives while the device is not bound
  2015-11-09 23:16 ` Dmitry Torokhov
@ 2015-11-10  9:11   ` Benjamin Tissoires
  0 siblings, 0 replies; 18+ messages in thread
From: Benjamin Tissoires @ 2015-11-10  9:11 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Andrew Duggan, linux-input, linux-kernel, Benjamin Tissoires,
	Linus Walleij, Christopher Heiny, Stephen Chandler Paul

On Tue, Nov 10, 2015 at 12:16 AM, Dmitry Torokhov
<dmitry.torokhov@gmail.com> wrote:
> On Thu, Nov 05, 2015 at 03:37:25PM -0800, Andrew Duggan wrote:
>> From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>>
>> If the device has been registered but is not populated, we should not
>> process any incoming interrupt.
>> Make sure the pointers we are following are valid.
>
> Why are the interrupts enabled when device is not ready?

Hmm... Yes, maybe this should have been tackled at the smbus level.
Sorting this out might also help in the various suspend/resume bugs we
are experiencing.

Cheers,
Benjamin

>
>>
>> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>> Tested-by: Andrew Duggan <aduggan@synaptics.com>
>> ---
>>  drivers/input/rmi4/rmi_driver.c | 3 +++
>>  1 file changed, 3 insertions(+)
>>
>> diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
>> index 2fdc7e8..fe5f2f9 100644
>> --- a/drivers/input/rmi4/rmi_driver.c
>> +++ b/drivers/input/rmi4/rmi_driver.c
>> @@ -279,6 +279,9 @@ int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
>>       struct rmi_function *entry;
>>       int error;
>>
>> +     if (!data || !data->f01_container || !data->irq_status)
>> +             return 0;
>> +
>>       error = rmi_read_block(rmi_dev,
>>                               data->f01_container->fd.data_base_addr + 1,
>>                               data->irq_status, data->num_of_irq_regs);
>> --
>> 2.1.4
>>
>
> --
> Dmitry

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 04/26] Input: synaptics-rmi4 - prevent oopses when irq arrives while the device is not bound
  2015-11-05 23:37 ` Andrew Duggan
  (?)
  (?)
@ 2015-11-09 23:16 ` Dmitry Torokhov
  2015-11-10  9:11   ` Benjamin Tissoires
  -1 siblings, 1 reply; 18+ messages in thread
From: Dmitry Torokhov @ 2015-11-09 23:16 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:37:25PM -0800, Andrew Duggan wrote:
> From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> 
> If the device has been registered but is not populated, we should not
> process any incoming interrupt.
> Make sure the pointers we are following are valid.

Why are the interrupts enabled when device is not ready?

> 
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> Tested-by: Andrew Duggan <aduggan@synaptics.com>
> ---
>  drivers/input/rmi4/rmi_driver.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
> index 2fdc7e8..fe5f2f9 100644
> --- a/drivers/input/rmi4/rmi_driver.c
> +++ b/drivers/input/rmi4/rmi_driver.c
> @@ -279,6 +279,9 @@ int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
>  	struct rmi_function *entry;
>  	int error;
>  
> +	if (!data || !data->f01_container || !data->irq_status)
> +		return 0;
> +
>  	error = rmi_read_block(rmi_dev,
>  				data->f01_container->fd.data_base_addr + 1,
>  				data->irq_status, data->num_of_irq_regs);
> -- 
> 2.1.4
> 

-- 
Dmitry

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH 04/26] Input: synaptics-rmi4 - prevent oopses when irq arrives while the device is not bound
  2015-11-05 23:37 ` Andrew Duggan
  (?)
@ 2015-11-09 12:58 ` Linus Walleij
  -1 siblings, 0 replies; 18+ messages in thread
From: Linus Walleij @ 2015-11-09 12:58 UTC (permalink / raw)
  To: Andrew Duggan
  Cc: Linux Input, linux-kernel, Benjamin Tissoires, Dmitry Torokhov,
	Benjamin Tissoires, Christopher Heiny, Stephen Chandler Paul

On Fri, Nov 6, 2015 at 12:37 AM, Andrew Duggan <aduggan@synaptics.com> wrote:

> From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
>
> If the device has been registered but is not populated, we should not
> process any incoming interrupt.
> Make sure the pointers we are following are valid.
>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
> Tested-by: Andrew Duggan <aduggan@synaptics.com>

Tested-by: Linus Walleij <linus.walleij@linaro.org>

This should just be squashed into the offending commit.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 18+ messages in thread

* [PATCH 04/26] Input: synaptics-rmi4 - prevent oopses when irq arrives while the device is not bound
@ 2015-11-05 23:37 ` Andrew Duggan
  0 siblings, 0 replies; 18+ messages in thread
From: Andrew Duggan @ 2015-11-05 23:37 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>

If the device has been registered but is not populated, we should not
process any incoming interrupt.
Make sure the pointers we are following are valid.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: Andrew Duggan <aduggan@synaptics.com>
---
 drivers/input/rmi4/rmi_driver.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
index 2fdc7e8..fe5f2f9 100644
--- a/drivers/input/rmi4/rmi_driver.c
+++ b/drivers/input/rmi4/rmi_driver.c
@@ -279,6 +279,9 @@ int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
 	struct rmi_function *entry;
 	int error;
 
+	if (!data || !data->f01_container || !data->irq_status)
+		return 0;
+
 	error = rmi_read_block(rmi_dev,
 				data->f01_container->fd.data_base_addr + 1,
 				data->irq_status, data->num_of_irq_regs);
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 18+ messages in thread

* [PATCH 04/26] Input: synaptics-rmi4 - prevent oopses when irq arrives while the device is not bound
@ 2015-11-05 23:37 ` Andrew Duggan
  0 siblings, 0 replies; 18+ messages in thread
From: Andrew Duggan @ 2015-11-05 23:37 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>

If the device has been registered but is not populated, we should not
process any incoming interrupt.
Make sure the pointers we are following are valid.

Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: Andrew Duggan <aduggan@synaptics.com>
---
 drivers/input/rmi4/rmi_driver.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
index 2fdc7e8..fe5f2f9 100644
--- a/drivers/input/rmi4/rmi_driver.c
+++ b/drivers/input/rmi4/rmi_driver.c
@@ -279,6 +279,9 @@ int rmi_process_interrupt_requests(struct rmi_device *rmi_dev)
 	struct rmi_function *entry;
 	int error;
 
+	if (!data || !data->f01_container || !data->irq_status)
+		return 0;
+
 	error = rmi_read_block(rmi_dev,
 				data->f01_container->fd.data_base_addr + 1,
 				data->irq_status, data->num_of_irq_regs);
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2015-11-10  9:12 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
2015-11-05 23:34 ` [PATCH 01/26] Input: synaptics-rmi4 - embed the function modules in rmi_core Andrew Duggan
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
2015-11-05 23:34   ` 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
2015-11-05 23:34 ` [PATCH 04/26] Input: synaptics-rmi4 - prevent oopses when irq arrives while the device is not bound Andrew Duggan
2015-11-05 23:34   ` Andrew Duggan
2015-11-09 12:49 ` [PATCH 00/26] Consolidate patches and add support for new devices Linus Walleij
2015-11-09 22:54   ` Andrew Duggan
2015-11-09 23:03     ` Dmitry Torokhov
2015-11-05 23:37 [PATCH 04/26] Input: synaptics-rmi4 - prevent oopses when irq arrives while the device is not bound Andrew Duggan
2015-11-05 23:37 ` Andrew Duggan
2015-11-09 12:58 ` Linus Walleij
2015-11-09 23:16 ` Dmitry Torokhov
2015-11-10  9:11   ` Benjamin Tissoires

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.