phy: allwinner: sun4i-usb: poll vbus changes on A23/A33 when driving VBUS
The AXP223 PMIC, like the AXP221, does not generate VBUS change interrupts when N_VBUSEN is used to drive VBUS for the OTG port on the board. This was not noticed until recently, as most A23/A33 boards use a GPIO pin that does not support interrupts for OTG ID detection. This forces the driver to use polling. However the A33-OlinuXino uses a pin that does support interrupts, so the driver uses them. However the VBUS interrupt never fires, and the driver never gets to update the VBUS status. This results in musb timing out waiting for VBUS to rise. This was worked around for the AXP221 by resorting to polling changes in commitpull/546/head91d96f06a7("phy-sun4i-usb: Add workaround for missing Vbus det interrupts on A31"). This patch adds the A23 and A33 to the list of SoCs that need the workaround. Fixes:fc1f45ed30("phy-sun4i-usb: Add support for the usb-phys on the sun8i-a33 SoC") Fixes:123dfdbcfa("phy-sun4i-usb: Add support for the usb-phys on the sun8i-a23 SoC") Cc: <stable@vger.kernel.org> # 4.3.x:68dbc2ce77phy-sun4i-usb: Use of_match_node to get model specific config data Cc: <stable@vger.kernel.org> # 4.3.x:5cf700ac9dphy: phy-sun4i-usb: Fix optional gpios failing probe Cc: <stable@vger.kernel.org> # 4.3.x:04e59a0211phy-sun4i-usb: Fix irq free conditions to match request conditions Cc: <stable@vger.kernel.org> # 4.3.x:91d96f06a7phy-sun4i-usb: Add workaround for missing Vbus det interrupts on A31 Cc: <stable@vger.kernel.org> # 4.3.x Signed-off-by: Chen-Yu Tsai <wens@csie.org> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
parent
ae91a799fb
commit
d7119224bf
|
|
@ -411,11 +411,13 @@ static bool sun4i_usb_phy0_poll(struct sun4i_usb_phy_data *data)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The A31 companion pmic (axp221) does not generate vbus change
|
* The A31/A23/A33 companion pmics (AXP221/AXP223) do not
|
||||||
* interrupts when the board is driving vbus, so we must poll
|
* generate vbus change interrupts when the board is driving
|
||||||
|
* vbus using the N_VBUSEN pin on the pmic, so we must poll
|
||||||
* when using the pmic for vbus-det _and_ we're driving vbus.
|
* when using the pmic for vbus-det _and_ we're driving vbus.
|
||||||
*/
|
*/
|
||||||
if (data->cfg->type == sun6i_a31_phy &&
|
if ((data->cfg->type == sun6i_a31_phy ||
|
||||||
|
data->cfg->type == sun8i_a33_phy) &&
|
||||||
data->vbus_power_supply && data->phys[0].regulator_on)
|
data->vbus_power_supply && data->phys[0].regulator_on)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
@ -886,7 +888,7 @@ static const struct sun4i_usb_phy_cfg sun7i_a20_cfg = {
|
||||||
|
|
||||||
static const struct sun4i_usb_phy_cfg sun8i_a23_cfg = {
|
static const struct sun4i_usb_phy_cfg sun8i_a23_cfg = {
|
||||||
.num_phys = 2,
|
.num_phys = 2,
|
||||||
.type = sun4i_a10_phy,
|
.type = sun6i_a31_phy,
|
||||||
.disc_thresh = 3,
|
.disc_thresh = 3,
|
||||||
.phyctl_offset = REG_PHYCTL_A10,
|
.phyctl_offset = REG_PHYCTL_A10,
|
||||||
.dedicated_clocks = true,
|
.dedicated_clocks = true,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue