• Lucas Stach's avatar
    power: supply: ucs1002: fix some health status issues · 81196e2e
    Lucas Stach authored
    Some fault events like the over-current condition will get resolved
    by the hardware, by e.g. disabling the port. As the status in the
    interrupt status register is cleared on read when the fault is resolved,
    the sysfs health property will only contain the correct health status
    for the first time it is read after such an event, even if the actual
    fault condition (like a VBUS short) still persists. To reflect this
    properly in the property we cache the last health status and only update
    the cache when a actual change happens, i.e. the ERR bit in the status
    register flips, as this one properly reflects a continued fault condition.
    
    The ALERT pin however, is not driven by the ERR status, but by the actual
    fault status, so the pin will change back to it's default state when the
    hardware has automatically resolved the fault by cutting the power. Thus
    we never get an IRQ when the actual fault condition has been resolved and
    the ERR status bit has been cleared in auto-recovery mode. To get this
    information we need to poll the interrupt status register after some time
    to see if the fault is gone and update our cache in that case.
    
    To avoid any additional locking, we handle both paths (IRQ firing and
    delayed polling) through the same single-threaded delayed work.
    Signed-off-by: default avatarLucas Stach <l.stach@pengutronix.de>
    Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
    81196e2e
ucs1002_power.c 17.6 KB