Index: linux-2.6.24/drivers/input/touchscreen/s3c2410_ts.c
===================================================================
--- linux-2.6.24.orig/drivers/input/touchscreen/s3c2410_ts.c	2008-02-16 13:36:59.000000000 +0100
+++ linux-2.6.24/drivers/input/touchscreen/s3c2410_ts.c	2008-02-16 15:21:47.000000000 +0100
@@ -104,98 +104,65 @@
 	s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);
 }
 
-static void touch_timer_fire(unsigned long data)
-{
-  	unsigned long data0;
-  	unsigned long data1;
-	int updown;
-
-  	data0 = readl(base_addr+S3C2410_ADCDAT0);
-  	data1 = readl(base_addr+S3C2410_ADCDAT1);
-
- 	updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));
-
- 	if (updown) {
- 		if (ts.count != 0) {
- 			ts.xp >>= ts.shift;
- 			ts.yp >>= ts.shift;
-
-#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
- 			{
- 				struct timeval tv;
- 				do_gettimeofday(&tv);
- 				printk(DEBUG_LVL "T: %06d, X: %03ld, Y: %03ld\n", (int)tv.tv_usec, ts.xp, ts.yp);
- 			}
-#endif
-
- 			input_report_abs(ts.dev, ABS_X, ts.xp);
- 			input_report_abs(ts.dev, ABS_Y, ts.yp);
-
- 			input_report_key(ts.dev, BTN_TOUCH, 1);
- 			input_report_abs(ts.dev, ABS_PRESSURE, 1);
- 			input_sync(ts.dev);
- 		}
-
- 		ts.xp = 0;
- 		ts.yp = 0;
- 		ts.count = 0;
-
- 		writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);
- 		writel(readl(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);
- 	} else {
- 		ts.count = 0;
-
- 		input_report_key(ts.dev, BTN_TOUCH, 0);
- 		input_report_abs(ts.dev, ABS_PRESSURE, 0);
- 		input_sync(ts.dev);
-
- 		writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
- 	}
-}
-
-static struct timer_list touch_timer =
-		TIMER_INITIALIZER(touch_timer_fire, 0, 0);
-
-static irqreturn_t stylus_updown(int irq, void *dev_id)
+static irqreturn_t stylus_action(int irq, void *dev_id)
 {
 	unsigned long data0;
 	unsigned long data1;
-	int updown;
+	int down;
 
 	data0 = readl(base_addr+S3C2410_ADCDAT0);
 	data1 = readl(base_addr+S3C2410_ADCDAT1);
 
-	updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));
-
-	/* TODO we should never get an interrupt with updown set while
-	 * the timer is running, but maybe we ought to verify that the
-	 * timer isn't running anyways. */
+	down = (data0 & S3C2410_ADCDAT0_XPDATA_MASK) < 940; //(!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));
 
-	if (updown)
-		touch_timer_fire(0);
+	if(down) {
+		ts.xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;
+		ts.yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;
+		ts.count++;
+
+		if(ts.count == (1<<ts.shift)) {
+			//printk("ts.xp=%d, ts.yp=%d\n", ts.xp, ts.yp);
+			input_report_abs(ts.dev, ABS_X, ts.xp>>ts.shift);
+			input_report_abs(ts.dev, ABS_Y, ts.yp>>ts.shift);
+
+			input_report_key(ts.dev, BTN_TOUCH, 1);
+			input_report_abs(ts.dev, ABS_PRESSURE, 1);
+			input_sync(ts.dev);
+			ts.count = 0;
+			ts.xp = 0;
+			ts.yp = 0;
+		}
+		writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);
+		writel(readl(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);
+	} else {
+		writel(WAIT4INT(1), base_addr+S3C2410_ADCTSC);
+		input_report_key(ts.dev, BTN_TOUCH, 0);
+		input_report_abs(ts.dev, ABS_PRESSURE, 0);
+		input_sync(ts.dev);
+	}
 
 	return IRQ_HANDLED;
 }
 
-
-static irqreturn_t stylus_action(int irq, void *dev_id)
+static irqreturn_t stylus_updown(int irq, void *dev_id)
 {
 	unsigned long data0;
 	unsigned long data1;
+	int down;
 
 	data0 = readl(base_addr+S3C2410_ADCDAT0);
 	data1 = readl(base_addr+S3C2410_ADCDAT1);
 
-	ts.xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;
-	ts.yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;
-	ts.count++;
+	down = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));
 
-        if (ts.count < (1<<ts.shift)) {
+	if(down) {
+		ts.xp = 0;
+		ts.yp = 0;
+		ts.count = 0;
 		writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, base_addr+S3C2410_ADCTSC);
 		writel(readl(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);
 	} else {
-		mod_timer(&touch_timer, jiffies+1);
-		writel(WAIT4INT(1), base_addr+S3C2410_ADCTSC);
+		writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
 	}
 
 	return IRQ_HANDLED;

