diff options
Diffstat (limited to 'recipes/linux/linux-2.6.29+2.6.30-rc4/tx25/tx25-ts2.patch')
-rw-r--r-- | recipes/linux/linux-2.6.29+2.6.30-rc4/tx25/tx25-ts2.patch | 1759 |
1 files changed, 0 insertions, 1759 deletions
diff --git a/recipes/linux/linux-2.6.29+2.6.30-rc4/tx25/tx25-ts2.patch b/recipes/linux/linux-2.6.29+2.6.30-rc4/tx25/tx25-ts2.patch deleted file mode 100644 index de1f748386..0000000000 --- a/recipes/linux/linux-2.6.29+2.6.30-rc4/tx25/tx25-ts2.patch +++ /dev/null @@ -1,1759 +0,0 @@ -Index: linux-2.6.30-karo/arch/arm/mach-mx2/clock_imx25.c -=================================================================== ---- linux-2.6.30-karo.orig/arch/arm/mach-mx2/clock_imx25.c 2009-06-22 16:51:38.000000000 +0200 -+++ linux-2.6.30-karo/arch/arm/mach-mx2/clock_imx25.c 2009-06-23 12:07:34.000000000 +0200 -@@ -171,7 +171,7 @@ - #define MXC_CCM_CGCR2_SPBA_OFFSET (42 - 32) - #define MXC_CCM_CGCR2_SSI1_OFFSET (43 - 32) - #define MXC_CCM_CGCR2_SSI2_OFFSET (44 - 32) --#define MXC_CCM_CGCR2_TCHSCRN_OFFSET (45 - 32) -+#define MXC_CCM_CGCR2_TSC_OFFSET (45 - 32) - #define MXC_CCM_CGCR2_UART1_OFFSET (46 - 32) - #define MXC_CCM_CGCR2_UART2_OFFSET (47 - 32) - #define MXC_CCM_CGCR2_UART3_OFFSET (48 - 32) -@@ -615,7 +615,7 @@ - - /* Bottom-level clocks */ - --struct clk usbotg_clk = { -+static struct clk usbotg_clk = { - .id = 0, - .parent = &ahb_clk, - .enable = _clk_enable, -@@ -624,16 +624,27 @@ - .disable = _clk_disable, - }; - --struct clk rtic_clk = { -- .id = 0, -- .parent = &ahb_clk, -- .enable = _clk_enable, -- .enable_reg = MXC_CCM_CGCR0, -- .enable_shift = MXC_CCM_CGCR0_HCLK_RTIC_OFFSET, -- .disable = _clk_disable, -+static struct clk rtic_clk[] = { -+ { -+ .id = 0, -+ .parent = &ipg_clk, -+ .enable = _clk_enable, -+ .enable_reg = MXC_CCM_CGCR2, -+ .enable_shift = MXC_CCM_CGCR2_RTIC_OFFSET, -+ .disable = _clk_disable, -+ .secondary = &rtic_clk[1], -+ }, -+ { -+ .id = 0, -+ .parent = &ahb_clk, -+ .enable = _clk_enable, -+ .enable_reg = MXC_CCM_CGCR0, -+ .enable_shift = MXC_CCM_CGCR0_HCLK_RTIC_OFFSET, -+ .disable = _clk_disable, -+ }, - }; - --struct clk emi_clk = { -+static struct clk emi_clk = { - .id = 0, - .parent = &ahb_clk, - .enable = _clk_enable, -@@ -642,7 +653,7 @@ - .disable = _clk_disable, - }; - --struct clk brom_clk = { -+static struct clk brom_clk = { - .id = 0, - .parent = &ahb_clk, - .enable = _clk_enable, -@@ -813,12 +824,12 @@ - }, - }; - --struct clk nfc_clk = { -+static struct clk nfc_clk = { - .id = 0, - .parent = &per_clk[8], - }; - --struct clk audmux_clk = { -+static struct clk audmux_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, -@@ -827,7 +838,7 @@ - .disable = _clk_disable, - }; - --struct clk ata_clk[] = { -+static struct clk ata_clk[] = { - { - .id = 0, - .parent = &ipg_clk, -@@ -847,7 +858,7 @@ - }, - }; - --struct clk can_clk[] = { -+static struct clk can_clk[] = { - { - .id = 0, - .parent = &ipg_clk, -@@ -866,7 +877,7 @@ - }, - }; - --struct clk csi_clk[] = { -+static struct clk csi_clk[] = { - { - .id = 0, - .parent = &per_clk[0], -@@ -891,7 +902,7 @@ - }, - }; - --struct clk cspi_clk[] = { -+static struct clk cspi_clk[] = { - { - .id = 0, - .parent = &ipg_clk, -@@ -918,7 +929,7 @@ - }, - }; - --struct clk dryice_clk = { -+static struct clk dryice_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, -@@ -927,7 +938,7 @@ - .disable = _clk_disable, - }; - --struct clk ect_clk = { -+static struct clk ect_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, -@@ -936,7 +947,7 @@ - .disable = _clk_disable, - }; - --struct clk epit1_clk[] = { -+static struct clk epit1_clk[] = { - { - .id = 0, - .parent = &per_clk[1], -@@ -952,7 +963,7 @@ - }, - }; - --struct clk epit2_clk[] = { -+static struct clk epit2_clk[] = { - { - .id = 1, - .parent = &per_clk[1], -@@ -968,7 +979,7 @@ - }, - }; - --struct clk esai_clk[] = { -+static struct clk esai_clk[] = { - { - .id = 0, - .parent = &per_clk[2], -@@ -993,7 +1004,7 @@ - }, - }; - --struct clk esdhc1_clk[] = { -+static struct clk esdhc1_clk[] = { - { - .id = 0, - .parent = &per_clk[3], -@@ -1018,7 +1029,7 @@ - }, - }; - --struct clk esdhc2_clk[] = { -+static struct clk esdhc2_clk[] = { - { - .id = 1, - .parent = &per_clk[4], -@@ -1043,7 +1054,7 @@ - }, - }; - --struct clk fec_clk[] = { -+static struct clk fec_clk[] = { - { - .id = 0, - .parent = &ipg_clk, -@@ -1063,7 +1074,7 @@ - }, - }; - --struct clk gpio_clk[] = { -+static struct clk gpio_clk[] = { - { - .id = 0, - .parent = &ipg_clk, -@@ -1154,7 +1165,7 @@ - }, - }; - --struct clk i2c_clk[] = { -+static struct clk i2c_clk[] = { - { - .id = 0, - .parent = &per_clk[6], -@@ -1169,7 +1180,7 @@ - }, - }; - --struct clk iim_clk = { -+static struct clk iim_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, -@@ -1178,7 +1189,7 @@ - .disable = _clk_disable, - }; - --struct clk iomuxc_clk = { -+static struct clk iomuxc_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, -@@ -1187,7 +1198,7 @@ - .disable = _clk_disable, - }; - --struct clk kpp_clk = { -+static struct clk kpp_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, -@@ -1196,7 +1207,7 @@ - .disable = _clk_disable, - }; - --struct clk lcdc_clk[] = { -+static struct clk lcdc_clk[] = { - { - .id = 0, - .parent = &per_clk[7], -@@ -1221,7 +1232,7 @@ - }, - }; - --struct clk owire_clk[] = { -+static struct clk owire_clk[] = { - { - .id = 0, - .parent = &per_clk[9], -@@ -1237,7 +1248,7 @@ - }, - }; - --struct clk pwm1_clk[] = { -+static struct clk pwm1_clk[] = { - { - .id = 0, - .parent = &per_clk[10], -@@ -1253,7 +1264,7 @@ - }, - }; - --struct clk pwm2_clk[] = { -+static struct clk pwm2_clk[] = { - { - .id = 1, - .parent = &per_clk[10], -@@ -1269,7 +1280,7 @@ - }, - }; - --struct clk pwm3_clk[] = { -+static struct clk pwm3_clk[] = { - { - .id = 2, - .parent = &per_clk[10], -@@ -1285,7 +1296,7 @@ - }, - }; - --struct clk pwm4_clk[] = { -+static struct clk pwm4_clk[] = { - { - .id = 3, - .parent = &per_clk[10], -@@ -1301,7 +1312,7 @@ - }, - }; - --struct clk rngb_clk = { -+static struct clk rngb_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, -@@ -1310,7 +1321,7 @@ - .disable = _clk_disable, - }; - --struct clk scc_clk = { -+static struct clk scc_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, -@@ -1319,7 +1330,7 @@ - .disable = _clk_disable, - }; - --struct clk sdma_clk[] = { -+static struct clk sdma_clk[] = { - { - .id = 0, - .parent = &ipg_clk, -@@ -1339,7 +1350,7 @@ - }, - }; - --struct clk sim1_clk[] = { -+static struct clk sim1_clk[] = { - { - .id = 0, - .parent = &per_clk[11], -@@ -1355,7 +1366,7 @@ - }, - }; - --struct clk sim2_clk[] = { -+static struct clk sim2_clk[] = { - { - .id = 1, - .parent = &per_clk[12], -@@ -1371,7 +1382,7 @@ - }, - }; - --struct clk slcdc_clk[] = { -+static struct clk slcdc_clk[] = { - { - .id = 0, - .parent = &ipg_clk, -@@ -1391,7 +1402,7 @@ - }, - }; - --struct clk spba_clk = { -+static struct clk spba_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, -@@ -1400,7 +1411,7 @@ - .disable = _clk_disable, - }; - --struct clk ssi1_clk[] = { -+static struct clk ssi1_clk[] = { - { - .id = 0, - .parent = &per_clk[13], -@@ -1416,7 +1427,7 @@ - }, - }; - --struct clk ssi2_clk[] = { -+static struct clk ssi2_clk[] = { - { - .id = 1, - .parent = &per_clk[14], -@@ -1432,16 +1443,16 @@ - }, - }; - --struct clk tchscrn_clk = { -+static struct clk tsc_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, - .enable_reg = MXC_CCM_CGCR2, -- .enable_shift = MXC_CCM_CGCR2_TCHSCRN_OFFSET, -+ .enable_shift = MXC_CCM_CGCR2_TSC_OFFSET, - .disable = _clk_disable, - }; - --struct clk uart1_clk[] = { -+static struct clk uart1_clk[] = { - { - .id = 0, - .parent = &per_clk[15], -@@ -1457,7 +1468,7 @@ - }, - }; - --struct clk uart2_clk[] = { -+static struct clk uart2_clk[] = { - { - .id = 1, - .parent = &per_clk[15], -@@ -1473,7 +1484,7 @@ - }, - }; - --struct clk uart3_clk[] = { -+static struct clk uart3_clk[] = { - { - .id = 2, - .parent = &per_clk[15], -@@ -1489,7 +1500,7 @@ - }, - }; - --struct clk uart4_clk[] = { -+static struct clk uart4_clk[] = { - { - .id = 3, - .parent = &per_clk[15], -@@ -1505,7 +1516,7 @@ - }, - }; - --struct clk uart5_clk[] = { -+static struct clk uart5_clk[] = { - { - .id = 4, - .parent = &per_clk[15], -@@ -1521,7 +1532,7 @@ - }, - }; - --struct clk wdog_clk = { -+static struct clk wdog_clk = { - .id = 0, - .parent = &ipg_clk, - .enable = _clk_enable, -@@ -1600,6 +1611,7 @@ - .set_rate = _clk_usb_set_rate, - .round_rate = _clk_usb_round_rate, - .set_parent = _clk_usb_set_parent, -+ .secondary = &usbotg_clk, - }; - - /* CLKO */ -@@ -1714,7 +1726,8 @@ - _REGISTER_CLOCK("mxc_nand.0", NULL, nfc_clk) - _REGISTER_CLOCK(NULL, "audmux", audmux_clk) - _REGISTER_CLOCK(NULL, "ata", ata_clk[0]) -- _REGISTER_CLOCK(NULL, "can", can_clk[0]) -+ _REGISTER_CLOCK("mxc-can.0", NULL, can_clk[0]) -+ _REGISTER_CLOCK("mxc-can.1", NULL, can_clk[1]) - _REGISTER_CLOCK(NULL, "csi", csi_clk[0]) - _REGISTER_CLOCK(NULL, "cspi.0", cspi_clk[0]) - _REGISTER_CLOCK(NULL, "cspi.1", cspi_clk[1]) -@@ -1755,7 +1768,7 @@ - _REGISTER_CLOCK(NULL, "spba", spba_clk) - _REGISTER_CLOCK(NULL, "ssi1", ssi1_clk[0]) - _REGISTER_CLOCK(NULL, "ssi2", ssi2_clk[0]) -- _REGISTER_CLOCK(NULL, "tchscrn", tchscrn_clk) -+ _REGISTER_CLOCK("mxc-tsadcc.0", NULL, tsc_clk) - _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk[0]) - _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk[0]) - _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk[0]) -Index: linux-2.6.30-karo/arch/arm/mach-mx2/karo-tx25.c -=================================================================== ---- linux-2.6.30-karo.orig/arch/arm/mach-mx2/karo-tx25.c 2009-06-23 13:46:03.000000000 +0200 -+++ linux-2.6.30-karo/arch/arm/mach-mx2/karo-tx25.c 2009-06-23 15:04:16.000000000 +0200 -@@ -69,6 +69,7 @@ - //#include <mach/ulpi.h> - //#include <mach/mxc_ehci.h> - //#include <mach/board-tx25.h> -+#include <mach/mxc_tsadcc.h> - - #include "crm_regs.h" - #include "devices.h" -@@ -829,6 +830,39 @@ - #endif - #endif - -+#if defined(CONFIG_TOUCHSCREEN_MXC_TSADCC) || defined(CONFIG_TOUCHSCREEN_MXC_TSADCC_MODULE) -+static struct resource mxc_tsadcc_resources[] = { -+ { -+ .start = TSC_BASE_ADDR, -+ .end = TSC_BASE_ADDR + 0x85f, -+ .flags = IORESOURCE_MEM, -+ }, -+ { -+ .start = MXC_INT_TSC, -+ .end = MXC_INT_TSC, -+ .flags = IORESOURCE_IRQ, -+ }, -+}; -+ -+static struct mxc_tsadcc_pdata mxc_tsadcc_pdata = { -+ .pen_debounce_time = 32, -+ .intref = 1, -+ .adc_clk = 1666667, -+ .tsc_mode = MXC_TSC_4WIRE, -+ .hsyncen = 0, -+}; -+ -+static struct platform_device mxc_tsadcc_device = { -+ .id = 0, -+ .name = "mxc-tsadcc", -+ .num_resources = ARRAY_SIZE(mxc_tsadcc_resources), -+ .resource = mxc_tsadcc_resources, -+ .dev = { -+ .platform_data = &mxc_tsadcc_pdata, -+ }, -+}; -+#endif -+ - struct platform_dev_list { - struct platform_device *pdev; - int flag; -@@ -851,6 +885,9 @@ - #if defined(CONFIG_MXC_VPU) || defined(CONFIG_MXC_VPU_MODULE) - { .pdev = &mxc_vpu_device, .flag = 1, }, - #endif -+#if defined(CONFIG_TOUCHSCREEN_MXC_TSADCC) || defined(CONFIG_TOUCHSCREEN_MXC_TSADCC_MODULE) -+ { .pdev = &mxc_tsadcc_device, .flag = 1, }, -+#endif - }; - #define TX25_NUM_DEVICES ARRAY_SIZE(tx25_devices) - -Index: linux-2.6.30-karo/arch/arm/plat-mxc/include/mach/mxc_tsadcc.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.30-karo/arch/arm/plat-mxc/include/mach/mxc_tsadcc.h 2009-06-23 13:46:20.000000000 +0200 -@@ -0,0 +1,28 @@ -+/* -+ * Freescale i.MX25 Touch Screen Driver -+ * -+ * Copyright (c) 2009 Lothar Wassmann <LW@KARO-electronics.de> -+ * -+ * Based on code from Freescale BSP -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+typedef enum { -+ MXC_TSC_4WIRE, -+ MXC_TSC_5WIRE, -+} mxc_tsc_mode; -+ -+struct mxc_tsadcc_pdata { -+ int pen_debounce_time; /* 0: disable debounce; -+ * 1..128: # of ADC clock cycles / 8 */ -+ unsigned int intref:1, /* 0|1: internal reference disabled|enabled */ -+ hsyncen:1; /* synchronize measurements with LCD HSYNC */ -+ unsigned int r_xplate; /* resistance (in Ohms) of X plate -+ * (required for pressure measurement */ -+ int adc_clk; /* ADC clock frequency in Hz (max. 1750000); -+ * <= 0: use default (1666667) */ -+ mxc_tsc_mode tsc_mode; /* select 4 wire or 5 wire mode */ -+}; -Index: linux-2.6.30-karo/drivers/input/touchscreen/Kconfig -=================================================================== ---- linux-2.6.30-karo.orig/drivers/input/touchscreen/Kconfig 2009-06-23 13:46:03.000000000 +0200 -+++ linux-2.6.30-karo/drivers/input/touchscreen/Kconfig 2009-06-23 13:46:20.000000000 +0200 -@@ -287,6 +287,18 @@ - To compile this driver as a module, choose M here: the - module will be called atmel_tsadcc. - -+config TOUCHSCREEN_MXC_TSADCC -+ tristate "i.MX25 Touchscreen Interface" -+ depends on MACH_MX25 -+ help -+ Say Y here if you have a 4-wire touchscreen connected to the -+ ADC Controller on your Freescale i.MX25 SoC. -+ -+ If unsure, say N. -+ -+ To compile this driver as a module, choose M here: the -+ module will be called atmel_tsadcc. -+ - config TOUCHSCREEN_UCB1400 - tristate "Philips UCB1400 touchscreen" - depends on AC97_BUS -Index: linux-2.6.30-karo/drivers/input/touchscreen/Makefile -=================================================================== ---- linux-2.6.30-karo.orig/drivers/input/touchscreen/Makefile 2009-06-23 13:46:03.000000000 +0200 -+++ linux-2.6.30-karo/drivers/input/touchscreen/Makefile 2009-06-23 13:46:20.000000000 +0200 -@@ -16,19 +16,20 @@ - obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o - obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o - obj-$(CONFIG_TOUCHSCREEN_INEXIO) += inexio.o --obj-$(CONFIG_TOUCHSCREEN_MIGOR) += migor_ts.o --obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o --obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o - obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o - obj-$(CONFIG_TOUCHSCREEN_HP7XX) += jornada720_ts.o - obj-$(CONFIG_TOUCHSCREEN_HTCPEN) += htcpen.o --obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o -+obj-$(CONFIG_TOUCHSCREEN_MIGOR) += migor_ts.o -+obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o -+obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o -+obj-$(CONFIG_TOUCHSCREEN_MXC_TSADCC) += mxc_tsadcc.o - obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o - obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o - obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o - obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o - obj-$(CONFIG_TOUCHSCREEN_TSC2007) += tsc2007.o - obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o -+obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o - obj-$(CONFIG_TOUCHSCREEN_WACOM_W8001) += wacom_w8001.o - obj-$(CONFIG_TOUCHSCREEN_WM97XX) += wm97xx-ts.o - obj-$(CONFIG_TOUCHSCREEN_DA9034) += da9034-ts.o -Index: linux-2.6.30-karo/drivers/input/touchscreen/mxc_tsadcc.c -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.30-karo/drivers/input/touchscreen/mxc_tsadcc.c 2009-06-23 14:54:48.000000000 +0200 -@@ -0,0 +1,897 @@ -+/* -+ * Freescale i.MX25 Touch Screen Driver -+ * -+ * Copyright (c) 2009 Lothar Wassmann <LW@KARO-electronics.de> -+ * -+ * Based on atmel_tsadcc.c -+ * Copyright (c) 2008 ATMEL et. al. -+ * and code from Freescale BSP -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+#include <linux/module.h> -+#include <linux/err.h> -+#include <linux/input.h> -+#include <linux/timer.h> -+#include <linux/interrupt.h> -+#include <linux/clk.h> -+#include <linux/platform_device.h> -+#include <linux/io.h> -+#include <mach/mxc_tsadcc.h> -+ -+#include "mxc_tsadcc.h" -+ -+#define TSC_NUM_SAMPLES 1 -+#define ADC_NUM_SAMPLES 1 -+ -+#ifdef DEBUG -+static int debug = 4; -+#define dbg_lvl(n) ((n) < debug) -+module_param(debug, int, S_IRUGO | S_IWUSR); -+ -+#define DBG(lvl, fmt...) do { if (dbg_lvl(lvl)) printk(KERN_DEBUG fmt); } while (0) -+#else -+static int debug; -+#define dbg_lvl(n) 0 -+module_param(debug, int, 0); -+ -+#define DBG(lvl, fmt...) do { } while (0) -+#endif -+ -+#define DEFAULT_ADC_CLOCK 1666667 -+#define DEFAULT_RX_VALUE 360 -+ -+//#define REPORT_PRESSURE -+ -+struct mxc_tsadcc_fifo_data { -+ unsigned int id:4, -+ data:12; -+}; -+ -+/* The layout of this structure depends on the setup created by mxc_tsadcc_config() */ -+struct mxc_tsadcc_tsc_data { -+ struct mxc_tsadcc_fifo_data pendown[TSC_NUM_SAMPLES]; -+ struct mxc_tsadcc_fifo_data pos_x[TSC_NUM_SAMPLES]; -+ struct mxc_tsadcc_fifo_data pos_y[TSC_NUM_SAMPLES]; -+#ifdef REPORT_PRESSURE -+ struct mxc_tsadcc_fifo_data yn[TSC_NUM_SAMPLES]; -+ struct mxc_tsadcc_fifo_data xp[TSC_NUM_SAMPLES]; -+#endif -+ struct mxc_tsadcc_fifo_data pendown2[TSC_NUM_SAMPLES]; -+}; -+ -+struct mxc_tsadcc_adc_data { -+ struct mxc_tsadcc_fifo_data data[ADC_NUM_SAMPLES]; -+}; -+ -+struct mxc_tsadcc { -+ struct input_dev *input; -+ char phys[32]; -+ void __iomem *reg_base; -+ struct clk *clk; -+ int irq; -+ struct work_struct work; -+ struct timer_list timer; -+ wait_queue_head_t wq; -+ unsigned int pendown:1, -+ clk_enabled:1, -+ attrs:1, -+ valid_measure:1; -+ mxc_tsc_mode tsc_mode; -+ struct mxc_tsadcc_tsc_data *tsc_data; -+ struct mxc_tsadcc_adc_data *adc_data; -+ unsigned int r_xplate; -+ -+ struct mutex convert_mutex; -+ unsigned short pressure; -+ unsigned short prev_absx; -+ unsigned short prev_absy; -+}; -+ -+#ifdef DEBUG -+#define mxc_tsadcc_read(s,reg) _mxc_tsadcc_read(s,reg,#reg,__FUNCTION__) -+#define mxc_tsadcc_write(s,reg,val) _mxc_tsadcc_write(s,reg,val,#reg,__FUNCTION__) -+ -+static inline unsigned long _mxc_tsadcc_read(struct mxc_tsadcc *ts_dev, int reg, -+ const char *name, const char *fn) -+{ -+ unsigned long val = __raw_readl(ts_dev->reg_base + reg); -+ DBG(3, "%s: Read %08lx from %s\n", fn, val, name); -+ return val; -+} -+ -+static inline void _mxc_tsadcc_write(struct mxc_tsadcc *ts_dev, int reg, unsigned long val, -+ const char *name, const char *fn) -+{ -+ __raw_writel(val, ts_dev->reg_base + reg); -+ DBG(3, "%s: Wrote %08lx to %s\n", fn, val, name); -+} -+#else -+static inline unsigned long mxc_tsadcc_read(struct mxc_tsadcc *ts_dev, int reg) -+{ -+ return __raw_readl(ts_dev->reg_base + reg); -+} -+static inline void mxc_tsadcc_write(struct mxc_tsadcc *ts_dev, int reg, unsigned long val) -+{ -+ __raw_writel(val, ts_dev->reg_base + reg); -+} -+#endif -+ -+static void tsc_clk_enable(struct mxc_tsadcc *ts_dev) -+{ -+ if (!ts_dev->clk_enabled) { -+ unsigned long reg; -+ clk_enable(ts_dev->clk); -+ -+ reg = mxc_tsadcc_read(ts_dev, TGCR); -+ reg |= TGCR_IPG_CLK_EN; -+ mxc_tsadcc_write(ts_dev, TGCR, reg); -+ ts_dev->clk_enabled = 1; -+ } -+} -+ -+static void tsc_clk_disable(struct mxc_tsadcc *ts_dev) -+{ -+ if (ts_dev->clk_enabled) { -+ unsigned long reg; -+ -+ reg = mxc_tsadcc_read(ts_dev, TGCR); -+ reg &= ~TGCR_IPG_CLK_EN; -+ mxc_tsadcc_write(ts_dev, TGCR, reg); -+ -+ clk_disable(ts_dev->clk); -+ ts_dev->clk_enabled = 0; -+ } -+} -+ -+static inline int mxc_tsadcc_pendown(struct mxc_tsadcc *ts_dev) -+{ -+ return ts_dev->pendown; -+} -+ -+static int mxc_tsadcc_read_adc(struct mxc_tsadcc *ts_dev, int chan) -+{ -+ int ret = 1; -+ unsigned long reg; -+ unsigned int data_num = 0; -+ int i; -+ union { -+ unsigned int fifo[sizeof(struct mxc_tsadcc_tsc_data) / sizeof(int)]; -+ struct mxc_tsadcc_tsc_data data; -+ } *fifo_data = (void *)ts_dev->adc_data; -+ struct mxc_tsadcc_adc_data *adc_data = ts_dev->adc_data; -+ int lastitemid = 0; -+ struct input_dev *input_dev = ts_dev->input; -+ long timeout = msecs_to_jiffies(1 * ADC_NUM_SAMPLES); -+ -+ mutex_lock(&ts_dev->convert_mutex); -+ reg = (0xf << CQCR_FIFOWATERMARK_SHIFT) | -+ (lastitemid << CQCR_LAST_ITEM_ID_SHIFT) | CQCR_QSM_FQS; -+ mxc_tsadcc_write(ts_dev, GCQCR, reg); -+ -+ reg = ((ADC_NUM_SAMPLES - 1) << CC_NOS_SHIFT) | -+ (16 << CC_SETTLING_TIME_SHIFT) | -+ CC_YPLLSW_OFF | CC_XNURSW_OFF | CC_XPULSW | -+ CC_SELREFP_INT | chan | CC_SEL_REFN_AGND; -+ mxc_tsadcc_write(ts_dev, GCC0, reg); -+ -+ memset(adc_data, 0, sizeof(*adc_data)); -+ -+ reg = mxc_tsadcc_read(ts_dev, GCQCR); -+ reg |= CQCR_FQS; -+ mxc_tsadcc_write(ts_dev, GCQCR, reg); -+ -+ /* enable end of conversion interrupt */ -+ reg = mxc_tsadcc_read(ts_dev, GCQMR); -+ reg &= ~CQMR_EOQ_IRQ_MSK; -+ mxc_tsadcc_write(ts_dev, GCQMR, reg); -+ -+ timeout = wait_event_timeout(ts_dev->wq, -+ mxc_tsadcc_read(ts_dev, GCQSR) & -+ CQSR_EOQ, timeout); -+ if (timeout == 0 && -+ !(mxc_tsadcc_read(ts_dev, GCQSR) & CQSR_EOQ)) { -+ dev_err(&input_dev->dev, -+ "Timeout waiting for data on channel %d\n", -+ chan); -+ ret = -ETIME; -+ goto exit; -+ } -+ -+ reg = mxc_tsadcc_read(ts_dev, GCQCR); -+ reg &= ~CQCR_FQS; -+ mxc_tsadcc_write(ts_dev, GCQCR, reg); -+ reg = mxc_tsadcc_read(ts_dev, GCQSR); -+ -+ /* clear interrupt status bit */ -+ reg = CQSR_EOQ; -+ mxc_tsadcc_write(ts_dev, GCQSR, reg); -+ -+ while (!(mxc_tsadcc_read(ts_dev, GCQSR) & CQSR_EMPT)) { -+ BUG_ON(data_num >= ARRAY_SIZE(fifo_data->fifo)); -+ reg = mxc_tsadcc_read(ts_dev, GCQFIFO); -+ fifo_data->fifo[data_num] = reg; -+ data_num++; -+ } -+ DBG(0, "%s: Read %u words from fifo\n", __FUNCTION__, data_num); -+ for (i = 0; i < data_num; i++) { -+ DBG(0, "%s: data[%d]=%03x ID %d\n", __FUNCTION__, i, -+ adc_data->data[i].data, adc_data->data[i].id); -+ } -+ exit: -+ mutex_unlock(&ts_dev->convert_mutex); -+ -+ return ret; -+} -+ -+struct mxc_tsadcc_attr { -+ struct device_attribute attr; -+ unsigned int reg; -+}; -+ -+#define to_mxc_tsadcc_attr(a) container_of(a, struct mxc_tsadcc_attr, attr) -+ -+#define MXC_TSADCC_DEV_ATTR(_name, _mode, _reg, _read, _write) \ -+ struct mxc_tsadcc_attr mxc_tsadcc_attr_##_name = { \ -+ .attr = __ATTR(_name,_mode,_read,_write), \ -+ .reg = _reg, \ -+ } -+ -+static ssize_t mxc_tsadcc_attr_get(struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ ssize_t ret = -EIO; -+ struct mxc_tsadcc *ts_dev = dev_get_drvdata(dev); -+ struct mxc_tsadcc_attr *mxc_tsadcc_attr = to_mxc_tsadcc_attr(attr); -+ -+ if (mxc_tsadcc_read_adc(ts_dev, mxc_tsadcc_attr->reg)) { -+ ret = sprintf(buf, "0x%04x\n", ts_dev->adc_data->data[0].data); -+ } -+ return ret; -+} -+ -+#if 0 -+static ssize_t mxc_tsadcc_attr_set(struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ ssize_t ret; -+ struct mxc_tsadcc *ts_dev = dev_get_drvdata(dev); -+ struct mxc_tsadcc_attr *mxc_tsadcc_attr = to_mxc_tsadcc_attr(attr); -+ unsigned long val = simple_strtoul(buf, NULL, 0); -+ -+ mxc_tsadcc_write(ts_dev, mxc_tsadcc_attr->reg, val); -+ return count; -+} -+#endif -+ -+MXC_TSADCC_DEV_ATTR(inaux0, S_IRUGO, CC_SELIN_INAUX0, mxc_tsadcc_attr_get, NULL); -+MXC_TSADCC_DEV_ATTR(inaux1, S_IRUGO, CC_SELIN_INAUX1, mxc_tsadcc_attr_get, NULL); -+MXC_TSADCC_DEV_ATTR(inaux2, S_IRUGO, CC_SELIN_INAUX2, mxc_tsadcc_attr_get, NULL); -+ -+static struct attribute *mxc_tsadcc_attrs[] = { -+ &mxc_tsadcc_attr_inaux0.attr.attr, -+ &mxc_tsadcc_attr_inaux1.attr.attr, -+ &mxc_tsadcc_attr_inaux2.attr.attr, -+ NULL -+}; -+ -+static const struct attribute_group mxc_tsadcc_attr_group = { -+ .attrs = mxc_tsadcc_attrs, -+}; -+ -+static int mxc_tsadcc_read_ts(struct mxc_tsadcc *ts_dev, int force) -+{ -+ int ret; -+ unsigned long reg; -+ unsigned int data_num = 0; -+ union { -+ unsigned int fifo[sizeof(struct mxc_tsadcc_tsc_data) / sizeof(int)]; -+ struct mxc_tsadcc_tsc_data data; -+ } *fifo_data = (void *)ts_dev->tsc_data; -+ struct mxc_tsadcc_tsc_data *tsc_data = ts_dev->tsc_data; -+ struct input_dev *input_dev = ts_dev->input; -+ long timeout = msecs_to_jiffies(1 * TSC_NUM_SAMPLES); -+ -+ mutex_lock(&ts_dev->convert_mutex); -+ memset(tsc_data, 0, sizeof(*tsc_data)); -+ if (force) { -+ reg = (0x1 << CC_YPLLSW_SHIFT) | (0x1 << CC_XNURSW_SHIFT) | -+ CC_XPULSW; -+ mxc_tsadcc_write(ts_dev, TICR, reg); -+ -+ /* FQS */ -+ reg = mxc_tsadcc_read(ts_dev, TCQCR); -+ reg &= ~CQCR_QSM_MASK; -+ reg |= CQCR_QSM_FQS; -+ mxc_tsadcc_write(ts_dev, TCQCR, reg); -+ reg = mxc_tsadcc_read(ts_dev, TCQCR); -+ reg |= CQCR_FQS; -+ mxc_tsadcc_write(ts_dev, TCQCR, reg); -+ -+ timeout = wait_event_timeout(ts_dev->wq, -+ mxc_tsadcc_read(ts_dev, TCQSR) & -+ CQSR_EOQ, timeout); -+ if (timeout == 0 && -+ !(mxc_tsadcc_read(ts_dev, TCQSR) & CQSR_EOQ)) { -+ dev_err(&input_dev->dev, -+ "Timeout waiting for TSC data\n"); -+ ret = -ETIME; -+ goto exit; -+ } -+ -+ /* stop FQS */ -+ reg = mxc_tsadcc_read(ts_dev, TCQCR); -+ reg &= ~CQCR_QSM_MASK; -+ mxc_tsadcc_write(ts_dev, TCQCR, reg); -+ reg = mxc_tsadcc_read(ts_dev, TCQCR); -+ reg &= ~CQCR_FQS; -+ mxc_tsadcc_write(ts_dev, TCQCR, reg); -+ -+ /* clear status bit */ -+ reg = mxc_tsadcc_read(ts_dev, TCQSR); -+ reg = CQSR_EOQ; -+ mxc_tsadcc_write(ts_dev, TCQSR, reg); -+ } else { -+ /* Config idle for 4-wire */ -+ reg = TSC_4WIRE_TOUCH_DETECT; -+ mxc_tsadcc_write(ts_dev, TICR, reg); -+ -+ /* Pen interrupt starts new conversion queue */ -+ reg = mxc_tsadcc_read(ts_dev, TCQCR); -+ reg &= ~CQCR_QSM_MASK; -+ reg |= CQCR_QSM_PEN; -+ mxc_tsadcc_write(ts_dev, TCQCR, reg); -+ -+ /* PDEN and PDBEN */ -+ reg = mxc_tsadcc_read(ts_dev, TGCR); -+ reg |= (TGCR_PDB_EN | TGCR_PD_EN); -+ mxc_tsadcc_write(ts_dev, TGCR, reg); -+ -+ wait_event_timeout(ts_dev->wq, -+ mxc_tsadcc_read(ts_dev, TCQSR) & -+ CQSR_EOQ, timeout); -+ if (timeout == 0 && -+ !(mxc_tsadcc_read(ts_dev, TCQSR) & CQSR_EOQ)) { -+ dev_err(&input_dev->dev, -+ "Timeout waiting for TSC data\n"); -+ ret = -ETIME; -+ goto exit; -+ } -+ -+ /* stop the conversion */ -+ reg = mxc_tsadcc_read(ts_dev, TCQCR); -+ reg &= ~CQCR_QSM_MASK; -+ mxc_tsadcc_write(ts_dev, TCQCR, reg); -+ -+ /* clear interrupt status flags */ -+ reg = CQSR_PD | CQSR_EOQ; -+ mxc_tsadcc_write(ts_dev, TCQSR, reg); -+ -+ /* change configuration for FQS mode */ -+ reg = (0x1 << CC_YPLLSW_SHIFT) | (0x1 << CC_XNURSW_SHIFT) | -+ CC_XPULSW; -+ mxc_tsadcc_write(ts_dev, TICR, reg); -+ } -+ -+ while (!(mxc_tsadcc_read(ts_dev, TCQSR) & CQSR_EMPT)) { -+ BUG_ON(data_num >= ARRAY_SIZE(fifo_data->fifo)); -+ reg = mxc_tsadcc_read(ts_dev, TCQFIFO); -+ fifo_data->fifo[data_num] = reg; -+ data_num++; -+ } -+ DBG(0, "%s: Read %u words from fifo\n", __FUNCTION__, data_num); -+ -+ ret = tsc_data->pendown[0].data <= 0x600 && -+ tsc_data->pendown2[0].data <= 0x600; -+ -+ if (ret) { -+ DBG(0, "%s: pos_x=%03x pos_y=%03x\n", -+ __FUNCTION__, tsc_data->pos_x[0].data, -+ tsc_data->pos_y[0].data); -+#ifdef REPORT_PRESSURE -+ DBG(0, "%s: pos_x=%03x pos_y=%03x xp=%03x yn=%03x\n", -+ __FUNCTION__, tsc_data->xp[0].data, -+ tsc_data->yn[0].data); -+#endif -+ if (/*(mxc_tsadcc_read(ts_dev, TCQSR) & CQSR_PD) && */ -+ tsc_data->pos_x[0].data && -+ tsc_data->pos_x[1].data && -+ tsc_data->pos_x[2].data) { -+#ifdef REPORT_PRESSURE -+ ts_dev->pressure = ts_dev->r_xplate * -+ (tsc_data->pos_x[0].data / 4096) * -+ ((tsc_data->yn[0].data - tsc_data->xp[0].data) / -+ tsc_data->xp[0].data); -+#else -+ ts_dev->pressure = 4095; -+#endif -+ DBG(0, "%s: Detected PEN DOWN with pressure %03x\n", -+ __FUNCTION__, ts_dev->pressure); -+ ts_dev->pendown = 1; -+ } else { -+ DBG(0, "%s: Detected PEN UP\n", __FUNCTION__); -+ ts_dev->pendown = 0; -+ } -+ } else { -+ DBG(0, "%s: Discarding measurement\n", __FUNCTION__); -+ ts_dev->pendown = 0; -+ } -+ exit: -+ mutex_unlock(&ts_dev->convert_mutex); -+ -+ return ret; -+} -+ -+static inline void mxc_tsadcc_enable_pendown(struct mxc_tsadcc *ts_dev) -+{ -+ unsigned long reg; -+ -+ /* Config idle for 4-wire */ -+ reg = TSC_4WIRE_TOUCH_DETECT; -+ mxc_tsadcc_write(ts_dev, TICR, reg); -+ -+ DBG(0, "%s: Enable PD detect\n", __FUNCTION__); -+ reg = mxc_tsadcc_read(ts_dev, TGCR); -+ reg |= TGCR_PD_EN; -+ mxc_tsadcc_write(ts_dev, TGCR, reg); -+} -+ -+static void mxc_tsadcc_work(struct work_struct *w) -+{ -+ struct mxc_tsadcc *ts_dev = container_of(w, struct mxc_tsadcc, work); -+ struct input_dev *input_dev = ts_dev->input; -+ -+ if (mxc_tsadcc_read_ts(ts_dev, 1)) { -+ DBG(0, "%s: Got sample %d\n", __FUNCTION__, ts_dev->pendown); -+ if (mxc_tsadcc_pendown(ts_dev)) { -+ if (!ts_dev->valid_measure) { -+ ts_dev->valid_measure = 1; -+ } else { -+ DBG(0, "%s: Reporting PD event %03x @ %03x,%03x\n", -+ __FUNCTION__, ts_dev->pressure, -+ ts_dev->tsc_data->pos_x[0].data, -+ ts_dev->tsc_data->pos_y[0].data); -+ -+ input_report_abs(input_dev, ABS_X, -+ ts_dev->tsc_data->pos_x[0].data); -+ input_report_abs(input_dev, ABS_Y, -+ ts_dev->tsc_data->pos_y[0].data); -+#ifdef REPORT_PRESSURE -+ input_report_abs(input_dev, ABS_PRESSURE, -+ ts_dev->pressure); -+#endif -+ input_report_key(input_dev, BTN_TOUCH, 1); -+ input_sync(input_dev); -+ } -+ ts_dev->prev_absx = ts_dev->tsc_data->pos_x[0].data; -+ ts_dev->prev_absy = ts_dev->tsc_data->pos_y[0].data; -+ DBG(0, "%s: Enabling timer\n", __FUNCTION__); -+ mod_timer(&ts_dev->timer, jiffies + -+ msecs_to_jiffies(10)); -+ return; -+ } -+ } -+ if (ts_dev->valid_measure) { -+ DBG(0, "%s: Reporting PU event: %03x,%03x\n", __FUNCTION__, -+ ts_dev->prev_absx, ts_dev->prev_absy); -+ input_report_abs(input_dev, ABS_X, -+ ts_dev->prev_absx); -+ input_report_abs(input_dev, ABS_Y, -+ ts_dev->prev_absy); -+#ifdef REPORT_PRESSURE -+ input_report_abs(input_dev, ABS_PRESSURE, 0); -+#endif -+ input_report_key(input_dev, BTN_TOUCH, 0); -+ input_sync(input_dev); -+ } -+ ts_dev->valid_measure = 0; -+ mxc_tsadcc_enable_pendown(ts_dev); -+} -+ -+static void mxc_tsadcc_timer(unsigned long data) -+{ -+ struct mxc_tsadcc *ts_dev = (void *)data; -+ schedule_work(&ts_dev->work); -+} -+ -+static irqreturn_t mxc_tsadcc_interrupt(int irq, void *dev) -+{ -+ struct mxc_tsadcc *ts_dev = dev; -+ //struct input_dev *input_dev = ts_dev->input; -+ unsigned long reg; -+ unsigned long status = mxc_tsadcc_read(ts_dev, TGSR); -+ -+ DBG(0, "%s: TCSR= %08lx\n", __FUNCTION__, status); -+ -+ if (status & TGSR_TCQ_INT) { -+ DBG(0, "%s: TCQSR=%08lx\n", __FUNCTION__, -+ mxc_tsadcc_read(ts_dev, TCQSR)); -+ reg = mxc_tsadcc_read(ts_dev, TCQSR); -+ if (reg & CQSR_PD) { -+ /* disable pen down detect */ -+ DBG(0, "%s: Disable PD detect\n", __FUNCTION__); -+ reg = mxc_tsadcc_read(ts_dev, TGCR); -+ reg &= ~TGCR_PD_EN; -+ mxc_tsadcc_write(ts_dev, TGCR, reg); -+ -+ /* Now schedule new measurement */ -+ schedule_work(&ts_dev->work); -+ } -+ } -+ if (status & TGSR_GCQ_INT) { -+ DBG(0, "%s: GCQSR=%08lx\n", __FUNCTION__, -+ mxc_tsadcc_read(ts_dev, GCQSR)); -+ reg = mxc_tsadcc_read(ts_dev, GCQSR); -+ if (reg & CQSR_EOQ) { -+ reg = mxc_tsadcc_read(ts_dev, GCQMR); -+ reg |= CQMR_EOQ_IRQ_MSK; -+ mxc_tsadcc_write(ts_dev, GCQMR, reg); -+ } -+ } -+ return IRQ_HANDLED; -+} -+ -+static void mxc_tsadcc_4wire_config(struct mxc_tsadcc *ts_dev) -+{ -+ unsigned long reg; -+ int lastitemid; -+ -+ /* Level sense */ -+ reg = mxc_tsadcc_read(ts_dev, TCQCR); -+ reg |= CQCR_PD_CFG; -+ reg |= (0xf << CQCR_FIFOWATERMARK_SHIFT); /* watermark */ -+ mxc_tsadcc_write(ts_dev, TCQCR, reg); -+ -+ /* Configure 4-wire */ -+ reg = TSC_4WIRE_PRECHARGE; -+ reg |= CC_IGS; -+ mxc_tsadcc_write(ts_dev, TCC0, reg); -+ -+ reg = TSC_4WIRE_TOUCH_DETECT; -+ reg |= (TSC_NUM_SAMPLES - 1) << CC_NOS_SHIFT; /* 4 samples */ -+ reg |= 32 << CC_SETTLING_TIME_SHIFT; /* it's important! */ -+ mxc_tsadcc_write(ts_dev, TCC1, reg); -+ -+ reg = TSC_4WIRE_X_MEASURE; -+ reg |= (TSC_NUM_SAMPLES - 1) << CC_NOS_SHIFT; /* 4 samples */ -+ reg |= 16 << CC_SETTLING_TIME_SHIFT; /* settling time */ -+ mxc_tsadcc_write(ts_dev, TCC2, reg); -+ -+ reg = TSC_4WIRE_Y_MEASURE; -+ reg |= (TSC_NUM_SAMPLES - 1) << CC_NOS_SHIFT; /* 4 samples */ -+ reg |= 16 << CC_SETTLING_TIME_SHIFT; /* settling time */ -+ mxc_tsadcc_write(ts_dev, TCC3, reg); -+ -+ reg = TSC_4WIRE_YN_MEASURE; -+ reg |= (TSC_NUM_SAMPLES - 1) << CC_NOS_SHIFT; /* 4 samples */ -+ reg |= 16 << CC_SETTLING_TIME_SHIFT; /* settling time */ -+ mxc_tsadcc_write(ts_dev, TCC4, reg); -+ -+ reg = TSC_4WIRE_XP_MEASURE; -+ reg |= (TSC_NUM_SAMPLES - 1) << CC_NOS_SHIFT; /* 4 samples */ -+ reg |= 16 << CC_SETTLING_TIME_SHIFT; /* settling time */ -+ mxc_tsadcc_write(ts_dev, TCC5, reg); -+ -+ reg = (TCQ_ITEM_TCC0 << CQ_ITEM0_SHIFT) | -+ (TCQ_ITEM_TCC1 << CQ_ITEM1_SHIFT) | -+ (TCQ_ITEM_TCC2 << CQ_ITEM2_SHIFT) | -+ (TCQ_ITEM_TCC3 << CQ_ITEM3_SHIFT) | -+ (TCQ_ITEM_TCC0 << CQ_ITEM4_SHIFT) | -+ (TCQ_ITEM_TCC1 << CQ_ITEM5_SHIFT); -+ mxc_tsadcc_write(ts_dev, TCQ_ITEM_7_0, reg); -+ -+ lastitemid = 5; -+ reg = mxc_tsadcc_read(ts_dev, TCQCR); -+ reg = (reg & ~CQCR_LAST_ITEM_ID_MASK) | -+ (lastitemid << CQCR_LAST_ITEM_ID_SHIFT); -+ mxc_tsadcc_write(ts_dev, TCQCR, reg); -+ -+ /* pen down enable */ -+ reg = mxc_tsadcc_read(ts_dev, TCQCR); -+ reg &= ~CQCR_PD_MSK; -+ mxc_tsadcc_write(ts_dev, TCQCR, reg); -+ reg = mxc_tsadcc_read(ts_dev, TCQMR); -+ reg &= ~CQMR_PD_IRQ_MSK; -+ mxc_tsadcc_write(ts_dev, TCQMR, reg); -+ -+ /* Config idle for 4-wire */ -+ reg = TSC_4WIRE_TOUCH_DETECT; -+ mxc_tsadcc_write(ts_dev, TICR, reg); -+ -+ /* Pen interrupt starts new conversion queue */ -+ reg = mxc_tsadcc_read(ts_dev, TCQCR); -+ reg &= ~CQCR_QSM_MASK; -+ reg |= CQCR_QSM_PEN; -+ mxc_tsadcc_write(ts_dev, TCQCR, reg); -+} -+ -+static void mxc_tsadcc_config(struct platform_device *pdev) -+{ -+ struct mxc_tsadcc *ts_dev = platform_get_drvdata(pdev); -+ struct mxc_tsadcc_pdata *pdata = pdev->dev.platform_data; -+ unsigned int tgcr; -+ unsigned int pdbt; -+ unsigned int pdben; -+ unsigned int intref; -+ unsigned int adc_clk = DEFAULT_ADC_CLOCK; -+ unsigned long ipg_clk; -+ unsigned int clkdiv; -+ -+ if (pdata) { -+ pdbt = pdata->pen_debounce_time - 1; -+ pdben = pdata->pen_debounce_time > 0; -+ intref = !!pdata->intref; -+ if (pdata->adc_clk > 0) { -+ adc_clk = pdata->adc_clk; -+ } -+ ts_dev->r_xplate = pdata->r_xplate; -+ } else { -+ dev_dbg(&pdev->dev, "No platform_data; using defaults\n"); -+ pdbt = TGCR_PDBTIME128; -+ pdben = 1; -+ intref = 1; -+ } -+ if (ts_dev->r_xplate == 0) { -+ ts_dev->r_xplate = DEFAULT_RX_VALUE; -+ DBG(0, "%s: Assuming default Rx value of %u Ohms\n", -+ __FUNCTION__, ts_dev->r_xplate); -+ } -+ ipg_clk = clk_get_rate(ts_dev->clk); -+ dev_info(&pdev->dev, "Master clock is: %lu.%06luMHz requested ADC clock: %u.%06uMHz\n", -+ ipg_clk / 1000000, ipg_clk % 1000000, -+ adc_clk / 1000000, adc_clk % 1000000); -+ /* -+ * adc_clk = ipg_clk / (2 * clkdiv + 2) -+ * The exact formula for the clock divider would be: -+ * clkdiv = ipg_clk / (2 * adc_clk) - 1 -+ * but we drop the '- 1' due to integer truncation -+ * and to make sure the actual clock is always less or equal -+ * to the designated clock. -+ */ -+ clkdiv = ipg_clk / (2 * adc_clk + 1); -+ if (clkdiv > 31) { -+ clkdiv = 31; -+ dev_warn(&pdev->dev, -+ "cannot accomodate designated clock of %u.%06uMHz; using %lu.%06luMHz\n", -+ adc_clk / 1000000, adc_clk % 1000000, -+ ipg_clk / (2 * clkdiv + 2) / 1000000, -+ ipg_clk / (2 * clkdiv + 2) % 1000000); -+ } else { -+ dev_dbg(&pdev->dev, -+ "clkdiv=%u actual ADC clock: %lu.%06luMHz\n", -+ clkdiv, ipg_clk / (2 * (clkdiv + 1)) / 1000000, -+ ipg_clk / (2 * clkdiv + 2) % 1000000); -+ } -+ -+ tgcr = ((pdbt << TGCR_PDBTIME_SHIFT) & TGCR_PDBTIME_MASK) | /* pen debounce time */ -+ (pdben * TGCR_PDB_EN) | /* pen debounce enable */ -+ (intref * TGCR_INTREFEN) | /* pen debounce enable */ -+ TGCR_POWER_SAVE | /* Switch TSC on */ -+ TGCR_PD_EN | /* Enable Pen Detect */ -+ ((clkdiv << TGCR_ADCCLKCFG_SHIFT) & TGCR_ADCCLKCFG_MASK); -+ -+ /* reset TSC */ -+ mxc_tsadcc_write(ts_dev, TGCR, TGCR_TSC_RST); -+ while (mxc_tsadcc_read(ts_dev, TGCR) & TGCR_TSC_RST) { -+ cpu_relax(); -+ } -+ mxc_tsadcc_write(ts_dev, TGCR, tgcr); -+ -+ mxc_tsadcc_4wire_config(ts_dev); -+ tsc_clk_enable(ts_dev); -+} -+ -+static int __devinit mxc_tsadcc_probe(struct platform_device *pdev) -+{ -+ int err; -+ struct mxc_tsadcc *ts_dev; -+ struct input_dev *input_dev; -+ struct resource *res; -+ int irq; -+ -+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ if (!res) { -+ dev_err(&pdev->dev, "No mmio resource defined\n"); -+ return -ENODEV; -+ } -+ -+ irq = platform_get_irq(pdev, 0); -+ if (irq < 0) { -+ dev_err(&pdev->dev, "No IRQ assigned\n"); -+ return -ENODEV; -+ } -+ -+ if (!request_mem_region(res->start, resource_size(res), -+ "mxc tsadcc regs")) { -+ return -EBUSY; -+ } -+ -+ /* Allocate memory for device */ -+ ts_dev = kzalloc(sizeof(struct mxc_tsadcc), GFP_KERNEL); -+ if (!ts_dev) { -+ dev_err(&pdev->dev, "Failed to allocate memory\n"); -+ err = -ENOMEM; -+ goto err_release_mem; -+ } -+ -+ /* allocate conversion buffers separately to prevent -+ * cacheline alignment issues when using DMA */ -+ ts_dev->tsc_data = kzalloc(sizeof(struct mxc_tsadcc_tsc_data), GFP_KERNEL); -+ ts_dev->adc_data = kzalloc(sizeof(struct mxc_tsadcc_adc_data), GFP_KERNEL); -+ if (ts_dev->tsc_data == NULL || ts_dev->adc_data == NULL) { -+ err = -ENOMEM; -+ goto err_free_mem; -+ } -+ ts_dev->irq = irq; -+ INIT_WORK(&ts_dev->work, mxc_tsadcc_work); -+ mutex_init(&ts_dev->convert_mutex); -+ setup_timer(&ts_dev->timer, mxc_tsadcc_timer, (unsigned long)ts_dev); -+ init_waitqueue_head(&ts_dev->wq); -+ -+ platform_set_drvdata(pdev, ts_dev); -+ -+ input_dev = input_allocate_device(); -+ if (!input_dev) { -+ dev_err(&pdev->dev, "Failed to allocate input device\n"); -+ err = -ENOMEM; -+ goto err_free_mem; -+ } -+ -+ ts_dev->reg_base = ioremap(res->start, resource_size(res)); -+ if (!ts_dev->reg_base) { -+ dev_err(&pdev->dev, "Failed to map registers\n"); -+ err = -ENOMEM; -+ goto err_free_dev; -+ } -+ -+ err = request_irq(ts_dev->irq, mxc_tsadcc_interrupt, 0, -+ pdev->dev.driver->name, ts_dev); -+ if (err) { -+ dev_err(&pdev->dev, "Failed to install irq handler: %d\n", err); -+ goto err_unmap_regs; -+ } -+ -+ ts_dev->clk = clk_get(&pdev->dev, NULL); -+ if (IS_ERR(ts_dev->clk)) { -+ dev_err(&pdev->dev, "Failed to get ts_clk\n"); -+ err = PTR_ERR(ts_dev->clk); -+ goto err_free_irq; -+ } -+ -+ ts_dev->input = input_dev; -+ -+ snprintf(ts_dev->phys, sizeof(ts_dev->phys), -+ "%s/input0", dev_name(&pdev->dev)); -+ -+ input_dev->name = "mxc touch screen controller"; -+ input_dev->phys = ts_dev->phys; -+ input_dev->dev.parent = &pdev->dev; -+ -+ input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); -+ input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); -+ input_dev->absbit[0] = BIT_MASK(ABS_X) | -+ BIT_MASK(ABS_Y) | -+ BIT_MASK(ABS_PRESSURE); -+ -+ input_set_abs_params(input_dev, ABS_X, 0, 0xFFF, 0, 0); -+ input_set_abs_params(input_dev, ABS_Y, 0, 0xFFF, 0, 0); -+ input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xFFF, 0, 0); -+ -+ mxc_tsadcc_config(pdev); -+ -+ /* All went ok, so register to the input system */ -+ err = input_register_device(input_dev); -+ if (err) -+ goto err_fail; -+ -+ err = sysfs_create_group(&pdev->dev.kobj, &mxc_tsadcc_attr_group); -+ if (err) { -+ dev_warn(&pdev->dev, "Failed to create sysfs attributes: %d\n", -+ err); -+ } -+ ts_dev->attrs = !err; -+ -+ return 0; -+ -+err_fail: -+ clk_disable(ts_dev->clk); -+ clk_put(ts_dev->clk); -+err_free_irq: -+ free_irq(ts_dev->irq, ts_dev); -+err_unmap_regs: -+ iounmap(ts_dev->reg_base); -+err_free_dev: -+ input_free_device(ts_dev->input); -+err_free_mem: -+ kfree(ts_dev->tsc_data); -+ kfree(ts_dev->adc_data); -+ kfree(ts_dev); -+err_release_mem: -+ release_mem_region(res->start, resource_size(res)); -+ return err; -+} -+ -+static int __devexit mxc_tsadcc_remove(struct platform_device *pdev) -+{ -+ struct mxc_tsadcc *ts_dev = dev_get_drvdata(&pdev->dev); -+ struct resource *res; -+ -+ if (ts_dev->attrs) { -+ DBG(0, "%s: Removing sysfs attributes\n", __FUNCTION__); -+ sysfs_remove_group(&pdev->dev.kobj, &mxc_tsadcc_attr_group); -+ } -+ del_timer_sync(&ts_dev->timer); -+ input_unregister_device(ts_dev->input); -+ -+ clk_disable(ts_dev->clk); -+ clk_put(ts_dev->clk); -+ -+ free_irq(ts_dev->irq, ts_dev); -+ -+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -+ iounmap(ts_dev->reg_base); -+ release_mem_region(res->start, resource_size(res)); -+ -+ kfree(ts_dev->tsc_data); -+ kfree(ts_dev->adc_data); -+ kfree(ts_dev); -+ return 0; -+} -+ -+#ifdef CONFIG_PM -+static int mxc_tsadcc_suspend(struct platform_device *pdev, pm_message_t msg) -+{ -+ struct mxc_tsadcc *ts_dev = dev_get_drvdata(&pdev->dev); -+ -+ if (ts_dev->clk_enabled) { -+ tsc_clk_disable(ts_dev); -+ ts_dev->clk_enabled = 1; -+ } -+ return 0; -+} -+ -+static int mxc_tsadcc_resume(struct platform_device *pdev) -+{ -+ struct mxc_tsadcc *ts_dev = dev_get_drvdata(&pdev->dev); -+ -+ if (ts_dev->clk_enabled) { -+ ts_dev->clk_enabled = 0; -+ tsc_clk_enable(ts_dev); -+ } -+ return 0; -+} -+#else -+#define mxc_tsadcc_suspend NULL -+#define mxc_tsadcc_resume NULL -+#endif -+ -+static struct platform_driver mxc_tsadcc_driver = { -+ .probe = mxc_tsadcc_probe, -+ .remove = __devexit_p(mxc_tsadcc_remove), -+ .suspend = mxc_tsadcc_suspend, -+ .resume = mxc_tsadcc_resume, -+ .driver = { -+ .name = "mxc-tsadcc", -+ }, -+}; -+ -+static int __init mxc_tsadcc_init(void) -+{ -+ return platform_driver_register(&mxc_tsadcc_driver); -+} -+ -+static void __exit mxc_tsadcc_exit(void) -+{ -+ platform_driver_unregister(&mxc_tsadcc_driver); -+} -+ -+module_init(mxc_tsadcc_init); -+module_exit(mxc_tsadcc_exit); -+ -+ -+MODULE_LICENSE("GPL"); -+MODULE_DESCRIPTION("i.MX25 TouchScreen Driver"); -+MODULE_AUTHOR("Lothar Wassmann <LW@KARO-electronics.de>"); -+ -Index: linux-2.6.30-karo/drivers/input/touchscreen/mxc_tsadcc.h -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.30-karo/drivers/input/touchscreen/mxc_tsadcc.h 2009-06-23 13:46:20.000000000 +0200 -@@ -0,0 +1,243 @@ -+/* -+ * Freescale i.MX25 Touch Screen Driver -+ * -+ * Copyright (c) 2009 Lothar Wassmann <LW@KARO-electronics.de> -+ * -+ * Based on code from Freescale BSP -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+/* TSC General Config Register */ -+#define TGCR 0x000 -+#define TGCR_IPG_CLK_EN (1 << 0) -+#define TGCR_TSC_RST (1 << 1) -+#define TGCR_FUNC_RST (1 << 2) -+#define TGCR_SLPC (1 << 4) -+#define TGCR_STLC (1 << 5) -+#define TGCR_HSYNC_EN (1 << 6) -+#define TGCR_HSYNC_POL (1 << 7) -+#define TGCR_POWERMODE_SHIFT 8 -+#define TGCR_POWER_OFF (0x0 << TGCR_POWERMODE_SHIFT) -+#define TGCR_POWER_SAVE (0x1 << TGCR_POWERMODE_SHIFT) -+#define TGCR_POWER_ON (0x3 << TGCR_POWERMODE_SHIFT) -+#define TGCR_POWER_MASK (0x3 << TGCR_POWERMODE_SHIFT) -+#define TGCR_INTREFEN (1 << 10) -+#define TGCR_ADCCLKCFG_SHIFT 16 -+#define TGCR_ADCCLKCFG_MASK (0x1f << TGCR_ADCCLKCFG_SHIFT) -+#define TGCR_PD_EN (1 << 23) -+#define TGCR_PDB_EN (1 << 24) -+#define TGCR_PDBTIME_SHIFT 25 -+#define TGCR_PDBTIME128 (0x3f << TGCR_PDBTIME_SHIFT) -+#define TGCR_PDBTIME_MASK (0x7f << TGCR_PDBTIME_SHIFT) -+ -+/* TSC General Status Register */ -+#define TGSR 0x004 -+#define TGSR_TCQ_INT (1 << 0) -+#define TGSR_GCQ_INT (1 << 1) -+#define TGSR_SLP_INT (1 << 2) -+#define TGSR_TCQ_DMA (1 << 16) -+#define TGSR_GCQ_DMA (1 << 17) -+ -+/* TSC IDLE Config Register */ -+#define TICR 0x008 -+ -+/* TouchScreen Convert Queue FIFO Register */ -+#define TCQFIFO 0x400 -+/* TouchScreen Convert Queue Control Register */ -+#define TCQCR 0x404 -+#define CQCR_QSM_SHIFT 0 -+#define CQCR_QSM_STOP (0x0 << CQCR_QSM_SHIFT) -+#define CQCR_QSM_PEN (0x1 << CQCR_QSM_SHIFT) -+#define CQCR_QSM_FQS (0x2 << CQCR_QSM_SHIFT) -+#define CQCR_QSM_FQS_PEN (0x3 << CQCR_QSM_SHIFT) -+#define CQCR_QSM_MASK (0x3 << CQCR_QSM_SHIFT) -+#define CQCR_FQS (1 << 2) -+#define CQCR_RPT (1 << 3) -+#define CQCR_LAST_ITEM_ID_SHIFT 4 -+#define CQCR_LAST_ITEM_ID_MASK (0xf << CQCR_LAST_ITEM_ID_SHIFT) -+#define CQCR_FIFOWATERMARK_SHIFT 8 -+#define CQCR_FIFOWATERMARK_MASK (0xf << CQCR_FIFOWATERMARK_SHIFT) -+#define CQCR_REPEATWAIT_SHIFT 12 -+#define CQCR_REPEATWAIT_MASK (0xf << CQCR_REPEATWAIT_SHIFT) -+#define CQCR_QRST (1 << 16) -+#define CQCR_FRST (1 << 17) -+#define CQCR_PD_MSK (1 << 18) -+#define CQCR_PD_CFG (1 << 19) -+ -+/* TouchScreen Convert Queue Status Register */ -+#define TCQSR 0x408 -+#define CQSR_PD (1 << 0) -+#define CQSR_EOQ (1 << 1) -+#define CQSR_FOR (1 << 4) -+#define CQSR_FUR (1 << 5) -+#define CQSR_FER (1 << 6) -+#define CQSR_EMPT (1 << 13) -+#define CQSR_FULL (1 << 14) -+#define CQSR_FDRY (1 << 15) -+ -+/* TouchScreen Convert Queue Mask Register */ -+#define TCQMR 0x40c -+#define CQMR_PD_IRQ_MSK (1 << 0) -+#define CQMR_EOQ_IRQ_MSK (1 << 1) -+#define CQMR_FOR_IRQ_MSK (1 << 4) -+#define CQMR_FUR_IRQ_MSK (1 << 5) -+#define CQMR_FER_IRQ_MSK (1 << 6) -+#define CQMR_PD_DMA_MSK (1 << 16) -+#define CQMR_EOQ_DMA_MSK (1 << 17) -+#define CQMR_FOR_DMA_MSK (1 << 20) -+#define CQMR_FUR_DMA_MSK (1 << 21) -+#define CQMR_FER_DMA_MSK (1 << 22) -+#define CQMR_FDRY_DMA_MSK (1 << 31) -+ -+/* TouchScreen Convert Queue ITEM 7~0 */ -+#define TCQ_ITEM_7_0 0x420 -+ -+/* TouchScreen Convert Queue ITEM 15~8 */ -+#define TCQ_ITEM_15_8 0x424 -+ -+#define TCQ_ITEM_TCC0 0x0 -+#define TCQ_ITEM_TCC1 0x1 -+#define TCQ_ITEM_TCC2 0x2 -+#define TCQ_ITEM_TCC3 0x3 -+#define TCQ_ITEM_TCC4 0x4 -+#define TCQ_ITEM_TCC5 0x5 -+#define TCQ_ITEM_TCC6 0x6 -+#define TCQ_ITEM_TCC7 0x7 -+#define TCQ_ITEM_GCC7 0x8 -+#define TCQ_ITEM_GCC6 0x9 -+#define TCQ_ITEM_GCC5 0xa -+#define TCQ_ITEM_GCC4 0xb -+#define TCQ_ITEM_GCC3 0xc -+#define TCQ_ITEM_GCC2 0xd -+#define TCQ_ITEM_GCC1 0xe -+#define TCQ_ITEM_GCC0 0xf -+ -+/* TouchScreen Convert Config 0-7 */ -+#define TCC0 0x440 -+#define TCC1 0x444 -+#define TCC2 0x448 -+#define TCC3 0x44c -+#define TCC4 0x450 -+#define TCC5 0x454 -+#define TCC6 0x458 -+#define TCC7 0x45c -+#define CC_PEN_IACK (1 << 1) -+#define CC_SEL_REFN_SHIFT 2 -+#define CC_SEL_REFN_YNLR (0x1 << CC_SEL_REFN_SHIFT) -+#define CC_SEL_REFN_AGND (0x2 << CC_SEL_REFN_SHIFT) -+#define CC_SEL_REFN_MASK (0x3 << CC_SEL_REFN_SHIFT) -+#define CC_SELIN_SHIFT 4 -+#define CC_SELIN_XPUL (0x0 << CC_SELIN_SHIFT) -+#define CC_SELIN_YPLL (0x1 << CC_SELIN_SHIFT) -+#define CC_SELIN_XNUR (0x2 << CC_SELIN_SHIFT) -+#define CC_SELIN_YNLR (0x3 << CC_SELIN_SHIFT) -+#define CC_SELIN_WIPER (0x4 << CC_SELIN_SHIFT) -+#define CC_SELIN_INAUX0 (0x5 << CC_SELIN_SHIFT) -+#define CC_SELIN_INAUX1 (0x6 << CC_SELIN_SHIFT) -+#define CC_SELIN_INAUX2 (0x7 << CC_SELIN_SHIFT) -+#define CC_SELIN_MASK (0x7 << CC_SELIN_SHIFT) -+#define CC_SELREFP_SHIFT 7 -+#define CC_SELREFP_YPLL (0x0 << CC_SELREFP_SHIFT) -+#define CC_SELREFP_XPUL (0x1 << CC_SELREFP_SHIFT) -+#define CC_SELREFP_EXT (0x2 << CC_SELREFP_SHIFT) -+#define CC_SELREFP_INT (0x3 << CC_SELREFP_SHIFT) -+#define CC_SELREFP_MASK (0x3 << CC_SELREFP_SHIFT) -+#define CC_XPULSW (1 << 9) -+#define CC_XNURSW_SHIFT 10 -+#define CC_XNURSW_HIGH (0x0 << CC_XNURSW_SHIFT) -+#define CC_XNURSW_OFF (0x1 << CC_XNURSW_SHIFT) -+#define CC_XNURSW_LOW (0x3 << CC_XNURSW_SHIFT) -+#define CC_XNURSW_MASK (0x3 << CC_XNURSW_SHIFT) -+#define CC_YPLLSW_SHIFT 12 -+#define CC_YPLLSW_HIGH (0x0 << CC_YPLLSW_SHIFT) -+#define CC_YPLLSW_OFF (0x1 << CC_YPLLSW_SHIFT) -+#define CC_YPLLSW_LOW (0x3 << CC_YPLLSW_SHIFT) -+#define CC_YPLLSW_MASK (0x3 << CC_YPLLSW_SHIFT) -+#define CC_YNLRSW (1 << 14) -+#define CC_WIPERSW (1 << 15) -+#define CC_NOS_SHIFT 16 -+#define CC_NOS_MASK (0xf << CC_NOS_SHIFT) -+#define CC_IGS (1 << 20) -+#define CC_SETTLING_TIME_SHIFT 24 -+#define CC_SETTLING_TIME_MASK (0xff << CC_SETTLING_TIME_SHIFT) -+ -+#define TSC_4WIRE_PRECHARGE 0x158c -+#define TSC_4WIRE_TOUCH_DETECT 0x578e -+ -+#define TSC_4WIRE_X_MEASURE 0x1c90 -+#define TSC_4WIRE_Y_MEASURE 0x4604 -+#define TSC_4WIRE_XP_MEASURE 0x0f8c -+#define TSC_4WIRE_YN_MEASURE 0x0fbc -+ -+#define TSC_GENERAL_ADC_GCC0 0x17dc -+#define TSC_GENERAL_ADC_GCC1 0x17ec -+#define TSC_GENERAL_ADC_GCC2 0x17fc -+ -+/* GeneralADC Convert Queue FIFO Register */ -+#define GCQFIFO 0x800 -+#define GCQFIFO_ADCOUT_SHIFT 4 -+#define GCQFIFO_ADCOUT_MASK (0xfff << GCQFIFO_ADCOUT_SHIFT) -+ -+/* GeneralADC Convert Queue Control Register */ -+#define GCQCR 0x804 -+ -+/* GeneralADC Convert Queue Status Register */ -+#define GCQSR 0x808 -+ -+/* GeneralADC Convert Queue Mask Register */ -+#define GCQMR 0x80c -+ -+/* GeneralADC Convert Queue ITEM 7~0 */ -+#define GCQ_ITEM_7_0 0x820 -+ -+/* GeneralADC Convert Queue ITEM 15~8 */ -+#define GCQ_ITEM_15_8 0x824 -+ -+#define CQ_ITEM7_SHIFT 28 -+#define CQ_ITEM6_SHIFT 24 -+#define CQ_ITEM5_SHIFT 20 -+#define CQ_ITEM4_SHIFT 16 -+#define CQ_ITEM3_SHIFT 12 -+#define CQ_ITEM2_SHIFT 8 -+#define CQ_ITEM1_SHIFT 4 -+#define CQ_ITEM0_SHIFT 0 -+ -+#define CQ_ITEM8_SHIFT 28 -+#define CQ_ITEM9_SHIFT 24 -+#define CQ_ITEM10_SHIFT 20 -+#define CQ_ITEM11_SHIFT 16 -+#define CQ_ITEM12_SHIFT 12 -+#define CQ_ITEM13_SHIFT 8 -+#define CQ_ITEM14_SHIFT 4 -+#define CQ_ITEM15_SHIFT 0 -+ -+#define GCQ_ITEM_GCC0 0x0 -+#define GCQ_ITEM_GCC1 0x1 -+#define GCQ_ITEM_GCC2 0x2 -+#define GCQ_ITEM_GCC3 0x3 -+ -+/* GeneralADC Convert Config 0-7 */ -+#define GCC0 0x840 -+#define GCC1 0x844 -+#define GCC2 0x848 -+#define GCC3 0x84c -+#define GCC4 0x850 -+#define GCC5 0x854 -+#define GCC6 0x858 -+#define GCC7 0x85c -+ -+/* TSC Test Register R/W */ -+#define TTR 0xc00 -+/* TSC Monitor Register 1, 2 */ -+#define MNT1 0xc04 -+#define MNT2 0xc04 -+ -+#define DETECT_ITEM_ID_1 1 -+#define DETECT_ITEM_ID_2 5 -+#define TS_X_ITEM_ID 2 -+#define TS_Y_ITEM_ID 3 -+#define TSI_DATA 1 -+#define FQS_DATA 0 |