Provide device tree support and binding information.
Change platform data parameters from x/y_max to x/y_size..

Signed-off-by: Roger Quadros <rog...@ti.com>
Acked-by: Mugunthan V N <mugunthan...@ti.com>
---
 .../bindings/input/touchscreen/pixcir_i2c_ts.txt   | 26 ++++++++
 drivers/input/touchscreen/pixcir_i2c_ts.c          | 77 ++++++++++++++++++++--
 include/linux/input/pixcir_ts.h                    |  5 +-
 3 files changed, 101 insertions(+), 7 deletions(-)
 create mode 100644 
Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt

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 0000000..c0b0b270
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/touchscreen/pixcir_i2c_ts.txt
@@ -0,0 +1,26 @@
+* Pixcir I2C touchscreen controllers
+
+Required properties:
+- compatible: must be "pixcir,pixcir_ts"
+- reg: I2C address of the chip
+- interrupts: interrupt to which the chip is connected
+- attb-gpio: GPIO connected to the ATTB line of the chip
+- x-size: horizontal resolution of touchscreen
+- y-size: vertical resolution of touchscreen
+
+Example:
+
+       i2c@00000000 {
+               /* ... */
+
+               pixcir_ts@5c {
+                       compatible = "pixcir,pixcir_ts";
+                       reg = <0x5c>;
+                       interrupts = <2 0>;
+                       attb-gpio = <&gpf 2 0 2>;
+                       x-size = <800>;
+                       y-size = <600>;
+               };
+
+               /* ... */
+       };
diff --git a/drivers/input/touchscreen/pixcir_i2c_ts.c 
b/drivers/input/touchscreen/pixcir_i2c_ts.c
index 6cc6b36..3a447c9 100644
--- a/drivers/input/touchscreen/pixcir_i2c_ts.c
+++ b/drivers/input/touchscreen/pixcir_i2c_ts.c
@@ -24,6 +24,10 @@
 #include <linux/i2c.h>
 #include <linux/input.h>
 #include <linux/input/pixcir_ts.h>
+#include <linux/gpio.h>
+#include <linux/of.h>
+#include <linux/of_gpio.h>
+#include <linux/of_device.h>
 
 struct pixcir_i2c_ts_data {
        struct i2c_client *client;
@@ -125,15 +129,65 @@ static int pixcir_i2c_ts_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops,
                         pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume);
 
+#if defined(CONFIG_OF)
+static const struct of_device_id pixcir_of_match[];
+
+static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
+{
+       struct pixcir_ts_platform_data *pdata;
+       struct device_node *np = dev->of_node;
+       const struct of_device_id *match;
+
+       match = of_match_device(of_match_ptr(pixcir_of_match), dev);
+       if (!match)
+               return ERR_PTR(-EINVAL);
+
+       pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
+       if (!pdata)
+               return ERR_PTR(-ENOMEM);
+
+       pdata->gpio_attb = of_get_named_gpio(np, "attb-gpio", 0);
+       if (!gpio_is_valid(pdata->gpio_attb))
+               dev_err(dev, "Failed to get ATTB GPIO\n");
+
+       if (of_property_read_u32(np, "x-size", &pdata->x_size)) {
+               dev_err(dev, "Failed to get x-size property\n");
+               return ERR_PTR(-EINVAL);
+       }
+
+       if (of_property_read_u32(np, "y-size", &pdata->y_size)) {
+               dev_err(dev, "Failed to get y-size property\n");
+               return ERR_PTR(-EINVAL);
+       }
+
+       dev_dbg(dev, "%s: x %d, y %d, gpio %d\n", __func__,
+                               pdata->x_size, pdata->y_size, pdata->gpio_attb);
+
+       return pdata;
+}
+#else
+static struct pixcir_ts_platform_data *pixcir_parse_dt(struct device *dev)
+{
+       return NULL;
+}
+#endif
+
 static int pixcir_i2c_ts_probe(struct i2c_client *client,
                                         const struct i2c_device_id *id)
 {
        const struct pixcir_ts_platform_data *pdata = client->dev.platform_data;
+       struct device *dev = &client->dev;
+       struct device_node *np = dev->of_node;
        struct pixcir_i2c_ts_data *tsdata;
        struct input_dev *input;
        int error;
 
-       if (!pdata) {
+       if (np) {
+               pdata = pixcir_parse_dt(dev);
+               if (IS_ERR(pdata))
+                       return PTR_ERR(pdata);
+
+       } else if (!pdata) {
                dev_err(&client->dev, "platform data not defined\n");
                return -EINVAL;
        }
@@ -157,10 +211,14 @@ static int pixcir_i2c_ts_probe(struct i2c_client *client,
        __set_bit(EV_KEY, input->evbit);
        __set_bit(EV_ABS, input->evbit);
        __set_bit(BTN_TOUCH, input->keybit);
-       input_set_abs_params(input, ABS_X, 0, pdata->x_max, 0, 0);
-       input_set_abs_params(input, ABS_Y, 0, pdata->y_max, 0, 0);
-       input_set_abs_params(input, ABS_MT_POSITION_X, 0, pdata->x_max, 0, 0);
-       input_set_abs_params(input, ABS_MT_POSITION_Y, 0, pdata->y_max, 0, 0);
+       input_set_abs_params(input, ABS_X,
+                                       0, pdata->x_size - 1, 0, 0);
+       input_set_abs_params(input, ABS_Y,
+                                       0, pdata->y_size - 1, 0, 0);
+       input_set_abs_params(input, ABS_MT_POSITION_X,
+                                       0, pdata->x_size - 1, 0, 0);
+       input_set_abs_params(input, ABS_MT_POSITION_Y,
+                                       0, pdata->y_size - 1, 0, 0);
 
        input_set_drvdata(input, tsdata);
 
@@ -211,11 +269,20 @@ static const struct i2c_device_id pixcir_i2c_ts_id[] = {
 };
 MODULE_DEVICE_TABLE(i2c, pixcir_i2c_ts_id);
 
+#if defined(CONFIG_OF)
+static const struct of_device_id pixcir_of_match[] = {
+       { .compatible = "pixcir,pixcir_ts", },
+       { }
+};
+MODULE_DEVICE_TABLE(of, pixcir_of_match);
+#endif
+
 static struct i2c_driver pixcir_i2c_ts_driver = {
        .driver = {
                .owner  = THIS_MODULE,
                .name   = "pixcir_ts",
                .pm     = &pixcir_dev_pm_ops,
+               .of_match_table = of_match_ptr(pixcir_of_match),
        },
        .probe          = pixcir_i2c_ts_probe,
        .remove         = pixcir_i2c_ts_remove,
diff --git a/include/linux/input/pixcir_ts.h b/include/linux/input/pixcir_ts.h
index 7163d91..b34ff7e 100644
--- a/include/linux/input/pixcir_ts.h
+++ b/include/linux/input/pixcir_ts.h
@@ -3,8 +3,9 @@
 
 struct pixcir_ts_platform_data {
        int (*attb_read_val)(void);
-       int x_max;
-       int y_max;
+       unsigned int x_size;    /* X axis resolution */
+       unsigned int y_size;    /* Y axis resolution */
+       int gpio_attb;          /* GPIO connected to ATTB line */
 };
 
 #endif
-- 
1.8.3.2

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

Reply via email to