Skip to content

Commit

Permalink
Input: atmel_mxt_ts - implement device tree support
Browse files Browse the repository at this point in the history
Signed-off-by: Stephen Warren <[email protected]>
Signed-off-by: Nick Dyer <[email protected]>
Signed-off-by: Dmitry Torokhov <[email protected]>
  • Loading branch information
nvswarren authored and dtor committed Jul 23, 2014
1 parent b735fbe commit 78188be
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 5 deletions.
25 changes: 25 additions & 0 deletions Documentation/devicetree/bindings/input/atmel,maxtouch.txt
Original file line number Diff line number Diff line change
@@ -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) IRQ_TYPE_LEVEL_LOW>;
};
68 changes: 63 additions & 5 deletions drivers/input/touchscreen/atmel_mxt_ts.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -1527,15 +1528,65 @@ static void mxt_input_close(struct input_dev *dev)
mxt_stop(data);
}

static int mxt_probe(struct i2c_client *client,
const struct i2c_device_id *id)
#ifdef CONFIG_OF
static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
{
struct mxt_platform_data *pdata;
u32 *keymap;
u32 keycode;
int proplen, i, ret;

if (!client->dev.of_node)
return ERR_PTR(-ENODEV);

pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata)
return ERR_PTR(-ENOMEM);

if (of_find_property(client->dev.of_node, "linux,gpio-keymap",
&proplen)) {
pdata->t19_num_keys = proplen / sizeof(u32);

keymap = devm_kzalloc(&client->dev,
pdata->t19_num_keys * sizeof(keymap[0]),
GFP_KERNEL);
if (!keymap)
return ERR_PTR(-ENOMEM);

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 = KEY_RESERVED;

keymap[i] = keycode;
}

pdata->t19_keymap = keymap;
}

return pdata;
}
#else
static struct mxt_platform_data *mxt_parse_dt(struct i2c_client *client)
{
dev_dbg(&client->dev, "No platform data specified\n");
return ERR_PTR(-EINVAL);
}
#endif

static int mxt_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
struct mxt_data *data;
const struct mxt_platform_data *pdata = dev_get_platdata(&client->dev);
const struct mxt_platform_data *pdata;
int error;

if (!pdata)
return -EINVAL;
pdata = dev_get_platdata(&client->dev);
if (!pdata) {
pdata = mxt_parse_dt(client);
if (IS_ERR(pdata))
return PTR_ERR(pdata);
}

data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);
if (!data) {
Expand Down Expand Up @@ -1638,6 +1689,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 },
Expand All @@ -1651,6 +1708,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,
Expand Down

0 comments on commit 78188be

Please sign in to comment.