• Doug Anderson's avatar
    HID: i2c-hid: Fix suspend/resume when already runtime suspended · 01714a6f
    Doug Anderson authored
    On ACPI-based systems ACPI power domain code runtime resumes device before
    calling suspend method, which ensures that i2c-hid suspend code starts with
    device not in low-power state and with interrupts enabled.
    
    On other systems, especially if device is not a part of any power domain,
    we may end up calling driver's system-level suspend routine while the
    device is runtime-suspended (with controller in presumably low power state
    and interrupts disabled). This will result in interrupts being essentially
    disabled twice, and we will only re-enable them after both system resume
    and runtime resume methods complete. Unfortunately i2c_hid_resume() calls
    i2c_hid_hwreset() and that only works properly if interrupts are enabled.
    
    Also if device is runtime-suspended driver's suspend code may fail if it
    tries to issue I/O requests.
    
    Let's fix it by runtime-resuming the device if we need to run HID driver's
    suspend code and also disabling interrupts only if device is not already
    runtime-suspended. Also on resume we mark the device as running at full
    power (since that is what resetting will do to it).
    Reviewed-by: default avatarBenson Leung <bleung@chromium.org>
    Tested-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    Acked-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
    Signed-off-by: default avatarDoug Anderson <dianders@chromium.org>
    Signed-off-by: default avatarDmitry Torokhov <dtor@chromium.org>
    Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
    01714a6f
i2c-hid.c 29.8 KB