1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
diff -Nur linux-2.6.24.vanilla/drivers/mfd/ucb1x00-ts.c linux-2.6.24/drivers/mfd/ucb1x00-ts.c
--- linux-2.6.24.vanilla/drivers/mfd/ucb1x00-ts.c 2008-01-24 23:58:37.000000000 +0100
+++ linux-2.6.24/drivers/mfd/ucb1x00-ts.c 2008-02-20 21:21:51.000000000 +0100
@@ -16,6 +16,10 @@
* It is important to note that the signal connected to the ADCSYNC
* pin should provide pulses even when the LCD is blanked, otherwise
* a pen touch needed to unblank the LCD will never be read.
+ *
+ * mrdata: -added some accuracy improvement based on thesings collie patch
+ * -added suspend fix
+ *
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
@@ -104,6 +108,8 @@
UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND |
UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA);
+ udelay(55);
+
return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPY, ts->adcsync);
}
}
@@ -130,7 +136,7 @@
UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW |
UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA);
- udelay(55);
+ udelay(165);
return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPY, ts->adcsync);
}
@@ -158,7 +164,7 @@
UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW |
UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA);
- udelay(55);
+ udelay(165);
return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPX, ts->adcsync);
}
@@ -216,13 +222,17 @@
signed long timeout;
ts->restart = 0;
-
+
ucb1x00_adc_enable(ts->ucb);
x = ucb1x00_ts_read_xpos(ts);
+ ucb1x00_adc_disable(ts->ucb);
+ ucb1x00_adc_enable(ts->ucb);
y = ucb1x00_ts_read_ypos(ts);
+ ucb1x00_adc_disable(ts->ucb);
+ ucb1x00_adc_enable(ts->ucb);
p = ucb1x00_ts_read_pressure(ts);
-
+
/*
* Switch back to interrupt mode.
*/
@@ -231,15 +241,19 @@
msleep(10);
+ if ((x < 60) || (y < 60)) {
+ p = 0;
+ }
+
ucb1x00_enable(ts->ucb);
-
if (ucb1x00_ts_pen_down(ts)) {
+
set_task_state(tsk, TASK_INTERRUPTIBLE);
ucb1x00_enable_irq(ts->ucb, UCB_IRQ_TSPX, machine_is_collie() ? UCB_RISING : UCB_FALLING);
ucb1x00_disable(ts->ucb);
-
+
/*
* If we spat out a valid sample set last time,
* spit out a "pen off" sample here.
@@ -250,7 +264,9 @@
}
timeout = MAX_SCHEDULE_TIMEOUT;
+
} else {
+
ucb1x00_disable(ts->ucb);
/*
@@ -269,6 +285,14 @@
try_to_freeze();
+ /*
+ * While suspend the ktsd-thread goes sleep -> try_to_freeze()
+ * While resume the ktsd-thread do wakup and must rune one time
+ * again to do a clean re-setup -> enable_irq: UCB_IRQ_TSPX
+ */
+ if(ts->restart)
+ timeout = HZ / 100;
+
schedule_timeout(timeout);
}
@@ -351,8 +375,12 @@
* TS interrupt mode is set up again
* after sleep.
*/
+
ts->restart = 1;
wake_up(&ts->irq_wait);
+
+ printk(KERN_INFO "ucb1x00-ts.c -> ucb1x00_ts_resume() ktsd - restart *DONE*\n");
+
}
return 0;
}
|