#define   DATA0_VAL_PD                         BIT(1)
 #define   USE_XUSB_AO                          BIT(4)
 
+#define TEGRA_UTMI_PAD_MAX 4
+
 #define TEGRA186_LANE(_name, _offset, _shift, _mask, _type)            \
        {                                                               \
                .name = _name,                                          \
 
        /* UTMI bias and tracking */
        struct clk *usb2_trk_clk;
-       unsigned int bias_pad_enable;
+       DECLARE_BITMAP(utmi_pad_enabled, TEGRA_UTMI_PAD_MAX);
 
        /* padctl context */
        struct tegra186_xusb_padctl_context context;
        u32 value;
        int err;
 
-       mutex_lock(&padctl->lock);
-
-       if (priv->bias_pad_enable++ > 0) {
-               mutex_unlock(&padctl->lock);
+       if (!bitmap_empty(priv->utmi_pad_enabled, TEGRA_UTMI_PAD_MAX))
                return;
-       }
 
        err = clk_prepare_enable(priv->usb2_trk_clk);
        if (err < 0)
        struct tegra186_xusb_padctl *priv = to_tegra186_xusb_padctl(padctl);
        u32 value;
 
-       mutex_lock(&padctl->lock);
-
-       if (WARN_ON(priv->bias_pad_enable == 0)) {
-               mutex_unlock(&padctl->lock);
-               return;
-       }
-
-       if (--priv->bias_pad_enable > 0) {
-               mutex_unlock(&padctl->lock);
+       if (!bitmap_empty(priv->utmi_pad_enabled, TEGRA_UTMI_PAD_MAX))
                return;
-       }
 
        value = padctl_readl(padctl, XUSB_PADCTL_USB2_BIAS_PAD_CTL1);
        value |= USB2_PD_TRK;
                clk_disable_unprepare(priv->usb2_trk_clk);
        }
 
-       mutex_unlock(&padctl->lock);
 }
 
 static void tegra186_utmi_pad_power_on(struct phy *phy)
 {
        struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
        struct tegra_xusb_padctl *padctl = lane->pad->padctl;
+       struct tegra186_xusb_padctl *priv = to_tegra186_xusb_padctl(padctl);
        struct tegra_xusb_usb2_port *port;
        struct device *dev = padctl->dev;
        unsigned int index = lane->index;
        if (!phy)
                return;
 
+       mutex_lock(&padctl->lock);
+       if (test_bit(index, priv->utmi_pad_enabled)) {
+               mutex_unlock(&padctl->lock);
+               return;
+       }
+
        port = tegra_xusb_find_usb2_port(padctl, index);
        if (!port) {
                dev_err(dev, "no port found for USB2 lane %u\n", index);
+               mutex_unlock(&padctl->lock);
                return;
        }
 
        value = padctl_readl(padctl, XUSB_PADCTL_USB2_OTG_PADX_CTL1(index));
        value &= ~USB2_OTG_PD_DR;
        padctl_writel(padctl, value, XUSB_PADCTL_USB2_OTG_PADX_CTL1(index));
+
+       set_bit(index, priv->utmi_pad_enabled);
+       mutex_unlock(&padctl->lock);
 }
 
 static void tegra186_utmi_pad_power_down(struct phy *phy)
 {
        struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
        struct tegra_xusb_padctl *padctl = lane->pad->padctl;
+       struct tegra186_xusb_padctl *priv = to_tegra186_xusb_padctl(padctl);
        unsigned int index = lane->index;
        u32 value;
 
        if (!phy)
                return;
 
+       mutex_lock(&padctl->lock);
+       if (!test_bit(index, priv->utmi_pad_enabled)) {
+               mutex_unlock(&padctl->lock);
+               return;
+       }
+
        dev_dbg(padctl->dev, "power down UTMI pad %u\n", index);
 
        value = padctl_readl(padctl, XUSB_PADCTL_USB2_OTG_PADX_CTL0(index));
 
        udelay(2);
 
+       clear_bit(index, priv->utmi_pad_enabled);
+
        tegra186_utmi_bias_pad_power_off(padctl);
+
+       mutex_unlock(&padctl->lock);
 }
 
 static int tegra186_xusb_padctl_vbus_override(struct tegra_xusb_padctl *padctl,