[PORT FROM R2] atmel_mxt224: restore power config during resume
authorHong Liu <hong.liu@intel.com>
Tue, 31 Jan 2012 02:21:43 +0000 (10:21 +0800)
committerbuildbot <buildbot@intel.com>
Wed, 8 Feb 2012 01:36:53 +0000 (17:36 -0800)
BZ: 19465

If we put palm/face on screen during touch resume, touch may send
multi-point touch data to driver before it performs a reset. Then after
reset, all touch state will be cleared in touch firmware, and it will
not report finger lift for the 2nd finger. This causes driver always report
multi-touch data (2 points in our driver config) for singer finger operation.
For apps don't support multi-touch operation (like phone app), it looks like
touch is dead at that time.

Fixed by do a power config restoration and then do manual calibration instead
of doing a soft reset during late resume.

Change-Id: Iba3f67debd2486d6830298dd87a8c2368e8fa520
Orig-Change-Id: I710e75bfab5170ee7a91029db28c8da3d1fa6115
Signed-off-by: Hong Liu <hong.liu@intel.com>
Reviewed-on: http://android.intel.com:8080/34008
Reviewed-by: Cai, Stanley W <stanley.w.cai@intel.com>
Tested-by: Wang, Zhifeng <zhifeng.wang@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/input/touchscreen/atmel_mxt224.c

index 2e229e8..6b9c4ee 100644 (file)
@@ -2524,19 +2524,37 @@ void mxt_early_suspend(struct early_suspend *h)
        mutex_unlock(&mxt_es->dev_mutex);
 }
 
+static void mxt_calibrate(struct mxt_data *mxt)
+{
+       u16 addr;
+
+       addr = get_object_address(MXT_GEN_COMMANDPROCESSOR_T6,
+                       0, mxt->object_table,
+                       mxt->device_info.num_objs) + MXT_ADR_T6_CALIBRATE;
+       mxt_write_byte(mxt->client, addr, 0x55);
+}
+
 void mxt_late_resume(struct early_suspend *h)
 {
-       int gpio_intr;
+       int ret;
+       u16 addr;
 
        enable_irq(mxt_es->irq);
 
        mutex_lock(&mxt_es->dev_mutex);
        mxt_es->calibration_confirm = 0;
-       mxt_reset(mxt_es);
-
-       gpio_intr = gpio_get_value(mxt_es->mxt_intr_gpio);
-       if (gpio_intr == 0)
-               mxt_worker(mxt_es);
+       addr = get_object_address(MXT_GEN_POWERCONFIG_T7,
+                               0,
+                               mxt_es->object_table,
+                               mxt_es->device_info.num_objs);
+       ret = mxt_write_block(mxt_es->client, addr, 3, mxt_es->T7);
+       if (ret < 0) {
+               dev_err(&mxt_es->client->dev, "fail to start scan.\n");
+               mxt_gpio_reset(mxt_es);
+       } else {
+               msleep(40);
+               mxt_calibrate(mxt_es);
+       }
 
        mxt_es->suspended = FALSE;
        mutex_unlock(&mxt_es->dev_mutex);