diff options
Diffstat (limited to 'drivers/phy/meson-gxl-usb2.c')
-rw-r--r-- | drivers/phy/meson-gxl-usb2.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/drivers/phy/meson-gxl-usb2.c b/drivers/phy/meson-gxl-usb2.c index d633effa404..140e936b47a 100644 --- a/drivers/phy/meson-gxl-usb2.c +++ b/drivers/phy/meson-gxl-usb2.c @@ -7,7 +7,6 @@ * Author: Neil Armstrong <narmstron@baylibre.com> */ -#include <common.h> #include <malloc.h> #include <asm/io.h> #include <bitfield.h> @@ -20,8 +19,6 @@ #include <linux/printk.h> #include <linux/usb/otg.h> -#include <asm/arch/usb-gx.h> - #include <linux/bitops.h> #include <linux/compat.h> @@ -122,33 +119,40 @@ static void phy_meson_gxl_usb2_reset(struct phy_meson_gxl_usb2_priv *priv) udelay(RESET_COMPLETE_TIME); } -void phy_meson_gxl_usb2_set_mode(struct phy *phy, enum usb_dr_mode mode) +static int phy_meson_gxl_usb2_set_mode(struct phy *phy, enum phy_mode mode, int submode) { struct udevice *dev = phy->dev; struct phy_meson_gxl_usb2_priv *priv = dev_get_priv(dev); uint val; + if (submode) + return -EOPNOTSUPP; + regmap_read(priv->regmap, U2P_R0, &val); switch (mode) { - case USB_DR_MODE_UNKNOWN: - case USB_DR_MODE_HOST: - case USB_DR_MODE_OTG: + case PHY_MODE_USB_DEVICE: + val &= ~U2P_R0_DM_PULLDOWN; + val &= ~U2P_R0_DP_PULLDOWN; + val |= U2P_R0_ID_PULLUP; + break; + + case PHY_MODE_USB_HOST: + case PHY_MODE_USB_OTG: val |= U2P_R0_DM_PULLDOWN; val |= U2P_R0_DP_PULLDOWN; val &= ~U2P_R0_ID_PULLUP; break; - case USB_DR_MODE_PERIPHERAL: - val &= ~U2P_R0_DM_PULLDOWN; - val &= ~U2P_R0_DP_PULLDOWN; - val |= U2P_R0_ID_PULLUP; - break; + default: + return -EINVAL; } regmap_write(priv->regmap, U2P_R0, val); phy_meson_gxl_usb2_reset(priv); + + return 0; } static int phy_meson_gxl_usb2_power_on(struct phy *phy) @@ -162,7 +166,7 @@ static int phy_meson_gxl_usb2_power_on(struct phy *phy) val &= ~U2P_R0_POWER_ON_RESET; regmap_write(priv->regmap, U2P_R0, val); - phy_meson_gxl_usb2_set_mode(phy, USB_DR_MODE_HOST); + phy_meson_gxl_usb2_set_mode(phy, PHY_MODE_USB_HOST, 0); return 0; } @@ -184,6 +188,7 @@ static int phy_meson_gxl_usb2_power_off(struct phy *phy) struct phy_ops meson_gxl_usb2_phy_ops = { .power_on = phy_meson_gxl_usb2_power_on, .power_off = phy_meson_gxl_usb2_power_off, + .set_mode = phy_meson_gxl_usb2_set_mode, }; int meson_gxl_usb2_phy_probe(struct udevice *dev) |