Input: add dt support to zforce driver
Subsystems (3)
cover Input: add dt support to zforce driver
This adds the binding documentation and necessary parsing code to make zforce based touchscreen usable on devicetree platforms.
Heiko Stuebner (3):
dt-bindings: bindings for zforce touchscreens
Input: zforce: Use internal pdata pointer instead of dev_get_platdata
Input: zforce: add devicetree support
.../bindings/input/touchscreen/zforce_ts.txt | 30 ++++++++++ .../devicetree/bindings/vendor-prefixes.txt | 1 + drivers/input/touchscreen/zforce_ts.c | 63 ++++++++++++++++++-- 3 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txt
Signature · 1 line
1.7.10.4
PATCH 1/3 dt-bindings: bindings for zforce touchscreens
Binding documentation for Neonode zForce infrared touchscreens.
--- .../bindings/input/touchscreen/zforce_ts.txt | 30 ++++++++++++++++++++ .../devicetree/bindings/vendor-prefixes.txt | 1 + 2 files changed, 31 insertions(+) create mode 100644 Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txt
Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txt new file +30 -0
@@ -0,0 +1,30 @@ +* Neonode infrared touchscreen controller + +Required properties: +- compatible: must be "neonode,zforce" +- reg: I2C address of the chip +- interrupts: interrupt to which the chip is connected +- gpios: gpios the chip is connected to + first one is the interrupt gpio and second one the reset gpio +- x-size: horizontal resolution of touchscreen +- y-size: vertical resolution of touchscreen + +Example: + + i2c@00000000 { + /* ... */ + + zforce_ts@50 { + compatible = "neonode,zforce"; + reg = <0x50>; + interrupts = <2 0>; + + gpios = <&gpio5 6 0>, /* INT */ + <&gpio5 9 0>; /* RST */ + + x-size = <800>; + y-size = <600>; + }; + + /* ... */ + };
Documentation/devicetree/bindings/vendor-prefixes.txt +1 -0
@@ -53,6 +53,7 @@ maxim Maxim Integrated Products microchip Microchip Technology Inc. mosaixtech Mosaix Technologies, Inc. national National Semiconductor +neonode Neonode Inc. nintendo Nintendo nvidia NVIDIA nxp NXP Semiconductors
Signature · 1 line
1.7.10.4
PATCH 2/3 Input: zforce: Use internal pdata pointer instead of dev_get_platdata
In reply to Heiko StübnerWhen the device is initialized from devicetree the platformdata is created locally making dev_get_platdata return NULL.
Therefore directly use the internal pointer to the pdata instead.
--- drivers/input/touchscreen/zforce_ts.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/input/touchscreen/zforce_ts.c +3 -3
@@ -255,7 +255,7 @@ static int zforce_setconfig(struct zforce_ts *ts, char b1)static int zforce_start (struct zforce_ts *ts) {struct i2c_client *client = ts->client; -const struct zforce_ts_platdata *pdata =dev_get_platdata (&client->dev); +const struct zforce_ts_platdata *pdata = ts->pdata;int ret;dev_dbg (&client->dev,"starting device\n" );
@@ -326,7 +326,7 @@ static int zforce_stop(struct zforce_ts *ts)static int zforce_touch_event (struct zforce_ts *ts,u8 *payload) {struct i2c_client *client = ts->client; -const struct zforce_ts_platdata *pdata =dev_get_platdata (&client->dev); +const struct zforce_ts_platdata *pdata = ts->pdata;struct zforce_point point;int count, i, num =0 ;
@@ -471,7 +471,7 @@ static irqreturn_t zforce_irq_thread(int irq, void *dev_id) {struct zforce_ts *ts = dev_id;struct i2c_client *client = ts->client; -const struct zforce_ts_platdata *pdata =dev_get_platdata (&client->dev); +const struct zforce_ts_platdata *pdata = ts->pdata;int ret;u8 payload_buffer[512 ];u8 *payload;
Signature · 1 line
1.7.10.4
PATCH 3/3 Input: zforce: add devicetree support
In reply to Heiko StübnerThis makes the zforce driver usable on devicetree-based platforms too.
--- drivers/input/touchscreen/zforce_ts.c | 57 +++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-)
drivers/input/touchscreen/zforce_ts.c +55 -2
@@ -29,6 +29,8 @@#include <linux/sysfs.h> #include <linux/input/mt.h> #include <linux/platform_data/zforce_ts.h> +#include <linux/of.h> +#include <linux/of_gpio.h> #define WAIT_TIMEOUT msecs_to_jiffies(1000)
@@ -684,6 +686,45 @@ static void zforce_reset(void *data)gpio_set_value (ts->pdata->gpio_rst,0 ); } +static struct zforce_ts_platdata *zforce_parse_dt (struct device *dev) +{ +struct zforce_ts_platdata *pdata; +struct device_node *np = dev->of_node; + +if (!np) +return ERR_PTR (-ENOENT ); + + pdata =devm_kzalloc (dev,sizeof (*pdata),GFP_KERNEL ); +if (!pdata) { +dev_err (dev,"failed to allocate platform data\n" ); +return ERR_PTR (-ENOMEM ); + } + + pdata->gpio_int =of_get_gpio (np,0 ); +if (!gpio_is_valid (pdata->gpio_int)) { +dev_err (dev,"failed to get interrupt gpio\n" ); +return ERR_PTR (-EINVAL ); + } + + pdata->gpio_rst =of_get_gpio (np,1 ); +if (!gpio_is_valid (pdata->gpio_rst)) { +dev_err (dev,"failed to get reset gpio\n" ); +return ERR_PTR (-EINVAL ); + } + +if (of_property_read_u32 (np,"x-size" , &pdata->x_max)) { +dev_err (dev,"failed to get x-size property\n" ); +return ERR_PTR (-EINVAL ); + } + +if (of_property_read_u32 (np,"y-size" , &pdata->y_max)) { +dev_err (dev,"failed to get y-size property\n" ); +return ERR_PTR (-EINVAL ); + } + +return pdata; +} +static int zforce_probe (struct i2c_client *client,const struct i2c_device_id *id) {
@@ -692,8 +733,11 @@ static int zforce_probe(struct i2c_client *client,struct input_dev *input_dev;int ret; -if (!pdata) -return -EINVAL ; +if (!pdata) { + pdata =zforce_parse_dt (&client->dev); +if (IS_ERR (pdata)) +return PTR_ERR (pdata); + } ts =devm_kzalloc (&client->dev,sizeof (struct zforce_ts ),GFP_KERNEL );if (!ts)
@@ -829,11 +873,20 @@ static struct i2c_device_id zforce_idtable[] = { };MODULE_DEVICE_TABLE (i2c, zforce_idtable); +#ifdef CONFIG_OF +static struct of_device_id zforce_dt_idtable[] = { + { .compatible ="neonode,zforce" }, + {}, +}; +MODULE_DEVICE_TABLE (of, zforce_dt_idtable); +#endif +static struct i2c_driver zforce_driver = { .driver = { .owner =THIS_MODULE , .name ="zforce-ts" , .pm = &zforce_pm_ops, + .of_match_table =of_match_ptr (zforce_dt_idtable), }, .probe = zforce_probe, .id_table = zforce_idtable,
Signature · 1 line
1.7.10.4
Dmitry Torokhov
maintainerHi Heiko,
Quoted 8 lines · Heiko Stübner
This adds the binding documentation and necessary parsing code to make zforce based touchscreen usable on devicetree platforms.
Heiko Stuebner (3):
dt-bindings: bindings for zforce touchscreens
Input: zforce: Use internal pdata pointer instead ofdev_get_platdata
Input: zforce: add devicetree support
Quoted 6 lines
.../bindings/input/touchscreen/zforce_ts.txt | 30 ++++++++++ .../devicetree/bindings/vendor-prefixes.txt | 1 + drivers/input/touchscreen/zforce_ts.c | 63 ++++++++++++++++++-- 3 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txt
I applied the 2nd one and then folded parts of 1st into the 3rd, leaving changes to devicetree/bindings/vendor-prefixes.txt out. Please resubmit them to DT maintainers.
Thanks.
Signature · 5 lines
Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH 1/1 input: zforce: add regulator handling
In reply to Heiko StübnerFrom: Heiko Stuebner <[email protected]>
It's possible that the controller has an individually switchable power supply. Therefore add support to control a supplying regulator.
As this is not always the case, the regulator is requested as optional.
--- .../bindings/input/touchscreen/zforce_ts.txt | 4 +++ drivers/input/touchscreen/zforce_ts.c | 30 ++++++++++++++++++++++ 2 files changed, 34 insertions(+)
Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txt +4 -0
@@ -9,6 +9,9 @@ Required properties: - x-size: horizontal resolution of touchscreen - y-size: vertical resolution of touchscreen +Optional properties: +- vdd-supply: Regulator controlling the controller supply + Example: i2c@00000000 {
@@ -18,6 +21,7 @@ Example: compatible = "neonode,zforce"; reg = <0x50>; interrupts = <2 0>; + vdd-supply = <®_zforce_vdd>; gpios = <&gpio5 6 0>, /* INT */ <&gpio5 9 0>; /* RST */
drivers/input/touchscreen/zforce_ts.c +30 -0
@@ -29,6 +29,8 @@#include <linux/sysfs.h> #include <linux/input/mt.h> #include <linux/platform_data/zforce_ts.h> +#include <linux/regulator/consumer.h> +#include <linux/delay.h> #include <linux/of.h> #include <linux/of_gpio.h>
@@ -117,6 +119,8 @@ struct zforce_ts {const struct zforce_ts_platdata *pdata;char phys[32 ]; +struct regulator *reg_vdd; +bool suspending;bool suspended;bool boot_complete;
@@ -690,6 +694,11 @@ static void zforce_reset(void *data)struct zforce_ts *ts = data;gpio_set_value (ts->pdata->gpio_rst,0 ); + +udelay (10 ); + +if (!IS_ERR (ts->reg_vdd)) +regulator_disable (ts->reg_vdd); }static struct zforce_ts_platdata *zforce_parse_dt (struct device *dev)
@@ -765,10 +774,31 @@ static int zforce_probe(struct i2c_client *client,return ret; } + ts->reg_vdd =devm_regulator_get_optional (&client->dev,"vdd" ); +if (IS_ERR (ts->reg_vdd) &&PTR_ERR (ts->reg_vdd) == -EPROBE_DEFER ) +return PTR_ERR (ts->reg_vdd); + +if (!IS_ERR (ts->reg_vdd)) { + ret =regulator_enable (ts->reg_vdd); +if (ret) +return ret; + +/* +* according to datasheet add 100us grace time after regular +* regulator enable delay. +*/ +udelay (100 ); + } + ret =devm_add_action (&client->dev, zforce_reset, ts);if (ret) {dev_err (&client->dev,"failed to register reset action, %d\n" , ret); + +/* hereafter the regulator will be disabled by the action */ +if (!IS_ERR (ts->reg_vdd)) +regulator_disable (ts->reg_vdd); +return ret; }
Signature · 1 line
1.9.0
Re: [PATCH] input: zforce: add regulator handling
Hi Dmitry,
Am Dienstag, 22. April 2014, 21:19:57 schrieb Heiko Stübner:
Quoted 8 lines
From: Heiko Stuebner <[email protected]>
It's possible that the controller has an individually switchable power supply. Therefore add support to control a supplying regulator.
As this is not always the case, the regulator is requested as optional.
Signed-off-by Heiko Stuebner <[email protected]>
ping?
Thanks
Heiko
Quoted 84 lines
--- .../bindings/input/touchscreen/zforce_ts.txt | 4 +++ drivers/input/touchscreen/zforce_ts.c | 30++++++++++++++++++++++ 2 files changed, 34 insertions(+)
diff --git
a/Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txtb/Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txtindex 2faf1f1..80c37df 100644Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txt +4
-0@@ -9,6 +9,9 @@ Required properties: - x-size: horizontal resolution of touchscreen - y-size: vertical resolution of touchscreen +Optional properties: +- vdd-supply: Regulator controlling the controller supply + Example: i2c@00000000 {@@ -18,6 +21,7 @@ Example: compatible = "neonode,zforce"; reg = <0x50>; interrupts = <2 0>; + vdd-supply = <®_zforce_vdd>; gpios = <&gpio5 6 0>, /* INT */ <&gpio5 9 0>; /* RST */(quoted diff) +0
-0
b/drivers/input/touchscreen/zforce_ts.cindex 01d30ce..39ca962 100644drivers/input/touchscreen/zforce_ts.c +25
-0@@ -29,6 +29,8 @@#include <linux/sysfs.h> #include <linux/input/mt.h> #include <linux/platform_data/zforce_ts.h> +#include <linux/regulator/consumer.h> +#include <linux/delay.h> #include <linux/of.h> #include <linux/of_gpio.h> @@ -117,6 +119,8 @@ struct zforce_ts {const struct zforce_ts_platdata *pdata;char phys[32 ]; +struct regulator *reg_vdd; +bool suspending;bool suspended;bool boot_complete;@@ -690,6 +694,11 @@ static void zforce_reset(void *data)struct zforce_ts *ts = data;gpio_set_value (ts->pdata->gpio_rst,0 ); + +udelay (10 ); + +if (!IS_ERR (ts->reg_vdd)) +regulator_disable (ts->reg_vdd); }static struct zforce_ts_platdata *zforce_parse_dt (struct device *dev)@@ -765,10 +774,31 @@ static int zforce_probe(struct i2c_client *client,return ret; } + ts->reg_vdd =devm_regulator_get_optional (&client->dev,"vdd" ); +if (IS_ERR (ts->reg_vdd) &&PTR_ERR (ts->reg_vdd) == -EPROBE_DEFER ) +return PTR_ERR (ts->reg_vdd); + +if (!IS_ERR (ts->reg_vdd)) { + ret =regulator_enable (ts->reg_vdd); +if (ret) +return ret; + +/* +* according to datasheet add 100us grace time after regular +* regulator enable delay. +*/ +udelay (100 ); + } + ret =devm_add_action (&client->dev, zforce_reset, ts);
drivers/input/touchscreen/zforce_ts.c static int zforce_probe(struct i2c_client *client, · line 803
Quoted 10 lines
drivers/input/touchscreen/zforce_ts.c +5
-0if (ret) {dev_err (&client->dev,"failed to register reset action, %d\n" , ret); + +/* hereafter the regulator will be disabled by the action */ +if (!IS_ERR (ts->reg_vdd)) +regulator_disable (ts->reg_vdd); +return ret; }
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH RESEND 1/1 input: zforce: add regulator handling
In reply to Heiko StübnerFrom: Heiko Stuebner <[email protected]>
It's possible that the controller has an individually switchable power supply. Therefore add support to control a supplying regulator.
As this is not always the case, the regulator is requested as optional.
--- .../bindings/input/touchscreen/zforce_ts.txt | 4 +++ drivers/input/touchscreen/zforce_ts.c | 30 ++++++++++++++++++++++ 2 files changed, 34 insertions(+)
Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txt +4 -0
@@ -9,6 +9,9 @@ Required properties: - x-size: horizontal resolution of touchscreen - y-size: vertical resolution of touchscreen +Optional properties: +- vdd-supply: Regulator controlling the controller supply + Example: i2c@00000000 {
@@ -18,6 +21,7 @@ Example: compatible = "neonode,zforce"; reg = <0x50>; interrupts = <2 0>; + vdd-supply = <®_zforce_vdd>; gpios = <&gpio5 6 0>, /* INT */ <&gpio5 9 0>; /* RST */
drivers/input/touchscreen/zforce_ts.c +30 -0
@@ -29,6 +29,8 @@#include <linux/sysfs.h> #include <linux/input/mt.h> #include <linux/platform_data/zforce_ts.h> +#include <linux/regulator/consumer.h> +#include <linux/delay.h> #include <linux/of.h> #include <linux/of_gpio.h>
@@ -117,6 +119,8 @@ struct zforce_ts {const struct zforce_ts_platdata *pdata;char phys[32 ]; +struct regulator *reg_vdd; +bool suspending;bool suspended;bool boot_complete;
@@ -690,6 +694,11 @@ static void zforce_reset(void *data)struct zforce_ts *ts = data;gpio_set_value (ts->pdata->gpio_rst,0 ); + +udelay (10 ); + +if (!IS_ERR (ts->reg_vdd)) +regulator_disable (ts->reg_vdd); }static struct zforce_ts_platdata *zforce_parse_dt (struct device *dev)
@@ -765,10 +774,31 @@ static int zforce_probe(struct i2c_client *client,return ret; } + ts->reg_vdd =devm_regulator_get_optional (&client->dev,"vdd" ); +if (IS_ERR (ts->reg_vdd) &&PTR_ERR (ts->reg_vdd) == -EPROBE_DEFER ) +return PTR_ERR (ts->reg_vdd); + +if (!IS_ERR (ts->reg_vdd)) { + ret =regulator_enable (ts->reg_vdd); +if (ret) +return ret; + +/* +* according to datasheet add 100us grace time after regular +* regulator enable delay. +*/ +udelay (100 ); + } + ret =devm_add_action (&client->dev, zforce_reset, ts);if (ret) {dev_err (&client->dev,"failed to register reset action, %d\n" , ret); + +/* hereafter the regulator will be disabled by the action */ +if (!IS_ERR (ts->reg_vdd)) +regulator_disable (ts->reg_vdd); +return ret; }
Signature · 1 line
1.9.0
Dmitry Torokhov
maintainerRe: [PATCH RESEND] input: zforce: add regulator handling
Quoted 8 lines · Heiko Stübner
From: Heiko Stuebner <[email protected]>
It's possible that the controller has an individually switchable power supply. Therefore add support to control a supplying regulator.
As this is not always the case, the regulator is requested as optional.
Signed-off-by Heiko Stuebner <[email protected]>
Applied (with minimal edits to avoid repeated IS_ERR/PTR_ERR), thank you.
Quoted 96 lines
--- .../bindings/input/touchscreen/zforce_ts.txt | 4 +++ drivers/input/touchscreen/zforce_ts.c | 30 ++++++++++++++++++++++ 2 files changed, 34 insertions(+)Documentation/devicetree/bindings/input/touchscreen/zforce_ts.txt +4
-0@@ -9,6 +9,9 @@ Required properties: - x-size: horizontal resolution of touchscreen - y-size: vertical resolution of touchscreen +Optional properties: +- vdd-supply: Regulator controlling the controller supply + Example: i2c@00000000 {@@ -18,6 +21,7 @@ Example: compatible = "neonode,zforce"; reg = <0x50>; interrupts = <2 0>; + vdd-supply = <®_zforce_vdd>; gpios = <&gpio5 6 0>, /* INT */ <&gpio5 9 0>; /* RST */drivers/input/touchscreen/zforce_ts.c +30
-0@@ -29,6 +29,8 @@#include <linux/sysfs.h> #include <linux/input/mt.h> #include <linux/platform_data/zforce_ts.h> +#include <linux/regulator/consumer.h> +#include <linux/delay.h> #include <linux/of.h> #include <linux/of_gpio.h> @@ -117,6 +119,8 @@ struct zforce_ts {const struct zforce_ts_platdata *pdata;char phys[32 ]; +struct regulator *reg_vdd; +bool suspending;bool suspended;bool boot_complete;@@ -690,6 +694,11 @@ static void zforce_reset(void *data)struct zforce_ts *ts = data;gpio_set_value (ts->pdata->gpio_rst,0 ); + +udelay (10 ); + +if (!IS_ERR (ts->reg_vdd)) +regulator_disable (ts->reg_vdd); }static struct zforce_ts_platdata *zforce_parse_dt (struct device *dev)@@ -765,10 +774,31 @@ static int zforce_probe(struct i2c_client *client,return ret; } + ts->reg_vdd =devm_regulator_get_optional (&client->dev,"vdd" ); +if (IS_ERR (ts->reg_vdd) &&PTR_ERR (ts->reg_vdd) == -EPROBE_DEFER ) +return PTR_ERR (ts->reg_vdd); + +if (!IS_ERR (ts->reg_vdd)) { + ret =regulator_enable (ts->reg_vdd); +if (ret) +return ret; + +/* +* according to datasheet add 100us grace time after regular +* regulator enable delay. +*/ +udelay (100 ); + } + ret =devm_add_action (&client->dev, zforce_reset, ts);if (ret) {dev_err (&client->dev,"failed to register reset action, %d\n" , ret); + +/* hereafter the regulator will be disabled by the action */ +if (!IS_ERR (ts->reg_vdd)) +regulator_disable (ts->reg_vdd); +return ret; }Signature · 1 line
1.9.0
Signature · 5 lines
Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html