|
@@ -173,11 +173,9 @@ static void titsc_step_config(struct titsc *ts_dev)
|
|
|
titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY);
|
|
|
}
|
|
|
|
|
|
- /* Charge step configuration */
|
|
|
- config = 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 */
|
|
|
|
|
|
+ config = titsc_readl(ts_dev, REG_IDLECONFIG);
|
|
|
titsc_writel(ts_dev, REG_CHARGECONFIG, config);
|
|
|
titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY);
|
|
|
|
|
@@ -261,12 +259,34 @@ static irqreturn_t titsc_irq(int irq, void *dev)
|
|
|
{
|
|
|
struct titsc *ts_dev = dev;
|
|
|
struct input_dev *input_dev = ts_dev->input;
|
|
|
- unsigned int status, irqclr = 0;
|
|
|
+ unsigned int fsm, status, irqclr = 0;
|
|
|
unsigned int x = 0, y = 0;
|
|
|
unsigned int z1, z2, z;
|
|
|
- unsigned int fsm;
|
|
|
|
|
|
- status = titsc_readl(ts_dev, REG_IRQSTATUS);
|
|
|
+ status = titsc_readl(ts_dev, REG_RAWIRQSTATUS);
|
|
|
+ if (status & IRQENB_HW_PEN) {
|
|
|
+ ts_dev->pen_down = true;
|
|
|
+ titsc_writel(ts_dev, REG_IRQWAKEUP, 0x00);
|
|
|
+ titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN);
|
|
|
+ irqclr |= IRQENB_HW_PEN;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (status & IRQENB_PENUP) {
|
|
|
+ fsm = titsc_readl(ts_dev, REG_ADCFSM);
|
|
|
+ if (fsm == ADCFSM_STEPID) {
|
|
|
+ ts_dev->pen_down = 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 = true;
|
|
|
+ }
|
|
|
+ irqclr |= IRQENB_PENUP;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (status & IRQENB_EOS)
|
|
|
+ irqclr |= IRQENB_EOS;
|
|
|
+
|
|
|
/*
|
|
|
* ADC and touchscreen share the IRQ line.
|
|
|
* FIFO1 interrupts are used by ADC. Handle FIFO0 IRQs here only
|
|
@@ -297,37 +317,11 @@ static irqreturn_t titsc_irq(int irq, void *dev)
|
|
|
}
|
|
|
irqclr |= IRQENB_FIFO0THRES;
|
|
|
}
|
|
|
-
|
|
|
- /*
|
|
|
- * Time for sequencer to settle, to read
|
|
|
- * correct state of the sequencer.
|
|
|
- */
|
|
|
- udelay(SEQ_SETTLE);
|
|
|
-
|
|
|
- status = titsc_readl(ts_dev, REG_RAWIRQSTATUS);
|
|
|
- if (status & IRQENB_PENUP) {
|
|
|
- /* Pen up event */
|
|
|
- fsm = titsc_readl(ts_dev, REG_ADCFSM);
|
|
|
- if (fsm == ADCFSM_STEPID) {
|
|
|
- ts_dev->pen_down = 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 = true;
|
|
|
- }
|
|
|
- irqclr |= 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);
|
|
|
+ if (status & IRQENB_EOS)
|
|
|
+ am335x_tsc_se_set_cache(ts_dev->mfd_tscadc,
|
|
|
+ ts_dev->step_mask);
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
return IRQ_NONE;
|
|
@@ -417,6 +411,7 @@ static int titsc_probe(struct platform_device *pdev)
|
|
|
}
|
|
|
|
|
|
titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES);
|
|
|
+ titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_EOS);
|
|
|
err = titsc_config_wires(ts_dev);
|
|
|
if (err) {
|
|
|
dev_err(&pdev->dev, "wrong i/p wire configuration\n");
|