phy_sun4i_usb: set_mode: Allow using set_mode to force end the current session
authorHans de Goede <hdegoede@redhat.com>
Fri, 23 Sep 2016 13:40:56 +0000 (16:40 +0300)
committerKishon Vijay Abraham I <kishon@ti.com>
Fri, 18 Nov 2016 12:49:16 +0000 (18:19 +0530)
commit5d04c883797209f566538e27441b2563afe4e9b9
tree6f651f0b5c9131d6b9aba1dc673e10e34a14ad17
parente4d5973f9cba4eeeda239edef765b116865e006f
phy_sun4i_usb: set_mode: Allow using set_mode to force end the current session

The sunxi musb has a bug where sometimes it will generate a babble
error on device disconnect instead of a disconnect irq. When this
happens the musb-controller switches from host mode to device mode
(it clears MUSB_DEVCTL_SESSION and sets MUSB_DEVCTL_BDEVICE) and
gets stuck in this state.

Clearing this requires reporting Vbus low for 200 or more ms, but
on some devices Vbus is simply always high (host-only mode, no Vbus
control).

This commit modifies sun4i_usb_phy_set_mode so that it will force
end the current session when called with the current mode, before this
commit calling set_mode with the current mode was a nop since id_det
would stay the same resulting in the detect_work not doing anything.

This allows the sunxi-musb glue to use sun4i_usb_phy_set_mode to force
end the current session without changing the mode, to fixup the stuck
state after a babble error.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
drivers/phy/phy-sun4i-usb.c