From 36b05076d6f41c4301454048929aa2c8b42718f7 Mon Sep 17 00:00:00 2001 From: Marcin Juszkiewicz Date: Wed, 30 Aug 2006 13:22:23 +0000 Subject: linux-openzaurus: added patches from mikearthur to fix TS on tosa --- .../linux-openzaurus-2.6.17/tosa-lcdnoise-r0.patch | 157 ++++++++++++++++ .../wm97xx-lcdnoise-r0.patch | 208 +++++++++++++++++++++ packages/linux/linux-openzaurus_2.6.17.bb | 6 +- 3 files changed, 369 insertions(+), 2 deletions(-) create mode 100644 packages/linux/linux-openzaurus-2.6.17/tosa-lcdnoise-r0.patch create mode 100644 packages/linux/linux-openzaurus-2.6.17/wm97xx-lcdnoise-r0.patch (limited to 'packages') diff --git a/packages/linux/linux-openzaurus-2.6.17/tosa-lcdnoise-r0.patch b/packages/linux/linux-openzaurus-2.6.17/tosa-lcdnoise-r0.patch new file mode 100644 index 0000000000..cb014fb8bc --- /dev/null +++ b/packages/linux/linux-openzaurus-2.6.17/tosa-lcdnoise-r0.patch @@ -0,0 +1,157 @@ +Index: linux-tosa/arch/arm/mach-pxa/tosa.c +=================================================================== +--- linux-tosa.orig/arch/arm/mach-pxa/tosa.c 2006-08-29 16:52:59.000000000 +0100 ++++ linux-tosa/arch/arm/mach-pxa/tosa.c 2006-08-29 16:55:25.959706776 +0100 +@@ -2,6 +2,7 @@ + * Support for Sharp SL-C6000x PDAs + * Model: (Tosa) + * ++ * Copyright (c) 2006 Wolfson Microelectronics PLC. + * Copyright (c) 2005 Dirk Opfer + * + * Based on code written by Sharp/Lineo for 2.4 kernels +@@ -46,6 +47,8 @@ + #include + #include + ++#include ++ + #include "generic.h" + + /* +@@ -428,6 +431,16 @@ + }, + }; + ++ ++/* ++ * Tosa Touchscreen device ++ */ ++ ++static struct wm97xx_machinfo tosa_ts_machinfo = { ++ .get_hsync_time = tosa_get_hsync_time, ++ .wait_hsync = tosa_wait_hsync, ++}; ++ + /* + * Tosa Blueooth + */ +@@ -457,6 +470,7 @@ + GPSR(TOSA_GPIO_ON_RESET) = GPIO_bit(TOSA_GPIO_ON_RESET); + + mdelay(1000); ++ wm97xx_unset_machinfo(); + } + + static void tosa_restart(void) +@@ -501,6 +515,8 @@ + platform_scoop_config = &tosa_pcmcia_config; + + platform_add_devices(devices, ARRAY_SIZE(devices)); ++ ++ wm97xx_set_machinfo(&tosa_ts_machinfo); + } + + static void __init fixup_tosa(struct machine_desc *desc, +Index: linux-tosa/arch/arm/mach-pxa/tosa_lcd.c +=================================================================== +--- linux-tosa.orig/arch/arm/mach-pxa/tosa_lcd.c 2006-08-29 16:52:59.000000000 +0100 ++++ linux-tosa/arch/arm/mach-pxa/tosa_lcd.c 2006-08-29 16:55:32.818664056 +0100 +@@ -1,6 +1,7 @@ + /* + * LCD / Backlight control code for Sharp SL-6000x (tosa) + * ++ * Copyright (c) 2006 Wolfson Microelectronics PLC. + * Copyright (c) 2005 Dirk Opfer + * + * This program is free software; you can redistribute it and/or modify +@@ -59,6 +60,8 @@ + static struct ssp_dev tosa_nssp_dev; + static struct ssp_state tosa_nssp_state; + static spinlock_t tosa_nssp_lock; ++static int blanked; ++static unsigned long hsync_time; + + static unsigned short normal_i2c[] = { + DAC_BASE, +@@ -130,6 +133,17 @@ + pxa_nssp_output(TG_GPOSR,0x02); /* GPOS0=powercontrol, GPOS1=GPIO, GPOS2=TCTL */ + } + ++static unsigned long calc_hsync_time(const struct fb_videomode *mode) { ++ /* The 25 and 44 'magic numbers' are from Sharp's 2.4 patches */ ++ if (mode->yres == 640) { ++ return 25; ++ } ++ if (mode->yres == 320) { ++ return 44; ++ } ++ return 0; ++} ++ + static void tosa_lcd_tg_on(struct device *dev, const struct fb_videomode *mode) + { + const int value = TG_REG0_COLOR | TG_REG0_UD | TG_REG0_LR; +@@ -154,6 +168,8 @@ + /* set common voltage */ + i2c_smbus_write_byte_data(tosa_i2c_dac, DAC_CH1, comadj); + ++ blanked = 0; ++ hsync_time = calc_hsync_time(mode); + } + + static void tosa_lcd_tg_off(struct device *dev) +@@ -172,6 +188,8 @@ + + /* L3V Off */ + reset_scoop_gpio( &tosascoop_jc_device.dev,TOSA_SCOOP_JC_TC3693_L3V_ON); ++ ++ blanked = 1; + } + + static int tosa_detect_client(struct i2c_adapter* adapter, int address, int kind) { +@@ -238,6 +256,23 @@ + return 0; + } + ++unsigned long tosa_get_hsync_time(void) ++{ ++/* This method should eventually contain the correct algorithm for calculating ++ the hsync_time */ ++ if (blanked) ++ return 0; ++ else ++ return hsync_time; ++} ++ ++void tosa_wait_hsync(void) ++{ ++ /* Waits for a rising edge on the VGA line */ ++ while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) == 0); ++ while((GPLR(TOSA_GPIO_VGA_LINE) & GPIO_bit(TOSA_GPIO_VGA_LINE)) != 0); ++} ++ + static struct i2c_driver tosa_driver={ + .id = TOSA_LCD_I2C_DEVICEID, + .attach_adapter = tosa_attach_adapter, +Index: linux-tosa/include/asm-arm/arch-pxa/tosa.h +=================================================================== +--- linux-tosa.orig/include/asm-arm/arch-pxa/tosa.h 2006-08-29 16:52:59.000000000 +0100 ++++ linux-tosa/include/asm-arm/arch-pxa/tosa.h 2006-08-29 16:55:12.442761664 +0100 +@@ -1,6 +1,7 @@ + /* + * Hardware specific definitions for Sharp SL-C6000x series of PDAs + * ++ * Copyright (c) 2006 Wolfson Microelectronics PLC. + * Copyright (c) 2005 Dirk Opfer + * + * Based on Sharp's 2.4 kernel patches +@@ -187,4 +188,8 @@ + extern struct platform_device tosascoop_jc_device; + extern struct platform_device tosascoop_device; + extern struct platform_device tc6393_device; ++ ++unsigned long tosa_get_hsync_time(void); ++void tosa_wait_hsync(void); ++ + #endif /* _ASM_ARCH_TOSA_H_ */ diff --git a/packages/linux/linux-openzaurus-2.6.17/wm97xx-lcdnoise-r0.patch b/packages/linux/linux-openzaurus-2.6.17/wm97xx-lcdnoise-r0.patch new file mode 100644 index 0000000000..191de3af22 --- /dev/null +++ b/packages/linux/linux-openzaurus-2.6.17/wm97xx-lcdnoise-r0.patch @@ -0,0 +1,208 @@ +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 diff --git a/packages/linux/linux-openzaurus_2.6.17.bb b/packages/linux/linux-openzaurus_2.6.17.bb index c7f1f21618..ef03c0e434 100644 --- a/packages/linux/linux-openzaurus_2.6.17.bb +++ b/packages/linux/linux-openzaurus_2.6.17.bb @@ -1,6 +1,6 @@ require linux-openzaurus.inc -PR = "r20" +PR = "r21" # Handy URLs # git://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git \ @@ -115,7 +115,9 @@ SRC_URI_append_tosa = "\ ${DOSRC}/sharpsl-pm-postresume-r0.patch;patch=1 \ ${DOSRC}/wm97xx-dig-restore-r0.patch;patch=1 \ ${DOSRC}/wm97xx-miscdevs-resume-r0.patch;patch=1 \ - ${DOSRC}/wm9712-reset-loop-r1.patch;patch=1" + ${DOSRC}/wm9712-reset-loop-r1.patch;patch=1 \ + file://tosa-lcdnoise-r0.patch;patch=1 \ + file://wm97xx-lcdnoise-r0.patch;patch=1 " # ${DOSRC}/tosa-asoc-r1.patch;patch=1 " S = "${WORKDIR}/linux-2.6.17" -- cgit v1.2.3