diff --git a/drivers/regulator/rpm-smd-regulator.c b/drivers/regulator/rpm-smd-regulator.c
index d26fd3bea7887f6944a83e4f86b5c4ff2fdaf65d..dbee7f06b3166504a2728992db11dbefc5e6c0fe 100644
--- a/drivers/regulator/rpm-smd-regulator.c
+++ b/drivers/regulator/rpm-smd-regulator.c
@@ -1691,6 +1691,9 @@ static int rpm_vreg_device_probe(struct platform_device *pdev)
 			|= REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_DRMS;
 		init_data->constraints.valid_modes_mask
 			|= REGULATOR_MODE_NORMAL | REGULATOR_MODE_IDLE;
+		if (regulator_type == RPM_REGULATOR_TYPE_BOB)
+			init_data->constraints.valid_modes_mask
+				|= REGULATOR_MODE_FAST;
 	}
 
 	reg->rdesc.name		= init_data->constraints.name;
diff --git a/sound/soc/codecs/tas2557/tas2557-core.c b/sound/soc/codecs/tas2557/tas2557-core.c
index d7e1930a10c28fecb83cc8533d39bdca6104d3aa..402b0a0fa2bc99951b8aef916b308113f91a8b1f 100644
--- a/sound/soc/codecs/tas2557/tas2557-core.c
+++ b/sound/soc/codecs/tas2557/tas2557-core.c
@@ -126,6 +126,18 @@ static unsigned int p_tas2557_shutdown_data[] = {
 	0xFFFFFFFF, 0xFFFFFFFF
 };
 
+
+static void force_vbob_pwm_mode(struct tas2557_priv *pTAS2557, bool enable)
+{
+	if (pTAS2557->vbob_regulator == NULL)
+		return;
+
+	if (regulator_set_mode(pTAS2557->vbob_regulator, enable ?
+			       REGULATOR_MODE_FAST : REGULATOR_MODE_NORMAL))
+		dev_err(pTAS2557->dev, "failed to set BoB to %s\n",
+			enable ? "FAST" : "NORMAL");
+}
+
 static int tas2557_dev_load_data(struct tas2557_priv *pTAS2557,
 	enum channel chl, unsigned int *pData)
 {
@@ -1067,6 +1079,12 @@ end:
 		if (pTAS2557->mnErrCode & (ERROR_DEVA_I2C_COMM | ERROR_DEVB_I2C_COMM | ERROR_PRAM_CRCCHK | ERROR_YRAM_CRCCHK))
 			failsafe(pTAS2557);
 		/* TAS2557_RELOAD_FIRMWARE_END */
+	} else {
+		if ((pTAS2557->bob_fast_profile != UINT_MAX) &&
+		    (pTAS2557->bob_fast_profile ==
+		     pTAS2557->mnCurrentConfiguration)) {
+			force_vbob_pwm_mode(pTAS2557, pTAS2557->mbPowerUp);
+		}
 	}
 
 	return nResult;
@@ -2284,6 +2302,11 @@ int tas2557_set_config(struct tas2557_priv *pTAS2557, int config)
 	dev_dbg(pTAS2557->dev, "%s, load new conf %s\n", __func__, pConfiguration->mpName);
 	nResult = tas2557_load_configuration(pTAS2557, nConfiguration, false);
 
+	if ((pTAS2557->bob_fast_profile != UINT_MAX) && (pTAS2557->mbPowerUp)) {
+		force_vbob_pwm_mode(pTAS2557,
+				    pTAS2557->bob_fast_profile ==
+				    pTAS2557->mnCurrentConfiguration);
+	}
 end:
 
 	return nResult;
@@ -2936,6 +2959,21 @@ int tas2557_parse_dt(struct device *dev, struct tas2557_priv *pTAS2557)
 	else
 		dev_dbg(pTAS2557->dev, "ti,cal-file-name=%s\n",
 			pTAS2557->cal_file_name);
+
+	rc = of_property_read_u32(np, "ti,bob-fast-profile", &value);
+
+	if (rc) {
+		dev_dbg(pTAS2557->dev, "ti,bob-fast-profile not set\n");
+		pTAS2557->bob_fast_profile = UINT_MAX;
+	} else {
+		pTAS2557->bob_fast_profile = value;
+		dev_info(pTAS2557->dev, "ti,bob-fast-profile set to %d\n",
+			 pTAS2557->bob_fast_profile);
+		pTAS2557->vbob_regulator = devm_regulator_get(pTAS2557->dev,
+							      "pm8998_bob");
+		if (pTAS2557->vbob_regulator == NULL)
+			dev_err(pTAS2557->dev, "failed to get BoB regulator\n");
+	}
 end:
 
 	return ret;
diff --git a/sound/soc/codecs/tas2557/tas2557.h b/sound/soc/codecs/tas2557/tas2557.h
index e9eedaf0650932c9918dace6e08e628bf3b9590c..c2c4c1e848dc8874277c93ab237a7e20b7ad2ca6 100644
--- a/sound/soc/codecs/tas2557/tas2557.h
+++ b/sound/soc/codecs/tas2557/tas2557.h
@@ -536,6 +536,9 @@ struct tas2557_priv {
 	*/
 	bool mbBypassTMax;
 
+	unsigned int bob_fast_profile;
+	struct regulator *vbob_regulator;
+
 #ifdef CONFIG_TAS2557_CODEC_STEREO
 	struct mutex codec_lock;
 #endif