struct work_struct work;
struct workqueue_struct *wq;
struct gsl_ts_data *dd;
+ int flag_irq_is_disable;
+ spinlock_t irq_lock;
u8 *touch_data;
u8 device_id;
int irq;
}
#endif
+void glsx680_ts_irq_disable(struct gsl_ts *ts)
+{
+ unsigned long irqflags;
+
+ spin_lock_irqsave(&ts->irq_lock, irqflags);
+ if (!ts->flag_irq_is_disable) {
+ disable_irq_nosync(ts->client->irq);
+ ts->flag_irq_is_disable = 1;
+ }
+ spin_unlock_irqrestore(&ts->irq_lock, irqflags);
+}
+
+void glsx680_ts_irq_enable(struct gsl_ts *ts)
+{
+ unsigned long irqflags = 0;
+
+ spin_lock_irqsave(&ts->irq_lock, irqflags);
+ if (ts->flag_irq_is_disable) {
+ enable_irq(ts->client->irq);
+ ts->flag_irq_is_disable = 0;
+ }
+ spin_unlock_irqrestore(&ts->irq_lock, irqflags);
+}
+
static void gslX680_ts_worker(struct work_struct *work)
{
int rc, i;
i2c_lock_flag = 0;
i2c_lock_schedule:
#endif
- enable_irq(ts->client->irq);
+ glsx680_ts_irq_enable(ts);
}
struct gsl_ts *ts = (struct gsl_ts *)dev_id;
//print_info("========gslX680 Interrupt=========\n");
- disable_irq_nosync(ts->client->irq);
+ glsx680_ts_irq_disable(ts);
if (!work_pending(&ts->work)) {
queue_work(ts->wq, &ts->work);
cancel_delayed_work_sync(&ts->gsl_monitor_work);
#endif
- disable_irq_nosync(ts->client->irq);
+ glsx680_ts_irq_disable(ts);
+ cancel_work_sync(&ts->work);
#ifdef SLEEP_CLEAR_POINT
msleep(10);
printk("gsl_ts_resume () : queue gsl_monitor_work\n");
queue_delayed_work(gsl_monitor_workqueue, &ts->gsl_monitor_work, 300);
#endif
- disable_irq_nosync(ts->client->irq);
- enable_irq(ts->client->irq);
+ glsx680_ts_irq_enable(ts);
return 0;
}
cancel_delayed_work_sync(&ts->gsl_monitor_work);
#endif
- disable_irq_nosync(ts->client->irq);
+ glsx680_ts_irq_disable(ts);
+ cancel_work_sync(&ts->work);
#ifdef SLEEP_CLEAR_POINT
msleep(10);
printk("gsl_ts_resume () : queue gsl_monitor_work\n");
queue_delayed_work(gsl_monitor_workqueue, &ts->gsl_monitor_work, 300);
#endif
- disable_irq_nosync(ts->client->irq);
- enable_irq(ts->client->irq);
+ glsx680_ts_irq_enable(ts);
}
#endif
//printk("##################### probe [2]chip_type=%c .\n",chip_type);
init_chip(ts->client, ts);
check_mem_data(ts->client, ts);
-
+ spin_lock_init(&ts->irq_lock);
client->irq = gpio_to_irq(ts->irq);
rc = request_irq(client->irq, gsl_ts_irq, IRQF_TRIGGER_RISING,
client->name, ts);