From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758989AbaGCPJn (ORCPT ); Thu, 3 Jul 2014 11:09:43 -0400 Received: from kdh-gw.itdev.co.uk ([89.21.227.133]:12919 "EHLO hermes.kdh.itdev.co.uk" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758594AbaGCPIO (ORCPT ); Thu, 3 Jul 2014 11:08:14 -0400 From: nick.dyer@itdev.co.uk To: Dmitry Torokhov Cc: Yufeng Shen , Daniel Kurtz , Henrik Rydberg , Joonyoung Shim , Alan Bowens , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Meerwald , Benson Leung , Olof Johansson , Sekhar Nori , Stephen Warren , Nick Dyer Subject: [PATCH 04/15] Input: atmel_mxt_ts - implement device tree support Date: Thu, 3 Jul 2014 16:01:26 +0100 Message-Id: <1404399697-26484-5-git-send-email-nick.dyer@itdev.co.uk> X-Mailer: git-send-email 2.0.1 In-Reply-To: <1404399697-26484-1-git-send-email-nick.dyer@itdev.co.uk> References: <1404399697-26484-1-git-send-email-nick.dyer@itdev.co.uk> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Stephen Warren Signed-off-by: Stephen Warren Signed-off-by: Nick Dyer --- .../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 + . + +Example: + + touch@4b { + compatible = "atmel,maxtouch"; + reg = <0x4b>; + interrupt-parent = <&gpio>; + interrupts = ; + }; 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 #include #include +#include #include /* 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