From: Bill Varney <[email protected]>

Signed-off-by: Ken Lierman <[email protected]>
---
 arch/x86/kernel/mrst.c |   64 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kernel/mrst.c b/arch/x86/kernel/mrst.c
index 2c2f662..58df1b6 100644
--- a/arch/x86/kernel/mrst.c
+++ b/arch/x86/kernel/mrst.c
@@ -37,6 +37,7 @@
 #include <linux/bh1770glc.h>
 #include <linux/leds-lp5523.h>
 #include <linux/pn544.h>
+#include <linux/atmel_maxtouch.h>
 
 #include <asm/setup.h>
 #include <asm/mpspec_def.h>
@@ -803,6 +804,68 @@ void *bh1770glc_platform_data_init(void *info)
        return &prox_pdata;
 }
 
+static  int mxt_reset_gpio;
+
+static u8 mxt_valid_interrupt(void)
+{
+       return 1;
+}
+
+static void mxt_init_platform_hw(void)
+{
+       int err;
+
+       err = gpio_request(mxt_reset_gpio, "MaxTouch-reset");
+       if (err < 0)
+               printk(KERN_ERR "Failed to request GPIO%d (MaxTouch-reset) 
err=%d\n",
+                       mxt_reset_gpio, err);
+
+       err = gpio_direction_output(mxt_reset_gpio, 0);
+       if (err)
+               printk(KERN_ERR "Failed to change direction, err=%d\n", err);
+
+       /* maXTouch wants 40mSec minimum after reset to get organized */
+       gpio_set_value(mxt_reset_gpio, 1);
+       msleep(40);
+}
+
+static void mxt_exit_platform_hw(void)
+{
+       printk(KERN_INFO "In %s.", __func__);
+       gpio_set_value(mxt_reset_gpio, 0);
+}
+
+static void *mxt_platform_data(void *info)
+{
+       struct i2c_board_info *i2c_info = (struct i2c_board_info *) info;
+       static struct mxt_platform_data mfld_mxt_platform_data;
+       int intr = 0;
+
+       printk(KERN_INFO "In %s.", __func__);
+
+       memset(&mfld_mxt_platform_data, 0x00,
+               sizeof(struct mxt_platform_data));
+       mfld_mxt_platform_data.numtouch         = 10;
+       mfld_mxt_platform_data.init_platform_hw = &mxt_init_platform_hw;
+       mfld_mxt_platform_data.exit_platform_hw = &mxt_exit_platform_hw;
+       mfld_mxt_platform_data.max_x            = 480;
+       mfld_mxt_platform_data.max_y            = 864;
+       mfld_mxt_platform_data.valid_interrupt  = &mxt_valid_interrupt;
+
+       intr = get_gpio_by_name("TS0-intr");
+       if (intr == -1) {
+               printk(KERN_ERR "Missing GPIO(s) for MXT.\n");
+               return NULL;
+       }
+
+       /* On nCDK EB2.0, Atmel max touch reset is on
+       GP_CORE_033 = 33 + 96 = 129 */
+       mxt_reset_gpio = 129; /* TODO: Use SFI, when SFI is available */
+
+       i2c_info->irq = intr + MRST_IRQ_OFFSET;
+       return &mfld_mxt_platform_data;
+}
+
 #ifdef CONFIG_BCM4751_GPS
 
 /*
@@ -1387,6 +1450,7 @@ static const struct devs_id device_ids[] = {
        {"pmic_audio", SFI_DEV_TYPE_IPC, 1, &no_platform_data},
        {"msic_audio", SFI_DEV_TYPE_SPI, 1, &no_platform_data},
        {"msic_audio", SFI_DEV_TYPE_IPC, 1, &no_platform_data},
+       {"mXT224", SFI_DEV_TYPE_I2C, 0, &mxt_platform_data},
        {"i2c_TC35894-nEB1", SFI_DEV_TYPE_I2C, 0, &tc35894xbg_n_platform_data},
        {"i2c_TC35894-i", SFI_DEV_TYPE_I2C, 0, &tc35894xbg_i_platform_data},
        {"bh1770glc", SFI_DEV_TYPE_I2C, 0, &bh1770glc_platform_data_init},
-- 
1.7.1

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to