HID: i2c-hid: Call device suspend callback before disabling irq
authorGabriele Mazzotta <gabriele.mzt@gmail.com>
Tue, 7 Jul 2015 19:58:02 +0000 (21:58 +0200)
committerJiri Kosina <jkosina@suse.com>
Wed, 8 Jul 2015 10:43:20 +0000 (12:43 +0200)
i2c-hid takes care of requesting and handling IRQs for HID devices
which in turns might expect them to be always active when working
in normal conditions. Hence, disabling IRQs before calling the suspend
callbacks can potentially cause problems since device drivers might
try to perform operations needing them.

Fix this by disabling IRQs only after the suspend callbacks had been
executed.

Signed-off-by: Gabriele Mazzotta <gabriele.mzt@gmail.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/i2c-hid/i2c-hid.c

index f77469d4edfb0ecb1709032361913d4a92ceb919..9ed69b5121f71bcaa2fba2d9b53d8bae1ea10c08 100644 (file)
@@ -1092,13 +1092,13 @@ static int i2c_hid_suspend(struct device *dev)
        struct hid_device *hid = ihid->hid;
        int ret = 0;
 
+       if (hid->driver && hid->driver->suspend)
+               ret = hid->driver->suspend(hid, PMSG_SUSPEND);
+
        disable_irq(ihid->irq);
        if (device_may_wakeup(&client->dev))
                enable_irq_wake(ihid->irq);
 
-       if (hid->driver && hid->driver->suspend)
-               ret = hid->driver->suspend(hid, PMSG_SUSPEND);
-
        /* Save some power */
        i2c_hid_set_power(client, I2C_HID_PWR_SLEEP);
 
This page took 0.027614 seconds and 5 git commands to generate.