RE: [PATCHv4 2/5] Input: edt-ft5x06: Add DT support

From: fugang.duan@xxxxxxxxxxxxx
Date: Thu Mar 20 2014 - 01:19:46 EST


From: Lothar WaÃmann <LW@xxxxxxxxxxxxxxxxxxx>
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; devicetree@xxxxxxxxxxxxxxx; linux-doc@xxxxxxxxxxxxxxx;
>linux-input@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; Simon Budig; Lothar
>WaÃmann
>Subject: [PATCHv4 2/5] Input: edt-ft5x06: Add DT support
>
>
>Signed-off-by: Lothar WaÃmann <LW@xxxxxxxxxxxxxxxxxxx>
>---
> .../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‹§²æ¸›yú²X¬¶ÇvØ–)Þ{.nlj·¥Š{±‘êX§¶›¡Ü}©ž²ÆzÚj:+v‰¨¾«‘êZ+€Êzf£¢·hšˆ§~†­†Ûÿû®w¥¢¸?™¨è&¢)ßf”ùy§m…á«a¶Úÿ 0¶ìå