goto out_err;
 
                error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3,
-                                          CPCAP_BIT_VBUSSTBY_EN,
-                                          CPCAP_BIT_VBUSSTBY_EN);
+                                          CPCAP_BIT_VBUSSTBY_EN |
+                                          CPCAP_BIT_VBUSEN_SPI,
+                                          CPCAP_BIT_VBUSEN_SPI);
                if (error)
                        goto out_err;
 
        }
 
        error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3,
-                                  CPCAP_BIT_VBUSSTBY_EN, 0);
+                                  CPCAP_BIT_VBUSSTBY_EN |
+                                  CPCAP_BIT_VBUSEN_SPI, 0);
        if (error)
                goto out_err;
 
 
 #define CPCAP_REG_CRM_ICHRG_1A596      CPCAP_REG_CRM_ICHRG(0xe)
 #define CPCAP_REG_CRM_ICHRG_NO_LIMIT   CPCAP_REG_CRM_ICHRG(0xf)
 
+/* CPCAP_REG_VUSBC register bits needed for VBUS */
+#define CPCAP_BIT_VBUS_SWITCH          BIT(0)  /* VBUS boost to 5V */
+
 enum {
        CPCAP_CHARGER_IIO_BATTDET,
        CPCAP_CHARGER_IIO_VOLTAGE,
        struct power_supply *usb;
 
        struct phy_companion comparator;        /* For USB VBUS */
-       bool vbus_enabled;
+       unsigned int vbus_enabled:1;
+       unsigned int feeding_vbus:1;
        atomic_t active;
 
        int status;
 }
 
 /* VBUS control functions for the USB PHY companion */
-
 static void cpcap_charger_vbus_work(struct work_struct *work)
 {
        struct cpcap_charger_ddata *ddata;
                        return;
                }
 
+               ddata->feeding_vbus = true;
                cpcap_charger_set_cable_path(ddata, false);
                cpcap_charger_set_inductive_path(ddata, false);
 
                if (error)
                        goto out_err;
 
+               error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC,
+                                          CPCAP_BIT_VBUS_SWITCH,
+                                          CPCAP_BIT_VBUS_SWITCH);
+               if (error)
+                       goto out_err;
+
                error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM,
                                           CPCAP_REG_CRM_RVRSMODE,
                                           CPCAP_REG_CRM_RVRSMODE);
                if (error)
                        goto out_err;
        } else {
+               error = regmap_update_bits(ddata->reg, CPCAP_REG_VUSBC,
+                                          CPCAP_BIT_VBUS_SWITCH, 0);
+               if (error)
+                       goto out_err;
+
                error = regmap_update_bits(ddata->reg, CPCAP_REG_CRM,
                                           CPCAP_REG_CRM_RVRSMODE, 0);
                if (error)
 
                cpcap_charger_set_cable_path(ddata, true);
                cpcap_charger_set_inductive_path(ddata, true);
+               ddata->feeding_vbus = false;
        }
 
        return;
        if (error)
                return;
 
-       if (cpcap_charger_vbus_valid(ddata) && s.chrgcurr1) {
+       if (!ddata->feeding_vbus && cpcap_charger_vbus_valid(ddata) &&
+           s.chrgcurr1) {
                int max_current;
 
                if (cpcap_charger_battery_found(ddata))