• Douglas Anderson's avatar
    HID: i2c-hid: Suspend i2c-hid devices in remove · 5f8838e9
    Douglas Anderson authored
    In the i2c-hid remove() function we currently try to power off,
    depopulate our child device, and free our resources. That's OK, but...
    
    * If the i2c-hid device is on a power rail that can't turn off (either
      an always-on or a shared power rail) we won't try to put the device
      in a low power state during remove(). This probably doesn't matter
      for very many devices but it could be nice in some instances.
    
    * If the i2c-hid device somehow manages to generate an interrupt after
      we tried to power off it is conceivable that the interrupt could
      arrive during or after the call to hid_destroy_device() but before
      the call to free_irq(). That could cause a crash since our IRQ
      handler isn't expecting it. One could imagine this happening in
      the case where we couldn't turn off (see the previous bullet) or,
      possibly, if the interrupt line could glitch shortly after the
      device powered off.
    
    Let's call the suspend code during remove to avoid these issues. That
    will put the device into a low power state and also disable
    interrupts.
    
    Technically, one could consider this a "fix" of commit 4a200c3b
    ("HID: i2c-hid: introduce HID over i2c specification implementation").
    However, since the above bullet points are more theoretical than
    problems seen on real systems and since the remove() of an i2c-hid
    touchscreen isn't terribly likely to be called in production, it's
    probably not worth the bother of trying to backport it.
    Reviewed-by: default avatarBenjamin Tissoires <bentiss@kernel.org>
    Acked-by: default avatarBenjamin Tissoires <bentiss@kernel.org>
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Link: https://patchwork.freedesktop.org/patch/msgid/20230727101636.v4.8.Ic3ecad4a825905f4e4ce2a772b17f3c9cb2d60a2@changeid
    5f8838e9
i2c-hid-core.c 29.6 KB