Re: [PATCH v3 3/3] touchscreen: colibri-vf50-ts: Add touchscreen support for Colibri VF50

2015-08-19 Thread maitysanchayan
Hello Dmitry,

Will take care of all points with the next revision.

Thank you for the feedback.

- Sanchayan.

On 15-08-14 15:53:46, Dmitry Torokhov wrote:
> Hi Sanchayan,
> 
> On Wed, Aug 05, 2015 at 02:25:51PM +0530, Sanchayan Maity wrote:
> > The Colibri Vybrid VF50 module supports 4-wire touchscreens using
> > FETs and ADC inputs. This driver uses the IIO consumer interface
> > and relies on the vf610_adc driver based on the IIO framework.
> > 
> > Signed-off-by: Sanchayan Maity 
> > ---
> >  drivers/input/touchscreen/Kconfig   |  12 +
> >  drivers/input/touchscreen/Makefile  |   1 +
> >  drivers/input/touchscreen/colibri-vf50-ts.c | 404 
> > 
> >  3 files changed, 417 insertions(+)
> >  create mode 100644 drivers/input/touchscreen/colibri-vf50-ts.c
> > 
> > diff --git a/drivers/input/touchscreen/Kconfig 
> > b/drivers/input/touchscreen/Kconfig
> > index 80f6386..28948ca 100644
> > --- a/drivers/input/touchscreen/Kconfig
> > +++ b/drivers/input/touchscreen/Kconfig
> > @@ -1027,4 +1027,16 @@ config TOUCHSCREEN_ZFORCE
> >   To compile this driver as a module, choose M here: the
> >   module will be called zforce_ts.
> >  
> > +config TOUCHSCREEN_COLIBRI_VF50
> > +   tristate "Toradex Colibri on board touchscreen driver"
> > +   depends on GPIOLIB && IIO && VF610_ADC
> > +   help
> > + Say Y here if you have a Colibri VF50 and plan to use
> > + the on-board provided 4-wire touchscreen driver.
> > +
> > + If unsure, say N.
> > +
> > + To compile this driver as a module, choose M here: the
> > + module will be called colibri_vf50_ts.
> > +
> >  endif
> > diff --git a/drivers/input/touchscreen/Makefile 
> > b/drivers/input/touchscreen/Makefile
> > index 44deea7..93746a0 100644
> > --- a/drivers/input/touchscreen/Makefile
> > +++ b/drivers/input/touchscreen/Makefile
> > @@ -84,3 +84,4 @@ obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o
> >  obj-$(CONFIG_TOUCHSCREEN_SX8654)   += sx8654.o
> >  obj-$(CONFIG_TOUCHSCREEN_TPS6507X) += tps6507x-ts.o
> >  obj-$(CONFIG_TOUCHSCREEN_ZFORCE)   += zforce_ts.o
> > +obj-$(CONFIG_TOUCHSCREEN_COLIBRI_VF50) += colibri-vf50-ts.o
> > diff --git a/drivers/input/touchscreen/colibri-vf50-ts.c 
> > b/drivers/input/touchscreen/colibri-vf50-ts.c
> > new file mode 100644
> > index 000..d7bc91a
> > --- /dev/null
> > +++ b/drivers/input/touchscreen/colibri-vf50-ts.c
> > @@ -0,0 +1,404 @@
> > +/* Copyright 2015 Toradex AG
> > + *
> > + * Toradex Colibri VF50 Touchscreen driver
> > + *
> > + * Originally authored by Stefan Agner for 3.0 kernel
> > + *
> > + * This program is free software; you can redistribute it and/or modify
> > + * it under the terms of the GNU General Public License as published by
> > + * the Free Software Foundation; either version 2 of the License, or
> > + * (at your option) any later version.
> > + */
> > +
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +
> > +#define DRIVER_NAME "colibri-vf50-ts"
> > +#define DRV_VERSION "1.0"
> > +
> > +#define VF_ADC_MAX ((1 << 12) - 1)
> > +
> > +#define COLI_TOUCH_MIN_DELAY_US 1000
> > +#define COLI_TOUCH_MAX_DELAY_US 2000
> > +
> > +static int min_pressure = 200;
> > +
> > +struct vf50_touch_device {
> > +   struct platform_device  *pdev;
> > +   struct input_dev*ts_input;
> > +   struct iio_channel  *channels;
> > +   struct gpio_desc *gpio_xp;
> > +   struct gpio_desc *gpio_xm;
> > +   struct gpio_desc *gpio_yp;
> > +   struct gpio_desc *gpio_ym;
> > +   struct gpio_desc *gpio_pen_detect;
> > +   int pen_irq;
> > +   bool stop_touchscreen;
> > +};
> > +
> > +/*
> > + * Enables given plates and measures touch parameters using ADC
> > + */
> > +static int adc_ts_measure(struct iio_channel *channel,
> > + struct gpio_desc *plate_p, struct gpio_desc *plate_m)
> > +{
> > +   int i, value = 0, val = 0;
> > +   int ret;
> > +
> > +   gpiod_set_value(plate_p, 1);
> > +   gpiod_set_value(plate_m, 1);
> > +
> > +   usleep_range(COLI_TOUCH_MIN_DELAY_US, COLI_TOUCH_MAX_DELAY_US);
> > +
> > +   for (i = 0; i < 5; i++) {
> 
> Can we have a #define for 5?
> 
> > +   ret = iio_read_channel_raw(channel, );
> > +   if (ret < 0) {
> > +   value = ret;
> > +   goto error_iio_read;
> > +   }
> > +
> > +   value += val;
> > +   }
> > +
> > +   value /= 5;
> > +
> > +error_iio_read:
> > +   gpiod_set_value(plate_p, 0);
> > +   gpiod_set_value(plate_m, 0);
> > +
> > +   return value;
> > +}
> > +
> > +/*
> > + * Enable touch detection using falling edge detection on XM
> > + */
> > +static void vf50_ts_enable_touch_detection(struct vf50_touch_device 
> > *vf50_ts)
> > +{
> > +   /* Enable plate YM (needs to be strong GND, high active) */
> > +   gpiod_set_value(vf50_ts->gpio_ym, 1);
> > +
> > +   /*
> > +* Let the platform 

Re: [PATCH v3 3/3] touchscreen: colibri-vf50-ts: Add touchscreen support for Colibri VF50

2015-08-19 Thread maitysanchayan
Hello Dmitry,

Will take care of all points with the next revision.

Thank you for the feedback.

- Sanchayan.

On 15-08-14 15:53:46, Dmitry Torokhov wrote:
 Hi Sanchayan,
 
 On Wed, Aug 05, 2015 at 02:25:51PM +0530, Sanchayan Maity wrote:
  The Colibri Vybrid VF50 module supports 4-wire touchscreens using
  FETs and ADC inputs. This driver uses the IIO consumer interface
  and relies on the vf610_adc driver based on the IIO framework.
  
  Signed-off-by: Sanchayan Maity maitysancha...@gmail.com
  ---
   drivers/input/touchscreen/Kconfig   |  12 +
   drivers/input/touchscreen/Makefile  |   1 +
   drivers/input/touchscreen/colibri-vf50-ts.c | 404 
  
   3 files changed, 417 insertions(+)
   create mode 100644 drivers/input/touchscreen/colibri-vf50-ts.c
  
  diff --git a/drivers/input/touchscreen/Kconfig 
  b/drivers/input/touchscreen/Kconfig
  index 80f6386..28948ca 100644
  --- a/drivers/input/touchscreen/Kconfig
  +++ b/drivers/input/touchscreen/Kconfig
  @@ -1027,4 +1027,16 @@ config TOUCHSCREEN_ZFORCE
To compile this driver as a module, choose M here: the
module will be called zforce_ts.
   
  +config TOUCHSCREEN_COLIBRI_VF50
  +   tristate Toradex Colibri on board touchscreen driver
  +   depends on GPIOLIB  IIO  VF610_ADC
  +   help
  + Say Y here if you have a Colibri VF50 and plan to use
  + the on-board provided 4-wire touchscreen driver.
  +
  + If unsure, say N.
  +
  + To compile this driver as a module, choose M here: the
  + module will be called colibri_vf50_ts.
  +
   endif
  diff --git a/drivers/input/touchscreen/Makefile 
  b/drivers/input/touchscreen/Makefile
  index 44deea7..93746a0 100644
  --- a/drivers/input/touchscreen/Makefile
  +++ b/drivers/input/touchscreen/Makefile
  @@ -84,3 +84,4 @@ obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o
   obj-$(CONFIG_TOUCHSCREEN_SX8654)   += sx8654.o
   obj-$(CONFIG_TOUCHSCREEN_TPS6507X) += tps6507x-ts.o
   obj-$(CONFIG_TOUCHSCREEN_ZFORCE)   += zforce_ts.o
  +obj-$(CONFIG_TOUCHSCREEN_COLIBRI_VF50) += colibri-vf50-ts.o
  diff --git a/drivers/input/touchscreen/colibri-vf50-ts.c 
  b/drivers/input/touchscreen/colibri-vf50-ts.c
  new file mode 100644
  index 000..d7bc91a
  --- /dev/null
  +++ b/drivers/input/touchscreen/colibri-vf50-ts.c
  @@ -0,0 +1,404 @@
  +/* Copyright 2015 Toradex AG
  + *
  + * Toradex Colibri VF50 Touchscreen driver
  + *
  + * Originally authored by Stefan Agner for 3.0 kernel
  + *
  + * This program is free software; you can redistribute it and/or modify
  + * it under the terms of the GNU General Public License as published by
  + * the Free Software Foundation; either version 2 of the License, or
  + * (at your option) any later version.
  + */
  +
  +#include linux/delay.h
  +#include linux/err.h
  +#include linux/gpio.h
  +#include linux/iio/consumer.h
  +#include linux/iio/types.h
  +#include linux/input.h
  +#include linux/interrupt.h
  +#include linux/kernel.h
  +#include linux/module.h
  +#include linux/pinctrl/consumer.h
  +#include linux/platform_device.h
  +#include linux/slab.h
  +#include linux/types.h
  +
  +#define DRIVER_NAME colibri-vf50-ts
  +#define DRV_VERSION 1.0
  +
  +#define VF_ADC_MAX ((1  12) - 1)
  +
  +#define COLI_TOUCH_MIN_DELAY_US 1000
  +#define COLI_TOUCH_MAX_DELAY_US 2000
  +
  +static int min_pressure = 200;
  +
  +struct vf50_touch_device {
  +   struct platform_device  *pdev;
  +   struct input_dev*ts_input;
  +   struct iio_channel  *channels;
  +   struct gpio_desc *gpio_xp;
  +   struct gpio_desc *gpio_xm;
  +   struct gpio_desc *gpio_yp;
  +   struct gpio_desc *gpio_ym;
  +   struct gpio_desc *gpio_pen_detect;
  +   int pen_irq;
  +   bool stop_touchscreen;
  +};
  +
  +/*
  + * Enables given plates and measures touch parameters using ADC
  + */
  +static int adc_ts_measure(struct iio_channel *channel,
  + struct gpio_desc *plate_p, struct gpio_desc *plate_m)
  +{
  +   int i, value = 0, val = 0;
  +   int ret;
  +
  +   gpiod_set_value(plate_p, 1);
  +   gpiod_set_value(plate_m, 1);
  +
  +   usleep_range(COLI_TOUCH_MIN_DELAY_US, COLI_TOUCH_MAX_DELAY_US);
  +
  +   for (i = 0; i  5; i++) {
 
 Can we have a #define for 5?
 
  +   ret = iio_read_channel_raw(channel, val);
  +   if (ret  0) {
  +   value = ret;
  +   goto error_iio_read;
  +   }
  +
  +   value += val;
  +   }
  +
  +   value /= 5;
  +
  +error_iio_read:
  +   gpiod_set_value(plate_p, 0);
  +   gpiod_set_value(plate_m, 0);
  +
  +   return value;
  +}
  +
  +/*
  + * Enable touch detection using falling edge detection on XM
  + */
  +static void vf50_ts_enable_touch_detection(struct vf50_touch_device 
  *vf50_ts)
  +{
  +   /* Enable plate YM (needs to be strong GND, high active) */
  +   gpiod_set_value(vf50_ts-gpio_ym, 1);
  +
  +   /*
  +* Let the platform mux to idle state in order to enable
  +* Pull-Up on GPIO
  +*/
  +   

Re: [PATCH v3 3/3] touchscreen: colibri-vf50-ts: Add touchscreen support for Colibri VF50

2015-08-14 Thread Dmitry Torokhov
Hi Sanchayan,

On Wed, Aug 05, 2015 at 02:25:51PM +0530, Sanchayan Maity wrote:
> The Colibri Vybrid VF50 module supports 4-wire touchscreens using
> FETs and ADC inputs. This driver uses the IIO consumer interface
> and relies on the vf610_adc driver based on the IIO framework.
> 
> Signed-off-by: Sanchayan Maity 
> ---
>  drivers/input/touchscreen/Kconfig   |  12 +
>  drivers/input/touchscreen/Makefile  |   1 +
>  drivers/input/touchscreen/colibri-vf50-ts.c | 404 
> 
>  3 files changed, 417 insertions(+)
>  create mode 100644 drivers/input/touchscreen/colibri-vf50-ts.c
> 
> diff --git a/drivers/input/touchscreen/Kconfig 
> b/drivers/input/touchscreen/Kconfig
> index 80f6386..28948ca 100644
> --- a/drivers/input/touchscreen/Kconfig
> +++ b/drivers/input/touchscreen/Kconfig
> @@ -1027,4 +1027,16 @@ config TOUCHSCREEN_ZFORCE
> To compile this driver as a module, choose M here: the
> module will be called zforce_ts.
>  
> +config TOUCHSCREEN_COLIBRI_VF50
> + tristate "Toradex Colibri on board touchscreen driver"
> + depends on GPIOLIB && IIO && VF610_ADC
> + help
> +   Say Y here if you have a Colibri VF50 and plan to use
> +   the on-board provided 4-wire touchscreen driver.
> +
> +   If unsure, say N.
> +
> +   To compile this driver as a module, choose M here: the
> +   module will be called colibri_vf50_ts.
> +
>  endif
> diff --git a/drivers/input/touchscreen/Makefile 
> b/drivers/input/touchscreen/Makefile
> index 44deea7..93746a0 100644
> --- a/drivers/input/touchscreen/Makefile
> +++ b/drivers/input/touchscreen/Makefile
> @@ -84,3 +84,4 @@ obj-$(CONFIG_TOUCHSCREEN_W90X900)   += w90p910_ts.o
>  obj-$(CONFIG_TOUCHSCREEN_SX8654) += sx8654.o
>  obj-$(CONFIG_TOUCHSCREEN_TPS6507X)   += tps6507x-ts.o
>  obj-$(CONFIG_TOUCHSCREEN_ZFORCE) += zforce_ts.o
> +obj-$(CONFIG_TOUCHSCREEN_COLIBRI_VF50)   += colibri-vf50-ts.o
> diff --git a/drivers/input/touchscreen/colibri-vf50-ts.c 
> b/drivers/input/touchscreen/colibri-vf50-ts.c
> new file mode 100644
> index 000..d7bc91a
> --- /dev/null
> +++ b/drivers/input/touchscreen/colibri-vf50-ts.c
> @@ -0,0 +1,404 @@
> +/* Copyright 2015 Toradex AG
> + *
> + * Toradex Colibri VF50 Touchscreen driver
> + *
> + * Originally authored by Stefan Agner for 3.0 kernel
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define DRIVER_NAME "colibri-vf50-ts"
> +#define DRV_VERSION "1.0"
> +
> +#define VF_ADC_MAX ((1 << 12) - 1)
> +
> +#define COLI_TOUCH_MIN_DELAY_US 1000
> +#define COLI_TOUCH_MAX_DELAY_US 2000
> +
> +static int min_pressure = 200;
> +
> +struct vf50_touch_device {
> + struct platform_device  *pdev;
> + struct input_dev*ts_input;
> + struct iio_channel  *channels;
> + struct gpio_desc *gpio_xp;
> + struct gpio_desc *gpio_xm;
> + struct gpio_desc *gpio_yp;
> + struct gpio_desc *gpio_ym;
> + struct gpio_desc *gpio_pen_detect;
> + int pen_irq;
> + bool stop_touchscreen;
> +};
> +
> +/*
> + * Enables given plates and measures touch parameters using ADC
> + */
> +static int adc_ts_measure(struct iio_channel *channel,
> +   struct gpio_desc *plate_p, struct gpio_desc *plate_m)
> +{
> + int i, value = 0, val = 0;
> + int ret;
> +
> + gpiod_set_value(plate_p, 1);
> + gpiod_set_value(plate_m, 1);
> +
> + usleep_range(COLI_TOUCH_MIN_DELAY_US, COLI_TOUCH_MAX_DELAY_US);
> +
> + for (i = 0; i < 5; i++) {

Can we have a #define for 5?

> + ret = iio_read_channel_raw(channel, );
> + if (ret < 0) {
> + value = ret;
> + goto error_iio_read;
> + }
> +
> + value += val;
> + }
> +
> + value /= 5;
> +
> +error_iio_read:
> + gpiod_set_value(plate_p, 0);
> + gpiod_set_value(plate_m, 0);
> +
> + return value;
> +}
> +
> +/*
> + * Enable touch detection using falling edge detection on XM
> + */
> +static void vf50_ts_enable_touch_detection(struct vf50_touch_device *vf50_ts)
> +{
> + /* Enable plate YM (needs to be strong GND, high active) */
> + gpiod_set_value(vf50_ts->gpio_ym, 1);
> +
> + /*
> +  * Let the platform mux to idle state in order to enable
> +  * Pull-Up on GPIO
> +  */
> + pinctrl_pm_select_idle_state(_ts->pdev->dev);
> +}
> +
> +/*
> + * ADC touch screen sampling bottom half irq handler
> + */
> +static irqreturn_t vf50_ts_irq_bh(int irq, void *private)
> +{
> + struct vf50_touch_device *vf50_ts = (struct vf50_touch_device *)private;
> + struct 

Re: [PATCH v3 3/3] touchscreen: colibri-vf50-ts: Add touchscreen support for Colibri VF50

2015-08-14 Thread Dmitry Torokhov
Hi Sanchayan,

On Wed, Aug 05, 2015 at 02:25:51PM +0530, Sanchayan Maity wrote:
 The Colibri Vybrid VF50 module supports 4-wire touchscreens using
 FETs and ADC inputs. This driver uses the IIO consumer interface
 and relies on the vf610_adc driver based on the IIO framework.
 
 Signed-off-by: Sanchayan Maity maitysancha...@gmail.com
 ---
  drivers/input/touchscreen/Kconfig   |  12 +
  drivers/input/touchscreen/Makefile  |   1 +
  drivers/input/touchscreen/colibri-vf50-ts.c | 404 
 
  3 files changed, 417 insertions(+)
  create mode 100644 drivers/input/touchscreen/colibri-vf50-ts.c
 
 diff --git a/drivers/input/touchscreen/Kconfig 
 b/drivers/input/touchscreen/Kconfig
 index 80f6386..28948ca 100644
 --- a/drivers/input/touchscreen/Kconfig
 +++ b/drivers/input/touchscreen/Kconfig
 @@ -1027,4 +1027,16 @@ config TOUCHSCREEN_ZFORCE
 To compile this driver as a module, choose M here: the
 module will be called zforce_ts.
  
 +config TOUCHSCREEN_COLIBRI_VF50
 + tristate Toradex Colibri on board touchscreen driver
 + depends on GPIOLIB  IIO  VF610_ADC
 + help
 +   Say Y here if you have a Colibri VF50 and plan to use
 +   the on-board provided 4-wire touchscreen driver.
 +
 +   If unsure, say N.
 +
 +   To compile this driver as a module, choose M here: the
 +   module will be called colibri_vf50_ts.
 +
  endif
 diff --git a/drivers/input/touchscreen/Makefile 
 b/drivers/input/touchscreen/Makefile
 index 44deea7..93746a0 100644
 --- a/drivers/input/touchscreen/Makefile
 +++ b/drivers/input/touchscreen/Makefile
 @@ -84,3 +84,4 @@ obj-$(CONFIG_TOUCHSCREEN_W90X900)   += w90p910_ts.o
  obj-$(CONFIG_TOUCHSCREEN_SX8654) += sx8654.o
  obj-$(CONFIG_TOUCHSCREEN_TPS6507X)   += tps6507x-ts.o
  obj-$(CONFIG_TOUCHSCREEN_ZFORCE) += zforce_ts.o
 +obj-$(CONFIG_TOUCHSCREEN_COLIBRI_VF50)   += colibri-vf50-ts.o
 diff --git a/drivers/input/touchscreen/colibri-vf50-ts.c 
 b/drivers/input/touchscreen/colibri-vf50-ts.c
 new file mode 100644
 index 000..d7bc91a
 --- /dev/null
 +++ b/drivers/input/touchscreen/colibri-vf50-ts.c
 @@ -0,0 +1,404 @@
 +/* Copyright 2015 Toradex AG
 + *
 + * Toradex Colibri VF50 Touchscreen driver
 + *
 + * Originally authored by Stefan Agner for 3.0 kernel
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation; either version 2 of the License, or
 + * (at your option) any later version.
 + */
 +
 +#include linux/delay.h
 +#include linux/err.h
 +#include linux/gpio.h
 +#include linux/iio/consumer.h
 +#include linux/iio/types.h
 +#include linux/input.h
 +#include linux/interrupt.h
 +#include linux/kernel.h
 +#include linux/module.h
 +#include linux/pinctrl/consumer.h
 +#include linux/platform_device.h
 +#include linux/slab.h
 +#include linux/types.h
 +
 +#define DRIVER_NAME colibri-vf50-ts
 +#define DRV_VERSION 1.0
 +
 +#define VF_ADC_MAX ((1  12) - 1)
 +
 +#define COLI_TOUCH_MIN_DELAY_US 1000
 +#define COLI_TOUCH_MAX_DELAY_US 2000
 +
 +static int min_pressure = 200;
 +
 +struct vf50_touch_device {
 + struct platform_device  *pdev;
 + struct input_dev*ts_input;
 + struct iio_channel  *channels;
 + struct gpio_desc *gpio_xp;
 + struct gpio_desc *gpio_xm;
 + struct gpio_desc *gpio_yp;
 + struct gpio_desc *gpio_ym;
 + struct gpio_desc *gpio_pen_detect;
 + int pen_irq;
 + bool stop_touchscreen;
 +};
 +
 +/*
 + * Enables given plates and measures touch parameters using ADC
 + */
 +static int adc_ts_measure(struct iio_channel *channel,
 +   struct gpio_desc *plate_p, struct gpio_desc *plate_m)
 +{
 + int i, value = 0, val = 0;
 + int ret;
 +
 + gpiod_set_value(plate_p, 1);
 + gpiod_set_value(plate_m, 1);
 +
 + usleep_range(COLI_TOUCH_MIN_DELAY_US, COLI_TOUCH_MAX_DELAY_US);
 +
 + for (i = 0; i  5; i++) {

Can we have a #define for 5?

 + ret = iio_read_channel_raw(channel, val);
 + if (ret  0) {
 + value = ret;
 + goto error_iio_read;
 + }
 +
 + value += val;
 + }
 +
 + value /= 5;
 +
 +error_iio_read:
 + gpiod_set_value(plate_p, 0);
 + gpiod_set_value(plate_m, 0);
 +
 + return value;
 +}
 +
 +/*
 + * Enable touch detection using falling edge detection on XM
 + */
 +static void vf50_ts_enable_touch_detection(struct vf50_touch_device *vf50_ts)
 +{
 + /* Enable plate YM (needs to be strong GND, high active) */
 + gpiod_set_value(vf50_ts-gpio_ym, 1);
 +
 + /*
 +  * Let the platform mux to idle state in order to enable
 +  * Pull-Up on GPIO
 +  */
 + pinctrl_pm_select_idle_state(vf50_ts-pdev-dev);
 +}
 +
 +/*
 + * ADC touch screen sampling bottom half irq handler
 + */
 +static irqreturn_t vf50_ts_irq_bh(int irq, void *private)
 +{
 + struct vf50_touch_device 

[PATCH v3 3/3] touchscreen: colibri-vf50-ts: Add touchscreen support for Colibri VF50

2015-08-05 Thread Sanchayan Maity
The Colibri Vybrid VF50 module supports 4-wire touchscreens using
FETs and ADC inputs. This driver uses the IIO consumer interface
and relies on the vf610_adc driver based on the IIO framework.

Signed-off-by: Sanchayan Maity 
---
 drivers/input/touchscreen/Kconfig   |  12 +
 drivers/input/touchscreen/Makefile  |   1 +
 drivers/input/touchscreen/colibri-vf50-ts.c | 404 
 3 files changed, 417 insertions(+)
 create mode 100644 drivers/input/touchscreen/colibri-vf50-ts.c

diff --git a/drivers/input/touchscreen/Kconfig 
b/drivers/input/touchscreen/Kconfig
index 80f6386..28948ca 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -1027,4 +1027,16 @@ config TOUCHSCREEN_ZFORCE
  To compile this driver as a module, choose M here: the
  module will be called zforce_ts.
 
+config TOUCHSCREEN_COLIBRI_VF50
+   tristate "Toradex Colibri on board touchscreen driver"
+   depends on GPIOLIB && IIO && VF610_ADC
+   help
+ Say Y here if you have a Colibri VF50 and plan to use
+ the on-board provided 4-wire touchscreen driver.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called colibri_vf50_ts.
+
 endif
diff --git a/drivers/input/touchscreen/Makefile 
b/drivers/input/touchscreen/Makefile
index 44deea7..93746a0 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -84,3 +84,4 @@ obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o
 obj-$(CONFIG_TOUCHSCREEN_SX8654)   += sx8654.o
 obj-$(CONFIG_TOUCHSCREEN_TPS6507X) += tps6507x-ts.o
 obj-$(CONFIG_TOUCHSCREEN_ZFORCE)   += zforce_ts.o
+obj-$(CONFIG_TOUCHSCREEN_COLIBRI_VF50) += colibri-vf50-ts.o
diff --git a/drivers/input/touchscreen/colibri-vf50-ts.c 
b/drivers/input/touchscreen/colibri-vf50-ts.c
new file mode 100644
index 000..d7bc91a
--- /dev/null
+++ b/drivers/input/touchscreen/colibri-vf50-ts.c
@@ -0,0 +1,404 @@
+/* Copyright 2015 Toradex AG
+ *
+ * Toradex Colibri VF50 Touchscreen driver
+ *
+ * Originally authored by Stefan Agner for 3.0 kernel
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define DRIVER_NAME "colibri-vf50-ts"
+#define DRV_VERSION "1.0"
+
+#define VF_ADC_MAX ((1 << 12) - 1)
+
+#define COLI_TOUCH_MIN_DELAY_US 1000
+#define COLI_TOUCH_MAX_DELAY_US 2000
+
+static int min_pressure = 200;
+
+struct vf50_touch_device {
+   struct platform_device  *pdev;
+   struct input_dev*ts_input;
+   struct iio_channel  *channels;
+   struct gpio_desc *gpio_xp;
+   struct gpio_desc *gpio_xm;
+   struct gpio_desc *gpio_yp;
+   struct gpio_desc *gpio_ym;
+   struct gpio_desc *gpio_pen_detect;
+   int pen_irq;
+   bool stop_touchscreen;
+};
+
+/*
+ * Enables given plates and measures touch parameters using ADC
+ */
+static int adc_ts_measure(struct iio_channel *channel,
+ struct gpio_desc *plate_p, struct gpio_desc *plate_m)
+{
+   int i, value = 0, val = 0;
+   int ret;
+
+   gpiod_set_value(plate_p, 1);
+   gpiod_set_value(plate_m, 1);
+
+   usleep_range(COLI_TOUCH_MIN_DELAY_US, COLI_TOUCH_MAX_DELAY_US);
+
+   for (i = 0; i < 5; i++) {
+   ret = iio_read_channel_raw(channel, );
+   if (ret < 0) {
+   value = ret;
+   goto error_iio_read;
+   }
+
+   value += val;
+   }
+
+   value /= 5;
+
+error_iio_read:
+   gpiod_set_value(plate_p, 0);
+   gpiod_set_value(plate_m, 0);
+
+   return value;
+}
+
+/*
+ * Enable touch detection using falling edge detection on XM
+ */
+static void vf50_ts_enable_touch_detection(struct vf50_touch_device *vf50_ts)
+{
+   /* Enable plate YM (needs to be strong GND, high active) */
+   gpiod_set_value(vf50_ts->gpio_ym, 1);
+
+   /*
+* Let the platform mux to idle state in order to enable
+* Pull-Up on GPIO
+*/
+   pinctrl_pm_select_idle_state(_ts->pdev->dev);
+}
+
+/*
+ * ADC touch screen sampling bottom half irq handler
+ */
+static irqreturn_t vf50_ts_irq_bh(int irq, void *private)
+{
+   struct vf50_touch_device *vf50_ts = (struct vf50_touch_device *)private;
+   struct device *dev = _ts->pdev->dev;
+   int val_x, val_y, val_z1, val_z2, val_p = 0;
+   bool discard_val_on_start = true;
+
+   /* Disable the touch detection plates */
+   gpiod_set_value(vf50_ts->gpio_ym, 0);
+
+   /* Let the platform mux to default state in order to mux as ADC */
+   

[PATCH v3 3/3] touchscreen: colibri-vf50-ts: Add touchscreen support for Colibri VF50

2015-08-05 Thread Sanchayan Maity
The Colibri Vybrid VF50 module supports 4-wire touchscreens using
FETs and ADC inputs. This driver uses the IIO consumer interface
and relies on the vf610_adc driver based on the IIO framework.

Signed-off-by: Sanchayan Maity maitysancha...@gmail.com
---
 drivers/input/touchscreen/Kconfig   |  12 +
 drivers/input/touchscreen/Makefile  |   1 +
 drivers/input/touchscreen/colibri-vf50-ts.c | 404 
 3 files changed, 417 insertions(+)
 create mode 100644 drivers/input/touchscreen/colibri-vf50-ts.c

diff --git a/drivers/input/touchscreen/Kconfig 
b/drivers/input/touchscreen/Kconfig
index 80f6386..28948ca 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -1027,4 +1027,16 @@ config TOUCHSCREEN_ZFORCE
  To compile this driver as a module, choose M here: the
  module will be called zforce_ts.
 
+config TOUCHSCREEN_COLIBRI_VF50
+   tristate Toradex Colibri on board touchscreen driver
+   depends on GPIOLIB  IIO  VF610_ADC
+   help
+ Say Y here if you have a Colibri VF50 and plan to use
+ the on-board provided 4-wire touchscreen driver.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called colibri_vf50_ts.
+
 endif
diff --git a/drivers/input/touchscreen/Makefile 
b/drivers/input/touchscreen/Makefile
index 44deea7..93746a0 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -84,3 +84,4 @@ obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o
 obj-$(CONFIG_TOUCHSCREEN_SX8654)   += sx8654.o
 obj-$(CONFIG_TOUCHSCREEN_TPS6507X) += tps6507x-ts.o
 obj-$(CONFIG_TOUCHSCREEN_ZFORCE)   += zforce_ts.o
+obj-$(CONFIG_TOUCHSCREEN_COLIBRI_VF50) += colibri-vf50-ts.o
diff --git a/drivers/input/touchscreen/colibri-vf50-ts.c 
b/drivers/input/touchscreen/colibri-vf50-ts.c
new file mode 100644
index 000..d7bc91a
--- /dev/null
+++ b/drivers/input/touchscreen/colibri-vf50-ts.c
@@ -0,0 +1,404 @@
+/* Copyright 2015 Toradex AG
+ *
+ * Toradex Colibri VF50 Touchscreen driver
+ *
+ * Originally authored by Stefan Agner for 3.0 kernel
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include linux/delay.h
+#include linux/err.h
+#include linux/gpio.h
+#include linux/iio/consumer.h
+#include linux/iio/types.h
+#include linux/input.h
+#include linux/interrupt.h
+#include linux/kernel.h
+#include linux/module.h
+#include linux/pinctrl/consumer.h
+#include linux/platform_device.h
+#include linux/slab.h
+#include linux/types.h
+
+#define DRIVER_NAME colibri-vf50-ts
+#define DRV_VERSION 1.0
+
+#define VF_ADC_MAX ((1  12) - 1)
+
+#define COLI_TOUCH_MIN_DELAY_US 1000
+#define COLI_TOUCH_MAX_DELAY_US 2000
+
+static int min_pressure = 200;
+
+struct vf50_touch_device {
+   struct platform_device  *pdev;
+   struct input_dev*ts_input;
+   struct iio_channel  *channels;
+   struct gpio_desc *gpio_xp;
+   struct gpio_desc *gpio_xm;
+   struct gpio_desc *gpio_yp;
+   struct gpio_desc *gpio_ym;
+   struct gpio_desc *gpio_pen_detect;
+   int pen_irq;
+   bool stop_touchscreen;
+};
+
+/*
+ * Enables given plates and measures touch parameters using ADC
+ */
+static int adc_ts_measure(struct iio_channel *channel,
+ struct gpio_desc *plate_p, struct gpio_desc *plate_m)
+{
+   int i, value = 0, val = 0;
+   int ret;
+
+   gpiod_set_value(plate_p, 1);
+   gpiod_set_value(plate_m, 1);
+
+   usleep_range(COLI_TOUCH_MIN_DELAY_US, COLI_TOUCH_MAX_DELAY_US);
+
+   for (i = 0; i  5; i++) {
+   ret = iio_read_channel_raw(channel, val);
+   if (ret  0) {
+   value = ret;
+   goto error_iio_read;
+   }
+
+   value += val;
+   }
+
+   value /= 5;
+
+error_iio_read:
+   gpiod_set_value(plate_p, 0);
+   gpiod_set_value(plate_m, 0);
+
+   return value;
+}
+
+/*
+ * Enable touch detection using falling edge detection on XM
+ */
+static void vf50_ts_enable_touch_detection(struct vf50_touch_device *vf50_ts)
+{
+   /* Enable plate YM (needs to be strong GND, high active) */
+   gpiod_set_value(vf50_ts-gpio_ym, 1);
+
+   /*
+* Let the platform mux to idle state in order to enable
+* Pull-Up on GPIO
+*/
+   pinctrl_pm_select_idle_state(vf50_ts-pdev-dev);
+}
+
+/*
+ * ADC touch screen sampling bottom half irq handler
+ */
+static irqreturn_t vf50_ts_irq_bh(int irq, void *private)
+{
+   struct vf50_touch_device *vf50_ts = (struct vf50_touch_device *)private;
+   struct device *dev = vf50_ts-pdev-dev;
+   int val_x, val_y, val_z1, val_z2, val_p = 0;
+   bool