Input: synaptics-rmi4 - add device tree support for 2d sensors and F11
2D sensors have several parameter which can be set in the platform data. This patch adds support for getting those values from devicetree. Signed-off-by: Andrew Duggan <aduggan@synaptics.com> Tested-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Tested-by: Linus Walleij <linus.walleij@linaro.org> Tested-by: Bjorn Andersson <bjorn.andersson@linaro.org> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
ff8f83708b
commit
aaa27982b3
|
@ -0,0 +1,56 @@
|
|||
Synaptics RMI4 2D Sensor 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 2D sensors using Function 11 or
|
||||
Function 12. Complete documentation for transports and other functions
|
||||
can be found in:
|
||||
Documentation/devicetree/bindings/input/rmi4.
|
||||
|
||||
RMI4 Function 11 and Function 12 are for 2D touch position sensing.
|
||||
Additional documentation for F11 can be found at:
|
||||
http://www.synaptics.com/sites/default/files/511-000136-01-Rev-E-RMI4-Interfacing-Guide.pdf
|
||||
|
||||
Optional Touch Properties:
|
||||
Description in Documentation/devicetree/bindings/input/touch
|
||||
- touchscreen-inverted-x
|
||||
- touchscreen-inverted-y
|
||||
- touchscreen-swapped-x-y
|
||||
- touchscreen-x-mm
|
||||
- touchscreen-y-mm
|
||||
|
||||
Optional Properties:
|
||||
- syna,clip-x-low: Sets a minimum value for X.
|
||||
- syna,clip-y-low: Sets a minimum value for Y.
|
||||
- syna,clip-x-high: Sets a maximum value for X.
|
||||
- syna,clip-y-high: Sets a maximum value for Y.
|
||||
- syna,offset-x: Add an offset to X.
|
||||
- syna,offset-y: Add an offset to Y.
|
||||
- syna,delta-x-threshold: Set the minimum distance on the X axis required
|
||||
to generate an interrupt in reduced reporting
|
||||
mode.
|
||||
- syna,delta-y-threshold: Set the minimum distance on the Y axis required
|
||||
to generate an interrupt in reduced reporting
|
||||
mode.
|
||||
- syna,sensor-type: Set the sensor type. 1 for touchscreen 2 for touchpad.
|
||||
- syna,disable-report-mask: Mask for disabling posiiton reporting. Used to
|
||||
disable reporing absolute position data.
|
||||
- syna,rezero-wait-ms: Time in miliseconds to wait after issuing a rezero
|
||||
command.
|
||||
|
||||
|
||||
Example of a RMI4 I2C device with F11:
|
||||
Example:
|
||||
&i2c1 {
|
||||
rmi4-i2c-dev@2c {
|
||||
compatible = "syna,rmi4-i2c";
|
||||
|
||||
...
|
||||
|
||||
rmi4-f11@11 {
|
||||
reg = <0x11>;
|
||||
touchscreen-inverted-y;
|
||||
syna,sensor-type = <2>;
|
||||
};
|
||||
};
|
||||
};
|
|
@ -18,6 +18,8 @@ Optional properties for Touchscreens:
|
|||
- touchscreen-inverted-y : Y axis is inverted (boolean)
|
||||
- touchscreen-swapped-x-y : X and Y axis are swapped (boolean)
|
||||
Swapping is done after inverting the axis
|
||||
- touchscreen-x-mm : horizontal length in mm of the touchscreen
|
||||
- touchscreen-y-mm : vertical length in mm of the touchscreen
|
||||
|
||||
Deprecated properties for Touchscreens:
|
||||
- x-size : deprecated name for touchscreen-size-x
|
||||
|
|
|
@ -219,3 +219,111 @@ int rmi_2d_sensor_configure_input(struct rmi_function *fn,
|
|||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rmi_2d_sensor_configure_input);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
int rmi_2d_sensor_of_probe(struct device *dev,
|
||||
struct rmi_2d_sensor_platform_data *pdata)
|
||||
{
|
||||
int retval;
|
||||
u32 val;
|
||||
|
||||
pdata->axis_align.swap_axes = of_property_read_bool(dev->of_node,
|
||||
"touchscreen-swapped-x-y");
|
||||
|
||||
pdata->axis_align.flip_x = of_property_read_bool(dev->of_node,
|
||||
"touchscreen-inverted-x");
|
||||
|
||||
pdata->axis_align.flip_y = of_property_read_bool(dev->of_node,
|
||||
"touchscreen-inverted-y");
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "syna,clip-x-low", 1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->axis_align.clip_x_low = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "syna,clip-y-low", 1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->axis_align.clip_y_low = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "syna,clip-x-high", 1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->axis_align.clip_x_high = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "syna,clip-y-high", 1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->axis_align.clip_y_high = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "syna,offset-x", 1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->axis_align.offset_x = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "syna,offset-y", 1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->axis_align.offset_y = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "syna,delta-x-threshold",
|
||||
1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->axis_align.delta_x_threshold = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "syna,delta-y-threshold",
|
||||
1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->axis_align.delta_y_threshold = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, (u32 *)&pdata->sensor_type,
|
||||
"syna,sensor-type", 1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "touchscreen-x-mm", 1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->x_mm = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "touchscreen-y-mm", 1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->y_mm = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val,
|
||||
"syna,disable-report-mask", 1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->disable_report_mask = val;
|
||||
|
||||
retval = rmi_of_property_read_u32(dev, &val, "syna,rezero-wait-ms",
|
||||
1);
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
pdata->rezero_wait = val;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
inline int rmi_2d_sensor_of_probe(struct device *dev,
|
||||
struct rmi_2d_sensor_platform_data *pdata)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
EXPORT_SYMBOL_GPL(rmi_2d_sensor_of_probe);
|
||||
|
|
|
@ -69,6 +69,9 @@ struct rmi_2d_sensor {
|
|||
u8 y_mm;
|
||||
};
|
||||
|
||||
int rmi_2d_sensor_of_probe(struct device *dev,
|
||||
struct rmi_2d_sensor_platform_data *pdata);
|
||||
|
||||
void rmi_2d_sensor_abs_process(struct rmi_2d_sensor *sensor,
|
||||
struct rmi_2d_sensor_abs_object *obj,
|
||||
int slot);
|
||||
|
|
|
@ -1059,8 +1059,13 @@ static int rmi_f11_initialize(struct rmi_function *fn)
|
|||
if (!f11)
|
||||
return -ENOMEM;
|
||||
|
||||
if (pdata->sensor_pdata)
|
||||
if (fn->dev.of_node) {
|
||||
rc = rmi_2d_sensor_of_probe(&fn->dev, &f11->sensor_pdata);
|
||||
if (rc)
|
||||
return rc;
|
||||
} else if (pdata->sensor_pdata) {
|
||||
f11->sensor_pdata = *pdata->sensor_pdata;
|
||||
}
|
||||
|
||||
f11->rezero_wait_ms = f11->sensor_pdata.rezero_wait;
|
||||
|
||||
|
|
Loading…
Reference in New Issue