diff options
| -rw-r--r-- | Documentation/devicetree/bindings/input/touchscreen/sitronix-st1232.txt | 24 | ||||
| -rw-r--r-- | drivers/input/touchscreen/st1232.c | 47 | ||||
| -rw-r--r-- | include/linux/platform_data/st1232_pdata.h | 13 | 
3 files changed, 80 insertions, 4 deletions
diff --git a/Documentation/devicetree/bindings/input/touchscreen/sitronix-st1232.txt b/Documentation/devicetree/bindings/input/touchscreen/sitronix-st1232.txt new file mode 100644 index 00000000000..64ad48b824a --- /dev/null +++ b/Documentation/devicetree/bindings/input/touchscreen/sitronix-st1232.txt @@ -0,0 +1,24 @@ +* Sitronix st1232 touchscreen controller + +Required properties: +- compatible: must be "sitronix,st1232" +- reg: I2C address of the chip +- interrupts: interrupt to which the chip is connected + +Optional properties: +- gpios: a phandle to the reset GPIO + +Example: + +	i2c@00000000 { +		/* ... */ + +		touchscreen@55 { +			compatible = "sitronix,st1232"; +			reg = <0x55>; +			interrupts = <2 0>; +			gpios = <&gpio1 166 0>; +		}; + +		/* ... */ +	}; diff --git a/drivers/input/touchscreen/st1232.c b/drivers/input/touchscreen/st1232.c index 75d8eb5ee60..1740a249637 100644 --- a/drivers/input/touchscreen/st1232.c +++ b/drivers/input/touchscreen/st1232.c @@ -19,13 +19,16 @@   */  #include <linux/delay.h> +#include <linux/gpio.h>  #include <linux/i2c.h>  #include <linux/input.h>  #include <linux/interrupt.h>  #include <linux/module.h> +#include <linux/of_gpio.h>  #include <linux/pm_qos.h>  #include <linux/slab.h>  #include <linux/types.h> +#include <linux/platform_data/st1232_pdata.h>  #define ST1232_TS_NAME	"st1232-ts" @@ -48,6 +51,7 @@ struct st1232_ts_data {  	struct input_dev *input_dev;  	struct st1232_ts_finger finger[MAX_FINGERS];  	struct dev_pm_qos_request low_latency_req; +	int reset_gpio;  };  static int st1232_ts_read_data(struct st1232_ts_data *ts) @@ -139,10 +143,17 @@ end:  	return IRQ_HANDLED;  } +static void st1232_ts_power(struct st1232_ts_data *ts, bool poweron) +{ +	if (gpio_is_valid(ts->reset_gpio)) +		gpio_direction_output(ts->reset_gpio, poweron); +} +  static int st1232_ts_probe(struct i2c_client *client,  					const struct i2c_device_id *id)  {  	struct st1232_ts_data *ts; +	struct st1232_pdata *pdata = client->dev.platform_data;  	struct input_dev *input_dev;  	int error; @@ -167,6 +178,25 @@ static int st1232_ts_probe(struct i2c_client *client,  	ts->client = client;  	ts->input_dev = input_dev; +	if (pdata) +		ts->reset_gpio = pdata->reset_gpio; +	else if (client->dev.of_node) +		ts->reset_gpio = of_get_gpio(client->dev.of_node, 0); +	else +		ts->reset_gpio = -ENODEV; + +	if (gpio_is_valid(ts->reset_gpio)) { +		error = devm_gpio_request(&client->dev, ts->reset_gpio, NULL); +		if (error) { +			dev_err(&client->dev, +				"Unable to request GPIO pin %d.\n", +				ts->reset_gpio); +				return error; +		} +	} + +	st1232_ts_power(ts, true); +  	input_dev->name = "st1232-touchscreen";  	input_dev->id.bustype = BUS_I2C;  	input_dev->dev.parent = &client->dev; @@ -203,7 +233,10 @@ static int st1232_ts_probe(struct i2c_client *client,  static int st1232_ts_remove(struct i2c_client *client)  { +	struct st1232_ts_data *ts = i2c_get_clientdata(client); +  	device_init_wakeup(&client->dev, 0); +	st1232_ts_power(ts, false);  	return 0;  } @@ -212,11 +245,14 @@ static int st1232_ts_remove(struct i2c_client *client)  static int st1232_ts_suspend(struct device *dev)  {  	struct i2c_client *client = to_i2c_client(dev); +	struct st1232_ts_data *ts = i2c_get_clientdata(client); -	if (device_may_wakeup(&client->dev)) +	if (device_may_wakeup(&client->dev)) {  		enable_irq_wake(client->irq); -	else +	} else {  		disable_irq(client->irq); +		st1232_ts_power(ts, false); +	}  	return 0;  } @@ -224,11 +260,14 @@ static int st1232_ts_suspend(struct device *dev)  static int st1232_ts_resume(struct device *dev)  {  	struct i2c_client *client = to_i2c_client(dev); +	struct st1232_ts_data *ts = i2c_get_clientdata(client); -	if (device_may_wakeup(&client->dev)) +	if (device_may_wakeup(&client->dev)) {  		disable_irq_wake(client->irq); -	else +	} else { +		st1232_ts_power(ts, true);  		enable_irq(client->irq); +	}  	return 0;  } diff --git a/include/linux/platform_data/st1232_pdata.h b/include/linux/platform_data/st1232_pdata.h new file mode 100644 index 00000000000..cac3e7b4c45 --- /dev/null +++ b/include/linux/platform_data/st1232_pdata.h @@ -0,0 +1,13 @@ +#ifndef _LINUX_ST1232_PDATA_H +#define _LINUX_ST1232_PDATA_H + +/* + * Optional platform data + * + * Use this if you want the driver to drive the reset pin. + */ +struct st1232_pdata { +	int reset_gpio; +}; + +#endif  |