From: Lothar Waßmann <l...@karo-electronics.de>
Data: Wednesday, March 19, 2014 9:09 PM

>To: Dmitry Torokhov; Duan Fugang-B38611; Grant Likely; Henrik Rydberg; Ian
>Campbell; Jingoo Han; Kumar Gala; Mark Rutland; Pawel Moll; Rob Herring; Rob
>Landley; Sachin Kamat; devicet...@vger.kernel.org; linux-...@vger.kernel.org;
>linux-in...@vger.kernel.org; linux-kernel@vger.kernel.org; Simon Budig; Lothar
>Waßmann
>Subject: [PATCHv4 2/5] Input: edt-ft5x06: Add DT support
>
>
>Signed-off-by: Lothar Waßmann <l...@karo-electronics.de>
>---
> .../bindings/input/touchscreen/edt-ft5x06.txt      |   41 ++++++
> drivers/input/touchscreen/edt-ft5x06.c             |  144 +++++++++++++++-----
> 2 files changed, 154 insertions(+), 31 deletions(-)  create mode 100644
>Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.txt
>
>diff --git a/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.txt
>b/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.txt
>new file mode 100644
>index 0000000..e5adc76
>--- /dev/null
>+++ b/Documentation/devicetree/bindings/input/touchscreen/edt-ft5x06.txt
>@@ -0,0 +1,41 @@
>+FocalTech EDT-FT5x06 Polytouch driver
>+=====================================
>+
>+Required properties:
>+ - compatible:  "edt,edt-ft5x06"
>+ - reg:         I2C slave address of the chip (0x38)
>+ - interrupt-parent: a phandle pointing to the interrupt controller
>+                     serving the interrupt for this chip
>+ - interrupts:       interrupt specification for this chip
>+
>+Optional properties:
>+ - reset-gpios: GPIO specification for the RESET input
>+ - wake-gpios:  GPIO specification for the WAKE input
>+
>+ - pinctrl-names: should be "default"
>+ - pinctrl-0:   a phandle pointing to the pin settings for the
>+                control gpios
>+
>+ - threshold:   allows setting the "click"-threshold in the range
>+                from 20 to 80.
>+
>+ - gain:        allows setting the sensitivity in the range from 0 to
>+                31. Note that lower values indicate higher
>+                sensitivity.
>+
>+ - offset:      allows setting the edge compensation in the range from
>+                0 to 31.
>+ - report_rate: allows setting the report rate in the range from 3 to
>+                14.
>+
>+Example:
>+      polytouch: edt-ft5x06@38 {
>+              compatible = "edt,edt-ft5x06";
>+              reg = <0x38>;
>+              pinctrl-names = "default";
>+              pinctrl-0 = <&edt_ft5x06_pins>;
>+              interrupt-parent = <&gpio2>;
>+              interrupts = <5 0>;
>+              reset-gpios = <&gpio2 6 1>;
>+              wake-gpios = <&gpio4 9 0>;
>+      };
>diff --git a/drivers/input/touchscreen/edt-ft5x06.c
>b/drivers/input/touchscreen/edt-ft5x06.c
>index 7b4470d..257a1c8 100644
>--- a/drivers/input/touchscreen/edt-ft5x06.c
>+++ b/drivers/input/touchscreen/edt-ft5x06.c
>@@ -33,6 +33,7 @@
> #include <linux/debugfs.h>
> #include <linux/slab.h>
> #include <linux/gpio.h>
>+#include <linux/of_gpio.h>
> #include <linux/input/mt.h>
> #include <linux/input/edt-ft5x06.h>
>
[...]
>+#ifdef CONFIG_OF
>+static int edt_ft5x06_i2c_ts_probe_dt(struct device *dev,
>+                              struct edt_ft5x06_ts_data *tsdata)
>+{
>+      struct device_node *np = dev->of_node;
>+
>+      if (!np)
>+              return -ENODEV;
Don't need to check the device node valid. If the device node is not existed, 
the driver don't run probe.

>+
>+      /*
>+       * irq_pin is not needed for DT setup.
>+       * irq is associated via 'interrupts' property in DT
>+       */
>+      tsdata->irq_pin = -EINVAL;
>+      tsdata->reset_pin = of_get_named_gpio(np, "reset-gpios", 0);
>+      tsdata->wake_pin = of_get_named_gpio(np, "wake-gpios", 0);
>+
>+      return 0;
>+}
>+#else
>+static inline int edt_ft5x06_i2c_ts_probe_dt(struct device *dev,
>+                                      struct edt_ft5x06_i2c_ts_data *tsdata) {
>+      return -ENODEV;
>+}
>+#endif
>+
> static int edt_ft5x06_ts_probe(struct i2c_client *client,
>                                        const struct i2c_device_id *id)
> {
>@@ -714,32 +775,40 @@ static int edt_ft5x06_ts_probe(struct i2c_client *client,
>
>       dev_dbg(&client->dev, "probing for EDT FT5x06 I2C\n");
>
>+      tsdata = devm_kzalloc(&client->dev, sizeof(*tsdata), GFP_KERNEL);
>+      if (!tsdata) {
>+              dev_err(&client->dev, "failed to allocate driver data.\n");
>+              return -ENOMEM;
>+      }
>+
>       if (!pdata) {
>-              dev_err(&client->dev, "no platform data?\n");
>-              return -EINVAL;
>+              error = edt_ft5x06_i2c_ts_probe_dt(&client->dev, tsdata);
>+              if (error) {
>+                      dev_err(&client->dev,
>+                              "DT probe failed and no platform data 
>present\n");
>+                      return error;
>+              }
>+      } else {
>+              tsdata->reset_pin = pdata->reset_pin;
>+              tsdata->irq_pin = pdata->irq_pin;
>+              tsdata->wake_pin = -EINVAL;
>       }
[...]

Thanks,
Andy
N�����r��y����b�X��ǧv�^�)޺{.n�+����{����zX����ܨ}���Ơz�&j:+v�������zZ+��+zf���h���~����i���z��w���?�����&�)ߢf��^jǫy�m��@A�a���
0��h���i

Reply via email to