Index: linux-tosa/drivers/input/touchscreen/wm9712.c =================================================================== --- linux-tosa.orig/drivers/input/touchscreen/wm9712.c 2006-08-29 16:52:36.008543280 +0100 +++ linux-tosa/drivers/input/touchscreen/wm9712.c 2006-08-29 16:52:50.923275896 +0100 @@ -1,7 +1,7 @@ /* * wm9712.c -- Codec driver for Wolfson WM9712 AC97 Codecs. * - * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC. + * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. * Author: Liam Girdwood * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com * Parts Copyright : Ian Molton @@ -13,6 +13,12 @@ * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * + * Revision history + * 4th Jul 2005 Initial version. + * 29th Aug 2006 Mike Arthur + * Added fixes for Sharp SL-6000 (Tosa) LCD noise causing + * touchscreen interference. + * */ #include @@ -28,6 +34,10 @@ #define WM9705_VERSION "0.60" #define DEFAULT_PRESSURE 0xb0c0 +#define CCNT(a) asm volatile ("mrc p14, 0, %0, C1, C1, 0" : "=r"(a)) +#define CCNT_ON() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) +#define CCNT_OFF() asm("mcr p14, 0, %0, C0, C0, 0" : : "r"(1)) + /* * Debug */ @@ -243,6 +253,36 @@ return wm->dig[2] & WM9712_PDEN; } + +#ifdef CONFIG_MACH_TOSA +/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait + * before sampling the Y axis of the touchscreen */ +static inline void wm9712_lcd_sync_on(struct wm97xx* wm, int adcsel) { + unsigned long timer1 = 0, timer2 = 0, wait_time = 0; + if (adcsel == WM97XX_ADCSEL_Y) { + wait_time = wm97xx_calc_lcd_waittime(wm); + + CCNT_ON(); + + if (wait_time) { + /* wait for LCD rising edge */ + wm_machinfo->wait_hsync(); + /* get clock */ + CCNT(timer1); + CCNT(timer2); + + while ((timer2 - timer1) < wait_time) { + CCNT(timer2); + } + } + } +} + +static inline void wm9712_lcd_sync_off(void) { + CCNT_OFF(); +} +#endif + /* * Read a sample from the WM9712 adc in polling mode. */ @@ -260,6 +300,9 @@ /* set up digitiser */ if (adcsel & 0x8000) adcsel = ((adcsel & 0x7fff) + 3) << 12; + #ifdef CONFIG_MACH_TOSA + wm9712_lcd_sync_on(wm, adcsel); + #endif wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, adcsel | WM97XX_POLL | WM97XX_DELAY(delay)); /* wait 3 AC97 time slots + delay for conversion */ @@ -282,6 +325,10 @@ *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + #ifdef CONFIG_MACH_TOSA + wm9712_lcd_sync_off(); + #endif + /* check we have correct sample */ if ((*sample & WM97XX_ADCSEL_MASK) != adcsel) { dbg ("adc wrong sample, read %x got %x", adcsel, @@ -303,11 +350,12 @@ static int wm9712_poll_touch(struct wm97xx* wm, struct wm97xx_data *data) { int rc; - if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X, &data->x)) != RC_VALID) return rc; + if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y, &data->y)) != RC_VALID) return rc; + if (pil && !five_wire) { if ((rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES, &data->p)) != RC_VALID) return rc; Index: linux-tosa/drivers/input/touchscreen/wm97xx-core.c =================================================================== --- linux-tosa.orig/drivers/input/touchscreen/wm97xx-core.c 2006-08-29 16:52:36.008543280 +0100 +++ linux-tosa/drivers/input/touchscreen/wm97xx-core.c 2006-08-29 16:52:50.924275744 +0100 @@ -2,7 +2,7 @@ * wm97xx-core.c -- Touch screen driver core for Wolfson WM9705, WM9712 * and WM9713 AC97 Codecs. * - * Copyright 2003, 2004, 2005 Wolfson Microelectronics PLC. + * Copyright 2003, 2004, 2005, 2006 Wolfson Microelectronics PLC. * Author: Liam Girdwood * liam.girdwood@wolfsonmicro.com or linux@wolfsonmicro.com * Parts Copyright : Ian Molton @@ -67,6 +67,9 @@ * GPIOs) and 2.6 power management. * 29th Nov 2004 Added WM9713 support. * 4th Jul 2005 Moved codec specific code out to seperate files. + * 29th Aug 2006 Mike Arthur + * Added fixes for Sharp SL-6000 (Tosa) LCD noise causing + * touchscreen interference. */ #include @@ -94,6 +97,7 @@ static DECLARE_MUTEX(gpio_sem); static LIST_HEAD(wm97xx_misc_list); static struct wm97xx* wm_codec = NULL; +struct wm97xx_machinfo *wm_machinfo; /* * WM97xx - enable/disable AUX ADC sysfs @@ -832,6 +836,23 @@ mdev->remove(wm_codec); } +#ifdef CONFIG_MACH_TOSA +/* On the Sharp SL-6000 (Tosa), due to a noisy LCD, we need to perform a wait + * before sampling the Y axis of the touchscreen */ +unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm) { + unsigned long hsync_time = wm_machinfo->get_hsync_time(); + return hsync_time; +} + +void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo) { + wm_machinfo = machinfo; +} + +void wm97xx_unset_machinfo() { + wm_machinfo = NULL; +} +#endif + static struct device_driver wm97xx_driver = { .name = "ac97", .bus = &ac97_bus_type, @@ -861,6 +882,9 @@ EXPORT_SYMBOL_GPL(wm97xx_reg_write); EXPORT_SYMBOL_GPL(wm97xx_register_misc_dev); EXPORT_SYMBOL_GPL(wm97xx_unregister_misc_dev); +EXPORT_SYMBOL_GPL(wm97xx_calc_lcd_waittime); +EXPORT_SYMBOL_GPL(wm97xx_set_machinfo); +EXPORT_SYMBOL_GPL(wm97xx_unset_machinfo); module_init(wm97xx_init); module_exit(wm97xx_exit); Index: linux-tosa/include/linux/wm97xx.h =================================================================== --- linux-tosa.orig/include/linux/wm97xx.h 2006-08-29 16:52:36.008543280 +0100 +++ linux-tosa/include/linux/wm97xx.h 2006-08-29 16:52:50.924275744 +0100 @@ -207,6 +207,7 @@ struct wm97xx; extern struct wm97xx_codec_drv wm97xx_codec; +extern struct wm97xx_machinfo *wm_machinfo; /* * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs @@ -253,6 +254,11 @@ struct list_head list; }; +struct wm97xx_machinfo { + unsigned long (*get_hsync_time)(void); + void (*wait_hsync)(void); +}; + int wm97xx_register_misc_dev(struct wm97xx_misc_dev* mdev); void wm97xx_unregister_misc_dev(struct wm97xx_misc_dev* mdev); @@ -281,4 +287,9 @@ int wm97xx_acc_startup(struct wm97xx* wm); void wm97xx_acc_shutdown(struct wm97xx* wm); + +unsigned long wm97xx_calc_lcd_waittime(struct wm97xx *wm); +void wm97xx_set_machinfo(struct wm97xx_machinfo *machinfo); +void wm97xx_unset_machinfo(void); + #endif