diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 68ac1ad..8c1d0d8 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -124,7 +124,7 @@ config TOUCHSCREEN_HP600
 
 config TOUCHSCREEN_WM97XX
 	tristate "Support for WM97xx AC97 touchscreen controllers"
-	depends SND_AC97_BUS
+	depends SND_PXA2XX_AC97
 
 choice
 	prompt "WM97xx codec type"
@@ -164,6 +164,23 @@ config TOUCHSCREEN_WM9713
 
 endchoice
 
+config TOUCHSCREEN_WM97XX_PXA
+	bool "WM97xx PXA accelerated touch"
+	depends on TOUCHSCREEN_WM97XX && ARCH_PXA
+	select TOUCHSCREEN_WM97XX_ACC
+	help
+	  Say Y here for continuous mode touch on the PXA
+
+	  If unsure, say N
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called pxa-wm97xx
+	  
+config TOUCHSCREEN_WM97XX_ACC
+	bool
+	help
+	  Enable support for WM97xx accelerated touchscreens
+
 config TOUCHSCREEN_PENMOUNT
 	tristate "Penmount serial touchscreen"
 	select SERIO
diff --git a/drivers/input/touchscreen/pxa-wm97xx.c b/drivers/input/touchscreen/pxa-wm97xx.c
index 918d268..b06a92f 100644
--- a/drivers/input/touchscreen/pxa-wm97xx.c
+++ b/drivers/input/touchscreen/pxa-wm97xx.c
@@ -169,6 +169,7 @@ int wm97xx_acc_pen_down (struct wm97xx* wm)
 		input_report_abs (wm->input_dev, ABS_X, x & 0xfff);
 		input_report_abs (wm->input_dev, ABS_Y, y & 0xfff);
 		input_report_abs (wm->input_dev, ABS_PRESSURE, p & 0xfff);
+		input_report_key(wm->input_dev, BTN_TOUCH, 1);
 		input_sync (wm->input_dev);
 		reads++;
 	} while (reads < cinfo[sp_idx].reads);
@@ -209,10 +210,10 @@ int wm97xx_acc_startup(struct wm97xx* wm)
 				/* enable pen down interrupt */
 				/* use PEN_DOWN GPIO 13 to assert IRQ on GPIO line 2 */
 				wm->pen_irq = MAINSTONE_AC97_IRQ;
-				wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN,
-					WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_STICKY, WM97XX_GPIO_WAKE);
-				wm97xx_config_gpio(wm, WM97XX_GPIO_2, WM97XX_GPIO_OUT,
-					WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_NOTSTICKY, WM97XX_GPIO_NOWAKE);
+//				wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN,
+//					WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_STICKY, WM97XX_GPIO_WAKE);
+//				wm97xx_config_gpio(wm, WM97XX_GPIO_2, WM97XX_GPIO_OUT,
+//					WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_NOTSTICKY, WM97XX_GPIO_NOWAKE);
 				break;
 			default:
 				printk(KERN_WARNING "pen down irq not supported on this device\n");
diff --git a/drivers/input/touchscreen/wm9713.c b/drivers/input/touchscreen/wm9713.c
index 42f5f30..d39493b 100644
--- a/drivers/input/touchscreen/wm9713.c
+++ b/drivers/input/touchscreen/wm9713.c
@@ -214,15 +214,15 @@ static int wm9713_digitiser_ioctl(struct wm97xx* wm, int cmd)
 
 	switch(cmd){
 	case WM97XX_DIG_START:
-		val = wm97xx_reg_read(wm, AC97_EXTENDED_MID);
-		wm97xx_reg_write(wm, AC97_EXTENDED_MID, val & 0x7fff);
+//		val = wm97xx_reg_read(wm, AC97_EXTENDED_MID);
+//		wm97xx_reg_write(wm, AC97_EXTENDED_MID, val & 0x7fff);
 		wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] | WM97XX_PRP_DET_DIG);
 		wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */
 		break;
 	case WM97XX_DIG_STOP:
 		wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] & ~WM97XX_PRP_DET_DIG);
-		val = wm97xx_reg_read(wm, AC97_EXTENDED_MID);
-		wm97xx_reg_write(wm, AC97_EXTENDED_MID, val | 0x8000);
+//		val = wm97xx_reg_read(wm, AC97_EXTENDED_MID);
+//		wm97xx_reg_write(wm, AC97_EXTENDED_MID, val | 0x8000);
 		break;
 	case WM97XX_AUX_PREPARE:
 		memcpy(wm->dig_save, wm->dig, sizeof(wm->dig));
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c
index 7a0cda0..b4aed25 100644
--- a/drivers/input/touchscreen/wm97xx-core.c
+++ b/drivers/input/touchscreen/wm97xx-core.c
@@ -85,6 +85,7 @@
 #include <linux/workqueue.h>
 #include <linux/device.h>
 #include <linux/wm97xx.h>
+#include <linux/freezer.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
 
@@ -182,11 +183,11 @@ int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel)
 	/* When the touchscreen is not in use, we may have to power up the AUX ADC
 	 * before we can use sample the AUX inputs->
 	 */
-	if (wm->id == WM9713_ID2 &&
-	    (power = wm97xx_reg_read(wm, AC97_EXTENDED_MID)) & 0x8000) {
-		power_adc = 1;
-		wm97xx_reg_write(wm, AC97_EXTENDED_MID, power & 0x7fff);
-	}
+//	if (wm->id == WM9713_ID2 &&
+//	    (power = wm97xx_reg_read(wm, AC97_EXTENDED_MID)) & 0x8000) {
+//		power_adc = 1;
+//		wm97xx_reg_write(wm, AC97_EXTENDED_MID, power & 0x7fff);
+//	}
 
 	/* Prepare the codec for AUX reading */
 	wm->codec->digitiser_ioctl(wm, WM97XX_AUX_PREPARE);
@@ -195,8 +196,8 @@ int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel)
 	wm->pen_probably_down = 1;
 	wm->codec->poll_sample(wm, adcsel, &auxval);
 
-	if (power_adc)
-		wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000);
+//	if (power_adc)
+//		wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000);
 
 	wm->codec->digitiser_ioctl(wm, WM97XX_DIG_RESTORE);
 
@@ -373,7 +374,7 @@ static int wm97xx_init_pen_irq(struct wm97xx *wm)
 {
 	u16 reg;
 
-	INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker, wm);
+	INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker);
 	if ((wm->pen_irq_workq =
 		create_singlethread_workqueue("kwm97pen")) == NULL) {
 		err("could not create pen irq work queue");
@@ -423,6 +424,7 @@ static int wm97xx_read_samples(struct wm97xx *wm, struct ts_state *state)
 			wm->pen_is_down = 0;
 			dbg("pen up");
 			input_report_abs(wm->input_dev, ABS_PRESSURE, 0);
+	                input_report_key(wm->input_dev, BTN_TOUCH, 0);
 			input_sync(wm->input_dev);
 		} else if (!(rc & RC_AGAIN)) {
 			/* We need high frequency updates only while pen is down,
@@ -444,6 +446,7 @@ static int wm97xx_read_samples(struct wm97xx *wm, struct ts_state *state)
 		input_report_abs(wm->input_dev, ABS_X, data.x & 0xfff);
 		input_report_abs(wm->input_dev, ABS_Y, data.y & 0xfff);
 		input_report_abs(wm->input_dev, ABS_PRESSURE, data.p & 0xfff);
+		input_report_key(wm->input_dev, BTN_TOUCH, 1);
 		input_sync(wm->input_dev);
 		wm->pen_is_down = 1;
 		state->sleep_time = state->min_sleep_time;
@@ -673,7 +676,8 @@ static int wm97xx_probe(struct device *dev)
 	wm->input_dev->name = "wm97xx touchscreen";
 	wm->input_dev->open = wm97xx_ts_input_open;
 	wm->input_dev->close = wm97xx_ts_input_close;
-	set_bit(EV_ABS, wm->input_dev->evbit);
+	wm->input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+	wm->input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH);
 	set_bit(ABS_X, wm->input_dev->absbit);
 	set_bit(ABS_Y, wm->input_dev->absbit);
 	set_bit(ABS_PRESSURE, wm->input_dev->absbit);
@@ -772,10 +776,10 @@ int wm97xx_resume(struct device* dev)
 	if(wm->id == WM9713_ID2) {
 		wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig[0]);
 		wm97xx_reg_write(wm, 0x5a, wm->misc);
-		if(wm->ts_use_count) {
-			u16 reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) & 0x7fff;
-			wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg);
-		}
+//		if(wm->ts_use_count) {
+//			u16 reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) & 0x7fff;
+//			wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg);
+//		}
 	}
 
 	wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig[1]);
