summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCliff Brake <cbrake@bec-systems.com>2006-11-13 19:07:14 +0000
committerCliff Brake <cbrake@bec-systems.com>2006-11-13 19:07:14 +0000
commit38d9e8aff1967820b22faeea83610c3c359f7705 (patch)
tree3d744d209b5df959dd82ea1eb31fbbe7819826e0
parent1c9e8b7ced097812f43cdd5782023464cef09ed8 (diff)
logicpd-pxa270-2.6.17: touchscreen load/unload fix (Shane Volpe)
fix for problem where touch is required to load/unload the driver
-rw-r--r--packages/linux/logicpd-pxa270-2.6.17-rc5/ucb1400-touchscreen.patch53
1 files changed, 43 insertions, 10 deletions
diff --git a/packages/linux/logicpd-pxa270-2.6.17-rc5/ucb1400-touchscreen.patch b/packages/linux/logicpd-pxa270-2.6.17-rc5/ucb1400-touchscreen.patch
index d995426f6f..ba04d46176 100644
--- a/packages/linux/logicpd-pxa270-2.6.17-rc5/ucb1400-touchscreen.patch
+++ b/packages/linux/logicpd-pxa270-2.6.17-rc5/ucb1400-touchscreen.patch
@@ -375,7 +375,7 @@ Index: linux-2.6.17-rc5/drivers/mfd/ucb1x00-ts.c
#include "ucb1x00.h"
-@@ -45,7 +43,7 @@ struct ucb1x00_ts {
+@@ -45,13 +43,14 @@ struct ucb1x00_ts {
struct input_dev *idev;
struct ucb1x00 *ucb;
@@ -384,7 +384,14 @@ Index: linux-2.6.17-rc5/drivers/mfd/ucb1x00-ts.c
struct task_struct *rtask;
u16 x_res;
u16 y_res;
-@@ -205,7 +203,6 @@ static int ucb1x00_thread(void *_ts)
+
+ unsigned int restart:1;
+ unsigned int adcsync:1;
++ unsigned int go_thread;
+ };
+
+ static int adcsync;
+@@ -205,7 +204,6 @@ static int ucb1x00_thread(void *_ts)
{
struct ucb1x00_ts *ts = _ts;
struct task_struct *tsk = current;
@@ -392,18 +399,19 @@ Index: linux-2.6.17-rc5/drivers/mfd/ucb1x00-ts.c
int valid;
/*
-@@ -217,10 +214,8 @@ static int ucb1x00_thread(void *_ts)
+@@ -217,10 +215,8 @@ static int ucb1x00_thread(void *_ts)
valid = 0;
- add_wait_queue(&ts->irq_wait, &wait);
- while (!kthread_should_stop()) {
+- while (!kthread_should_stop()) {
++ while (!kthread_should_stop() && ts->go_thread) {
unsigned int x, y, p;
- signed long timeout;
ts->restart = 0;
-@@ -242,8 +237,6 @@ static int ucb1x00_thread(void *_ts)
+@@ -242,8 +238,6 @@ static int ucb1x00_thread(void *_ts)
if (ucb1x00_ts_pen_down(ts)) {
@@ -412,7 +420,7 @@ Index: linux-2.6.17-rc5/drivers/mfd/ucb1x00-ts.c
ucb1x00_enable_irq(ts->ucb, UCB_IRQ_TSPX, machine_is_collie() ? UCB_RISING : UCB_FALLING);
ucb1x00_disable(ts->ucb);
-@@ -256,7 +249,15 @@ static int ucb1x00_thread(void *_ts)
+@@ -256,7 +250,16 @@ static int ucb1x00_thread(void *_ts)
valid = 0;
}
@@ -426,10 +434,11 @@ Index: linux-2.6.17-rc5/drivers/mfd/ucb1x00-ts.c
+ * the issue.
+ */
+ wait_for_completion_interruptible(&ts->irq_wait);
++
} else {
ucb1x00_disable(ts->ucb);
-@@ -271,16 +272,12 @@ static int ucb1x00_thread(void *_ts)
+@@ -271,16 +274,12 @@ static int ucb1x00_thread(void *_ts)
}
set_task_state(tsk, TASK_INTERRUPTIBLE);
@@ -447,7 +456,7 @@ Index: linux-2.6.17-rc5/drivers/mfd/ucb1x00-ts.c
ts->rtask = NULL;
return 0;
}
-@@ -293,7 +290,7 @@ static void ucb1x00_ts_irq(int idx, void
+@@ -293,7 +292,7 @@ static void ucb1x00_ts_irq(int idx, void
{
struct ucb1x00_ts *ts = id;
ucb1x00_disable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_FALLING);
@@ -456,7 +465,7 @@ Index: linux-2.6.17-rc5/drivers/mfd/ucb1x00-ts.c
}
static int ucb1x00_ts_open(struct input_dev *idev)
-@@ -303,7 +300,7 @@ static int ucb1x00_ts_open(struct input_
+@@ -303,7 +302,7 @@ static int ucb1x00_ts_open(struct input_
BUG_ON(ts->rtask);
@@ -465,7 +474,31 @@ Index: linux-2.6.17-rc5/drivers/mfd/ucb1x00-ts.c
ret = ucb1x00_hook_irq(ts->ucb, UCB_IRQ_TSPX, ucb1x00_ts_irq, ts);
if (ret < 0)
goto out;
-@@ -358,7 +355,7 @@ static int ucb1x00_ts_resume(struct ucb1
+@@ -318,6 +317,8 @@ static int ucb1x00_ts_open(struct input_
+ ucb1x00_adc_disable(ts->ucb);
+
+ ts->rtask = kthread_run(ucb1x00_thread, ts, "ktsd");
++ ts->go_thread = 1; //start thread!
++
+ if (!IS_ERR(ts->rtask)) {
+ ret = 0;
+ } else {
+@@ -337,9 +338,14 @@ static void ucb1x00_ts_close(struct inpu
+ {
+ struct ucb1x00_ts *ts = idev->private;
+
++
++ ts->go_thread = 0; //Stop thread!
++ complete(&ts->irq_wait);
++
+ if (ts->rtask)
+ kthread_stop(ts->rtask);
+
++
+ ucb1x00_enable(ts->ucb);
+ ucb1x00_free_irq(ts->ucb, UCB_IRQ_TSPX, ts);
+ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, 0);
+@@ -358,7 +364,7 @@ static int ucb1x00_ts_resume(struct ucb1
* after sleep.
*/
ts->restart = 1;