From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lee Jones Subject: Re: [PATCH 2/5] input: touchscreen: ti_am335x_tsc: Remove udelay in interrupt handler Date: Mon, 10 Nov 2014 09:11:23 +0000 Message-ID: <20141110091123.GC21424@x1> References: <1415339350-17679-1-git-send-email-vigneshr@ti.com> <1415339350-17679-3-git-send-email-vigneshr@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Return-path: Content-Disposition: inline In-Reply-To: <1415339350-17679-3-git-send-email-vigneshr@ti.com> Sender: linux-kernel-owner@vger.kernel.org To: Vignesh R Cc: Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , Benoit Cousson , Tony Lindgren , Russell King , Jonathan Cameron , Hartmut Knaack , Dmitry Torokhov , Sebastian Andrzej Siewior , Lars-Peter Clausen , Peter Meerwald , Samuel Ortiz , Felipe Balbi , Brad Griffis , Sanjeev Sharma , Paul Gortmaker , Jan Kardell , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, linux-arm-kernel@lists.i List-Id: devicetree@vger.kernel.org On Fri, 07 Nov 2014, Vignesh R wrote: > From: Brad Griffis >=20 > TSC interrupt handler had udelay to avoid reporting of false pen-up > interrupt to user space. This patch implements workaround suggesting = in > Advisory 1.0.31 of silicon errata for am335x, thus eliminating udelay > and touchscreen lag. This also improves performance of touchscreen an= d > eliminates sudden jump of cursor at touch release. >=20 > IDLECONFIG and CHARGECONFIG registers are to be configured > with same values in order to eliminate false pen-up events. This > workaround may result in false pen-down to be detected, hence conside= rable > charge step delay needs to be added. The charge delay is set to 0xB00= 0 > (in terms of ADC clock cycles) by default. >=20 > TSC steps are disabled at the end of every sampling cycle and EOS bit= is > set. Once the EOS bit is set, the TSC steps need to be re-enabled to = begin > next sampling cycle. >=20 > Signed-off-by: Brad Griffis > [vigneshr@ti.com: Ported the patch from v3.12 to v3.18rc2] >=20 > Signed-off-by: Vignesh R > --- > drivers/input/touchscreen/ti_am335x_tsc.c | 56 ++++++++++++---------= ---------- > include/linux/mfd/ti_am335x_tscadc.h | 3 +- Acked-by: Lee Jones > 2 files changed, 24 insertions(+), 35 deletions(-) >=20 > diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/inpu= t/touchscreen/ti_am335x_tsc.c > index 1aeac9675fe7..483fd97c0e0c 100644 > --- a/drivers/input/touchscreen/ti_am335x_tsc.c > +++ b/drivers/input/touchscreen/ti_am335x_tsc.c > @@ -173,11 +173,9 @@ static void titsc_step_config(struct titsc *ts_d= ev) > titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY); > } > =20 > - /* Charge step configuration */ > - config =3D ts_dev->bit_xp | ts_dev->bit_yn | > - STEPCHARGE_RFP_XPUL | STEPCHARGE_RFM_XNUR | > - STEPCHARGE_INM_AN1 | STEPCHARGE_INP(ts_dev->inp_yp); > + /* Make CHARGECONFIG same as IDLECONFIG */ > =20 > + config =3D titsc_readl(ts_dev, REG_IDLECONFIG); > titsc_writel(ts_dev, REG_CHARGECONFIG, config); > titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY); > =20 > @@ -264,9 +262,26 @@ static irqreturn_t titsc_irq(int irq, void *dev) > unsigned int status, irqclr =3D 0; > unsigned int x =3D 0, y =3D 0; > unsigned int z1, z2, z; > - unsigned int fsm; > =20 > - status =3D titsc_readl(ts_dev, REG_IRQSTATUS); > + status =3D titsc_readl(ts_dev, REG_RAWIRQSTATUS); > + if (status & IRQENB_HW_PEN) { > + ts_dev->pen_down =3D true; > + titsc_writel(ts_dev, REG_IRQWAKEUP, 0x00); > + titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN); > + irqclr |=3D IRQENB_HW_PEN; > + } > + > + if (status & IRQENB_PENUP) { > + ts_dev->pen_down =3D false; > + input_report_key(input_dev, BTN_TOUCH, 0); > + input_report_abs(input_dev, ABS_PRESSURE, 0); > + input_sync(input_dev); > + irqclr |=3D IRQENB_PENUP; > + } > + > + if (status & IRQENB_EOS) > + irqclr |=3D IRQENB_EOS; > + > /* > * ADC and touchscreen share the IRQ line. > * FIFO1 interrupts are used by ADC. Handle FIFO0 IRQs here only > @@ -297,34 +312,6 @@ static irqreturn_t titsc_irq(int irq, void *dev) > } > irqclr |=3D IRQENB_FIFO0THRES; > } > - > - /* > - * Time for sequencer to settle, to read > - * correct state of the sequencer. > - */ > - udelay(SEQ_SETTLE); > - > - status =3D titsc_readl(ts_dev, REG_RAWIRQSTATUS); > - if (status & IRQENB_PENUP) { > - /* Pen up event */ > - fsm =3D titsc_readl(ts_dev, REG_ADCFSM); > - if (fsm =3D=3D ADCFSM_STEPID) { > - ts_dev->pen_down =3D false; > - input_report_key(input_dev, BTN_TOUCH, 0); > - input_report_abs(input_dev, ABS_PRESSURE, 0); > - input_sync(input_dev); > - } else { > - ts_dev->pen_down =3D true; > - } > - irqclr |=3D IRQENB_PENUP; > - } > - > - if (status & IRQENB_HW_PEN) { > - > - titsc_writel(ts_dev, REG_IRQWAKEUP, 0x00); > - titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN); > - } > - > if (irqclr) { > titsc_writel(ts_dev, REG_IRQSTATUS, irqclr); > am335x_tsc_se_set_cache(ts_dev->mfd_tscadc, ts_dev->step_mask); > @@ -417,6 +404,7 @@ static int titsc_probe(struct platform_device *pd= ev) > } > =20 > titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES); > + titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_EOS); > err =3D titsc_config_wires(ts_dev); > if (err) { > dev_err(&pdev->dev, "wrong i/p wire configuration\n"); > diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd= /ti_am335x_tscadc.h > index e2e70053470e..c99be5dc0f5c 100644 > --- a/include/linux/mfd/ti_am335x_tscadc.h > +++ b/include/linux/mfd/ti_am335x_tscadc.h > @@ -52,6 +52,7 @@ > =20 > /* IRQ enable */ > #define IRQENB_HW_PEN BIT(0) > +#define IRQENB_EOS BIT(1) > #define IRQENB_FIFO0THRES BIT(2) > #define IRQENB_FIFO0OVRRUN BIT(3) > #define IRQENB_FIFO0UNDRFLW BIT(4) > @@ -107,7 +108,7 @@ > /* Charge delay */ > #define CHARGEDLY_OPEN_MASK (0x3FFFF << 0) > #define CHARGEDLY_OPEN(val) ((val) << 0) > -#define CHARGEDLY_OPENDLY CHARGEDLY_OPEN(1) > +#define CHARGEDLY_OPENDLY CHARGEDLY_OPEN(0xB000) > =20 > /* Control register */ > #define CNTRLREG_TSCSSENB BIT(0) --=20 Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org =E2=94=82 Open source software for ARM SoCs =46ollow Linaro: Facebook | Twitter | Blog