• Daniel Lezcano's avatar
    thermal/drivers/tegra: Remove unneeded lock when setting a trip point · 0cf321c8
    Daniel Lezcano authored
    The function tegra_tsensor_enable_hw_channel() takes the thermal zone
    lock to prevent "a potential" race with a call to set_trips()
    callback.
    
    The driver must not play with the thermal framework core code
    internals.
    
    The tegra_tsensor_enable_hw_channel() is called by:
    
     - the suspend / resume callbacks
     - the probe function after the thermal zones are registered
    
    The thermal zone lock taken in this function is supposed to protect
    from a call to the set_trips() callback which writes in the same
    register.
    
    The potential race is when suspend / resume are called at the same
    time as set_trips. This one is called only in
    thermal_zone_device_update().
    
     - At suspend time, the 'in_suspend' is set, thus the
       thermal_zone_device_update() bails out immediately and set_trips is
       not called during this moment.
    
     - At resume time, the thermal zone is updated at PM_POST_SUSPEND,
       thus the driver has already set the TH2 temperature.
    
     - At probe time, we register the thermal zone and then we set the
       TH2. The only scenario I can see so far is the interrupt fires, the
       thermal_zone_update() is called exactly at the moment
       tegra_tsensor_enable_hw_channel() a few lines after registering it.
    
    Enable the channels before setting up the interrupt. We close the
    potential race window without using the thermal zone's lock.
    Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
    Suggested-by: default avatarThierry Reding <thierry.reding@gmail.com>
    Acked-by: default avatarThierry Reding <treding@nvidia.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    0cf321c8
tegra30-tsensor.c 17.7 KB