fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / input / touchscreen / corgi_ts.c
index 1042987..e294558 100644 (file)
@@ -17,7 +17,7 @@
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/slab.h>
-#include <asm/irq.h>
+#include <linux/irq.h>
 
 #include <asm/arch/sharpsl.h>
 #include <asm/arch/hardware.h>
@@ -173,30 +173,31 @@ static int read_xydata(struct corgi_ts *corgi_ts)
        return 1;
 }
 
-static void new_data(struct corgi_ts *corgi_ts, struct pt_regs *regs)
+static void new_data(struct corgi_ts *corgi_ts)
 {
+       struct input_dev *dev = corgi_ts->input;
+
        if (corgi_ts->power_mode != PWR_MODE_ACTIVE)
                return;
 
        if (!corgi_ts->tc.pressure && corgi_ts->pendown == 0)
                return;
 
-       input_regs(corgi_ts->input, regs);
-       input_report_abs(corgi_ts->input, ABS_X, corgi_ts->tc.x);
-       input_report_abs(corgi_ts->input, ABS_Y, corgi_ts->tc.y);
-       input_report_abs(corgi_ts->input, ABS_PRESSURE, corgi_ts->tc.pressure);
-       input_report_key(corgi_ts->input, BTN_TOUCH, (corgi_ts->pendown != 0));
-       input_sync(corgi_ts->input);
+       input_report_abs(dev, ABS_X, corgi_ts->tc.x);
+       input_report_abs(dev, ABS_Y, corgi_ts->tc.y);
+       input_report_abs(dev, ABS_PRESSURE, corgi_ts->tc.pressure);
+       input_report_key(dev, BTN_TOUCH, corgi_ts->pendown);
+       input_sync(dev);
 }
 
-static void ts_interrupt_main(struct corgi_ts *corgi_ts, int isTimer, struct pt_regs *regs)
+static void ts_interrupt_main(struct corgi_ts *corgi_ts, int isTimer)
 {
        if ((GPLR(IRQ_TO_GPIO(corgi_ts->irq_gpio)) & GPIO_bit(IRQ_TO_GPIO(corgi_ts->irq_gpio))) == 0) {
                /* Disable Interrupt */
                set_irq_type(corgi_ts->irq_gpio, IRQT_NOEDGE);
                if (read_xydata(corgi_ts)) {
                        corgi_ts->pendown = 1;
-                       new_data(corgi_ts, regs);
+                       new_data(corgi_ts);
                }
                mod_timer(&corgi_ts->timer, jiffies + HZ / 100);
        } else {
@@ -208,7 +209,7 @@ static void ts_interrupt_main(struct corgi_ts *corgi_ts, int isTimer, struct pt_
 
                if (corgi_ts->pendown) {
                        corgi_ts->tc.pressure = 0;
-                       new_data(corgi_ts, regs);
+                       new_data(corgi_ts);
                }
 
                /* Enable Falling Edge */
@@ -220,13 +221,15 @@ static void ts_interrupt_main(struct corgi_ts *corgi_ts, int isTimer, struct pt_
 static void corgi_ts_timer(unsigned long data)
 {
        struct corgi_ts *corgits_data = (struct corgi_ts *) data;
-       ts_interrupt_main(corgits_data, 1, NULL);
+
+       ts_interrupt_main(corgits_data, 1);
 }
 
-static irqreturn_t ts_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t ts_interrupt(int irq, void *dev_id)
 {
        struct corgi_ts *corgits_data = dev_id;
-       ts_interrupt_main(corgits_data, 0, regs);
+
+       ts_interrupt_main(corgits_data, 0);
        return IRQ_HANDLED;
 }
 
@@ -238,7 +241,7 @@ static int corgits_suspend(struct platform_device *dev, pm_message_t state)
        if (corgi_ts->pendown) {
                del_timer_sync(&corgi_ts->timer);
                corgi_ts->tc.pressure = 0;
-               new_data(corgi_ts, NULL);
+               new_data(corgi_ts);
                corgi_ts->pendown = 0;
        }
        corgi_ts->power_mode = PWR_MODE_SUSPEND;
@@ -273,7 +276,7 @@ static int __init corgits_probe(struct platform_device *pdev)
        corgi_ts = kzalloc(sizeof(struct corgi_ts), GFP_KERNEL);
        input_dev = input_allocate_device();
        if (!corgi_ts || !input_dev)
-               goto fail;
+               goto fail1;
 
        platform_set_drvdata(pdev, corgi_ts);
 
@@ -282,7 +285,7 @@ static int __init corgits_probe(struct platform_device *pdev)
 
        if (corgi_ts->irq_gpio < 0) {
                err = -ENODEV;
-               goto fail;
+               goto fail1;
        }
 
        corgi_ts->input = input_dev;
@@ -318,12 +321,14 @@ static int __init corgits_probe(struct platform_device *pdev)
        corgi_ssp_ads7846_putget((5u << ADSCTRL_ADR_SH) | ADSCTRL_STS);
        mdelay(5);
 
-       if (request_irq(corgi_ts->irq_gpio, ts_interrupt, SA_INTERRUPT, "ts", corgi_ts)) {
+       if (request_irq(corgi_ts->irq_gpio, ts_interrupt, IRQF_DISABLED, "ts", corgi_ts)) {
                err = -EBUSY;
-               goto fail;
+               goto fail1;
        }
 
-       input_register_device(corgi_ts->input);
+       err = input_register_device(corgi_ts->input);
+       if (err)
+               goto fail2;
 
        corgi_ts->power_mode = PWR_MODE_ACTIVE;
 
@@ -332,17 +337,17 @@ static int __init corgits_probe(struct platform_device *pdev)
 
        return 0;
 
- fail: input_free_device(input_dev);
+ fail2:        free_irq(corgi_ts->irq_gpio, corgi_ts);
+ fail1:        input_free_device(input_dev);
        kfree(corgi_ts);
        return err;
-
 }
 
 static int corgits_remove(struct platform_device *pdev)
 {
        struct corgi_ts *corgi_ts = platform_get_drvdata(pdev);
 
-       free_irq(corgi_ts->irq_gpio, NULL);
+       free_irq(corgi_ts->irq_gpio, corgi_ts);
        del_timer_sync(&corgi_ts->timer);
        corgi_ts->machinfo->put_hsync();
        input_unregister_device(corgi_ts->input);