summaryrefslogtreecommitdiffstats
path: root/drivers/usb/musb-new
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2015-07-08 16:44:22 +0200
committerHans de Goede <hdegoede@redhat.com>2015-08-08 16:26:19 +0200
commitc9f8947e66042b49bba358d4bce531da3bd440be (patch)
tree8c1785ba6f2a8ea1aa9e771c31616d282692f353 /drivers/usb/musb-new
parent960caeba8f76baffc7201b7535de964f406d48b3 (diff)
downloadtalos-obmc-uboot-c9f8947e66042b49bba358d4bce531da3bd440be.tar.gz
talos-obmc-uboot-c9f8947e66042b49bba358d4bce531da3bd440be.zip
sunxi: usb-phy: Never power off the usb ports
USB devices are not really designed to get the power bounced off and on at them. Esp. USB powered harddisks do not like this. Currently we power off the USB ports both on a "usb reset" and when booting the kernel, causing the usb-power to bounce off and then back on again. This patch removes the powering off calls, fixing the undesirable power bouncing. Note this requires some special handling for the OTG port: 1) We must skip the external vbus check if we've already enabled our own vbus to avoid false positives 2) If on an usb reset we no longer detect that the id-pin is grounded, turn off vbus as that means an external vbus may be present now Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Ian Campbell <ijc@hellion.org.uk>
Diffstat (limited to 'drivers/usb/musb-new')
-rw-r--r--drivers/usb/musb-new/sunxi.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/usb/musb-new/sunxi.c b/drivers/usb/musb-new/sunxi.c
index 16a264a9dd..a146c0861f 100644
--- a/drivers/usb/musb-new/sunxi.c
+++ b/drivers/usb/musb-new/sunxi.c
@@ -196,8 +196,6 @@ static bool enabled = false;
static int sunxi_musb_enable(struct musb *musb)
{
- int ret;
-
pr_debug("%s():\n", __func__);
musb_ep_select(musb->mregs, 0);
@@ -210,17 +208,26 @@ static int sunxi_musb_enable(struct musb *musb)
musb_writeb(musb->mregs, USBC_REG_o_VEND0, 0);
if (is_host_enabled(musb)) {
- ret = sunxi_usb_phy_vbus_detect(0);
- if (ret == 1) {
- printf("A charger is plugged into the OTG: ");
- return -ENODEV;
+ int id = sunxi_usb_phy_id_detect(0);
+
+ if (id == 1 && sunxi_usb_phy_power_is_on(0))
+ sunxi_usb_phy_power_off(0);
+
+ if (!sunxi_usb_phy_power_is_on(0)) {
+ int vbus = sunxi_usb_phy_vbus_detect(0);
+ if (vbus == 1) {
+ printf("A charger is plugged into the OTG: ");
+ return -ENODEV;
+ }
}
- ret = sunxi_usb_phy_id_detect(0);
- if (ret == 1) {
+
+ if (id == 1) {
printf("No host cable detected: ");
return -ENODEV;
}
- sunxi_usb_phy_power_on(0); /* port power on */
+
+ if (!sunxi_usb_phy_power_is_on(0))
+ sunxi_usb_phy_power_on(0);
}
USBC_ForceVbusValidToHigh(musb->mregs);
@@ -236,9 +243,6 @@ static void sunxi_musb_disable(struct musb *musb)
if (!enabled)
return;
- if (is_host_enabled(musb))
- sunxi_usb_phy_power_off(0); /* port power off */
-
USBC_ForceVbusValidToLow(musb->mregs);
mdelay(200); /* Wait for the current session to timeout */
OpenPOWER on IntegriCloud