Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d8a8b3ed authored by Andrew Duggan's avatar Andrew Duggan Committed by Dmitry Torokhov
Browse files

Input: synaptics-rmi4 - add device tree support for RMI4 I2C devices



Add devicetree binding for I2C devices and add bindings for optional
parameters in the function drivers. Parameters for function drivers are
defined in child nodes for each of the functions.

Signed-off-by: default avatarAndrew Duggan <aduggan@synaptics.com>
Acked-by: default avatarRob Herring <robh@kernel.org>
Tested-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
Tested-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Tested-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent fdf51604
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
Synaptics RMI4 F01 Device Binding

The Synaptics RMI4 core is able to support RMI4 devices using different
transports and different functions. This file describes the device tree
bindings for devices which contain Function 1. Complete documentation
for transports and other functions can be found in:
Documentation/devicetree/bindings/input/rmi4.

Additional documentation for F01 can be found at:
http://www.synaptics.com/sites/default/files/511-000136-01-Rev-E-RMI4-Interfacing-Guide.pdf

Optional Properties:
- syna,nosleep-mode: If set the device will run at full power without sleeping.
			nosleep has 3 modes, 0 will not change the default
			setting, 1 will disable nosleep (allow sleeping),
			and 2 will enable nosleep (disabling sleep).
- syna,wakeup-threshold: Defines the amplitude of the disturbance to the
				background capacitance that will cause the
				device to wake from dozing.
- syna,doze-holdoff-ms: The delay to wait after the last finger lift and the
				first doze cycle.
- syna,doze-interval-ms: The time period that the device sleeps between finger
				activity.


Example of a RMI4 I2C device with F01:
	Example:
	&i2c1 {
		rmi4-i2c-dev@2c {
			compatible = "syna,rmi4-i2c";

			...

			rmi4-f01@1 {
				reg = <0x1>;
				syna,nosleep-mode = <1>;
			};
		};
	};
+53 −0
Original line number Diff line number Diff line
Synaptics RMI4 I2C Device Binding

The Synaptics RMI4 core is able to support RMI4 devices using different
transports and different functions. This file describes the device tree
bindings for devices using the I2C transport driver. Complete documentation
for other transports and functions can be found in
Documentation/devicetree/bindings/input/rmi4.

Required Properties:
- compatible: syna,rmi4-i2c
- reg: I2C address
- #address-cells: Set to 1 to indicate that the function child nodes
		    consist of only on uint32 value.
- #size-cells: Set to 0 to indicate that the function child nodes do not
		have a size property.

Optional Properties:
- interrupts: interrupt which the rmi device is connected to.
- interrupt-parent: The interrupt controller.
See Documentation/devicetree/bindings/interrupt-controller/interrupts.txt

- syna,reset-delay-ms: The number of milliseconds to wait after resetting the
			device.

Function Parameters:
Parameters specific to RMI functions are contained in child nodes of the rmi device
 node. Documentation for the parameters of each function can be found in:
Documentation/devicetree/bindings/input/rmi4/rmi_f*.txt.



Example:
	&i2c1 {
		rmi4-i2c-dev@2c {
			compatible = "syna,rmi4-i2c";
			reg = <0x2c>;
			#address-cells = <1>;
			#size-cells = <0>;
			interrupt-parent = <&gpio>;
			interrupts = <4 2>;

			rmi4-f01@1 {
				reg = <0x1>;
				syna,nosleep-mode = <1>;
			};

			rmi4-f11@11 {
				reg = <0x11>;
				touchscreen-inverted-y;
				syna,sensor-type = <2>;
			};
		};
	};
+1 −0
Original line number Diff line number Diff line
@@ -220,6 +220,7 @@ sprd Spreadtrum Communications Inc.
st	STMicroelectronics
ste	ST-Ericsson
stericsson	ST-Ericsson
syna	Synaptics Inc.
synology	Synology, Inc.
tbs	TBS Technologies
tcl	Toby Churchill Ltd.
+35 −0
Original line number Diff line number Diff line
@@ -153,6 +153,21 @@ static int rmi_function_match(struct device *dev, struct device_driver *drv)
	return fn->fd.function_number == handler->func;
}

#ifdef CONFIG_OF
static void rmi_function_of_probe(struct rmi_function *fn)
{
	char of_name[9];

	snprintf(of_name, sizeof(of_name), "rmi4-f%02x",
		fn->fd.function_number);
	fn->dev.of_node = of_find_node_by_name(
				fn->rmi_dev->xport->dev->of_node, of_name);
}
#else
static inline void rmi_function_of_probe(struct rmi_function *fn)
{}
#endif

static int rmi_function_probe(struct device *dev)
{
	struct rmi_function *fn = to_rmi_function(dev);
@@ -160,6 +175,8 @@ static int rmi_function_probe(struct device *dev)
					to_rmi_function_handler(dev->driver);
	int error;

	rmi_function_of_probe(fn);

	if (handler->probe) {
		error = handler->probe(fn);
		return error;
@@ -325,6 +342,24 @@ static int rmi_register_function_handlers(void)
	return ret;
}

int rmi_of_property_read_u32(struct device *dev, u32 *result,
				const char *prop, bool optional)
{
	int retval;
	u32 val = 0;

	retval = of_property_read_u32(dev->of_node, prop, &val);
	if (retval && (!optional && retval == -EINVAL)) {
		dev_err(dev, "Failed to get %s value: %d\n",
			prop, retval);
		return retval;
	}
	*result = val;

	return 0;
}
EXPORT_SYMBOL_GPL(rmi_of_property_read_u32);

static int __init rmi_bus_init(void)
{
	int error;
+0 −4
Original line number Diff line number Diff line
@@ -172,10 +172,6 @@ extern struct bus_type rmi_bus_type;

int rmi_of_property_read_u32(struct device *dev, u32 *result,
				const char *prop, bool optional);
int rmi_of_property_read_u16(struct device *dev, u16 *result,
				const char *prop, bool optional);
int rmi_of_property_read_u8(struct device *dev, u8 *result,
				const char *prop, bool optional);

#define RMI_DEBUG_CORE			BIT(0)
#define RMI_DEBUG_XPORT			BIT(1)
Loading