When I added the FIFO improving the interrupts handlers I introduced a bug.
The FIFO is allocated after the interrupts are requested. This makes the kernel
crash if the touchscreen generates activity before the allocation takes place.
This patch fixes the bug. I reproduced it and tested the fix in a GTA02.

- Fix bug
- Fix a typo

Reported-by: Andy Green Andy Green <[EMAIL PROTECTED]>
Signed-off-by: Nelson Castillo <[EMAIL PROTECTED]>
---

 0 files changed, 0 insertions(+), 0 deletions(-)

diff --git a/drivers/input/touchscreen/s3c2410_ts.c 
b/drivers/input/touchscreen/s3c2410_ts.c
index 8e6bc0a..4159ada 100644
--- a/drivers/input/touchscreen/s3c2410_ts.c
+++ b/drivers/input/touchscreen/s3c2410_ts.c
@@ -427,6 +427,11 @@ static int __init s3c2410ts_probe(struct platform_device 
*pdev)
        ts.dev->id.product = 0xBEEF;
        ts.dev->id.version = S3C2410TSVERSION;
        ts.state = TS_STATE_STANDBY;
+       ts.event_fifo = kfifo_alloc(TS_EVENT_FIFO_SIZE, GFP_KERNEL, NULL);
+       if (IS_ERR(ts.event_fifo)) {
+               ret = -EIO;
+               goto bail2;
+       }
 
        /* create the filter chain set up for the 2 coordinates we produce */
        ret = ts_filter_create_chain(
@@ -459,26 +464,17 @@ static int __init s3c2410ts_probe(struct platform_device 
*pdev)
                goto bail4;
        }
 
-       ts.event_fifo = kfifo_alloc(TS_EVENT_FIFO_SIZE, GFP_KERNEL, NULL);
-
-       if (IS_ERR(ts.event_fifo)) {
-               ret = -EIO;
-               goto bail5;
-       }
-
        dev_info(&pdev->dev, "successfully loaded\n");
 
        /* All went ok, so register to the input system */
        rc = input_register_device(ts.dev);
        if (rc) {
                ret = -EIO;
-               goto bail6;
+               goto bail5;
        }
 
        return 0;
 
-bail6:
-       kfifo_free(ts.event_fifo);
 bail5:
        free_irq(IRQ_TC, ts.dev);
        free_irq(IRQ_ADC, ts.dev);
@@ -489,7 +485,8 @@ bail4:
        disable_irq(IRQ_ADC);
 bail3:
        ts_filter_destroy_chain(ts.tsf);
-
+       kfifo_free(ts.event_fifo);
+bail2:
        input_unregister_device(ts.dev);
 bail1:
        iounmap(base_addr);
diff --git a/include/linux/ts_filter.h b/include/linux/ts_filter.h
index bfb8a22..715f1ba 100644
--- a/include/linux/ts_filter.h
+++ b/include/linux/ts_filter.h
@@ -8,7 +8,7 @@
  */
 
 #define MAX_TS_FILTER_CHAIN            4  /* max filters you can chain up */
-#define MAX_TS_FILTER_COORDS           3  /* Y, Y and Z (pressure) */
+#define MAX_TS_FILTER_COORDS           3  /* X, Y and Z (pressure) */
 
 struct ts_filter;
 


Reply via email to