Re: [PATCH v3 3/3] touchscreen: colibri-vf50-ts: Add touchscreen support for Colibri VF50
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
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
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
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
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
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