• Samuel Holland's avatar
    power: supply: axp20x_usb_power: Only poll while offline · bcfb7ae3
    Samuel Holland authored
    Investigation on the AXP803 shows that VBUS_PLUGIN/VBUS_REMOVAL IRQs are
    triggered on the rising/falling edge of AXP20X_PWR_STATUS_VBUS_USED. The
    reason IRQs do not arrive while N_VBUSEN/DRIVEVBUS is high is because
    AXP20X_PWR_STATUS_VBUS_USED also never goes high.
    
    This also means that if VBUS is online, a VBUS_REMOVAL IRQ is received
    immediately on setting N_VBUSEN/DRIVEVBUS high (and VBUS_PLUGIN shortly
    after it is set back low). This was also verified to be the case when
    manually offlining VBUS through AXP20X_VBUS_PATH_SELECT.
    
    As long as VBUS is online, a present->absent transition necessarily
    implies an online->offline transition. Since will cause an IRQ, there is
    no need to poll while VBUS is online.
    
    To ensure the driver's view of VBUS online status remains accurate,
    unconditionally poll once when receiving an IRQ and when resuming. If
    VBUS is still online at that time, polling will cease until the next
    VBUS_REMOVAL IRQ.
    Reviewed-by: default avatarChen-Yu Tsai <wens@csie.org>
    Signed-off-by: default avatarSamuel Holland <samuel@sholland.org>
    Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
    bcfb7ae3
axp20x_usb_power.c 17.1 KB