aboutsummaryrefslogtreecommitdiff
path: root/drivers/staging
diff options
context:
space:
mode:
authorNaveen Kumar Gaddipati <naveen.gaddipati@stericsson.com>2010-11-23 11:41:55 +0530
committerSundar Iyer <sundar.iyer@stericsson.com>2010-11-29 16:47:38 +0530
commit2720db4070eeb1bb41d35ffbdcc8821163585d02 (patch)
tree195480a0f6e9476fb012cdded545a0dfa24dac82 /drivers/staging
parent8ed907b5f187ebe30f3be43f8caecc94438c6af8 (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.c33
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 = {