• Daniel Lezcano's avatar
    thermal/drivers/hisi: Fix multiple alarm interrupts firing · db2b0332
    Daniel Lezcano authored
    The DT specifies a threshold of 65000, we setup the register with a value in
    the temperature resolution for the controller, 64656.
    
    When we reach 64656, the interrupt fires, the interrupt is disabled. Then the
    irq thread runs and calls thermal_zone_device_update() which will call in turn
    hisi_thermal_get_temp().
    
    The function will look if the temperature decreased, assuming it was more than
    65000, but that is not the case because the current temperature is 64656
    (because of the rounding when setting the threshold). This condition being
    true, we re-enable the interrupt which fires immediately after exiting the irq
    thread. That happens again and again until the temperature goes to more than
    65000.
    
    Potentially, there is here an interrupt storm if the temperature stabilizes at
    this temperature. A very unlikely case but possible.
    
    In any case, it does not make sense to handle dozens of alarm interrupt for
    nothing.
    
    Fix this by rounding the threshold value to the controller resolution so the
    check against the threshold is consistent with the one set in the controller.
    Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
    Reviewed-by: default avatarLeo Yan <leo.yan@linaro.org>
    Tested-by: default avatarLeo Yan <leo.yan@linaro.org>
    Signed-off-by: default avatarEduardo Valentin <edubezval@gmail.com>
    db2b0332
hisi_thermal.c 9.71 KB