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

Commit 103b127b authored by Ashay Jaiswal's avatar Ashay Jaiswal Committed by Guru Das Srinagesh
Browse files

power: smb5: add support to enable/disable hvdcp optimization



On certain PMICs, Flash has a requirement to limit VBUS at 5V
when it is active. This is to prevent the VIN_FLASH from seeing
a high input voltage. Add support for this by forcing VBUS to 5V
when there is a notification from flash driver based on flash_active
power-supply property. The userspace is also notified to stop any
further VBUS optimizations by setting the hvdcp_opti_allowed property.
The optimization is re-enabled when flash_active is cleared by the flash
driver.

Change-Id: I3748fe75f467969ecc4ec2a60c5360dba13953f1
Signed-off-by: default avatarAshay Jaiswal <ashayj@codeaurora.org>
Signed-off-by: default avatarUmang Agrawal <uagrawal@codeaurora.org>
parent fe9a9bb8
Loading
Loading
Loading
Loading
+32 −2
Original line number Original line Diff line number Diff line
@@ -623,6 +623,7 @@ static enum power_supply_property smb5_usb_props[] = {
	POWER_SUPPLY_PROP_SMB_EN_REASON,
	POWER_SUPPLY_PROP_SMB_EN_REASON,
	POWER_SUPPLY_PROP_SCOPE,
	POWER_SUPPLY_PROP_SCOPE,
	POWER_SUPPLY_PROP_MOISTURE_DETECTED,
	POWER_SUPPLY_PROP_MOISTURE_DETECTED,
	POWER_SUPPLY_PROP_HVDCP_OPTI_ALLOWED,
};
};


static int smb5_usb_get_prop(struct power_supply *psy,
static int smb5_usb_get_prop(struct power_supply *psy,
@@ -733,6 +734,9 @@ static int smb5_usb_get_prop(struct power_supply *psy,
	case POWER_SUPPLY_PROP_MOISTURE_DETECTED:
	case POWER_SUPPLY_PROP_MOISTURE_DETECTED:
		val->intval = chg->moisture_present;
		val->intval = chg->moisture_present;
		break;
		break;
	case POWER_SUPPLY_PROP_HVDCP_OPTI_ALLOWED:
		val->intval = !chg->flash_active;
		break;
	default:
	default:
		pr_err("get prop %d is not supported in usb\n", psp);
		pr_err("get prop %d is not supported in usb\n", psp);
		rc = -EINVAL;
		rc = -EINVAL;
@@ -1026,6 +1030,7 @@ static int smb5_usb_main_set_prop(struct power_supply *psy,
{
{
	struct smb5 *chip = power_supply_get_drvdata(psy);
	struct smb5 *chip = power_supply_get_drvdata(psy);
	struct smb_charger *chg = &chip->chg;
	struct smb_charger *chg = &chip->chg;
	union power_supply_propval pval = {0, };
	int rc = 0;
	int rc = 0;


	switch (psp) {
	switch (psp) {
@@ -1039,7 +1044,31 @@ static int smb5_usb_main_set_prop(struct power_supply *psy,
		rc = smblib_set_icl_current(chg, val->intval);
		rc = smblib_set_icl_current(chg, val->intval);
		break;
		break;
	case POWER_SUPPLY_PROP_FLASH_ACTIVE:
	case POWER_SUPPLY_PROP_FLASH_ACTIVE:
		if ((chg->smb_version == PMI632_SUBTYPE)
				&& (chg->flash_active != val->intval)) {
			chg->flash_active = val->intval;
			chg->flash_active = val->intval;

			rc = smblib_get_prop_usb_present(chg, &pval);
			if (rc < 0)
				pr_err("Failed to get USB preset status rc=%d\n",
						rc);
			if (pval.intval) {
				rc = smblib_force_vbus_voltage(chg,
					chg->flash_active ? FORCE_5V_BIT
								: IDLE_BIT);
				if (rc < 0)
					pr_err("Failed to force 5V\n");
				else
					chg->pulse_cnt = 0;
			}

			pr_debug("flash active VBUS 5V restriction %s\n",
				chg->flash_active ? "applied" : "removed");

			/* Update userspace */
			if (chg->batt_psy)
				power_supply_changed(chg->batt_psy);
		}
		break;
		break;
	case POWER_SUPPLY_PROP_TOGGLE_STAT:
	case POWER_SUPPLY_PROP_TOGGLE_STAT:
		rc = smblib_toggle_smb_en(chg, val->intval);
		rc = smblib_toggle_smb_en(chg, val->intval);
@@ -1465,6 +1494,7 @@ static int smb5_batt_set_prop(struct power_supply *psy,
		rc = smblib_rerun_aicl(chg);
		rc = smblib_rerun_aicl(chg);
		break;
		break;
	case POWER_SUPPLY_PROP_DP_DM:
	case POWER_SUPPLY_PROP_DP_DM:
		if (!chg->flash_active)
			rc = smblib_dp_dm(chg, val->intval);
			rc = smblib_dp_dm(chg, val->intval);
		break;
		break;
	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED:
	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED:
+1 −1
Original line number Original line Diff line number Diff line
@@ -2134,7 +2134,7 @@ static int smblib_dm_pulse(struct smb_charger *chg)
	return rc;
	return rc;
}
}


static int smblib_force_vbus_voltage(struct smb_charger *chg, u8 val)
int smblib_force_vbus_voltage(struct smb_charger *chg, u8 val)
{
{
	int rc;
	int rc;


+1 −0
Original line number Original line Diff line number Diff line
@@ -676,6 +676,7 @@ enum alarmtimer_restart smblib_lpd_recheck_timer(struct alarm *alarm,
int smblib_toggle_smb_en(struct smb_charger *chg, int toggle);
int smblib_toggle_smb_en(struct smb_charger *chg, int toggle);
void smblib_hvdcp_detect_enable(struct smb_charger *chg, bool enable);
void smblib_hvdcp_detect_enable(struct smb_charger *chg, bool enable);
void smblib_apsd_enable(struct smb_charger *chg, bool enable);
void smblib_apsd_enable(struct smb_charger *chg, bool enable);
int smblib_force_vbus_voltage(struct smb_charger *chg, u8 val);


int smblib_init(struct smb_charger *chg);
int smblib_init(struct smb_charger *chg);
int smblib_deinit(struct smb_charger *chg);
int smblib_deinit(struct smb_charger *chg);
+1 −0
Original line number Original line Diff line number Diff line
@@ -224,6 +224,7 @@ enum {
#define FORCE_12V_BIT				BIT(5)
#define FORCE_12V_BIT				BIT(5)
#define FORCE_9V_BIT				BIT(4)
#define FORCE_9V_BIT				BIT(4)
#define FORCE_5V_BIT				BIT(3)
#define FORCE_5V_BIT				BIT(3)
#define IDLE_BIT				BIT(2)
#define SINGLE_DECREMENT_BIT			BIT(1)
#define SINGLE_DECREMENT_BIT			BIT(1)
#define SINGLE_INCREMENT_BIT			BIT(0)
#define SINGLE_INCREMENT_BIT			BIT(0)