input: touch: maxim: Do not rely on previous state of reset
Xiaohui Tao [Thu, 5 Sep 2013 22:34:35 +0000 (15:34 -0700)]
Currently the driver does a reset in their resume function
(1) rely on previous state of the reset pin
(2) rely on touch_fusion daemon to issue a reset signal

Both of them are not reliable since
(1) The reset pin is possibly not low when the system resumes
due to some racing communication between the daemon/driver/chip
or some communication between the daemon/driver/chip that is
aborted during rapid resume/suspend. This can result in the reset
signal in resume not issued to the chip and it can cause touch
not working.
(1) The chip/daemon may enter some wired state that cannot
recover so that the daemon cannot issue the reset signal correctly.

The solution is to issue a low signal to the chip in resume
function so that it can guarantee that a true reset signal is issued
to the chip.

Bug 1353325

Change-Id: I2ede0dbb8987457cde344cdba12889b708fd95e7
Signed-off-by: Xiaohui Tao <xtao@nvidia.com>
Reviewed-on: http://git-master/r/268630
(cherry picked from commit 107001b0b70d39a489fe7d708af01a475ff2cc56)
Reviewed-on: http://git-master/r/271078
Reviewed-by: Mrutyunjay Sawant <msawant@nvidia.com>
Tested-by: Mrutyunjay Sawant <msawant@nvidia.com>

drivers/input/touchscreen/maxim_sti.c

index d6b8df6..3bca1bd 100644 (file)
@@ -664,10 +664,8 @@ static int suspend(struct device *dev)
        pdata->reset(pdata, 0);
        usleep_range(100, 120);
        ret = regulator_control(dd, false);
-       if (ret < 0) {
-               pdata->reset(pdata, 1);
+       if (ret < 0)
                return ret;
-       }
 
        return 0;
 }
@@ -682,6 +680,7 @@ static int resume(struct device *dev)
                return 0;
 
        /* power-up and reset-high */
+       pdata->reset(pdata, 0);
        ret = regulator_control(dd, true);
        if (ret < 0)
                return ret;