aboutsummaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/s3c2410_ts.c
diff options
context:
space:
mode:
authorAndy Green <andy@openmoko.com>2008-11-19 17:09:52 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:09:52 +0000
commit1ffbee7922d337215844b9e0b7607fc4202abe88 (patch)
tree1dcb3ede4248400bb0cbb8657d04cb0b313f0542 /drivers/input/touchscreen/s3c2410_ts.c
parent06978a2e455de33d8222fce251780437a8589bab (diff)
fix-touchscreen-meddling-divde.patch
Reported-by: Holger Freyther <zecke@openmoko.org> length can be zero... blowing a divide by zero exception... which somehow I don't get (?) Anyway the code is wrong and this should fix it. Signed-off-by: Andy Green <andy@openmoko.com>
Diffstat (limited to 'drivers/input/touchscreen/s3c2410_ts.c')
-rw-r--r--drivers/input/touchscreen/s3c2410_ts.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c
index b1ba73dcbfd..5bc347f3a8f 100644
--- a/drivers/input/touchscreen/s3c2410_ts.c
+++ b/drivers/input/touchscreen/s3c2410_ts.c
@@ -226,12 +226,18 @@ static irqreturn_t stylus_action(int irq, void *dev_id)
unsigned long x;
unsigned long y;
int length = (ts.head_raw_fifo - ts.tail_raw_fifo) & (ts.extent - 1);
- int scaled_avg_x = ts.raw_running_avg.x / length;
- int scaled_avg_y = ts.raw_running_avg.y / length;
+ int scaled_avg_x;
+ int scaled_avg_y;
x = readl(base_addr + S3C2410_ADCDAT0) & S3C2410_ADCDAT0_XPDATA_MASK;
y = readl(base_addr + S3C2410_ADCDAT1) & S3C2410_ADCDAT1_YPDATA_MASK;
+ if (!length)
+ goto store_sample;
+
+ scaled_avg_x = ts.raw_running_avg.x / length;
+ scaled_avg_y = ts.raw_running_avg.y / length;
+
/* we appear to accept every sample into both the running average FIFO
* and the summing average. BUT, if the last sample crossed a
* machine-set threshold, each time we do a beauty contest
@@ -280,7 +286,7 @@ static irqreturn_t stylus_action(int irq, void *dev_id)
else
ts.flag_previous_exceeded_threshold = 1;
- /* accepted */
+store_sample:
ts.xp += x;
ts.yp += y;
ts.count++;