|
@@ -44,7 +44,6 @@
|
|
|
#include <linux/interrupt.h>
|
|
|
#include <linux/irq.h>
|
|
|
#include <linux/slab.h>
|
|
|
-#include <linux/workqueue.h>
|
|
|
#include <linux/spi/spi.h>
|
|
|
#include <linux/i2c.h>
|
|
|
#include <linux/gpio.h>
|
|
@@ -131,13 +130,12 @@ typedef struct i2c_client bus_device;
|
|
|
struct ad7879 {
|
|
|
bus_device *bus;
|
|
|
struct input_dev *input;
|
|
|
- struct work_struct work;
|
|
|
struct timer_list timer;
|
|
|
#ifdef CONFIG_GPIOLIB
|
|
|
struct gpio_chip gc;
|
|
|
#endif
|
|
|
struct mutex mutex;
|
|
|
- unsigned disabled:1; /* P: mutex */
|
|
|
+ bool disabled; /* P: mutex */
|
|
|
|
|
|
#if defined(CONFIG_TOUCHSCREEN_AD7879_SPI) || defined(CONFIG_TOUCHSCREEN_AD7879_SPI_MODULE)
|
|
|
struct spi_message msg;
|
|
@@ -196,16 +194,6 @@ static void ad7879_report(struct ad7879 *ts)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void ad7879_work(struct work_struct *work)
|
|
|
-{
|
|
|
- struct ad7879 *ts = container_of(work, struct ad7879, work);
|
|
|
-
|
|
|
- /* use keventd context to read the result registers */
|
|
|
- ad7879_collect(ts);
|
|
|
- ad7879_report(ts);
|
|
|
- mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT);
|
|
|
-}
|
|
|
-
|
|
|
static void ad7879_ts_event_release(struct ad7879 *ts)
|
|
|
{
|
|
|
struct input_dev *input_dev = ts->input;
|
|
@@ -225,13 +213,10 @@ static irqreturn_t ad7879_irq(int irq, void *handle)
|
|
|
{
|
|
|
struct ad7879 *ts = handle;
|
|
|
|
|
|
- /* The repeated conversion sequencer controlled by TMR kicked off too fast.
|
|
|
- * We ignore the last and process the sample sequence currently in the queue.
|
|
|
- * It can't be older than 9.4ms
|
|
|
- */
|
|
|
+ ad7879_collect(ts);
|
|
|
+ ad7879_report(ts);
|
|
|
|
|
|
- if (!work_pending(&ts->work))
|
|
|
- schedule_work(&ts->work);
|
|
|
+ mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT);
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
@@ -249,11 +234,9 @@ static void ad7879_disable(struct ad7879 *ts)
|
|
|
|
|
|
if (!ts->disabled) {
|
|
|
|
|
|
- ts->disabled = 1;
|
|
|
+ ts->disabled = true;
|
|
|
disable_irq(ts->bus->irq);
|
|
|
|
|
|
- cancel_work_sync(&ts->work);
|
|
|
-
|
|
|
if (del_timer_sync(&ts->timer))
|
|
|
ad7879_ts_event_release(ts);
|
|
|
|
|
@@ -270,7 +253,7 @@ static void ad7879_enable(struct ad7879 *ts)
|
|
|
|
|
|
if (ts->disabled) {
|
|
|
ad7879_setup(ts);
|
|
|
- ts->disabled = 0;
|
|
|
+ ts->disabled = false;
|
|
|
enable_irq(ts->bus->irq);
|
|
|
}
|
|
|
|
|
@@ -458,7 +441,6 @@ static int __devinit ad7879_construct(bus_device *bus, struct ad7879 *ts)
|
|
|
ts->input = input_dev;
|
|
|
|
|
|
setup_timer(&ts->timer, ad7879_timer, (unsigned long) ts);
|
|
|
- INIT_WORK(&ts->work, ad7879_work);
|
|
|
mutex_init(&ts->mutex);
|
|
|
|
|
|
ts->x_plate_ohms = pdata->x_plate_ohms ? : 400;
|
|
@@ -526,9 +508,9 @@ static int __devinit ad7879_construct(bus_device *bus, struct ad7879 *ts)
|
|
|
|
|
|
ad7879_setup(ts);
|
|
|
|
|
|
- err = request_irq(bus->irq, ad7879_irq,
|
|
|
- IRQF_TRIGGER_FALLING, bus->dev.driver->name, ts);
|
|
|
-
|
|
|
+ err = request_threaded_irq(bus->irq, NULL, ad7879_irq,
|
|
|
+ IRQF_TRIGGER_FALLING,
|
|
|
+ bus->dev.driver->name, ts);
|
|
|
if (err) {
|
|
|
dev_err(&bus->dev, "irq %d busy?\n", bus->irq);
|
|
|
goto err_free_mem;
|