efi_loader: efi_variable_parse_signature() returns NULL on error
[oweals/u-boot.git] / drivers / phy / meson-gxl-usb3.c
index 5cbbd4d8f7ba49d03596cd112df15ebe6f921a9c..9de55bb5df0cbd0c0eff88b55e665f2813813f4b 100644 (file)
@@ -8,6 +8,7 @@
  */
 
 #include <common.h>
+#include <malloc.h>
 #include <asm/io.h>
 #include <bitfield.h>
 #include <dm.h>
@@ -15,6 +16,9 @@
 #include <generic-phy.h>
 #include <regmap.h>
 #include <clk.h>
+#include <linux/usb/otg.h>
+
+#include <asm/arch/usb-gx.h>
 
 #include <linux/bitops.h>
 #include <linux/compat.h>
@@ -92,20 +96,35 @@ struct phy_meson_gxl_usb3_priv {
 #endif
 };
 
-static int
-phy_meson_gxl_usb3_set_host_mode(struct phy_meson_gxl_usb3_priv *priv)
+void phy_meson_gxl_usb3_set_mode(struct phy *phy, enum usb_dr_mode mode)
 {
+       struct udevice *dev = phy->dev;
+       struct phy_meson_gxl_usb3_priv *priv = dev_get_priv(dev);
        uint val;
 
-       regmap_read(priv->regmap, USB_R0, &val);
-       val &= ~USB_R0_U2D_ACT;
-       regmap_write(priv->regmap, USB_R0, val);
-
-       regmap_read(priv->regmap, USB_R4, &val);
-       val &= ~USB_R4_P21_SLEEP_M0;
-       regmap_write(priv->regmap, USB_R4, val);
-
-       return 0;
+       switch (mode) {
+       case USB_DR_MODE_UNKNOWN:
+       case USB_DR_MODE_HOST:
+       case USB_DR_MODE_OTG:
+               regmap_read(priv->regmap, USB_R0, &val);
+               val &= ~USB_R0_U2D_ACT;
+               regmap_write(priv->regmap, USB_R0, val);
+
+               regmap_read(priv->regmap, USB_R4, &val);
+               val &= ~USB_R4_P21_SLEEP_M0;
+               regmap_write(priv->regmap, USB_R4, val);
+               break;
+
+       case USB_DR_MODE_PERIPHERAL:
+               regmap_read(priv->regmap, USB_R0, &val);
+               val |= USB_R0_U2D_ACT;
+               regmap_write(priv->regmap, USB_R0, val);
+
+               regmap_read(priv->regmap, USB_R4, &val);
+               val |= USB_R4_P21_SLEEP_M0;
+               regmap_write(priv->regmap, USB_R4, val);
+               break;
+       }
 }
 
 static int phy_meson_gxl_usb3_power_on(struct phy *phy)
@@ -121,7 +140,9 @@ static int phy_meson_gxl_usb3_power_on(struct phy *phy)
        val |= FIELD_PREP(USB_R5_ID_DIG_TH_MASK, 0xff);
        regmap_write(priv->regmap, USB_R5, val);
 
-       return phy_meson_gxl_usb3_set_host_mode(priv);
+       phy_meson_gxl_usb3_set_mode(phy, USB_DR_MODE_HOST);
+
+       return 0;
 }
 
 static int phy_meson_gxl_usb3_power_off(struct phy *phy)