Hi, This patch has been integrated, please test ASAP. http://download.meego.com/live/devel:/kernel/Trunk/i586/
Thanks, Kristen On Tue, 7 Jun 2011 20:17:31 +0800 <[email protected]> wrote: > > Update ektf2136 touch screen driver to 3.0.5 from 3.0.4 based on > kernel-dapttion-mrst-2.6.37.6-14.1.src.rpm in > meego-table-ia32-1.2.0.90.2.20110601: > > 1. Add hardware reset function in ektf2136 touch screen driver > 2. Replace request_irq to request_threaded_irq > 3. Add packet fail counter and debug message > 4. Add mutex lock for sleep and resume command > > Signed-off-by: Mike Hsu <[email protected]> > Signed-off-by: Stanley Zeng <[email protected]> > Signed-off-by: Scott Liu <[email protected]> > > --- > mrst.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > --- > --- linux-2.6.37/arch/x86/platform/mrst/mrst.old.c 2011-06-01 > 17:38:17.000000000 +0800 > +++ linux-2.6.37/arch/x86/platform/mrst/mrst.c 2011-06-01 > 17:39:12.000000000 +0800 > @@ -559,10 +559,13 @@ > struct spi_board_info *spi_info = info; > static struct ektf2136_platform_data ektf2136_spi_pdata; > int gpio = get_gpio_by_name("ts_int"); > + int reset = get_gpio_by_name("ts_reset"); > > - if (gpio == -1) > + if (gpio == -1 || reset == -1) > return NULL; > + > ektf2136_spi_pdata.gpio = gpio; > + ektf2136_spi_pdata.reset = reset; > spi_info->irq = gpio + MRST_IRQ_OFFSET; > spi_info->mode = SPI_MODE_3; > spi_info->controller_data = &ektf2136_spi_touch; > > --- > ektf2136.h | 1 + > 1 file changed, 1 insertion(+) > --- > --- linux-2.6.37/include/linux/spi/ektf2136.old.h 2011-06-01 > 17:39:51.000000000 +0800 > +++ linux-2.6.37/include/linux/spi/ektf2136.h 2011-06-01 17:40:16.000000000 > +0800 > @@ -5,6 +5,7 @@ > > struct ektf2136_platform_data { > int gpio; /* The GPIO pin for the device */ > + int reset; /* The HW RESET pin for the device */ > }; > > struct elan_sr_hdr { > > --- > ektf2136_spi.c | 68 > +++++++++++++++++++++++++++++++++++++++++++++++++++------ > 1 file changed, 61 insertions(+), 7 deletions(-) > --- > --- linux-2.6.37/drivers/input/touchscreen/ektf2136_spi.old.c 2011-06-01 > 17:52:12.000000000 +0800 > +++ linux-2.6.37/drivers/input/touchscreen/ektf2136_spi.c 2011-06-07 > 14:40:47.000000000 +0800 > @@ -30,11 +30,11 @@ > #include <linux/pm_runtime.h> > > #define DRV_NAME "ektf2136_spi" > -#define DRIVER_VERSION "v3.0.4" > +#define DRIVER_VERSION "v3.0.5" > > #define DRV_MA_VER 3 > #define DRV_MI_VER 0 > -#define DRV_SUB_MI_VER 4 > +#define DRV_SUB_MI_VER 5 > > static const char ELAN_TS_NAME[] = "ektf2136_spi"; > > @@ -109,6 +109,7 @@ > > struct elan_data { > int intr_gpio; > + int reset_gpio; > int use_irq; > u8 major_fw_version; > u8 minor_fw_version; > @@ -450,9 +451,11 @@ > > checksum = checksum%256; > > - if (checksum != buf[34]) > + if (checksum != buf[34]) { > + ed->packet_fail++; > + dev_dbg(&spi->dev, "elan touch checksum fail: %02x\n", buf[34]); > return -EFAULT; > - > + } > return 0; > } > > @@ -472,7 +475,7 @@ > status = gpio_get_value(ed->intr_gpio); > retry--; > msleep(20); > - } while (status == 1 && retry > 0); > + } while (status != 0 && retry > 0); > > return (status == 0 ? 0 : -ETIMEDOUT); > } > @@ -753,6 +756,24 @@ > } > > /** > + * elan_touch_hw_reset - reset touch panel > + * @spi: our panel > + * > + * Trigger the hardware reset pin at each touch panel initial stage. > + * Caller must hold the mutex > + */ > +static int elan_touch_hw_reset(struct spi_device *spi) > +{ > + struct elan_data *ed = spi_get_drvdata(spi); > + > + gpio_direction_output(ed->reset_gpio, 0); > + msleep(100); > + gpio_direction_output(ed->reset_gpio, 1); > + > + return 0; > +} > + > +/** > * elan_touch_init - hand shake with touch panel > * @spi: our panel > * > @@ -763,8 +784,14 @@ > { > u8 buf_recv[4]; > struct elan_data *ed = spi_get_drvdata(spi); > - int rc = elan_touch_poll(spi); > + int rc; > + > + /* Reset elan_touch_device */ > + rc = elan_touch_hw_reset(spi); > + if (rc < 0) > + return -EINVAL; > > + rc = elan_touch_poll(spi); > if (rc < 0) > return -EINVAL; > > @@ -915,6 +942,8 @@ > break; > } > default: > + ed->packet_fail++; > + dev_dbg(&spi->dev, "elan touch report data fail: %02x\n", > buf[0]); > break; > } > } > @@ -1191,7 +1220,7 @@ > > ed->use_irq = 1; > > - err = request_irq(spi->irq, elan_touch_ts_interrupt, > + err = request_threaded_irq(spi->irq, NULL, > elan_touch_ts_interrupt, > IRQF_TRIGGER_FALLING, ELAN_TS_NAME, ed); > > if (err < 0) { > @@ -1649,6 +1678,20 @@ > } > > ed->intr_gpio = pdata->gpio; > + ed->reset_gpio = pdata->reset; > + > + if (ed->reset_gpio) { > + err = gpio_is_valid(ed->reset_gpio); > + if (err < 0) { > + dev_dbg(&spi->dev, "elan touch hw reset pin %d is not > valid\n", ed->reset_gpio); > + goto fail; > + } > + err = gpio_request(ed->reset_gpio, ELAN_TS_NAME); > + if (err < 0) { > + dev_dbg(&spi->dev, "elan touch gpio_request fail: > %d\n", err); > + goto fail; > + } > + } > > ed->input = input_allocate_device(); > if (ed->input == NULL) { > @@ -1783,6 +1826,8 @@ > fail: > if (ed->input) > input_free_device(ed->input); > + if (ed->reset_gpio) > + gpio_free(ed->reset_gpio); > kfree(ed); > return err; > } > @@ -1811,6 +1856,9 @@ > else > hrtimer_cancel(&ed->timer); > > + if (ed->reset_gpio) > + gpio_free(ed->reset_gpio); > + > mutex_lock(&ed->mutex); > elan_send_soft_reset(spi); > mutex_unlock(&ed->mutex); > @@ -1836,8 +1884,11 @@ > if (ed->protocol & PRO_UPDATE_FW_MODE) > return 0; > > + mutex_lock(&ed->mutex); > ret = elan_spi_write_cmd(ed->spi, set_sleep_cmd, > sizeof(set_sleep_cmd), "set_sleep_cmd"); > + mutex_unlock(&ed->mutex); > + > if (ret < 0) > return ret; > > @@ -1862,8 +1913,11 @@ > if (ed->protocol & PRO_UPDATE_FW_MODE) > return 0; > > + mutex_lock(&ed->mutex); > ret = elan_spi_write_cmd(ed->spi, set_active_cmd, > sizeof(set_active_cmd), "set_active_cmd"); > + mutex_unlock(&ed->mutex); > + > if (ret < 0) > return ret; > > > Best regards, > > Mike Hsu 徐宗壕 > Linux Software, Mobile BG, Wistron > Email: [email protected] > Tel: 886-2-66123829 _______________________________________________ MeeGo-kernel mailing list [email protected] http://lists.meego.com/listinfo/meego-kernel
