Input: synaptics-rmi4 - add device tree support for 2d sensors and F11
authorAndrew Duggan <aduggan@synaptics.com>
Thu, 10 Mar 2016 23:48:32 +0000 (15:48 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 11 Mar 2016 00:04:05 +0000 (16:04 -0800)
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>
Documentation/devicetree/bindings/input/rmi4/rmi_2d_sensor.txt [new file with mode: 0644]
Documentation/devicetree/bindings/input/touchscreen/touchscreen.txt
drivers/input/rmi4/rmi_2d_sensor.c
drivers/input/rmi4/rmi_2d_sensor.h
drivers/input/rmi4/rmi_f11.c

diff --git a/Documentation/devicetree/bindings/input/rmi4/rmi_2d_sensor.txt b/Documentation/devicetree/bindings/input/rmi4/rmi_2d_sensor.txt
new file mode 100644 (file)
index 0000000..f2c30c8
--- /dev/null
@@ -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>;
+                       };
+               };
+       };
index ac23caf518ad07b59ef0aa17feae18519b3ba0be..bccaa4e7304530b559c411afc2fab9cbccd068b3 100644 (file)
@@ -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
index 8f48647ca5b02d648c86321bffa1789c257454cf..e97bd7fabccc5ec3b483070b3d58a55cca12b1f2 100644 (file)
@@ -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);
index 6a715d392ec21d9a3e4a34483462fe8c8df09ab2..77fcdfef003c6f96f19a796ffa410ba9b2026f82 100644 (file)
@@ -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);
index 948a360b6261c8bbef3e45f7518062d8a19da0b7..77a5eb84aed96bbe15acb29965627181e3d0675f 100644 (file)
@@ -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;