Merge branch 'master' of git://dev.doredevelopment.dk/oe-micro into org.openembedded.dev
[openembedded.git] / recipes / linux / linux-jlime-jornada7xx-2.6.17 / Newfile-Jornada720_ts.patch
1 --- linux-2.6.17-vanilla/drivers/input/touchscreen/jornada720_ts.c      1970-01-01 00:00:00.000000000 +0000
2 +++ linux-2.6.17/drivers/input/touchscreen/jornada720_ts.c      2006-07-10 17:06:11.000000000 +0000
3 @@ -0,0 +1,103 @@
4 +/*
5 + * Jornada 720 touchscreen interface based on Jornada 56x interface
6 + */
7
8 +#include <linux/input.h>
9 +#include <linux/module.h>
10 +#include <linux/kernel.h>
11 +#include <linux/init.h>
12 +#include <linux/delay.h>
13 +#include <linux/slab.h>
14 +#include <linux/errno.h>
15 +#include <linux/interrupt.h>
16 +
17 +#include <asm/arch/hardware.h>
18 +#include <asm/arch/jornada720.h>
19 +#include <asm/irq.h>
20 +#include <asm/mach/irq.h>
21 +
22 +MODULE_AUTHOR("Alex Lange <chicken@handhelds.org>");
23 +MODULE_DESCRIPTION("Jornada 720 touchscreen driver");
24 +MODULE_LICENSE("GPL");
25 +
26 +static char jornada720_ts_name[] = "Jornada 720 touchscreen";
27 +
28 +static struct input_dev *dev;
29 +
30 +static irqreturn_t jornada720_mouse_interrupt(int irq, void *dev_id, struct pt_regs *regs)
31 +{
32 +       int down;
33 +       int X[3], Y[3], high_x, high_y, x, y;
34 +       
35 +       udelay(1);
36 +       
37 +       down = ( (GPLR & GPIO_JORNADA720_MOUSE) == 0);
38 +       
39 +       if(!down) {
40 +               input_report_key(dev, BTN_TOUCH, down); /* report a pen up */
41 +               input_report_abs(dev, ABS_PRESSURE, 0);
42 +               input_sync(dev);
43 +               return IRQ_HANDLED;
44 +       }
45 +       
46 +       /* read x & y data from mcu interface and pass it on */
47 +       
48 +       jornada720_mcu_start(MCU_GetTouchSamples);
49 +       X[0] = jornada720_mcu_read();
50 +       X[1] = jornada720_mcu_read();
51 +       X[2] = jornada720_mcu_read();
52 +       Y[0] = jornada720_mcu_read();   
53 +       Y[1] = jornada720_mcu_read();
54 +       Y[2] = jornada720_mcu_read();
55 +       high_x = jornada720_mcu_read(); /* msbs of samples */
56 +       high_y = jornada720_mcu_read(); 
57 +       jornada720_mcu_end();
58 +       
59 +       X[0] |= (high_x & 3) << 8;
60 +       X[1] |= (high_x & 0xc) << 6;
61 +       X[2] |= (high_x & 0x30) << 4;
62 +
63 +       Y[0] |= (high_y & 3) << 8;
64 +       Y[1] |= (high_y & 0xc) << 6;
65 +       Y[2] |= (high_y & 0x30) << 4;
66 +
67 +        /* simple averaging filter */
68 +       x = (X[0] + X[1] + X[2])/3;
69 +       y = (Y[0] + Y[1] + Y[2])/3;
70 +       
71 +       input_report_key(dev, BTN_TOUCH, down);
72 +       input_report_abs(dev, ABS_X, x);
73 +       input_report_abs(dev, ABS_Y, y);
74 +       input_report_abs(dev, ABS_PRESSURE, 1);
75 +       input_sync(dev);
76 +       
77 +       return IRQ_HANDLED;
78 +       
79 +}
80 +
81 +static int __init jornada720_ts_init(void)
82 +{
83 +       printk("jornada720_ts: Jornada 720 touchscreen\n");
84 +       
85 +       dev = input_allocate_device();
86 +       dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
87 +       dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE);
88 +       dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
89 +       
90 +       dev->absmin[ABS_X] = 270; dev->absmin[ABS_Y] = 180;
91 +       dev->absmax[ABS_X] = 3900;  dev->absmax[ABS_Y] = 3700;
92 +       
93 +       dev->name = jornada720_ts_name;
94 +
95 +       if (request_irq(GPIO_JORNADA720_MOUSE_IRQ, jornada720_mouse_interrupt, SA_INTERRUPT, "Jornada720 Mouse", NULL))
96 +               printk("Unable to grab Jornada 720 touchscreen IRQ!\n");
97 +               
98 +       set_irq_type(GPIO_JORNADA720_MOUSE_IRQ, IRQT_RISING);
99 +       
100 +       input_register_device(dev);
101 +       
102 +       return 0;
103 +}
104 +
105 +module_init(jornada720_ts_init);
106 +