summaryrefslogtreecommitdiff
path: root/drivers/input
diff options
context:
space:
mode:
authorAbinaya P <abinayap@codeaurora.org>2015-05-07 16:12:24 +0530
committerAbinaya P <abinayap@codeaurora.org>2016-07-28 11:31:53 +0530
commit70dede533eb3d6864d10df6308c0a0df41e78d76 (patch)
tree4fc0f5d6914dbd2b30c8e54f0cba28f44ce9c24b /drivers/input
parent8702ef5194e88005aeac06026abd29b3873bc2b8 (diff)
input: it7258_ts_i2c: add DT parsing support for touch driver
Add device tree support for ITE Tech touch controller driver. Change-Id: I2671b7c30b0f2ed1d7ad788f29b7f900a2a1cdcc Signed-off-by: Shantanu Jain <shjain@codeaurora.org> Signed-off-by: Abinaya P <abinayap@codeaurora.org>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/touchscreen/it7258_ts_i2c.c110
1 files changed, 106 insertions, 4 deletions
diff --git a/drivers/input/touchscreen/it7258_ts_i2c.c b/drivers/input/touchscreen/it7258_ts_i2c.c
index 773ece9eb1d4..edd0b049f097 100644
--- a/drivers/input/touchscreen/it7258_ts_i2c.c
+++ b/drivers/input/touchscreen/it7258_ts_i2c.c
@@ -22,7 +22,8 @@
#include <linux/firmware.h>
#include <linux/gpio.h>
#include <linux/slab.h>
-#include <linux/wakelock.h>
+#include <linux/regulator/consumer.h>
+#include <linux/of_gpio.h>
#define MAX_BUFFER_SIZE 144
#define DEVICE_NAME "IT7260"
@@ -128,9 +129,25 @@ struct PointData {
#define FD_PRESSURE_HIGH 0x08
#define FD_PRESSURE_HEAVY 0x0F
+#define IT_VTG_MIN_UV 1800000
+#define IT_VTG_MAX_UV 1800000
+#define IT_I2C_VTG_MIN_UV 2600000
+#define IT_I2C_VTG_MAX_UV 3300000
+
+struct IT7260_ts_platform_data {
+ u32 irqflags;
+ u32 irq_gpio;
+ u32 irq_gpio_flags;
+ u32 reset_gpio;
+ u32 reset_gpio_flags;
+};
+
struct IT7260_ts_data {
struct i2c_client *client;
struct input_dev *input_dev;
+ const struct IT7260_ts_platform_data *pdata;
+ struct regulator *vdd;
+ struct regulator *avdd;
};
static int8_t fwUploadResult;
@@ -782,9 +799,10 @@ static int IT7260_ts_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
static const uint8_t cmdStart[] = {CMD_UNKNOWN_7};
- struct IT7260_i2c_platform_data *pdata;
+ struct IT7260_ts_platform_data *pdata;
uint8_t rsp[2];
int ret = -1;
+ int rc;
if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
LOGE("need I2C_FUNC_I2C\n");
@@ -805,13 +823,97 @@ static int IT7260_ts_probe(struct i2c_client *client,
gl_ts->client = client;
i2c_set_clientdata(client, gl_ts);
- pdata = client->dev.platform_data;
+ if (client->dev.platform_data == NULL)
+ return -ENODEV;
+
+ if (client->dev.of_node) {
+ pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL);
+ if (!pdata)
+ return -ENOMEM;
+ } else
+ pdata = client->dev.platform_data;
+
+ if (!pdata)
+ return -ENOMEM;
+
+ gl_ts->pdata = pdata;
if (sysfs_create_group(&(client->dev.kobj), &it7260_attrstatus_group)) {
dev_err(&client->dev, "failed to register sysfs #1\n");
goto err_sysfs_grp_create_1;
}
+ gl_ts->vdd = regulator_get(&gl_ts->client->dev, "vdd");
+ if (IS_ERR(gl_ts->vdd)) {
+ dev_err(&gl_ts->client->dev,
+ "Regulator get failed vdd\n");
+ gl_ts->vdd = NULL;
+ } else {
+ rc = regulator_set_voltage(gl_ts->vdd,
+ IT_VTG_MIN_UV, IT_VTG_MAX_UV);
+ if (rc)
+ dev_err(&gl_ts->client->dev,
+ "Regulator set_vtg failed vdd\n");
+ }
+
+ gl_ts->avdd = regulator_get(&gl_ts->client->dev, "avdd");
+ if (IS_ERR(gl_ts->avdd)) {
+ dev_err(&gl_ts->client->dev,
+ "Regulator get failed avdd\n");
+ gl_ts->avdd = NULL;
+ } else {
+ rc = regulator_set_voltage(gl_ts->avdd, IT_I2C_VTG_MIN_UV,
+ IT_I2C_VTG_MAX_UV);
+ if (rc)
+ dev_err(&gl_ts->client->dev,
+ "Regulator get failed avdd\n");
+ }
+
+ if (gl_ts->vdd) {
+ rc = regulator_enable(gl_ts->vdd);
+ if (rc) {
+ dev_err(&gl_ts->client->dev,
+ "Regulator vdd enable failed rc=%d\n", rc);
+ return rc;
+ }
+ }
+
+ if (gl_ts->avdd) {
+ rc = regulator_enable(gl_ts->avdd);
+ if (rc) {
+ dev_err(&gl_ts->client->dev,
+ "Regulator avdd enable failed rc=%d\n", rc);
+ return rc;
+ }
+ }
+
+ /* reset gpio info */
+ pdata->reset_gpio = of_get_named_gpio_flags(client->dev.of_node,
+ "ite,reset-gpio", 0,
+ &pdata->reset_gpio_flags);
+ if (gpio_is_valid(pdata->reset_gpio)) {
+ if (gpio_request(pdata->reset_gpio, "ite_reset_gpio"))
+ dev_err(&gl_ts->client->dev,
+ "gpio_request failed for reset GPIO\n");
+ if (gpio_direction_output(pdata->reset_gpio, 0))
+ dev_err(&gl_ts->client->dev,
+ "gpio_direction_output for reset GPIO\n");
+ dev_dbg(&gl_ts->client->dev, "Reset GPIO %d\n",
+ pdata->reset_gpio);
+ } else {
+ return pdata->reset_gpio;
+ }
+
+ /* irq gpio info */
+ pdata->irq_gpio = of_get_named_gpio_flags(client->dev.of_node,
+ "ite,irq-gpio", 0, &pdata->irq_gpio_flags);
+ if (gpio_is_valid(pdata->irq_gpio)) {
+ dev_dbg(&gl_ts->client->dev, "IRQ GPIO %d, IRQ # %d\n",
+ pdata->irq_gpio, gpio_to_irq(pdata->irq_gpio));
+ } else {
+ return pdata->irq_gpio;
+ }
+
if (!chipIdentifyIT7260()) {
LOGI("chipIdentifyIT7260 FAIL");
goto err_ident_fail_or_input_alloc;
@@ -901,7 +1003,7 @@ static const struct i2c_device_id IT7260_ts_id[] = {
MODULE_DEVICE_TABLE(i2c, IT7260_ts_id);
static const struct of_device_id IT7260_match_table[] = {
- { .compatible = "ITE,IT7260_ts",},
+ { .compatible = "ite,it7260_ts",},
{},
};