[PATCH 04/15] Input: atmel_mxt_ts - implement device tree support

From: nick . dyer
Date: Thu Jul 03 2014 - 11:09:48 EST


From: Stephen Warren <swarren@xxxxxxxxxx>

Signed-off-by: Stephen Warren <swarren@xxxxxxxxxx>
Signed-off-by: Nick Dyer <nick.dyer@xxxxxxxxxxx>
---
.../devicetree/bindings/input/atmel,maxtouch.txt | 25 +++++++++++
drivers/input/touchscreen/atmel_mxt_ts.c | 48 ++++++++++++++++++++++
2 files changed, 73 insertions(+)
create mode 100644 Documentation/devicetree/bindings/input/atmel,maxtouch.txt

diff --git a/Documentation/devicetree/bindings/input/atmel,maxtouch.txt b/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
new file mode 100644
index 0000000..60d6339
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/atmel,maxtouch.txt
@@ -0,0 +1,25 @@
+Atmel maXTouch touchscreen/touchpad
+
+Required properties:
+- compatible:
+ atmel,maxtouch
+
+- reg: The I2C address of the device
+
+- interrupts: The sink for the touchpad's IRQ output
+ See ../interrupt-controller/interrupts.txt
+
+Optional properties for main touchpad device:
+
+- linux,gpio-keymap: An array of up to 4 entries indicating the Linux
+ keycode generated by each GPIO. Linux keycodes are defined in
+ <dt-bindings/input/input.h>.
+
+Example:
+
+ touch@4b {
+ compatible = "atmel,maxtouch";
+ reg = <0x4b>;
+ interrupt-parent = <&gpio>;
+ interrupts = <TEGRA_GPIO(W, 3) GPIO_ACTIVE_HIGH>;
+ };
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 31113c3..5a095f6 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -22,6 +22,7 @@
#include <linux/i2c/atmel_mxt_ts.h>
#include <linux/input/mt.h>
#include <linux/interrupt.h>
+#include <linux/of.h>
#include <linux/slab.h>

/* Version */
@@ -1527,6 +1528,42 @@ static void mxt_input_close(struct input_dev *dev)
mxt_stop(data);
}

+#ifdef CONFIG_OF
+static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
+{
+ struct mxt_platform_data *pdata;
+ struct property *prop;
+ unsigned int *keymap;
+ int proplen, i, ret;
+ u32 keycode;
+
+ pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
+ if (!pdata)
+ return NULL;
+
+ prop = of_find_property(client->dev.of_node, "linux,gpio-keymap",
+ &proplen);
+ if (prop) {
+ pdata->t19_num_keys = proplen / sizeof(u32);
+
+ keymap = devm_kzalloc(&client->dev,
+ pdata->t19_num_keys * sizeof(u32), GFP_KERNEL);
+ if (!keymap)
+ return NULL;
+ pdata->t19_keymap = keymap;
+ for (i = 0; i < pdata->t19_num_keys; i++) {
+ ret = of_property_read_u32_index(client->dev.of_node,
+ "linux,gpio-keymap", i, &keycode);
+ if (ret)
+ keycode = 0;
+ keymap[i] = keycode;
+ }
+ }
+
+ return pdata;
+}
+#endif
+
static int mxt_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -1534,6 +1571,10 @@ static int mxt_probe(struct i2c_client *client,
const struct mxt_platform_data *pdata = dev_get_platdata(&client->dev);
int error;

+#ifdef CONFIG_OF
+ if (!pdata && client->dev.of_node)
+ pdata = mxt_parse_dt(client);
+#endif
if (!pdata)
return -EINVAL;

@@ -1638,6 +1679,12 @@ static int mxt_resume(struct device *dev)

static SIMPLE_DEV_PM_OPS(mxt_pm_ops, mxt_suspend, mxt_resume);

+static const struct of_device_id mxt_of_match[] = {
+ { .compatible = "atmel,maxtouch", },
+ {},
+};
+MODULE_DEVICE_TABLE(of, mxt_of_match);
+
static const struct i2c_device_id mxt_id[] = {
{ "qt602240_ts", 0 },
{ "atmel_mxt_ts", 0 },
@@ -1651,6 +1698,7 @@ static struct i2c_driver mxt_driver = {
.driver = {
.name = "atmel_mxt_ts",
.owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(mxt_of_match),
.pm = &mxt_pm_ops,
},
.probe = mxt_probe,
--
2.0.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/