#include <linux/async.h>
#include <mach/board.h>
+#ifdef CONFIG_HAS_EARLYSUSPEND
+#include <linux/earlysuspend.h>
+#endif
+
//#define DEBUG
#ifdef CONFIG_EETI_EGALAX_DEBUG
#define TS_DEBUG(fmt,args...) printk( KERN_DEBUG "[egalax_i2c]: " fmt, ## args)
#define EGALAX_IOCWAKEUP _IO(EGALAX_IOC_MAGIC, 1)
#define EGALAX_IOC_MAXNR 1
+#define EETI_EARLYSUSPEND_LEVEL 151
+
struct point_data {
short Status;
short X;
int irq;
};
+#ifdef CONFIG_HAS_EARLYSUSPEND
+struct suspend_info {
+ struct early_suspend early_suspend;
+ struct _egalax_i2c *egalax_i2c;
+};
+#endif
+
struct egalax_char_dev
{
int OpenCnts;
egalax_i2c->skip_packet = 0;
mutex_unlock(&egalax_i2c->mutex_wq);
-
- if( egalax_i2c->work_state > 0 )
- enable_irq(p_egalax_i2c_dev->irq);
+
+ enable_irq(p_egalax_i2c_dev->irq);
TS_DEBUG("egalax_i2c_wq leave\n");
}
i2c_master_normal_send(client, cmdbuf, MAX_I2C_LEN, EETI_I2C_RATE);
- egalax_i2c->work_state = 0;
disable_irq(p_egalax_i2c_dev->irq);
- cancel_work_sync(&egalax_i2c->work);
+ egalax_i2c->work_state = 0;
+ if (cancel_work_sync(&egalax_i2c->work)) {
+ /* if work was pending disable-count is now 2 */
+ pr_info("%s: work was pending\n", __func__);
+ enable_irq(p_egalax_i2c_dev->irq);
+ }
printk(KERN_DEBUG "[egalax_i2c]: device suspend done\n");
return 0;
}
+
+#ifdef CONFIG_HAS_EARLYSUSPEND
+
+static void egalax_i2c_early_suspend(struct early_suspend *h)
+{
+ pm_message_t mesg = {.event = 0};
+ struct suspend_info *info = container_of(h,struct suspend_info,early_suspend);
+ struct i2c_client *client = info->egalax_i2c->client;
+ egalax_i2c_suspend(client,mesg);
+
+}
+static void egalax_i2c_early_resume(struct early_suspend *h)
+{
+
+ struct suspend_info *info = container_of(h,struct suspend_info,early_suspend);
+ struct i2c_client *client = info->egalax_i2c->client;
+
+ egalax_i2c_resume(client);
+
+}
+
+#endif
+
+
+
#else
#define egalax_i2c_suspend NULL
#define egalax_i2c_resume NULL
#endif
+#ifdef CONFIG_HAS_EARLYSUSPEND
+static struct suspend_info suspend_info = {
+ .early_suspend.suspend = egalax_i2c_early_suspend,
+ .early_suspend.resume = egalax_i2c_early_resume,
+ .early_suspend.level = EETI_EARLYSUSPEND_LEVEL,
+};
+#endif
+
+
static int __devinit egalax_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
int ret;
device_init_wakeup(&client->dev, 0);
#endif
+#ifdef CONFIG_HAS_EARLYSUSPEND
+
+
+ suspend_info.egalax_i2c = p_egalax_i2c_dev;
+ register_early_suspend(&suspend_info.early_suspend);
+#endif
+
printk(KERN_DEBUG "[egalax_i2c]: probe done\n");
return 0;
.id_table = egalax_i2c_idtable,
.probe = egalax_i2c_probe,
.remove = __devexit_p(egalax_i2c_remove),
- .suspend = egalax_i2c_suspend,
- .resume = egalax_i2c_resume,
+ //.suspend = egalax_i2c_suspend,
+ //.resume = egalax_i2c_resume,
};
static const struct file_operations egalax_cdev_fops = {