diff options
| -rw-r--r-- | drivers/input/touchscreen/it7258_ts_i2c.c | 111 |
1 files changed, 65 insertions, 46 deletions
diff --git a/drivers/input/touchscreen/it7258_ts_i2c.c b/drivers/input/touchscreen/it7258_ts_i2c.c index 5ab1a6d8f9b0..011980ce2024 100644 --- a/drivers/input/touchscreen/it7258_ts_i2c.c +++ b/drivers/input/touchscreen/it7258_ts_i2c.c @@ -166,6 +166,12 @@ static int IT7260_ts_suspend(struct device *dev); static struct IT7260_ts_data *gl_ts; +/* Function declarations */ +static int fb_notifier_callback(struct notifier_block *self, + unsigned long event, void *data); +static int IT7260_ts_resume(struct device *dev); +static int IT7260_ts_suspend(struct device *dev); + static int IT7260_debug_suspend_set(void *_data, u64 val) { if (val) @@ -857,25 +863,16 @@ static int IT7260_ts_probe(struct i2c_client *client, uint8_t rsp[2]; int ret = -1; u32 temp_val; - int rc; struct dentry *temp; if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { dev_err(&client->dev, "need I2C_FUNC_I2C\n"); - ret = -ENODEV; - goto err_out; + return -ENODEV; } - if (!client->irq) { - dev_err(&client->dev, "need IRQ\n"); - ret = -ENODEV; - goto err_out; - } - gl_ts = kzalloc(sizeof(*gl_ts), GFP_KERNEL); - if (!gl_ts) { - ret = -ENOMEM; - goto err_out; - } + gl_ts = devm_kzalloc(&client->dev, sizeof(*gl_ts), GFP_KERNEL); + if (!gl_ts) + return -ENOMEM; gl_ts->client = client; i2c_set_clientdata(client, gl_ts); @@ -887,8 +884,9 @@ static int IT7260_ts_probe(struct i2c_client *client, pdata = devm_kzalloc(&client->dev, sizeof(*pdata), GFP_KERNEL); if (!pdata) return -ENOMEM; - } else + } else { pdata = client->dev.platform_data; + } if (!pdata) return -ENOMEM; @@ -901,12 +899,12 @@ static int IT7260_ts_probe(struct i2c_client *client, "Regulator get failed vdd\n"); gl_ts->vdd = NULL; } else { - rc = regulator_set_voltage(gl_ts->vdd, + ret = regulator_set_voltage(gl_ts->vdd, IT_VTG_MIN_UV, IT_VTG_MAX_UV); - if (rc) { + if (ret) { dev_err(&client->dev, - "Regulator set_vtg failed vdd %d\n", rc); - return rc; + "Regulator set_vtg failed vdd %d\n", ret); + return ret; } } @@ -916,30 +914,30 @@ static int IT7260_ts_probe(struct i2c_client *client, "Regulator get failed avdd\n"); gl_ts->avdd = NULL; } else { - rc = regulator_set_voltage(gl_ts->avdd, IT_I2C_VTG_MIN_UV, + ret = regulator_set_voltage(gl_ts->avdd, IT_I2C_VTG_MIN_UV, IT_I2C_VTG_MAX_UV); - if (rc) { + if (ret) { dev_err(&client->dev, - "Regulator get failed avdd %d\n", rc); - return rc; + "Regulator get failed avdd %d\n", ret); + return ret; } } if (gl_ts->vdd) { - rc = regulator_enable(gl_ts->vdd); - if (rc) { - dev_err(&client->dev, - "Regulator vdd enable failed rc=%d\n", rc); - return rc; + ret = regulator_enable(gl_ts->vdd); + if (ret) { + dev_err(&gl_ts->client->dev, + "Regulator vdd enable failed ret=%d\n", ret); + return ret; } } if (gl_ts->avdd) { - rc = regulator_enable(gl_ts->avdd); - if (rc) { - dev_err(&client->dev, - "Regulator avdd enable failed rc=%d\n", rc); - return rc; + ret = regulator_enable(gl_ts->avdd); + if (ret) { + dev_err(&gl_ts->client->dev, + "Regulator avdd enable failed ret=%d\n", ret); + return ret; } } @@ -979,27 +977,27 @@ static int IT7260_ts_probe(struct i2c_client *client, pdata->palm_detect_en = of_property_read_bool(client->dev.of_node, "ite,palm-detect-en"); if (pdata->palm_detect_en) { - rc = of_property_read_u32(client->dev.of_node, + ret = of_property_read_u32(client->dev.of_node, "ite,palm-detect-keycode", &temp_val); - if (!rc) { + if (!ret) { pdata->palm_detect_keycode = temp_val; } else { dev_err(&client->dev, "Unable to read palm-detect-keycode\n"); - return rc; + return ret; } } if (!IT7260_chipIdentify()) { dev_err(&client->dev, "Failed to identify chip!!!"); - goto err_ident_fail_or_input_alloc; + goto err_identification_fail; } gl_ts->input_dev = input_allocate_device(); if (!gl_ts->input_dev) { dev_err(&client->dev, "failed to allocate input device\n"); ret = -ENOMEM; - goto err_ident_fail_or_input_alloc; + goto err_input_alloc; } gl_ts->input_dev->name = DEVICE_NAME; @@ -1041,7 +1039,7 @@ static int IT7260_ts_probe(struct i2c_client *client, if (sysfs_create_group(&(client->dev.kobj), &it7260_attr_group)) { dev_err(&client->dev, "failed to register sysfs #2\n"); - goto err_sysfs_grp_create_2; + goto err_sysfs_grp_create; } #if defined(CONFIG_FB) @@ -1050,7 +1048,7 @@ static int IT7260_ts_probe(struct i2c_client *client, ret = fb_register_client(&gl_ts->fb_notif); if (ret) dev_err(&client->dev, "Unable to register fb_notifier: %d\n", - ret); + ret); #endif IT7260_i2cWriteNoReadyCheck(BUF_COMMAND, cmd_start, sizeof(cmd_start)); @@ -1061,7 +1059,7 @@ static int IT7260_ts_probe(struct i2c_client *client, gl_ts->dir = debugfs_create_dir(DEBUGFS_DIR_NAME, NULL); if (gl_ts->dir == NULL || IS_ERR(gl_ts->dir)) { dev_err(&client->dev, - "%s: Failed to create debugfs directory, rc = %ld\n", + "%s: Failed to create debugfs directory, ret = %ld\n", __func__, PTR_ERR(gl_ts->dir)); ret = PTR_ERR(gl_ts->dir); goto err_create_debugfs_dir; @@ -1071,7 +1069,7 @@ static int IT7260_ts_probe(struct i2c_client *client, gl_ts, &debug_suspend_fops); if (temp == NULL || IS_ERR(temp)) { dev_err(&client->dev, - "%s: Failed to create suspend debugfs file, rc = %ld\n", + "%s: Failed to create suspend debugfs file, ret = %ld\n", __func__, PTR_ERR(temp)); ret = PTR_ERR(temp); goto err_create_debugfs_file; @@ -1088,12 +1086,11 @@ err_create_debugfs_dir: #endif sysfs_remove_group(&(client->dev.kobj), &it7260_attr_group); -err_sysfs_grp_create_2: +err_sysfs_grp_create: free_irq(client->irq, gl_ts); err_irq_reg: input_unregister_device(gl_ts->input_dev); - gl_ts->input_dev = NULL; err_input_register: if (pdata->wakeup) { @@ -1102,11 +1099,20 @@ err_input_register: } if (gl_ts->input_dev) input_free_device(gl_ts->input_dev); + gl_ts->input_dev = NULL; -err_ident_fail_or_input_alloc: - kfree(gl_ts); +err_input_alloc: +err_identification_fail: + if (gpio_is_valid(pdata->reset_gpio)) + gpio_free(pdata->reset_gpio); + if (gpio_is_valid(pdata->irq_gpio)) + gpio_free(pdata->irq_gpio); + + regulator_disable(gl_ts->vdd); + regulator_disable(gl_ts->avdd); + regulator_put(gl_ts->vdd); + regulator_put(gl_ts->avdd); -err_out: return ret; } @@ -1118,10 +1124,23 @@ static int IT7260_ts_remove(struct i2c_client *client) dev_err(&client->dev, "Error occurred while unregistering fb_notifier.\n"); #endif sysfs_remove_group(&(client->dev.kobj), &it7260_attr_group); + free_irq(client->irq, gl_ts); + input_unregister_device(gl_ts->input_dev); + if (gl_ts->input_dev) + input_free_device(gl_ts->input_dev); + gl_ts->input_dev = NULL; if (gl_ts->pdata->wakeup) { cancel_work_sync(&gl_ts->work_pm_relax); device_init_wakeup(&client->dev, false); } + if (gpio_is_valid(gl_ts->pdata->reset_gpio)) + gpio_free(gl_ts->pdata->reset_gpio); + if (gpio_is_valid(gl_ts->pdata->irq_gpio)) + gpio_free(gl_ts->pdata->irq_gpio); + regulator_disable(gl_ts->vdd); + regulator_disable(gl_ts->avdd); + regulator_put(gl_ts->vdd); + regulator_put(gl_ts->avdd); return 0; } |
