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);
 
 {
        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
                }
                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;
        }
 
        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");