lkml.org 
[lkml]   [2015]   [Oct]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [Update][PATCH 3/3] input: i8042: Avoid resetting controller on system suspend/resume
    Date
    On Wednesday, October 07, 2015 03:03:57 AM Rafael J. Wysocki wrote:
    > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    >
    > If the upcoming system suspend is not going to be handled by the
    > platform firmware, like in the suspend-to-idle case, it is not
    > necessary to reset the controller in i8042_pm_suspend(), so avoid
    > doing that.
    >
    > Moreover, if the system resume currently in progress has not been
    > started by the platform firmware, like in the suspend-to-idle case,
    > i8042_controller_resume() need not be called by i8042_pm_resume(),
    > so avoid doing that too in that case.
    >
    > Additionally, try to catch the event that woke up the system by
    > calling the interrupt handler early during system resume if it has
    > not been started by the platform firmware.
    >
    > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

    If there are no more comments here, I'll tentatively queue it up for v4.4
    along with the [1-2/3] from this series.

    Please let me know if there are any problems with that.

    Thanks,
    Rafael


    > ---
    > drivers/input/serio/i8042.c | 32 +++++++++++++++++++++++++++-----
    > 1 file changed, 27 insertions(+), 5 deletions(-)
    >
    > Index: linux-pm/drivers/input/serio/i8042.c
    > ===================================================================
    > --- linux-pm.orig/drivers/input/serio/i8042.c
    > +++ linux-pm/drivers/input/serio/i8042.c
    > @@ -24,6 +24,7 @@
    > #include <linux/platform_device.h>
    > #include <linux/i8042.h>
    > #include <linux/slab.h>
    > +#include <linux/suspend.h>
    >
    > #include <asm/io.h>
    >
    > @@ -1170,7 +1171,8 @@ static int i8042_pm_suspend(struct devic
    > {
    > int i;
    >
    > - i8042_controller_reset(true);
    > + if (pm_suspend_via_firmware())
    > + i8042_controller_reset(true);
    >
    > /* Set up serio interrupts for system wakeup. */
    > for (i = 0; i < I8042_NUM_PORTS; i++) {
    > @@ -1183,8 +1185,17 @@ static int i8042_pm_suspend(struct devic
    > return 0;
    > }
    >
    > +static int i8042_pm_resume_noirq(struct device *dev)
    > +{
    > + if (!pm_resume_via_firmware())
    > + i8042_interrupt(0, NULL);
    > +
    > + return 0;
    > +}
    > +
    > static int i8042_pm_resume(struct device *dev)
    > {
    > + bool force_reset;
    > int i;
    >
    > for (i = 0; i < I8042_NUM_PORTS; i++) {
    > @@ -1195,11 +1206,21 @@ static int i8042_pm_resume(struct device
    > }
    >
    > /*
    > - * On resume from S2R we always try to reset the controller
    > - * to bring it in a sane state. (In case of S2D we expect
    > - * BIOS to reset the controller for us.)
    > + * If platform firmware was not going to be involved in suspend, we did
    > + * not restore the controller state to whatever it had been at boot
    > + * time, so we do not need to do anything.
    > */
    > - return i8042_controller_resume(true);
    > + if (!pm_suspend_via_firmware())
    > + return 0;
    > +
    > + /*
    > + * We only need to reset the controller if we are resuming after handing
    > + * off control to the platform firmware, otherwise we can simply restore
    > + * the mode.
    > + */
    > + force_reset = pm_resume_via_firmware();
    > +
    > + return i8042_controller_resume(force_reset);
    > }
    >
    > static int i8042_pm_thaw(struct device *dev)
    > @@ -1223,6 +1244,7 @@ static int i8042_pm_restore(struct devic
    >
    > static const struct dev_pm_ops i8042_pm_ops = {
    > .suspend = i8042_pm_suspend,
    > + .resume_noirq = i8042_pm_resume_noirq,
    > .resume = i8042_pm_resume,
    > .thaw = i8042_pm_thaw,
    > .poweroff = i8042_pm_reset,
    >
    > --



    \
     
     \ /
      Last update: 2015-10-12 22:01    [W:4.067 / U:0.540 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site