diff options
author | Naveen Kumar Gaddipati <naveen.gaddipati@stericsson.com> | 2010-11-23 11:41:55 +0530 |
---|---|---|
committer | Sundar Iyer <sundar.iyer@stericsson.com> | 2010-11-29 16:47:38 +0530 |
commit | 2720db4070eeb1bb41d35ffbdcc8821163585d02 (patch) | |
tree | 195480a0f6e9476fb012cdded545a0dfa24dac82 /drivers/staging | |
parent | 8ed907b5f187ebe30f3be43f8caecc94438c6af8 (diff) |
staging:Removed i2c errors during resume of Synaptics RMI4 touchpad
Removed i2c errors during resume of Synaptics RMI4 touchpad due to
decrease in delay of i2c transfers.
ST-Ericsson Id: ER 280566
Change-Id: I4dc6930fc6f5721f10fe60091968aa0a2ac5e5be
Signed-off-by: Naveen Kumar Gaddipati <naveen.gaddipati@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/9212
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/ste_rmi4/synaptics_i2c_rmi4.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.c b/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.c index 5f4300edd4a..df258321022 100644 --- a/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.c +++ b/drivers/staging/ste_rmi4/synaptics_i2c_rmi4.c @@ -5,7 +5,7 @@ * * Author: Js HA <js.ha@stericsson.com> for ST-Ericsson * Author: Naveen Kumar G <naveen.gaddipati@stericsson.com> for ST-Ericsson - * Copyright 2010 (c) ST-Ericsson AB + * Copyright 2010 (c) ST-Ericsson SA */ /* * This file is licensed under the GPL2 license. @@ -27,6 +27,7 @@ #include <linux/input.h> #include <linux/slab.h> +#include <linux/delay.h> #include <linux/i2c.h> #include <linux/interrupt.h> #include <linux/regulator/consumer.h> @@ -45,6 +46,7 @@ #define BUF_LEN 37 #define QUERY_LEN 9 #define DATA_LEN 12 +#define RESUME_DELAY 100 /* msecs */ #define HAS_TAP 0x01 #define HAS_PALMDETECT 0x01 #define HAS_ROTATE 0x02 @@ -165,6 +167,7 @@ struct synaptics_rmi4_device_info { * @wait: wait queue structure variable * @touch_stopped: flag to stop the thread function * @enable: flag to enable/disable the driver event. + * @resume_wq_handler: work queue for resume the device * * This structure gives the device data information. */ @@ -186,6 +189,7 @@ struct synaptics_rmi4_data { wait_queue_head_t wait; bool touch_stopped; bool enable; + struct work_struct resume_wq_handler; }; /** @@ -308,6 +312,7 @@ static int synaptics_rmi4_enable(struct synaptics_rmi4_data *pdata) enable_irq(pdata->board->irq_number); pdata->touch_stopped = false; + msleep(RESUME_DELAY); retval = synaptics_rmi4_i2c_block_read(pdata, pdata->fn01_data_base_addr + 1, &intr_status, @@ -1009,6 +1014,24 @@ static int synaptics_rmi4_i2c_query_device(struct synaptics_rmi4_data *pdata) } /** + * synaptics_rmi4_resume_handler() - work queue for resume handler + * @work:work_struct structure pointer + * + * This work queue handler used to resume the device and returns none + */ +static void synaptics_rmi4_resume_handler(struct work_struct *work) +{ + struct synaptics_rmi4_data *prmi4_data = container_of(work, + struct synaptics_rmi4_data, resume_wq_handler); + struct i2c_client *client = prmi4_data->i2c_client; + int retval; + + retval = synaptics_rmi4_enable(prmi4_data); + if (retval < 0) + dev_err(&client->dev, "%s: resume failed\n", __func__); +} + +/** * synaptics_rmi4_probe() - Initialze the i2c-client touchscreen driver * @i2c: i2c client structure pointer * @id:i2c device id pointer @@ -1137,6 +1160,8 @@ static int __devinit synaptics_rmi4_probe goto err_request_irq; } + INIT_WORK(&rmi4_data->resume_wq_handler, synaptics_rmi4_resume_handler); + /* sysfs implementation for dynamic enable/disable the input event */ retval = sysfs_create_group(&client->dev.kobj, &synaptics_rmi4_attr_group); @@ -1148,6 +1173,7 @@ static int __devinit synaptics_rmi4_probe return retval; err_sysfs: + cancel_work_sync(&rmi4_data->resume_wq_handler); err_request_irq: free_irq(platformdata->irq_number, rmi4_data); input_unregister_device(rmi4_data->input_dev); @@ -1181,6 +1207,7 @@ static int __devexit synaptics_rmi4_remove(struct i2c_client *client) sysfs_remove_group(&client->dev.kobj, &synaptics_rmi4_attr_group); rmi4_data->touch_stopped = true; wake_up(&rmi4_data->wait); + cancel_work_sync(&rmi4_data->resume_wq_handler); free_irq(pdata->irq_number, rmi4_data); input_unregister_device(rmi4_data->input_dev); if (pdata->regulator_en) { @@ -1219,7 +1246,9 @@ static int synaptics_rmi4_resume(struct device *dev) { struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev); - return synaptics_rmi4_enable(rmi4_data); + schedule_work(&rmi4_data->resume_wq_handler); + + return 0; } static const struct dev_pm_ops synaptics_rmi4_dev_pm_ops = { |