summaryrefslogtreecommitdiff
path: root/packages/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/tosa_ts.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/tosa_ts.patch')
-rw-r--r--packages/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/tosa_ts.patch207
1 files changed, 207 insertions, 0 deletions
diff --git a/packages/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/tosa_ts.patch b/packages/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/tosa_ts.patch
new file mode 100644
index 0000000000..678cb2e25b
--- /dev/null
+++ b/packages/linux/openzaurus-pxa27x-2.4.20-rmk2-embedix20050602/tosa_ts.patch
@@ -0,0 +1,207 @@
+
+#
+# Patch managed by http://www.holgerschurig.de/patcher.html
+#
+
+--- linux/drivers/char/tosa_ts.c~tosa_ts.patch
++++ linux/drivers/char/tosa_ts.c
+@@ -102,6 +102,8 @@
+ static int head = 0, tail = 0;
+
+ #ifdef CONFIG_PM
++#include <linux/pm.h>
++static struct pm_dev* tosa_ts_pm_dev;
+ static int tp_suspend = 0;
+ #endif /* CONFIG_PM */
+
+@@ -495,25 +497,6 @@
+ ioctl: ts_ioctl,
+ };
+
+-static void ts_exit(void)
+-{
+- ts_timer_clear();
+- ts_clear();
+- free_irq(IRQ_GPIO_TP_INT, NULL);
+- wm9712_power_mode_ts(WM9712_PWR_OFF);
+-
+- pxa_ac97_put(&ac97_on);
+-}
+-
+-#ifdef MODULE
+-static void __exit ac97_ts_cleanup(void)
+-{
+- ts_exit();
+- unregister_chrdev(TS_MAJOR, "ts");
+-}
+-module_exit(ac97_ts_cleanup);
+-#endif /* MODULE */
+-
+ extern int tc6393fb_lcdMode;
+
+ int ac97_ad_input(int ch, unsigned short *dat)
+@@ -608,7 +591,7 @@
+ #endif
+ }
+
+-static int ts_init(void)
++static int tosa_ts_hardware_start(void)
+ {
+ pxa_ac97_get(&codec, &ac97_on);
+
+@@ -625,7 +608,6 @@
+ /* GPIO3/PENDOWN wakeup */
+ ac97_bit_set(AC97_GPIO_WAKE_UP, CODEC_PENDOWN);
+
+- ts_clear();
+
+ /* Init queue */
+ //X kernel_thread(ts_pendown, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD);
+@@ -639,12 +621,39 @@
+ return -EBUSY;
+ }
+
+- // printk(KERN_INFO "Tosa Touch Screen driver initialized\n");
+-
+ return 0;
+ }
+
+-static int __init ac97_ts_init(void)
++static void tosa_ts_hardware_stop(void)
++{
++ ts_timer_clear();
++ ts_clear();
++ free_irq(IRQ_GPIO_TP_INT, NULL);
++ wm9712_power_mode_ts(WM9712_PWR_OFF);
++
++ pxa_ac97_put(&ac97_on);
++}
++
++#ifdef CONFIG_PM
++static int tosa_ts_pm_callback(struct pm_dev *pm_dev,
++ pm_request_t req, void *data)
++{
++ switch (req) {
++ case PM_SUSPEND:
++ tp_suspend = 1;
++ tosa_ts_hardware_stop();
++ break;
++ case PM_RESUME:
++ tp_suspend = 0;
++ tosa_ts_hardware_start();
++ break;
++ }
++ return 0;
++}
++#endif
++
++
++static int __init tosa_ts_init(void)
+ {
+ ac97_on = 0;
+
+@@ -663,28 +672,37 @@
+
+ if( register_chrdev(TS_MAJOR,DEV_NAME, &ts_fops) ) {
+ printk("unable to get major %d for touch screen\n", TS_MAJOR);
+- ts_exit();
+ }
+
+ init_procinfo();
+
++ tosa_ts_hardware_start();
++
++#ifdef CONFIG_PM
++ tosa_ts_pm_dev = pm_register(PM_SYS_DEV, 0, tosa_ts_pm_callback);
++#endif
++
+ kernel_thread(ts_pendown, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD);
+
+ return 0;
+ }
+
+-module_init(ac97_ts_init);
++static int __exit tosa_ts_cleanup()
++{
++ tosa_hardware_stop();
++ pm_unregister(tosa_ts_pm_dev);
++ unregister_chrdev(TS_MAJOR, "ts");
++}
++
++module_init(tosa_ts_init);
++module_exit(tosa_ts_cleanup);
+
+ /*
+ * Driver functions
+ */
+ static int ts_open(struct inode *inode, struct file *file)
+ {
+- if( ts_init() < 0 ) {
+- ts_exit();
+- return -EINVAL;
+- }
+-
++ ts_clear();
+ MOD_INC_USE_COUNT;
+ return 0;
+ }
+@@ -692,7 +710,6 @@
+
+ static int ts_release(struct inode *inode, struct file *file)
+ {
+- ts_exit();
+
+ MOD_DEC_USE_COUNT;
+ return 0;
+@@ -788,20 +805,3 @@
+ return 0;
+ }
+
+-#ifdef CONFIG_PM
+-void tosa_ts_suspend(void)
+-{
+- DEBUG(DBG_L1, "in\n");
+- tp_suspend = 1;
+- ts_exit();
+- DEBUG(DBG_L1, "out\n");
+-}
+-
+-void tosa_ts_resume(void)
+-{
+- DEBUG(DBG_L1, "in\n");
+- tp_suspend = 0;
+- ts_init();
+- DEBUG(DBG_L1, "out\n");
+-}
+-#endif /* CONFIG_PM */
+--- linux/drivers/sound/pxa-ac97_tosa.c~tosa_ts.patch
++++ linux/drivers/sound/pxa-ac97_tosa.c
+@@ -90,8 +90,6 @@
+ #include <linux/pm.h>
+ static struct pm_dev* pxa_sound_pm_dev;
+ static int tosa_pm_callback(struct pm_dev *,pm_request_t, void *);
+-extern void tosa_ts_suspend(void);
+-extern void tosa_ts_resume(void);
+ #endif /* CONFIG_PM */
+
+ /************************************************************
+@@ -2195,9 +2193,6 @@
+ case PM_SUSPEND:
+ DEBUG(DBG_L1, "PM_SUSPEND: start\n");
+ wm9712_suspend();
+-#ifdef CONFIG_TOSA_TS
+- tosa_ts_suspend();
+-#endif /* CONFIG_TOSA_TS */
+ if ( ac97_audio_state.rd_ref != 0 ) {
+ audio_clear_buf(ac97_audio_state.input_stream);
+ *ac97_audio_state.input_stream->drcmr = 0;
+@@ -2239,9 +2234,6 @@
+ ac97_audio_state.input_stream->dma_ch = err;
+ }
+ wm9712_resume();
+-#ifdef CONFIG_TOSA_TS
+- tosa_ts_resume();
+-#endif /* CONFIG_TOSA_TS */
+ DEBUG(DBG_L1, "PM_RESUME: done\n");
+ break;
+ }