From: Hong Liu Date: Tue, 31 Jan 2012 02:21:43 +0000 (+0800) Subject: [PORT FROM R2] atmel_mxt224: restore power config during resume X-Git-Tag: 2.1b_release~1482 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=77634c6b7a91b18da63c480816c02f794eca09d4;p=kernel%2Fkernel-mfld-blackbay.git [PORT FROM R2] atmel_mxt224: restore power config during resume 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 Reviewed-on: http://android.intel.com:8080/34008 Reviewed-by: Cai, Stanley W Tested-by: Wang, Zhifeng Reviewed-by: buildbot Tested-by: buildbot --- diff --git a/drivers/input/touchscreen/atmel_mxt224.c b/drivers/input/touchscreen/atmel_mxt224.c index 2e229e8..6b9c4ee 100644 --- a/drivers/input/touchscreen/atmel_mxt224.c +++ b/drivers/input/touchscreen/atmel_mxt224.c @@ -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);