summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/atmel_mxt_ts.c
diff options
context:
space:
mode:
authorNick Dyer <nick.dyer@itdev.co.uk>2011-10-07 15:15:52 +0100
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 12:37:41 -0700
commitfd7821dfb3cfc87e67fd0ee91c796dbf79c79cc5 (patch)
tree014799703ce2932ae39f53fe1391fe42cd85e47a /drivers/input/touchscreen/atmel_mxt_ts.c
parent2a7404ed94117dd094937b3210763ef1477d6a34 (diff)
Input: atmel_mxt_ts - Add early suspend support
Signed-off-by: Nick Dyer <nick.dyer@itdev.co.uk> Rebase-Id: Re4e790d2029278f3e1cb1f0d92dd5c957ddf5ddb
Diffstat (limited to 'drivers/input/touchscreen/atmel_mxt_ts.c')
-rw-r--r--drivers/input/touchscreen/atmel_mxt_ts.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index e4cb77fbcc75..555fc6057285 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -21,6 +21,9 @@
#include <linux/input/mt.h>
#include <linux/interrupt.h>
#include <linux/slab.h>
+#ifdef CONFIG_HAS_EARLYSUSPEND
+#include <linux/earlysuspend.h>
+#endif
/* Version */
#define MXT_VER_20 20
@@ -231,6 +234,11 @@ struct mxt_info {
u8 object_num;
};
+#ifdef CONFIG_HAS_EARLYSUSPEND
+static void mxt_early_suspend(struct early_suspend *es);
+static void mxt_late_resume(struct early_suspend *es);
+#endif
+
struct mxt_object {
u8 type;
u16 start_address;
@@ -279,6 +287,9 @@ struct mxt_data {
u8 idle_cycle_time;
u8 is_stopped;
u8 max_reportid;
+#ifdef CONFIG_HAS_EARLYSUSPEND
+ struct early_suspend early_suspend;
+#endif
};
/* I2C slave address pairs */
@@ -1784,6 +1795,13 @@ static int mxt_probe(struct i2c_client *client,
goto err_free_object;
}
+#ifdef CONFIG_HAS_EARLYSUSPEND
+ data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
+ data->early_suspend.suspend = mxt_early_suspend;
+ data->early_suspend.resume = mxt_late_resume;
+ register_early_suspend(&data->early_suspend);
+#endif
+
if (data->state == APPMODE) {
error = mxt_make_highchg(data);
if (error)
@@ -1843,6 +1861,10 @@ static int mxt_remove(struct i2c_client *client)
sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);
free_irq(data->irq, data);
input_unregister_device(data->input_dev);
+#ifdef CONFIG_HAS_EARLYSUSPEND
+ unregister_early_suspend(&data->early_suspend);
+#endif
+
kfree(data->object_table);
kfree(data);
@@ -1881,6 +1903,27 @@ static int mxt_resume(struct device *dev)
return 0;
}
+
+#ifdef CONFIG_HAS_EARLYSUSPEND
+static void mxt_early_suspend(struct early_suspend *es)
+{
+ struct mxt_data *mxt;
+ mxt = container_of(es, struct mxt_data, early_suspend);
+
+ if (mxt_suspend(&mxt->client->dev) != 0)
+ dev_err(&mxt->client->dev, "%s: failed\n", __func__);
+}
+
+static void mxt_late_resume(struct early_suspend *es)
+{
+ struct mxt_data *mxt;
+ mxt = container_of(es, struct mxt_data, early_suspend);
+
+ if (mxt_resume(&mxt->client->dev) != 0)
+ dev_err(&mxt->client->dev, "%s: failed\n", __func__);
+}
+#endif
+
#endif
static SIMPLE_DEV_PM_OPS(mxt_pm_ops, mxt_suspend, mxt_resume);