• Hans de Goede's avatar
    iio: hid-sensor-trigger: Fix sometimes not powering up the sensor after resume · 6f922530
    Hans de Goede authored
    hid_sensor_set_power_work() powers the sensors back up after a resume
    based on the user_requested_state atomic_t.
    
    But hid_sensor_power_state() treats this as a boolean flag, leading to
    the following problematic scenario:
    
    1) Some app starts using the iio-sensor in buffered / triggered mode,
       hid_sensor_data_rdy_trigger_set_state(true) gets called, setting
       user_requested_state to 1.
    2) Something directly accesses a _raw value through sysfs, leading
       to a call to hid_sensor_power_state(true) followed by
       hid_sensor_power_state(false) call, this sets user_requested_state
       to 1 followed by setting it to 0.
    3) Suspend/resume the machine, hid_sensor_set_power_work() now does
       NOT power the sensor back up because user_requested_state (wrongly)
       is 0. Which stops the app using the sensor in buffered mode from
       receiving any new values.
    
    This commit changes user_requested_state to a counter tracking how many
    times hid_sensor_power_state(true) was called instead, fixing this.
    
    Cc: Bastien Nocera <hadess@hadess.net>
    Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Acked-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
    Cc: <Stable@vger.kernel.org>
    Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
    6f922530
hid-sensor-trigger.c 9.51 KB