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

Commit 2acd0f4c authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "power: smb5-lib: Optimize PD voltage configuration flow"

parents ef7cca02 df2dbcbc
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -396,6 +396,7 @@ static struct device_attribute power_supply_attrs[] = {
	POWER_SUPPLY_ATTR(therm_icl_limit),
	POWER_SUPPLY_ATTR(therm_icl_limit),
	POWER_SUPPLY_ATTR(dc_reset),
	POWER_SUPPLY_ATTR(dc_reset),
	POWER_SUPPLY_ATTR(scale_mode_en),
	POWER_SUPPLY_ATTR(scale_mode_en),
	POWER_SUPPLY_ATTR(voltage_max_limit),
	/* Charge pump properties */
	/* Charge pump properties */
	POWER_SUPPLY_ATTR(cp_status1),
	POWER_SUPPLY_ATTR(cp_status1),
	POWER_SUPPLY_ATTR(cp_status2),
	POWER_SUPPLY_ATTR(cp_status2),
+15 −0
Original line number Original line Diff line number Diff line
@@ -639,6 +639,8 @@ static enum power_supply_property smb5_usb_props[] = {
	POWER_SUPPLY_PROP_CONNECTOR_TYPE,
	POWER_SUPPLY_PROP_CONNECTOR_TYPE,
	POWER_SUPPLY_PROP_CONNECTOR_HEALTH,
	POWER_SUPPLY_PROP_CONNECTOR_HEALTH,
	POWER_SUPPLY_PROP_VOLTAGE_MAX,
	POWER_SUPPLY_PROP_VOLTAGE_MAX,
	POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
	POWER_SUPPLY_PROP_VOLTAGE_MAX_LIMIT,
	POWER_SUPPLY_PROP_SMB_EN_MODE,
	POWER_SUPPLY_PROP_SMB_EN_MODE,
	POWER_SUPPLY_PROP_SMB_EN_REASON,
	POWER_SUPPLY_PROP_SMB_EN_REASON,
	POWER_SUPPLY_PROP_SCOPE,
	POWER_SUPPLY_PROP_SCOPE,
@@ -678,9 +680,18 @@ static int smb5_usb_get_prop(struct power_supply *psy,
		if (chg->real_charger_type == POWER_SUPPLY_TYPE_UNKNOWN)
		if (chg->real_charger_type == POWER_SUPPLY_TYPE_UNKNOWN)
			val->intval = 0;
			val->intval = 0;
		break;
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
		rc = smblib_get_prop_usb_voltage_max_design(chg, val);
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_MAX:
	case POWER_SUPPLY_PROP_VOLTAGE_MAX:
		rc = smblib_get_prop_usb_voltage_max(chg, val);
		rc = smblib_get_prop_usb_voltage_max(chg, val);
		break;
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_MAX_LIMIT:
		if (chg->usbin_forced_max_uv)
			val->intval = chg->usbin_forced_max_uv;
		else
			smblib_get_prop_usb_voltage_max_design(chg, val);
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
		rc = smblib_get_prop_usb_voltage_now(chg, val);
		rc = smblib_get_prop_usb_voltage_now(chg, val);
		break;
		break;
@@ -881,6 +892,9 @@ static int smb5_usb_set_prop(struct power_supply *psy,
		else
		else
			rc = -EINVAL;
			rc = -EINVAL;
		break;
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_MAX_LIMIT:
		smblib_set_prop_usb_voltage_max_limit(chg, val);
		break;
	default:
	default:
		pr_err("set prop %d is not supported\n", psp);
		pr_err("set prop %d is not supported\n", psp);
		rc = -EINVAL;
		rc = -EINVAL;
@@ -897,6 +911,7 @@ static int smb5_usb_prop_is_writeable(struct power_supply *psy,
	case POWER_SUPPLY_PROP_CTM_CURRENT_MAX:
	case POWER_SUPPLY_PROP_CTM_CURRENT_MAX:
	case POWER_SUPPLY_PROP_CONNECTOR_HEALTH:
	case POWER_SUPPLY_PROP_CONNECTOR_HEALTH:
	case POWER_SUPPLY_PROP_THERM_ICL_LIMIT:
	case POWER_SUPPLY_PROP_THERM_ICL_LIMIT:
	case POWER_SUPPLY_PROP_VOLTAGE_MAX_LIMIT:
		return 1;
		return 1;
	default:
	default:
		break;
		break;
+5 −1
Original line number Original line Diff line number Diff line
@@ -176,6 +176,7 @@ struct smb1390 {
	bool			switcher_enabled;
	bool			switcher_enabled;
	int			die_temp;
	int			die_temp;
	bool			suspended;
	bool			suspended;
	bool			disabled;
	u32			debug_mask;
	u32			debug_mask;
	u32			min_ilim_ua;
	u32			min_ilim_ua;
	u32			max_temp_alarm_degc;
	u32			max_temp_alarm_degc;
@@ -506,8 +507,10 @@ static int smb1390_disable_vote_cb(struct votable *votable, void *data,
	}
	}


	/* charging may have been disabled by ILIM; send uevent */
	/* charging may have been disabled by ILIM; send uevent */
	if (chip->cp_master_psy)
	if (chip->cp_master_psy && (disable != chip->disabled))
		power_supply_changed(chip->cp_master_psy);
		power_supply_changed(chip->cp_master_psy);

	chip->disabled = disable;
	return rc;
	return rc;
}
}


@@ -1151,6 +1154,7 @@ static int smb1390_probe(struct platform_device *pdev)
	mutex_init(&chip->die_chan_lock);
	mutex_init(&chip->die_chan_lock);
	chip->die_temp = -ENODATA;
	chip->die_temp = -ENODATA;
	chip->pmic_rev_id = pmic_rev_id;
	chip->pmic_rev_id = pmic_rev_id;
	chip->disabled = true;
	platform_set_drvdata(pdev, chip);
	platform_set_drvdata(pdev, chip);


	chip->regmap = dev_get_regmap(chip->dev->parent, NULL);
	chip->regmap = dev_get_regmap(chip->dev->parent, NULL);
+65 −1
Original line number Original line Diff line number Diff line
@@ -1154,6 +1154,7 @@ static void smblib_uusb_removal(struct smb_charger *chg)


	chg->voltage_min_uv = MICRO_5V;
	chg->voltage_min_uv = MICRO_5V;
	chg->voltage_max_uv = MICRO_5V;
	chg->voltage_max_uv = MICRO_5V;
	chg->usbin_forced_max_uv = 0;
	chg->usb_icl_delta_ua = 0;
	chg->usb_icl_delta_ua = 0;
	chg->pulse_cnt = 0;
	chg->pulse_cnt = 0;
	chg->uusb_apsd_rerun_done = false;
	chg->uusb_apsd_rerun_done = false;
@@ -3050,7 +3051,7 @@ int smblib_get_prop_usb_online(struct smb_charger *chg,
	return rc;
	return rc;
}
}


int smblib_get_prop_usb_voltage_max(struct smb_charger *chg,
int smblib_get_prop_usb_voltage_max_design(struct smb_charger *chg,
				    union power_supply_propval *val)
				    union power_supply_propval *val)
{
{
	switch (chg->real_charger_type) {
	switch (chg->real_charger_type) {
@@ -3079,6 +3080,37 @@ int smblib_get_prop_usb_voltage_max(struct smb_charger *chg,
	return 0;
	return 0;
}
}


int smblib_get_prop_usb_voltage_max(struct smb_charger *chg,
					union power_supply_propval *val)
{
	switch (chg->real_charger_type) {
	case POWER_SUPPLY_TYPE_USB_HVDCP:
		if (chg->qc2_unsupported_voltage == QC2_NON_COMPLIANT_9V) {
			val->intval = MICRO_5V;
			break;
		} else if (chg->qc2_unsupported_voltage ==
				QC2_NON_COMPLIANT_12V) {
			val->intval = MICRO_9V;
			break;
		}
		/* else, fallthrough */
	case POWER_SUPPLY_TYPE_USB_HVDCP_3:
		if (chg->smb_version == PMI632_SUBTYPE)
			val->intval = MICRO_9V;
		else
			val->intval = MICRO_12V;
		break;
	case POWER_SUPPLY_TYPE_USB_PD:
		val->intval = chg->voltage_max_uv;
		break;
	default:
		val->intval = MICRO_5V;
		break;
	}

	return 0;
}

#define HVDCP3_STEP_UV	200000
#define HVDCP3_STEP_UV	200000
static int smblib_estimate_adaptor_voltage(struct smb_charger *chg,
static int smblib_estimate_adaptor_voltage(struct smb_charger *chg,
					  union power_supply_propval *val)
					  union power_supply_propval *val)
@@ -3901,6 +3933,32 @@ int smblib_set_prop_boost_current(struct smb_charger *chg,
	return rc;
	return rc;
}
}


int smblib_set_prop_usb_voltage_max_limit(struct smb_charger *chg,
					const union power_supply_propval *val)
{
	union power_supply_propval pval = {0, };

	/* Exit if same value is re-configured */
	if (val->intval == chg->usbin_forced_max_uv)
		return 0;

	smblib_get_prop_usb_voltage_max_design(chg, &pval);

	if (val->intval >= MICRO_5V && val->intval <= pval.intval) {
		chg->usbin_forced_max_uv = val->intval;
		smblib_dbg(chg, PR_MISC, "Max VBUS limit changed to: %d\n",
				val->intval);
	} else if (chg->usbin_forced_max_uv) {
		chg->usbin_forced_max_uv = 0;
	} else {
		return 0;
	}

	power_supply_changed(chg->usb_psy);

	return 0;
}

int smblib_set_prop_typec_power_role(struct smb_charger *chg,
int smblib_set_prop_typec_power_role(struct smb_charger *chg,
				     const union power_supply_propval *val)
				     const union power_supply_propval *val)
{
{
@@ -3969,6 +4027,9 @@ int smblib_set_prop_pd_voltage_min(struct smb_charger *chg,
	int rc, min_uv;
	int rc, min_uv;


	min_uv = min(val->intval, chg->voltage_max_uv);
	min_uv = min(val->intval, chg->voltage_max_uv);
	if (chg->voltage_min_uv == min_uv)
		return 0;

	rc = smblib_set_usb_pd_allowed_voltage(chg, min_uv,
	rc = smblib_set_usb_pd_allowed_voltage(chg, min_uv,
					       chg->voltage_max_uv);
					       chg->voltage_max_uv);
	if (rc < 0) {
	if (rc < 0) {
@@ -3989,6 +4050,8 @@ int smblib_set_prop_pd_voltage_max(struct smb_charger *chg,
	int rc, max_uv;
	int rc, max_uv;


	max_uv = max(val->intval, chg->voltage_min_uv);
	max_uv = max(val->intval, chg->voltage_min_uv);
	if (chg->voltage_max_uv == max_uv)
		return 0;


	rc = smblib_set_usb_pd_fsw(chg, max_uv);
	rc = smblib_set_usb_pd_fsw(chg, max_uv);
	if (rc < 0) {
	if (rc < 0) {
@@ -5312,6 +5375,7 @@ static void typec_src_removal(struct smb_charger *chg)
	chg->usb_icl_delta_ua = 0;
	chg->usb_icl_delta_ua = 0;
	chg->voltage_min_uv = MICRO_5V;
	chg->voltage_min_uv = MICRO_5V;
	chg->voltage_max_uv = MICRO_5V;
	chg->voltage_max_uv = MICRO_5V;
	chg->usbin_forced_max_uv = 0;


	/* write back the default FLOAT charger configuration */
	/* write back the default FLOAT charger configuration */
	rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
	rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
+5 −0
Original line number Original line Diff line number Diff line
@@ -518,6 +518,7 @@ struct smb_charger {
	int			charge_full_cc;
	int			charge_full_cc;
	int			cc_soc_ref;
	int			cc_soc_ref;
	int			dr_mode;
	int			dr_mode;
	int			usbin_forced_max_uv;


	/* workaround flag */
	/* workaround flag */
	u32			wa_flags;
	u32			wa_flags;
@@ -663,6 +664,10 @@ int smblib_get_prop_usb_suspend(struct smb_charger *chg,
				union power_supply_propval *val);
				union power_supply_propval *val);
int smblib_get_prop_usb_voltage_max(struct smb_charger *chg,
int smblib_get_prop_usb_voltage_max(struct smb_charger *chg,
				union power_supply_propval *val);
				union power_supply_propval *val);
int smblib_get_prop_usb_voltage_max_design(struct smb_charger *chg,
				union power_supply_propval *val);
int smblib_set_prop_usb_voltage_max_limit(struct smb_charger *chg,
				const union power_supply_propval *val);
int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
				union power_supply_propval *val);
				union power_supply_propval *val);
int smblib_get_prop_low_power(struct smb_charger *chg,
int smblib_get_prop_low_power(struct smb_charger *chg,
Loading