Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 433c1ac3 authored by Umesh Vats's avatar Umesh Vats Committed by Gerrit - the friendly Code Review server
Browse files

Bluetooth: Enable support for retention power mode



Add the support for retention mode. BT host enters this mode from
once the BT is ON. In this mode, LDOs are still enabled but MSM
votes for voltage and current are set to 0. SW_CTRL from BT SoC
takes control of voting for these  LDOs.

Change-Id: If595c2cdc6e38a46ed78045a0373286ff97cfe5b
Signed-off-by: default avatarUmesh Vats <uvats@codeaurora.org>
parent c4e39324
Loading
Loading
Loading
Loading
+49 −2
Original line number Diff line number Diff line
@@ -116,6 +116,38 @@ static int bt_vreg_enable(struct bt_power_vreg_data *vreg)
	return rc;
}

static int bt_vreg_unvote(struct bt_power_vreg_data *vreg)
{
	int rc = 0;

	if (!vreg)
		return rc;

	BT_PWR_DBG("vreg_unvote for : %s", vreg->name);

	if (vreg->is_enabled) {
		if (vreg->set_voltage_sup) {
			/* Set the min voltage to 0 */
			rc = regulator_set_voltage(vreg->reg, 0,
					vreg->high_vol_level);
			if (rc < 0) {
				BT_PWR_ERR("vreg_set_vol(%s) failed rc=%d\n",
						vreg->name, rc);
				goto out;
			}
		}
		if (vreg->load_uA >= 0) {
			rc = regulator_set_load(vreg->reg, 0);
			if (rc < 0) {
				BT_PWR_ERR("vreg_set_mode(%s) failed rc=%d\n",
						vreg->name, rc);
			}
		}
	}
out:
	return rc;
}

static int bt_vreg_disable(struct bt_power_vreg_data *vreg)
{
	int rc = 0;
@@ -254,7 +286,8 @@ static int bluetooth_power(int on)

	BT_PWR_DBG("on: %d", on);

	if (on) {
	if (on == 1) {
		// Power On
		if (bt_power_pdata->bt_vdd_io) {
			rc = bt_configure_vreg(bt_power_pdata->bt_vdd_io);
			if (rc < 0) {
@@ -349,7 +382,8 @@ static int bluetooth_power(int on)
				goto gpio_fail;
			}
		}
	} else {
	} else if (on == 0) {
		// Power Off
		if (bt_power_pdata->bt_gpio_sys_rst > 0)
			bt_configure_gpios(on);
gpio_fail:
@@ -390,6 +424,19 @@ static int bluetooth_power(int on)
vdd_xtal_fail:
		if (bt_power_pdata->bt_vdd_io)
			bt_vreg_disable(bt_power_pdata->bt_vdd_io);
	} else if (on == 2) {
		/* Retention mode */
		if (bt_power_pdata->bt_vdd_rfa2)
			bt_vreg_unvote(bt_power_pdata->bt_vdd_rfa2);
		if (bt_power_pdata->bt_vdd_rfa1)
			bt_vreg_unvote(bt_power_pdata->bt_vdd_rfa1);
		if (bt_power_pdata->bt_vdd_dig)
			bt_vreg_unvote(bt_power_pdata->bt_vdd_dig);
		if (bt_power_pdata->bt_vdd_aon)
			bt_vreg_unvote(bt_power_pdata->bt_vdd_aon);
	} else {
		BT_PWR_ERR("Invalid power mode: %d", on);
		rc = -1;
	}
out:
	return rc;