aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoger Quadros <rogerq@ti.com>2014-07-28 13:05:39 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2014-07-28 13:26:18 -0400
commita4054596e93048d50502f6c31c853bfeba5acb8e (patch)
treeda22e91a4188146d8d506143c8a46b5140445cbb
parent36874c7e219fa080141d49fd7bb9bbbdad0507c5 (diff)
Input: pixcir_i2c_ts - add device tree support
Provide device tree support and binding information. Also provide support for a new chip "pixcir_tangoc". Signed-off-by: Roger Quadros <rogerq@ti.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt26
-rw-r--r--Documentation/devicetree/bindings/vendor-prefixes.txt1
-rw-r--r--drivers/input/touchscreen/pixcir_i2c_ts.c77
3 files changed, 104 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt b/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
new file mode 100644
index 000000000000..6e551090f465
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
@@ -0,0 +1,26 @@
1* Pixcir I2C touchscreen controllers
2
3Required properties:
4- compatible: must be "pixcir,pixcir_ts" or "pixcir,pixcir_tangoc"
5- reg: I2C address of the chip
6- interrupts: interrupt to which the chip is connected
7- attb-gpio: GPIO connected to the ATTB line of the chip
8- touchscreen-size-x: horizontal resolution of touchscreen (in pixels)
9- touchscreen-size-y: vertical resolution of touchscreen (in pixels)
10
11Example:
12
13 i2c@00000000 {
14 /* ... */
15
16 pixcir_ts@5c {
17 compatible = "pixcir,pixcir_ts";
18 reg = <0x5c>;
19 interrupts = <2 0>;
20 attb-gpio = <&gpf 2 0 2>;
21 touchscreen-size-x = <800>;
22 touchscreen-size-y = <600>;
23 };
24
25 /* ... */
26 };
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
index 46a311e728a8..91bd2287f0c7 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -99,6 +99,7 @@ panasonic Panasonic Corporation
99phytec PHYTEC Messtechnik GmbH 99phytec PHYTEC Messtechnik GmbH
100picochip Picochip Ltd 100picochip Picochip Ltd
101plathome Plat'Home Co., Ltd. 101plathome Plat'Home Co., Ltd.
102pixcir PIXCIR MICROELECTRONICS Co., Ltd
102powervr PowerVR (deprecated, use img) 103powervr PowerVR (deprecated, use img)
103qca Qualcomm Atheros, Inc. 104qca Qualcomm Atheros, Inc.
104qcom Qualcomm Technologies, Inc 105qcom Qualcomm Technologies, Inc
diff --git a/drivers/input/touchscreen/pixcir_i2c_ts.c b/drivers/input/touchscreen/pixcir_i2c_ts.c
index eddda520a1a7..fc49c75317d1 100644
--- a/drivers/input/touchscreen/pixcir_i2c_ts.c
+++ b/drivers/input/touchscreen/pixcir_i2c_ts.c
@@ -26,6 +26,9 @@
26#include <linux/input/mt.h> 26#include <linux/input/mt.h>
27#include <linux/input/pixcir_ts.h> 27#include <linux/input/pixcir_ts.h>
28#include <linux/gpio.h> 28#include <linux/gpio.h>
29#include <linux/of.h>
30#include <linux/of_gpio.h>
31#include <linux/of_device.h>
29 32
30#define PIXCIR_MAX_SLOTS 5 /* Max fingers supported by driver */ 33#define PIXCIR_MAX_SLOTS 5 /* Max fingers supported by driver */
31 34
@@ -407,16 +410,69 @@ unlock:
407static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops, 410static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops,
408 pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume); 411 pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume);
409 412
413#ifdef CONFIG_OF
414static const struct of_device_id pixcir_of_match[];
415
416static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
417{
418 struct pixcir_ts_platform_data *pdata;
419 struct device_node *np = dev->of_node;
420 const struct of_device_id *match;
421
422 match = of_match_device(of_match_ptr(pixcir_of_match), dev);
423 if (!match)
424 return ERR_PTR(-EINVAL);
425
426 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
427 if (!pdata)
428 return ERR_PTR(-ENOMEM);
429
430 pdata->chip = *(const struct pixcir_i2c_chip_data *)match->data;
431
432 pdata->gpio_attb = of_get_named_gpio(np, "attb-gpio", 0);
433 /* gpio_attb validity is checked in probe */
434
435 if (of_property_read_u32(np, "touchscreen-size-x", &pdata->x_max)) {
436 dev_err(dev, "Failed to get touchscreen-size-x property\n");
437 return ERR_PTR(-EINVAL);
438 }
439 pdata->x_max -= 1;
440
441 if (of_property_read_u32(np, "touchscreen-size-y", &pdata->y_max)) {
442 dev_err(dev, "Failed to get touchscreen-size-y property\n");
443 return ERR_PTR(-EINVAL);
444 }
445 pdata->y_max -= 1;
446
447 dev_dbg(dev, "%s: x %d, y %d, gpio %d\n", __func__,
448 pdata->x_max + 1, pdata->y_max + 1, pdata->gpio_attb);
449
450 return pdata;
451}
452#else
453static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
454{
455 return ERR_PTR(-EINVAL);
456}
457#endif
458
410static int pixcir_i2c_ts_probe(struct i2c_client *client, 459static int pixcir_i2c_ts_probe(struct i2c_client *client,
411 const struct i2c_device_id *id) 460 const struct i2c_device_id *id)
412{ 461{
413 const struct pixcir_ts_platform_data *pdata = 462 const struct pixcir_ts_platform_data *pdata =
414 dev_get_platdata(&client->dev); 463 dev_get_platdata(&client->dev);
415 struct device *dev = &client->dev; 464 struct device *dev = &client->dev;
465 struct device_node *np = dev->of_node;
416 struct pixcir_i2c_ts_data *tsdata; 466 struct pixcir_i2c_ts_data *tsdata;
417 struct input_dev *input; 467 struct input_dev *input;
418 int error; 468 int error;
419 469
470 if (np && !pdata) {
471 pdata = pixcir_parse_dt(dev);
472 if (IS_ERR(pdata))
473 return PTR_ERR(pdata);
474 }
475
420 if (!pdata) { 476 if (!pdata) {
421 dev_err(&client->dev, "platform data not defined\n"); 477 dev_err(&client->dev, "platform data not defined\n");
422 return -EINVAL; 478 return -EINVAL;
@@ -522,15 +578,36 @@ static int pixcir_i2c_ts_remove(struct i2c_client *client)
522 578
523static const struct i2c_device_id pixcir_i2c_ts_id[] = { 579static const struct i2c_device_id pixcir_i2c_ts_id[] = {
524 { "pixcir_ts", 0 }, 580 { "pixcir_ts", 0 },
581 { "pixcir_tangoc", 0 },
525 { } 582 { }
526}; 583};
527MODULE_DEVICE_TABLE(i2c, pixcir_i2c_ts_id); 584MODULE_DEVICE_TABLE(i2c, pixcir_i2c_ts_id);
528 585
586#ifdef CONFIG_OF
587static const struct pixcir_i2c_chip_data pixcir_ts_data = {
588 .max_fingers = 2,
589 /* no hw id support */
590};
591
592static const struct pixcir_i2c_chip_data pixcir_tangoc_data = {
593 .max_fingers = 5,
594 .has_hw_ids = true,
595};
596
597static const struct of_device_id pixcir_of_match[] = {
598 { .compatible = "pixcir,pixcir_ts", .data = &pixcir_ts_data },
599 { .compatible = "pixcir,pixcir_tangoc", .data = &pixcir_tangoc_data },
600 { }
601};
602MODULE_DEVICE_TABLE(of, pixcir_of_match);
603#endif
604
529static struct i2c_driver pixcir_i2c_ts_driver = { 605static struct i2c_driver pixcir_i2c_ts_driver = {
530 .driver = { 606 .driver = {
531 .owner = THIS_MODULE, 607 .owner = THIS_MODULE,
532 .name = "pixcir_ts", 608 .name = "pixcir_ts",
533 .pm = &pixcir_dev_pm_ops, 609 .pm = &pixcir_dev_pm_ops,
610 .of_match_table = of_match_ptr(pixcir_of_match),
534 }, 611 },
535 .probe = pixcir_i2c_ts_probe, 612 .probe = pixcir_i2c_ts_probe,
536 .remove = pixcir_i2c_ts_remove, 613 .remove = pixcir_i2c_ts_remove,