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��������+%������w��{.n�����{����*jg��������ݢj����G�������j:+v���w�m������w�������h�����٥