Index: linux-2.6.11/drivers/soc/tsc2101.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.11/drivers/soc/tsc2101.h	2005-04-21 16:18:54.000000000 +0100
@@ -0,0 +1,144 @@
+/*
+ * TI TSC2101 Hardware definitions
+ *
+ * Copyright 2005 Openedhand Ltd.
+ *
+ * Author: Richard Purdie <richard@o-hand.com>
+ *
+ * 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.
+ *
+ */
+
+/* Address constructs */
+#define TSC2101_READ     (1 << 15)    /* Read Register */
+#define TSC2101_WRITE    (0 << 15)    /* Write Register */
+#define TSC2101_PAGE(x)  ((x & 0xf) << 11) /* Memory Page to access */
+#define TSC2101_ADDR(x)  ((x & 0x3f) << 5) /* Memory Address to access */
+
+#define TSC2101_P0_REG(x) (TSC2101_PAGE(0) | TSC2101_ADDR(x))
+#define TSC2101_P1_REG(x) (TSC2101_PAGE(1) | TSC2101_ADDR(x))
+#define TSC2101_P2_REG(x) (TSC2101_PAGE(2) | TSC2101_ADDR(x))
+#define TSC2101_P3_REG(x) (TSC2101_PAGE(3) | TSC2101_ADDR(x))
+
+/* Page 0 Registers */
+#define TSC2101_REG_X      TSC2101_P0_REG(0x0)
+#define TSC2101_REG_Y      TSC2101_P0_REG(0x1)
+#define TSC2101_REG_Z1     TSC2101_P0_REG(0x2)
+#define TSC2101_REG_Z2     TSC2101_P0_REG(0x3)
+#define TSC2101_REG_BAT    TSC2101_P0_REG(0x5)
+#define TSC2101_REG_AUX1   TSC2101_P0_REG(0x7)
+#define TSC2101_REG_AUX2   TSC2101_P0_REG(0x8)
+#define TSC2101_REG_TEMP1  TSC2101_P0_REG(0x9)
+#define TSC2101_REG_TEMP2  TSC2101_P0_REG(0xa)
+
+/* Page 1 Registers */
+#define TSC2101_REG_ADC       TSC2101_P1_REG(0x0)
+#define TSC2101_REG_STATUS    TSC2101_P1_REG(0x1)
+#define TSC2101_REG_BUFMODE   TSC2101_P1_REG(0x2)
+#define TSC2101_REG_REF       TSC2101_P1_REG(0x3)
+#define TSC2101_REG_RESETCTL  TSC2101_P1_REG(0x4)
+#define TSC2101_REG_CONFIG    TSC2101_P1_REG(0x5)
+#define TSC2101_REG_TEMPMAX   TSC2101_P1_REG(0x6)
+#define TSC2101_REG_TEMPMIN   TSC2101_P1_REG(0x7)
+#define TSC2101_REG_AUX1MAX   TSC2101_P1_REG(0x8)
+#define TSC2101_REG_AUX1MIN   TSC2101_P1_REG(0x9)
+#define TSC2101_REG_AUX2MAX   TSC2101_P1_REG(0xa)
+#define TSC2101_REG_AUX2MIN   TSC2101_P1_REG(0xb)
+#define TSC2101_REG_MEASURE   TSC2101_P1_REG(0xc)
+#define TSC2101_REG_DELAY     TSC2101_P1_REG(0xd)
+
+#define TSC2101_REG_GPIO      TSC2101_P2_REG(0x23)
+
+/* Page 2 Registers */
+
+//#define TSC2101_REG_ADC       TSC2101_P2_REG(0x0)
+//#define TSC2101_REG_STATUS    TSC2101_P2_REG(0x1)
+//#define TSC2101_REG_BUFMODE   TSC2101_P2_REG(0x2)
+//#define TSC2101_REG_REF       TSC2101_P2_REG(0x3)
+//#define TSC2101_REG_RESETCTL  TSC2101_P2_REG(0x4)
+//#define TSC2101_REG_CONFIG    TSC2101_P2_REG(0x5)
+//#define TSC2101_REG_TEMPMAX   TSC2101_P2_REG(0x6)
+//#define TSC2101_REG_TEMPMIN   TSC2101_P2_REG(0x7)
+//#define TSC2101_REG_AUX1MAX   TSC2101_P2_REG(0x8)
+//#define TSC2101_REG_AUX1MIN   TSC2101_P2_REG(0x9)
+//#define TSC2101_REG_AUX2MAX   TSC2101_P2_REG(0xa)
+//#define TSC2101_REG_AUX2MIN   TSC2101_P2_REG(0xb)
+//#define TSC2101_REG_MEASURE   TSC2101_P2_REG(0xc)
+//#define TSC2101_REG_DELAY     TSC2101_P2_REG(0xd)
+
+/* Status Register Masks */
+
+#define TSC2101_STATUS_T2STAT   (1 << 1)
+#define TSC2101_STATUS_T1STAT   (1 << 2)
+#define TSC2101_STATUS_AX2STAT  (1 << 3)
+#define TSC2101_STATUS_AX1STAT  (1 << 4)
+#define TSC2101_STATUS_BSTAT    (1 << 6)
+#define TSC2101_STATUS_Z2STAT   (1 << 7)
+#define TSC2101_STATUS_Z1STAT   (1 << 8)
+#define TSC2101_STATUS_YSTAT    (1 << 9)
+#define TSC2101_STATUS_XSTAT    (1 << 10)
+#define TSC2101_STATUS_DAVAIL   (1 << 11)     
+#define TSC2101_STATUS_HCTLM    (1 << 12)
+#define TSC2101_STATUS_PWRDN    (1 << 13)
+#define TSC2101_STATUS_PINTDAV_SHIFT (14)
+#define TSC2101_STATUS_PINTDAV_MASK  (0x03)
+
+
+
+
+
+
+
+#define TSC2101_ADC_PSM_TSC2101 (1<<15) // pen status mode on ctrlreg adc
+#define TSC2101_ADC_STS (1<<14) // stop continuous scanning.
+#define TSC2101_ADC_AD3 (1<<13) 
+#define TSC2101_ADC_AD2 (1<<12) 
+#define TSC2101_ADC_AD1 (1<<11) 
+#define TSC2101_ADC_AD0 (1<<10) 
+#define TSC2101_ADC_RES(x) ((x<<8) & TSC2101_ADC_RES_MASK )
+#define TSC2101_ADC_RES_MASK (0x3<<8)  
+#define TSC2101_ADC_RES_12BITP (0) // 12-bit ADC resolution (default)
+#define TSC2101_ADC_RES_8BIT (1) // 8-bit ADC resolution
+#define TSC2101_ADC_RES_10BIT (2) // 10-bit ADC resolution
+#define TSC2101_ADC_RES_12BIT (3) // 12-bit ADC resolution
+
+#define TSC2101_ADC_AVG(x) ((x<<6) & TSC2101_ADC_AVG_MASK )
+#define TSC2101_ADC_AVG_MASK (0x3<<6)  
+#define TSC2101_ADC_NOAVG (0) //  a-d does no averaging
+#define TSC2101_ADC_4AVG (1) //  a-d does averaging of 4 samples
+#define TSC2101_ADC_8AVG (2) //  a-d does averaging of 8 samples
+#define TSC2101_ADC_16AVG (3) //  a-d does averaging of 16 samples
+
+#define TSC2101_ADC_CL(x) ((x<<4) & TSC2101_ADC_CL_MASK )
+#define TSC2101_ADC_CL_MASK (0x3<<4)
+#define TSC2101_ADC_CL_8MHZ_8BIT (0)
+#define TSC2101_ADC_CL_4MHZ_10BIT (1)
+#define TSC2101_ADC_CL_2MHZ_12BIT (2)
+#define TSC2101_ADC_CL_1MHZ_12BIT (3)
+#define TSC2101_ADC_CL0 (1<< 4)  
+
+/* ADC - Panel Voltage Stabilisation Time */
+#define TSC2101_ADC_PV(x)     ((x<<1) & TSC2101_ADC_PV_MASK )
+#define TSC2101_ADC_PV_MASK   (0x7<<1)
+#define TSC2101_ADC_PV_100ms  (0x7)  /* 100ms */
+#define TSC2101_ADC_PV_50ms   (0x6)  /* 50ms  */
+#define TSC2101_ADC_PV_10ms   (0x5)  /* 10ms  */
+#define TSC2101_ADC_PV_5ms    (0x4)  /* 5ms   */
+#define TSC2101_ADC_PV_1ms    (0x3)  /* 1ms   */
+#define TSC2101_ADC_PV_500us  (0x2)  /* 500us */
+#define TSC2101_ADC_PV_100us  (0x1)  /* 100us */
+#define TSC2101_ADC_PV_0s     (0x0)  /* 0s    */
+
+#define TSC2101_ADC_AVGFILT_MEAN     (0<<0)  /* Mean Average Filter */
+#define TSC2101_ADC_AVGFILT_MEDIAN   (1<<0)  /* Median Average Filter */
+
+#define TSC2101_ADC_x (1<< 0) // don't care
+
+#define TSC2101_CONFIG_DAV (1<<6)
+
+#define TSC2101_KEY_STC (1<<15) // keypad status
+#define TSC2101_KEY_SCS (1<<14) // keypad scan status
+
+
Index: linux-2.6.11/drivers/soc/Kconfig
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.11/drivers/soc/Kconfig	2005-04-21 16:18:54.000000000 +0100
@@ -0,0 +1,16 @@
+#
+# SoC drivers
+#
+# System-on-Chip are chips that implement a number of virtually unrelated
+# functions but sharing some common circuitry, for example power management
+# or an auxiliary interrupt controller.
+#
+
+menu "SoC drivers"
+
+config SOC_TSC2101
+	bool 
+	help
+	  Support for TI TSC2101 Touchscreen and Audio Codec
+
+endmenu
Index: linux-2.6.11/drivers/input/touchscreen/tsc2101_ts.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.11/drivers/input/touchscreen/tsc2101_ts.c	2005-04-21 16:18:54.000000000 +0100
@@ -0,0 +1,216 @@
+/*
+ * Texas Instruments TSC2101 Touchscreen Driver
+ *
+ * Copyright 2005 Openedhand Ltd.
+ *
+ * Author: Richard Purdie <richard@o-hand.com>
+ *
+ * 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/delay.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/soc/tsc2101.h>
+#include <asm/irq.h>
+#include <asm/arch/hx2750.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/pxa-regs.h>
+
+#define X_AXIS_MAX		3830
+#define X_AXIS_MIN		150
+#define Y_AXIS_MAX		3830
+#define Y_AXIS_MIN		190
+#define PRESSURE_MIN	0
+#define PRESSURE_MAX	20000
+
+extern struct ts_device hx_ts;
+
+struct tsc2101_ts_t {
+	struct input_dev inputdevice;
+	struct timer_list ts_timer;      // Timer for triggering acquisitions
+	int pendown;
+	int irq;
+	struct ts_device *dev;
+	spinlock_t lock;
+};
+
+
+
+static void ts_report(struct tsc2101_ts_t *tsc2101_ts, int x, int y, int p, int pendown)
+{
+	input_report_abs(&(tsc2101_ts->inputdevice), ABS_X, x);
+	input_report_abs(&(tsc2101_ts->inputdevice), ABS_Y, y);
+	input_report_abs(&(tsc2101_ts->inputdevice), ABS_PRESSURE, p);
+	input_report_key(&(tsc2101_ts->inputdevice), BTN_TOUCH, pendown);
+	input_sync(&(tsc2101_ts->inputdevice));
+
+	return;
+}
+
+
+static void ts_interrupt_main(struct tsc2101_ts_t *tsc2101_ts, int isTimer, struct pt_regs *regs)
+{
+	struct tsc2101_ts_event ts_data;
+	
+	if (!tsc2101_ts->dev->penup()) {
+		tsc2101_ts->pendown = 1;
+		tsc2101_ts->dev->read(&ts_data);
+		ts_report(tsc2101_ts, ts_data.x, ts_data.y, ts_data.p, 1);
+		mod_timer(&(tsc2101_ts->ts_timer), jiffies + HZ / 100);
+	} else {
+		if (tsc2101_ts->pendown > 0 && tsc2101_ts->pendown < 3) {
+			mod_timer(&(tsc2101_ts->ts_timer), jiffies + HZ / 100);
+			tsc2101_ts->pendown++;
+			return;
+		}
+				
+		if (tsc2101_ts->pendown) 
+			ts_report(tsc2101_ts, 0, 0, 0, 0);
+
+		tsc2101_ts->pendown = 0;
+
+		set_irq_type(tsc2101_ts->irq,IRQT_FALLING);
+
+		/* This must be checked after set_irq_type() to make sure no data was missed */
+		if ((GPLR(HX2750_GPIO_PENDOWN) & GPIO_bit(HX2750_GPIO_PENDOWN)) == 0) {
+			tsc2101_ts->dev->read(&ts_data);
+			mod_timer(&(tsc2101_ts->ts_timer), jiffies + HZ / 100);
+		} 
+	}
+}
+
+
+static void tsc2101_ts_timer(unsigned long data)
+{
+	unsigned long flags;
+	struct tsc2101_ts_t *tsc2101_ts = (struct tsc2101_ts_t *) data;
+
+	spin_lock_irqsave(&tsc2101_ts->lock, flags);
+	ts_interrupt_main(tsc2101_ts, 1, NULL);
+	spin_unlock_irqrestore(&tsc2101_ts->lock, flags);
+}
+
+static irqreturn_t tsc2101_ts_handler(int irq, void *dev_id, struct pt_regs *regs)
+{
+	unsigned long flags;
+	struct tsc2101_ts_t *tsc2101_ts = dev_id;
+	
+	spin_lock_irqsave(&tsc2101_ts->lock, flags);
+	set_irq_type(tsc2101_ts->irq,IRQT_NOEDGE);
+	ts_interrupt_main(tsc2101_ts, 0, regs);
+	spin_unlock_irqrestore(&tsc2101_ts->lock, flags);
+
+	return IRQ_HANDLED;
+}
+
+static int __init tsc2101_ts_probe(struct device *dev)
+{
+	struct tsc2101_ts_t *tsc2101_ts;
+
+	if (!(tsc2101_ts = kcalloc(1, sizeof(struct tsc2101_ts_t), GFP_KERNEL)))
+		return -ENOMEM;
+	
+	dev_set_drvdata(dev,tsc2101_ts);
+	
+	spin_lock_init(&tsc2101_ts->lock);
+
+	tsc2101_ts->dev = &hx_ts;
+	tsc2101_ts->irq = HX2750_IRQ_GPIO_PENDOWN;
+
+	init_timer(&tsc2101_ts->ts_timer);
+	tsc2101_ts->ts_timer.data = (unsigned long) tsc2101_ts;
+	tsc2101_ts->ts_timer.function = tsc2101_ts_timer;
+	
+	init_input_dev(&(tsc2101_ts->inputdevice));
+	tsc2101_ts->inputdevice.name = "tsc2101_ts";
+	tsc2101_ts->inputdevice.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS);
+	tsc2101_ts->inputdevice.keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH);
+	input_set_abs_params(&tsc2101_ts->inputdevice, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0);
+	input_set_abs_params(&tsc2101_ts->inputdevice, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0);
+	input_set_abs_params(&tsc2101_ts->inputdevice, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0);
+	input_register_device(&(tsc2101_ts->inputdevice));
+
+	tsc2101_ts->dev->enable();
+
+	/* request irq */
+	if (request_irq(tsc2101_ts->irq, tsc2101_ts_handler, 0, "tsc2101_ts", tsc2101_ts)) {
+		printk(KERN_ERR "tsc2101_ts.c: Could not allocate touchscreen IRQ!\n");
+		tsc2101_ts->irq = -1;
+		return -EINVAL;
+	}
+	set_irq_type(tsc2101_ts->irq,IRQT_FALLING);
+
+	printk("tsc2101 touchscreen driver initialized\n");
+
+	return 0;
+}
+
+static int __exit tsc2101_ts_remove(struct device *dev)
+{
+	struct tsc2101_ts_t *tsc2101_ts = dev_get_drvdata(dev);
+	
+	tsc2101_ts->dev->disable();
+	input_unregister_device(&tsc2101_ts->inputdevice);
+	if (tsc2101_ts->irq != -1)
+		free_irq(tsc2101_ts->irq, tsc2101_ts);
+
+	tsc2101_ts->dev->remove();
+
+	return 0;
+}
+
+static int tsc2101_ts_suspend(struct device *dev, u32 state, u32 level)
+{
+	struct tsc2101_ts_t *tsc2101_ts = dev_get_drvdata(dev);
+	
+	if (level == SUSPEND_POWER_DOWN) {
+		tsc2101_ts->dev->disable();
+		hx2750_ssp_suspend();
+	}
+	
+	return 0;
+}
+
+static int tsc2101_ts_resume(struct device *dev, u32 level)
+{
+	struct tsc2101_ts_t *tsc2101_ts = dev_get_drvdata(dev);
+	
+	if (level == RESUME_POWER_ON) {
+		hx2750_ssp_resume();
+		tsc2101_ts->dev->enable();
+	}
+
+	return 0;
+}
+
+static struct device_driver tsc2101_ts_driver = {
+	.name 		= "tsc2101_ts",
+	.bus 		= &platform_bus_type,
+	.probe 		= tsc2101_ts_probe,
+	.remove 	= __exit_p(tsc2101_ts_remove),
+	.suspend 	= tsc2101_ts_suspend,
+	.resume 	= tsc2101_ts_resume,
+};
+
+static int __init tsc2101_ts_init(void)
+{
+	return driver_register(&tsc2101_ts_driver);
+}
+
+static void __exit tsc2101_ts_exit(void)
+{
+	driver_unregister(&tsc2101_ts_driver);
+}
+
+module_init(tsc2101_ts_init);
+module_exit(tsc2101_ts_exit);
+
+MODULE_LICENSE("GPL");
Index: linux-2.6.11/drivers/input/touchscreen/Kconfig
===================================================================
--- linux-2.6.11.orig/drivers/input/touchscreen/Kconfig	2005-04-21 16:10:26.000000000 +0100
+++ linux-2.6.11/drivers/input/touchscreen/Kconfig	2005-04-21 16:18:54.000000000 +0100
@@ -35,3 +35,16 @@
 	  To compile this driver as a module, choose M here: the
 	  module will be called gunze.
 
+config TOUCHSCREEN_TSC2101
+	tristate "TI TSC2101 touchscreen input driver"
+	depends on MACH_HX2750 && INPUT && INPUT_TOUCHSCREEN
+	default y	
+	help
+	  Say Y here to enable the touchscreen driver for the Texas 
+	  Instruments TSC2101 SoC Device.
+
+	  If unsure, say N.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called ads7846_ts.
+	
\ No newline at end of file
Index: linux-2.6.11/drivers/input/touchscreen/Makefile
===================================================================
--- linux-2.6.11.orig/drivers/input/touchscreen/Makefile	2005-04-21 16:10:26.000000000 +0100
+++ linux-2.6.11/drivers/input/touchscreen/Makefile	2005-04-21 16:18:54.000000000 +0100
@@ -6,3 +6,4 @@
 
 obj-$(CONFIG_TOUCHSCREEN_BITSY)	+= h3600_ts_input.o
 obj-$(CONFIG_TOUCHSCREEN_GUNZE)	+= gunze.o
+obj-$(CONFIG_TOUCHSCREEN_TSC2101)	+= tsc2101_ts.o
Index: linux-2.6.11/drivers/soc/tsc2101.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.11/drivers/soc/tsc2101.c	2005-04-21 16:18:54.000000000 +0100
@@ -0,0 +1,134 @@
+/*
+ * TI TSC2102 Common Code
+ *
+ * Copyright 2005 Openedhand Ltd.
+ *
+ * Author: Richard Purdie <richard@o-hand.com>
+ *
+ * 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/delay.h>
+#include <linux/device.h>
+#include <linux/init.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/soc/tsc2101.h> 
+#include "tsc2101.h"
+
+
+
+//struct tsc2101_dev_params = {
+//	.sendcmd = ,
+//	.write   =,
+//};
+extern int hx2750_tsc2101_send(int write, int command, int *values, int numval);
+
+static int tsc2101_regread(int regnum)
+{
+	int reg;
+	hx2750_tsc2101_send(TSC2101_READ, regnum, &reg, 1);
+	return reg;
+}
+
+static void tsc2101_regwrite(int regnum, int value)
+{
+	int reg=value;
+	hx2750_tsc2101_send(TSC2101_WRITE, regnum, &reg, 1);
+	return;
+}
+
+static int tsc2101_ts_penup(void)
+{
+	return !( tsc2101_regread(TSC2101_REG_STATUS) & TSC2101_STATUS_DAVAIL);
+}
+
+static void tsc2101_ts_read(struct tsc2101_ts_event *ts_data)
+{
+	int z1,z2;
+	u32 values[4];
+
+	/* Read X, Y, Z1 and Z2 */
+	hx2750_tsc2101_send(TSC2101_READ, TSC2101_REG_X, &values[0], 4);
+
+	ts_data->x=values[0];
+	ts_data->y=values[1];
+	z1=values[2];
+	z2=values[3];
+
+	/* Calculate Pressure */
+	if ((z1 != 0) && (ts_data->x!=0) && (ts_data->y!=0)) 
+		ts_data->p = ((ts_data->x * (z2 -z1) / z1));
+	else
+		ts_data->p=0;
+}
+
+#define TSC2101_DATA_AVAILABLE         0x4000
+#define TSC2101_BUFFERMODE_DISABLE     0x0
+#define TSC2101_REF_POWERUP            0x16
+#define TSC2101_ENABLE_TOUCHDETECT     0x08
+#define TSC2101_PRG_DELAY              0x0900
+#define TSC2101_ADC_CONTROL            0x8874
+#define TSC2101_ADC_POWERDOWN          0x4000
+
+static void tsc2101_ts_enable(void)
+{
+	//omap_tsc2101_enable();
+	
+	/* PINTDAV is data available only */
+	tsc2101_regwrite(TSC2101_REG_STATUS, TSC2101_DATA_AVAILABLE);
+
+	/* disable buffer mode */
+	tsc2101_regwrite(TSC2101_REG_BUFMODE, TSC2101_BUFFERMODE_DISABLE);
+
+	/* use internal reference, 100 usec power-up delay,
+	 *	  * power down between conversions, 1.25V internal reference */
+	tsc2101_regwrite(TSC2101_REG_REF, TSC2101_REF_POWERUP);
+			   
+	/* enable touch detection, 84usec precharge time, 32 usec sense time */
+	tsc2101_regwrite(TSC2101_REG_CONFIG, TSC2101_ENABLE_TOUCHDETECT);
+			   
+	/* 3 msec conversion delays  */
+	tsc2101_regwrite(TSC2101_REG_DELAY, TSC2101_PRG_DELAY);
+	
+	/*
+	 * TSC2101-controlled conversions
+	 * 12-bit samples
+	 * continuous X,Y,Z1,Z2 scan mode
+	 * average (mean) 4 samples per coordinate
+	 * 1 MHz internal conversion clock
+	 * 500 usec panel voltage stabilization delay
+	 */
+	tsc2101_regwrite(TSC2101_REG_ADC, TSC2101_ADC_CONTROL);
+//0x8874
+
+	return;
+
+}
+
+static void tsc2101_ts_disable(void)
+{
+	//printk("tsc2101_ts_disable\n");
+	/* stop conversions and power down */
+	tsc2101_regwrite(TSC2101_REG_ADC, TSC2101_ADC_POWERDOWN);
+
+	//omap_tsc2101_disable();
+}
+
+
+
+
+struct ts_device hx_ts = {
+//	.probe 		= tsc2101_ts_probe,
+	.read 		= tsc2101_ts_read,
+	.enable 	= tsc2101_ts_enable,
+	.disable 	= tsc2101_ts_disable,
+	.remove 	= __exit_p(tsc2101_ts_remove),
+	.penup 		= tsc2101_ts_penup,
+};
+
Index: linux-2.6.11/drivers/soc/Makefile
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.11/drivers/soc/Makefile	2005-04-21 16:18:54.000000000 +0100
@@ -0,0 +1,5 @@
+#
+# Makefile for SoC drivers.
+#
+
+obj-$(CONFIG_SOC_TSC2101)      += tsc2101.o
Index: linux-2.6.11/include/linux/soc/tsc2101.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.11/include/linux/soc/tsc2101.h	2005-04-21 16:18:54.000000000 +0100
@@ -0,0 +1,31 @@
+/*
+ * TI TSC2101 Structure Definitions
+ *
+ * Copyright 2005 Openedhand Ltd.
+ *
+ * Author: Richard Purdie <richard@o-hand.com>
+ *
+ * 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.
+ *
+ */
+
+struct tsc2101_ts_event {
+	short p;
+	short x;
+	short y;
+};
+
+
+struct ts_device {
+        void (*read)    (struct tsc2101_ts_event*);
+        void (*enable)  (void);
+        void (*disable) (void);
+        void (*remove)  (void);
+        int  (*penup)  (void);
+};
+
+
+
+
Index: linux-2.6.11/arch/arm/Kconfig
===================================================================
--- linux-2.6.11.orig/arch/arm/Kconfig	2005-04-21 16:10:26.000000000 +0100
+++ linux-2.6.11/arch/arm/Kconfig	2005-04-21 16:18:54.000000000 +0100
@@ -713,6 +713,8 @@
 
 #source "drivers/l3/Kconfig"
 
+source "drivers/soc/Kconfig"
+
 source "drivers/media/Kconfig"
 
 source "fs/Kconfig"
Index: linux-2.6.11/drivers/Makefile
===================================================================
--- linux-2.6.11.orig/drivers/Makefile	2005-03-02 07:38:38.000000000 +0000
+++ linux-2.6.11/drivers/Makefile	2005-04-21 16:37:51.000000000 +0100
@@ -28,6 +28,7 @@
 obj-$(CONFIG_PARPORT)		+= parport/
 obj-y				+= base/ block/ misc/ net/ media/
 obj-$(CONFIG_NUBUS)		+= nubus/
+obj-$(CONFIG_SOC)		+= soc/
 obj-$(CONFIG_ATM)		+= atm/
 obj-$(CONFIG_PPC_PMAC)		+= macintosh/
 obj-$(CONFIG_IDE)		+= ide/

