From dda7a631ac901e4d140e8a6612c5c6b5506b6a91 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 21 Jan 2014 10:28:47 +0100 Subject: input: touchscreen: add ABS_X/ABS_Y axis for Fusion touchscreen Recent evdev X-Server input driver implementation complain when only multitouch axes have been reported ("found only multitouch-axes. That shouldn't happen."). Therefor also report the primary touch detection with default axis. --- drivers/input/touchscreen/fusion_F0710A.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/input/touchscreen/fusion_F0710A.c b/drivers/input/touchscreen/fusion_F0710A.c index d29baf08de91..371e4c0981d1 100644 --- a/drivers/input/touchscreen/fusion_F0710A.c +++ b/drivers/input/touchscreen/fusion_F0710A.c @@ -82,6 +82,10 @@ static int fusion_F0710A_register_input(void) input_set_abs_params(dev, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0); #endif + input_set_abs_params(dev, ABS_X, 0, fusion_F0710A.info.xres-1, 0, 0); + input_set_abs_params(dev, ABS_Y, 0, fusion_F0710A.info.yres-1, 0, 0); + input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); + ret = input_register_device(dev); if (ret < 0) goto bail1; @@ -253,6 +257,11 @@ static void fusion_F0710A_wq(struct work_struct *work) input_mt_sync(dev); #endif /* CONFIG_ANDROID */ + input_report_abs(dev, ABS_X, x1); + input_report_abs(dev, ABS_Y, y1); + input_report_abs(dev, ABS_PRESSURE, z1); + input_report_key(dev, BTN_TOUCH, fusion_F0710A.tip1); + input_sync(dev); enable_irq(fusion_F0710A.client->irq); @@ -265,6 +274,7 @@ static irqreturn_t fusion_F0710A_interrupt(int irq, void *dev_id) disable_irq_nosync(fusion_F0710A.client->irq); queue_work(fusion_F0710A.workq, &fusion_F0710A_work); + return IRQ_HANDLED; } -- cgit v1.2.3 From e95019a4f20b8cdfbe03658e4f73b69cdcf97540 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 21 Jan 2014 14:12:33 +0100 Subject: input: touchscreen: fix race condition in Fusion driver When the next interrupt request apeares between the confirmation of the previous (a write via I2C, fusion_F0710A_write_complete) and the reenable of the GPIO interrupt, the driver hangs and no more touch inputs are reported. This patch moves the confirmation after the reenabling of the GPIO interrupt. --- drivers/input/touchscreen/fusion_F0710A.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/input/touchscreen/fusion_F0710A.c b/drivers/input/touchscreen/fusion_F0710A.c index 371e4c0981d1..2cd2096c3b98 100644 --- a/drivers/input/touchscreen/fusion_F0710A.c +++ b/drivers/input/touchscreen/fusion_F0710A.c @@ -130,8 +130,6 @@ static int fusion_F0710A_read_sensor(void) if (ret < 0) { dev_err(&fusion_F0710A.client->dev, "Read block failed: %d\n", ret); - /* Clear fusion_F0710A interrupt */ - fusion_F0710A_write_complete(); return ret; } @@ -154,10 +152,9 @@ static int fusion_F0710A_read_sensor(void) fusion_F0710A.z2 = DATA(fusion_F0710A_SEC_PRESS); fusion_F0710A.tip2 = DATA(fusion_F0710A_SEC_TIDTS)&0x0f; fusion_F0710A.tid2 =(DATA(fusion_F0710A_SEC_TIDTS)&0xf0)>>4; - #undef DATA - /* Clear fusion_F0710A interrupt */ - return fusion_F0710A_write_complete(); + + return 0; } #define val_cut_max(x, max, reverse) \ @@ -177,11 +174,13 @@ static void fusion_F0710A_wq(struct work_struct *work) int x1 = 0, y1 = 0, z1 = 0, x2 = 0, y2 = 0, z2 = 0; if (fusion_F0710A_read_sensor() < 0) - return; + goto restore_irq; +#ifdef DEBUG printk(KERN_DEBUG "tip1, tid1, x1, y1, z1 (%x,%x,%d,%d,%d); tip2, tid2, x2, y2, z2 (%x,%x,%d,%d,%d)\n", fusion_F0710A.tip1, fusion_F0710A.tid1, fusion_F0710A.x1, fusion_F0710A.y1, fusion_F0710A.z1, fusion_F0710A.tip2, fusion_F0710A.tid2, fusion_F0710A.x2, fusion_F0710A.y2, fusion_F0710A.z2); +#endif /* DEBUG */ val_cut_max(fusion_F0710A.x1, fusion_F0710A.info.xres-1, fusion_F0710A.info.xy_reverse); val_cut_max(fusion_F0710A.y1, fusion_F0710A.info.yres-1, fusion_F0710A.info.xy_reverse); @@ -264,8 +263,11 @@ static void fusion_F0710A_wq(struct work_struct *work) input_sync(dev); +restore_irq: enable_irq(fusion_F0710A.client->irq); + /* Clear fusion_F0710A interrupt */ + fusion_F0710A_write_complete(); } static DECLARE_WORK(fusion_F0710A_work, fusion_F0710A_wq); -- cgit v1.2.3 From cb82730b70f31af3b43041ac4e47de69c18016c9 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Fri, 24 Jan 2014 17:29:43 +0100 Subject: input: touchscreen: added platform data for Fusion touchscreen Added platform data struct to define interrupt and reset GPIO. This allows to initialize the touchscreen controller inside the driver rather then in each platform and use the driver as a module. --- drivers/input/touchscreen/fusion_F0710A.c | 47 +++++++++++++++++++++++++++++++ include/linux/input/fusion_F0710A.h | 20 +++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 include/linux/input/fusion_F0710A.h diff --git a/drivers/input/touchscreen/fusion_F0710A.c b/drivers/input/touchscreen/fusion_F0710A.c index 2cd2096c3b98..1546e6a18512 100644 --- a/drivers/input/touchscreen/fusion_F0710A.c +++ b/drivers/input/touchscreen/fusion_F0710A.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "fusion_F0710A.h" @@ -286,10 +287,52 @@ const static u8* g_ver_product[4] = { static int fusion_F0710A_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { + struct fusion_f0710a_init_data *pdata = i2c->dev.platform_data; int ret; u8 ver_product, ver_id; u32 version; + if (pdata == NULL) + { + dev_err(&i2c->dev, "No platform data for Fusion driver\n"); + return -ENODEV; + } + + /* Request pinmuxing, if necessary */ + if (pdata->pinmux_fusion_pins != NULL) + { + ret = pdata->pinmux_fusion_pins(); + if (ret < 0) { + dev_err(&i2c->dev, "muxing GPIOs failed\n"); + return -ENODEV; + } + } + + if ((gpio_request(pdata->gpio_int, "SO-DIMM 28 (Iris X16-38 Pen)") == 0) && + (gpio_direction_input(pdata->gpio_int) == 0)) { + gpio_export(pdata->gpio_int, 0); + } else { + printk(KERN_WARNING "Could not obtain GPIO for Fusion pen down\n"); + return -ENODEV; + } + + if ((gpio_request(pdata->gpio_reset, "SO-DIMM 30 (Iris X16-39 RST)") == 0) && + (gpio_direction_output(pdata->gpio_reset, 1) == 0)) { + + /* Generate a 0 => 1 edge explicitly... */ + gpio_set_value(pdata->gpio_reset, 0); + mdelay(10); + gpio_set_value(pdata->gpio_reset, 1); + + gpio_export(pdata->gpio_reset, 0); + } else { + printk(KERN_WARNING "Could not obtain GPIO for Fusion reset\n"); + return -ENODEV; + } + + /* Use Pen Down GPIO as sampling interrupt */ + i2c->irq = gpio_to_irq(pdata->gpio_int); + if(!i2c->irq) { dev_err(&i2c->dev, "fusion_F0710A irq < 0 \n"); @@ -412,6 +455,10 @@ static int fusion_F0710A_resume(struct i2c_client *i2c) static int fusion_F0710A_remove(struct i2c_client *i2c) { + struct fusion_f0710a_init_data *pdata = i2c->dev.platform_data; + + gpio_free(pdata->gpio_int); + gpio_free(pdata->gpio_reset); destroy_workqueue(fusion_F0710A.workq); free_irq(i2c->irq, &fusion_F0710A); input_unregister_device(fusion_F0710A.input); diff --git a/include/linux/input/fusion_F0710A.h b/include/linux/input/fusion_F0710A.h new file mode 100644 index 000000000000..7d152cbdd06e --- /dev/null +++ b/include/linux/input/fusion_F0710A.h @@ -0,0 +1,20 @@ +/* linux/input/fusion_F0710A.h + * + * Platform data for Fusion F0710A driver + * + * Copyright (c) 2013 Toradex AG (stefan.agner@toradex.ch) + * + * For licencing details see kernel-base/COPYING + */ + +#ifndef __LINUX_I2C_FUSION_F0710A_H +#define __LINUX_I2C_FUSION_F0710A_H + +/* Board specific touch screen initial values */ +struct fusion_f0710a_init_data { + int (*pinmux_fusion_pins)(void); + int gpio_int; + int gpio_reset; +}; + +#endif /* __LINUX_I2C_FUSION_F0710A_H */ -- cgit v1.2.3 From 9d996316a470d37fb71c521f27106b014f3f0b23 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Mon, 27 Jan 2014 10:17:08 +0100 Subject: input: touchscreen: fusion: use new I2C PM functions To avoid warnings use the new I2C power management function for suspend and resume. --- drivers/input/touchscreen/fusion_F0710A.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/drivers/input/touchscreen/fusion_F0710A.c b/drivers/input/touchscreen/fusion_F0710A.c index 1546e6a18512..756cd61037e7 100644 --- a/drivers/input/touchscreen/fusion_F0710A.c +++ b/drivers/input/touchscreen/fusion_F0710A.c @@ -436,17 +436,19 @@ static int fusion_F0710A_probe(struct i2c_client *i2c, const struct i2c_device_i return ret; } -#ifdef CONFIG_PM -static int fusion_F0710A_suspend(struct i2c_client *i2c, pm_message_t mesg) +#ifdef CONFIG_PM_SLEEP +static int fusion_F0710A_suspend(struct device *dev) { + struct i2c_client *i2c = to_i2c_client(dev); disable_irq(i2c->irq); flush_workqueue(fusion_F0710A.workq); return 0; } -static int fusion_F0710A_resume(struct i2c_client *i2c) +static int fusion_F0710A_resume(struct device *dev) { + struct i2c_client *i2c = to_i2c_client(dev); enable_irq(i2c->irq); return 0; @@ -474,21 +476,22 @@ static struct i2c_device_id fusion_F0710A_id[] = { {}, }; +static const struct dev_pm_ops fusion_F0710A_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(fusion_F0710A_suspend, fusion_F0710A_resume) +}; + static struct i2c_driver fusion_F0710A_i2c_drv = { .driver = { + .owner = THIS_MODULE, .name = DRV_NAME, + .pm = &fusion_F0710A_pm_ops, }, .probe = fusion_F0710A_probe, .remove = fusion_F0710A_remove, -#ifdef CONFIG_PM - .suspend = fusion_F0710A_suspend, - .resume = fusion_F0710A_resume, -#endif .id_table = fusion_F0710A_id, .address_list = normal_i2c, }; - static int __init fusion_F0710A_init( void ) { int ret; -- cgit v1.2.3 From 63b293000723e61a880470f093fbe82e86ebd81b Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Mon, 27 Jan 2014 10:06:22 +0100 Subject: input: touchscreen: fusion: fix error handling Fix chip reset by sleeping long enought after reset. Do proper error handling (free GPIO on failure). Use dev_* for message logging to get similar messages for all fusion driver related errors and warnings. --- drivers/input/touchscreen/fusion_F0710A.c | 37 ++++++++++++++++++------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/drivers/input/touchscreen/fusion_F0710A.c b/drivers/input/touchscreen/fusion_F0710A.c index 756cd61037e7..330d4130399a 100644 --- a/drivers/input/touchscreen/fusion_F0710A.c +++ b/drivers/input/touchscreen/fusion_F0710A.c @@ -312,22 +312,25 @@ static int fusion_F0710A_probe(struct i2c_client *i2c, const struct i2c_device_i (gpio_direction_input(pdata->gpio_int) == 0)) { gpio_export(pdata->gpio_int, 0); } else { - printk(KERN_WARNING "Could not obtain GPIO for Fusion pen down\n"); + dev_warn(&i2c->dev, "Could not obtain GPIO for Fusion pen down\n"); return -ENODEV; } if ((gpio_request(pdata->gpio_reset, "SO-DIMM 30 (Iris X16-39 RST)") == 0) && (gpio_direction_output(pdata->gpio_reset, 1) == 0)) { - /* Generate a 0 => 1 edge explicitly... */ + /* Generate a 0 => 1 edge explicitly, and wait for startup... */ gpio_set_value(pdata->gpio_reset, 0); - mdelay(10); + msleep(10); gpio_set_value(pdata->gpio_reset, 1); + /* Wait for startup (up to 125ms according to datasheet) */ + msleep(125); gpio_export(pdata->gpio_reset, 0); } else { - printk(KERN_WARNING "Could not obtain GPIO for Fusion reset\n"); - return -ENODEV; + dev_warn(&i2c->dev, "Could not obtain GPIO for Fusion reset\n"); + ret = -ENODEV; + goto bail0; } /* Use Pen Down GPIO as sampling interrupt */ @@ -344,7 +347,7 @@ static int fusion_F0710A_probe(struct i2c_client *i2c, const struct i2c_device_i fusion_F0710A.client = i2c; i2c_set_clientdata(i2c, &fusion_F0710A); - printk(KERN_INFO "fusion_F0710A :Touchscreen registered with bus id (%d) with slave address 0x%x\n", + dev_info(&i2c->dev, "Touchscreen registered with bus id (%d) with slave address 0x%x\n", i2c_adapter_id(fusion_F0710A.client->adapter), fusion_F0710A.client->addr); /* Read out a lot of registers */ @@ -365,9 +368,9 @@ static int fusion_F0710A_probe(struct i2c_client *i2c, const struct i2c_device_i ver_id = ((u8)(ret) & 0x6) >> 1; version += ((((u32)ret) & 0xf8) >> 3) * 10; version += (((u32)ret) & 0x1) + 1; /* 0 is build 1, 1 is build 2 */ - printk(KERN_INFO "fusion_F0710A version product %s(%d)\n", g_ver_product[ver_product] ,ver_product); - printk(KERN_INFO "fusion_F0710A version id %s(%d)\n", ver_id ? "1.4" : "1.0", ver_id); - printk(KERN_INFO "fusion_F0710A version series (%d)\n", version); + dev_info(&i2c->dev, "version product %s(%d)\n", g_ver_product[ver_product] ,ver_product); + dev_info(&i2c->dev, "version id %s(%d)\n", ver_id ? "1.4" : "1.0", ver_id); + dev_info(&i2c->dev, "version series (%d)\n", version); switch(ver_product) { @@ -421,17 +424,19 @@ static int fusion_F0710A_probe(struct i2c_client *i2c, const struct i2c_device_i return 0; - bail4: +bail4: free_irq(i2c->irq, &fusion_F0710A); - bail3: +bail3: destroy_workqueue(fusion_F0710A.workq); fusion_F0710A.workq = NULL; - - bail2: +bail2: input_unregister_device(fusion_F0710A.input); - bail1: +bail1: + gpio_free(pdata->gpio_reset); +bail0: + gpio_free(pdata->gpio_int); return ret; } @@ -466,7 +471,7 @@ static int fusion_F0710A_remove(struct i2c_client *i2c) input_unregister_device(fusion_F0710A.input); i2c_set_clientdata(i2c, NULL); - printk(KERN_INFO "fusion_F0710A driver removed\n"); + dev_info(&i2c->dev, "driver removed\n"); return 0; } @@ -501,7 +506,7 @@ static int __init fusion_F0710A_init( void ) /* Probe for fusion_F0710A on I2C. */ ret = i2c_add_driver(&fusion_F0710A_i2c_drv); if (ret < 0) { - printk(KERN_ERR "fusion_F0710A_init can't add i2c driver: %d\n", ret); + printk(KERN_WARNING DRV_NAME " can't add i2c driver: %d\n", ret); } return ret; -- cgit v1.2.3 From 485b5d108fcf75a1066c5de054f8adf2e6118845 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Mon, 27 Jan 2014 14:34:11 +0100 Subject: colibri_t20/colibri_t30: use new platform data for fusion touchscreen Fusion touchscreen driver now uses platform data to do GPIO initialization by itself. Make use of this by providing GPIO numbers instead of doing initialization in the board initialization. --- arch/arm/configs/colibri_t20_defconfig | 1 + arch/arm/configs/colibri_t30_defconfig | 1 + arch/arm/mach-tegra/board-colibri_t20.c | 41 ++++++++++---------------- arch/arm/mach-tegra/board-colibri_t20.h | 3 -- arch/arm/mach-tegra/board-colibri_t30.c | 51 ++++++++++++--------------------- arch/arm/mach-tegra/board-colibri_t30.h | 3 -- 6 files changed, 35 insertions(+), 65 deletions(-) diff --git a/arch/arm/configs/colibri_t20_defconfig b/arch/arm/configs/colibri_t20_defconfig index 26892df10e9c..8fe150767638 100644 --- a/arch/arm/configs/colibri_t20_defconfig +++ b/arch/arm/configs/colibri_t20_defconfig @@ -196,6 +196,7 @@ CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_WM97XX=y # CONFIG_TOUCHSCREEN_WM9705 is not set # CONFIG_TOUCHSCREEN_WM9713 is not set +CONFIG_TOUCHSCREEN_FUSION_F0710A=m CONFIG_INPUT_MISC=y CONFIG_INPUT_UINPUT=y CONFIG_INPUT_GPIO=y diff --git a/arch/arm/configs/colibri_t30_defconfig b/arch/arm/configs/colibri_t30_defconfig index f0f5481890e7..5fd0bdc80b99 100644 --- a/arch/arm/configs/colibri_t30_defconfig +++ b/arch/arm/configs/colibri_t30_defconfig @@ -191,6 +191,7 @@ CONFIG_KEYBOARD_GPIO=y # CONFIG_INPUT_MOUSE is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_STMPE=y +CONFIG_TOUCHSCREEN_FUSION_F0710A=m CONFIG_INPUT_MISC=y CONFIG_INPUT_UINPUT=y CONFIG_INPUT_GPIO=y diff --git a/arch/arm/mach-tegra/board-colibri_t20.c b/arch/arm/mach-tegra/board-colibri_t20.c index f7153ab6a50b..470cc004165a 100644 --- a/arch/arm/mach-tegra/board-colibri_t20.c +++ b/arch/arm/mach-tegra/board-colibri_t20.c @@ -43,6 +43,7 @@ #include #include +#include #include "board-colibri_t20.h" #include "board.h" @@ -351,10 +352,8 @@ static struct gpio colibri_t20_gpios[] = { {TEGRA_GPIO_PK6, GPIOF_IN, "SODIMM pin 135"}, #endif #ifndef COLIBRI_T20_VI -#ifndef CONFIG_TOUCHSCREEN_FUSION_F0710A {TEGRA_GPIO_PL0, GPIOF_IN, "SOD-101, Iris X16-16"}, {TEGRA_GPIO_PL1, GPIOF_IN, "SOD-103, Iris X16-15"}, -#endif /* !CONFIG_TOUCHSCREEN_FUSION_F0710A */ //conflicts with Ethernet interrupt on Protea {TEGRA_GPIO_PL2, GPIOF_IN, "SODI-79, Iris X16-19"}, {TEGRA_GPIO_PL3, GPIOF_IN, "SODI-97, Iris X16-17"}, @@ -445,6 +444,19 @@ static void colibri_t20_gpio_init(void) } } +/* + * Fusion touch screen GPIOs (using Toradex display/touch adapater) + * Iris X16-38, SODIMM pin 28 (PWM B), pen down interrupt + * Iris X16-39, SODIMM pin 30 (PWM C), reset + * gpio_request muxes the GPIO function automatically, we only have to make + * sure input/output muxing is done here... + */ +static struct fusion_f0710a_init_data colibri_fusion_pdata = { + .pinmux_fusion_pins = NULL, + .gpio_int = TEGRA_GPIO_PB5, /* SO-DIMM 28: Pen down interrupt */ + .gpio_reset = TEGRA_GPIO_PA6, /* SO-DIMM 30: Reset interrupt */ +}; + /* I2C */ /* GEN1_I2C: I2C_SDA/SCL on SODIMM pin 194/196 (e.g. RTC on carrier board) */ @@ -454,12 +466,11 @@ static struct i2c_board_info colibri_t20_i2c_bus1_board_info[] __initdata = { I2C_BOARD_INFO("rtc-ds1307", 0x68), .type = "m41t00", }, -#ifdef CONFIG_TOUCHSCREEN_FUSION_F0710A { /* TouchRevolution Fusion 7 and 10 multi-touch controller */ I2C_BOARD_INFO("fusion_F0710A", 0x10), + .platform_data = &colibri_fusion_pdata, }, -#endif /* CONFIG_TOUCHSCREEN_FUSION_F0710A */ }; static struct tegra_i2c_platform_data colibri_t20_i2c1_platform_data = { @@ -525,28 +536,6 @@ static void colibri_t20_i2c_init(void) platform_device_register(&tegra_i2c_device2); platform_device_register(&tegra_i2c_device4); -#ifdef CONFIG_TOUCHSCREEN_FUSION_F0710A - if ((gpio_request(FUSION_PEN_DOWN, "103, Iris X16-15 Pen") == 0) && - (gpio_direction_input(FUSION_PEN_DOWN) == 0)) { - gpio_export(FUSION_PEN_DOWN, 0); - } else { - printk(KERN_ERR "Could not obtain GPIO for Fusion pen down\n"); - return; - } - - if ((gpio_request(FUSION_RESET, "101, Iris X16-16 RST") == 0) && - (gpio_direction_output(FUSION_RESET, 1) == 0)) { - gpio_direction_output(FUSION_RESET, 0); - mdelay(10); - gpio_direction_output(FUSION_RESET, 1); - } else { - printk(KERN_ERR "Could not obtain GPIO for Fusion reset\n"); - return; - } - - colibri_t20_i2c_bus1_board_info[1].irq = gpio_to_irq(FUSION_PEN_DOWN); -#endif /* CONFIG_TOUCHSCREEN_FUSION_F0710A */ - i2c_register_board_info(0, colibri_t20_i2c_bus1_board_info, ARRAY_SIZE(colibri_t20_i2c_bus1_board_info)); i2c_register_board_info(4, colibri_t20_i2c_bus4_board_info, diff --git a/arch/arm/mach-tegra/board-colibri_t20.h b/arch/arm/mach-tegra/board-colibri_t20.h index 23e9cdbda749..020670d424fd 100644 --- a/arch/arm/mach-tegra/board-colibri_t20.h +++ b/arch/arm/mach-tegra/board-colibri_t20.h @@ -31,9 +31,6 @@ #define FF_DCD TEGRA_GPIO_PC6 /* SODIMM 31 */ #define FF_DSR TEGRA_GPIO_PC1 /* SODIMM 29 */ -#define FUSION_PEN_DOWN TEGRA_GPIO_PL1 /* SODIMM 103 */ -#define FUSION_RESET TEGRA_GPIO_PL0 /* SODIMM 101 */ - #define I2C_SCL TEGRA_GPIO_PC4 /* SODIMM 196 */ #define I2C_SDA TEGRA_GPIO_PC5 /* SODIMM 194 */ diff --git a/arch/arm/mach-tegra/board-colibri_t30.c b/arch/arm/mach-tegra/board-colibri_t30.c index 63ce67307ee9..db3ab08cbc3d 100644 --- a/arch/arm/mach-tegra/board-colibri_t30.c +++ b/arch/arm/mach-tegra/board-colibri_t30.c @@ -40,6 +40,7 @@ #include #include +#include #include "board-colibri_t30.h" #include "board.h" @@ -60,10 +61,6 @@ #define TEGRA_SNOR_CONFIG_GO BIT(31) #define TEGRA_SNOR_CONFIG_SNOR_CS(val) REG_FIELD((val), 4, 3) -/* ADC */ - -//TODO - /* Audio */ static struct tegra_asoc_platform_data colibri_t30_audio_sgtl5000_pdata = { @@ -373,11 +370,9 @@ static struct gpio colibri_t30_gpios[] = { #ifndef COLIBRI_T30_VI // {TEGRA_GPIO_PY4, GPIOF_IN, "SODI-97, Iris X16-17"}, // {TEGRA_GPIO_PY5, GPIOF_IN, "SODI-79, Iris X16-19"}, -#ifndef CONFIG_TOUCHSCREEN_FUSION_F0710A -// {TEGRA_GPIO_PY6, GPIOF_IN, "103, Iris X16-15 Pen"}, -// {TEGRA_GPIO_PY7, GPIOF_IN, "101, Iris X16-16 RST"}, -#endif -// {TEGRA_GPIO_PZ0, GPIOF_IN, "SODIMM pin 96"}, +// {TEGRA_GPIO_PY6, GPIOF_IN, "SODI-103, Iris X16-15"}, +// {TEGRA_GPIO_PY7, GPIOF_IN, "SODI-101, Iris X16-16"}, +// {TEGRA_GPIO_PZ0, GPIOF_IN, "SODI-96"}, // {TEGRA_GPIO_PZ1, GPIOF_IN, "SODI-98, Iris X16-13"}, #endif // {TEGRA_GPIO_PZ2, GPIOF_IN, "SODIMM pin 156"}, @@ -423,6 +418,19 @@ static void colibri_t30_gpio_init(void) } } +/* + * Fusion touch screen GPIOs (using Toradex display/touch adapater) + * Iris X16-38, SODIMM pin 28 (PWM B), pen down interrupt + * Iris X16-39, SODIMM pin 30 (PWM C), reset + * gpio_request muxes the GPIO function automatically, we only have to make + * sure input/output muxing is done here... + */ +static struct fusion_f0710a_init_data colibri_fusion_pdata = { + .pinmux_fusion_pins = NULL, + .gpio_int = TEGRA_GPIO_PB5, /* SO-DIMM 28: Pen down interrupt */ + .gpio_reset = TEGRA_GPIO_PA6, /* SO-DIMM 30: Reset interrupt */ +}; + /* I2C */ /* Make sure that the pinmuxing enable the 'open drain' feature for pins used @@ -435,12 +443,11 @@ static struct i2c_board_info colibri_t30_i2c_bus1_board_info[] __initdata = { I2C_BOARD_INFO("rtc-ds1307", 0x68), .type = "m41t00", }, -#ifdef CONFIG_TOUCHSCREEN_FUSION_F0710A { /* TouchRevolution Fusion 7 and 10 multi-touch controller */ I2C_BOARD_INFO("fusion_F0710A", 0x10), + .platform_data = &colibri_fusion_pdata, }, -#endif /* CONFIG_TOUCHSCREEN_FUSION_F0710A */ }; static struct tegra_i2c_platform_data colibri_t30_i2c1_platform_data = { @@ -546,28 +553,6 @@ static void __init colibri_t30_i2c_init(void) platform_device_register(&tegra_i2c_device4); platform_device_register(&tegra_i2c_device5); -#ifdef CONFIG_TOUCHSCREEN_FUSION_F0710A - if ((gpio_request(FUSION_PEN_DOWN, "103, Iris X16-15 Pen") == 0) && - (gpio_direction_input(FUSION_PEN_DOWN) == 0)) { - gpio_export(FUSION_PEN_DOWN, 0); - } else { - printk(KERN_ERR "Could not obtain GPIO for Fusion pen down\n"); - return; - } - - if ((gpio_request(FUSION_RESET, "101, Iris X16-16 RST") == 0) && - (gpio_direction_output(FUSION_RESET, 1) == 0)) { - gpio_direction_output(FUSION_RESET, 0); - mdelay(10); - gpio_direction_output(FUSION_RESET, 1); - } else { - printk(KERN_ERR "Could not obtain GPIO for Fusion reset\n"); - return; - } - - colibri_t30_i2c_bus1_board_info[1].irq = gpio_to_irq(FUSION_PEN_DOWN); -#endif /* CONFIG_TOUCHSCREEN_FUSION_F0710A */ - i2c_register_board_info(0, colibri_t30_i2c_bus1_board_info, ARRAY_SIZE(colibri_t30_i2c_bus1_board_info)); diff --git a/arch/arm/mach-tegra/board-colibri_t30.h b/arch/arm/mach-tegra/board-colibri_t30.h index 85563fe222ba..3c67cb10f960 100644 --- a/arch/arm/mach-tegra/board-colibri_t30.h +++ b/arch/arm/mach-tegra/board-colibri_t30.h @@ -43,9 +43,6 @@ #define EN_MIC_GND TEGRA_GPIO_PT1 -#define FUSION_PEN_DOWN TEGRA_GPIO_PY6 /* SODIMM 103 */ -#define FUSION_RESET TEGRA_GPIO_PY7 /* SODIMM 101 */ - #define I2C_SCL TEGRA_GPIO_PC4 /* SODIMM 196 */ #define I2C_SDA TEGRA_GPIO_PC5 /* SODIMM 194 */ -- cgit v1.2.3