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

Commit 033251b2 authored by Harry Yang's avatar Harry Yang
Browse files

power: qpnp-smb5: Add SMB_EN_MODE psy property



Add SMB_EN_MODE psy property to show the secondary
charger currently being selected via SMB_EN pin.

Change-Id: Icd8ae5337744615e2eb37cf63e006afca8447085
Signed-off-by: default avatarHarry Yang <harryy@codeaurora.org>
parent 07a9d05e
Loading
Loading
Loading
Loading
+11 −6
Original line number Original line Diff line number Diff line
@@ -286,6 +286,13 @@ static int smb5_parse_dt(struct smb5 *chip)


	of_property_read_u32(node, "qcom,sec-charger-config",
	of_property_read_u32(node, "qcom,sec-charger-config",
					&chip->dt.sec_charger_config);
					&chip->dt.sec_charger_config);
	chg->sec_cp_present =
		chip->dt.sec_charger_config == POWER_SUPPLY_CHARGER_SEC_CP ||
		chip->dt.sec_charger_config == POWER_SUPPLY_CHARGER_SEC_CP_PL;

	chg->sec_pl_present =
		chip->dt.sec_charger_config == POWER_SUPPLY_CHARGER_SEC_PL ||
		chip->dt.sec_charger_config == POWER_SUPPLY_CHARGER_SEC_CP_PL;


	chg->step_chg_enabled = of_property_read_bool(node,
	chg->step_chg_enabled = of_property_read_bool(node,
				"qcom,step-charging-enable");
				"qcom,step-charging-enable");
@@ -461,6 +468,7 @@ static enum power_supply_property smb5_usb_props[] = {
	POWER_SUPPLY_PROP_SDP_CURRENT_MAX,
	POWER_SUPPLY_PROP_SDP_CURRENT_MAX,
	POWER_SUPPLY_PROP_CONNECTOR_TYPE,
	POWER_SUPPLY_PROP_CONNECTOR_TYPE,
	POWER_SUPPLY_PROP_VOLTAGE_MAX,
	POWER_SUPPLY_PROP_VOLTAGE_MAX,
	POWER_SUPPLY_PROP_SMB_EN_MODE,
	POWER_SUPPLY_PROP_SCOPE,
	POWER_SUPPLY_PROP_SCOPE,
};
};


@@ -580,6 +588,9 @@ static int smb5_usb_get_prop(struct power_supply *psy,
				: chg->otg_present ? POWER_SUPPLY_SCOPE_SYSTEM
				: chg->otg_present ? POWER_SUPPLY_SCOPE_SYSTEM
						: POWER_SUPPLY_SCOPE_UNKNOWN;
						: POWER_SUPPLY_SCOPE_UNKNOWN;
		break;
		break;
	case POWER_SUPPLY_PROP_SMB_EN_MODE:
		val->intval = chg->sec_chg_selected;
		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;
@@ -1466,12 +1477,6 @@ static int smb5_init_hw(struct smb5 *chip)
	smblib_get_charge_param(chg, &chg->param.usb_icl,
	smblib_get_charge_param(chg, &chg->param.usb_icl,
				&chg->default_icl_ua);
				&chg->default_icl_ua);


	chg->sec_cp_present = chip->dt.sec_charger_config == SEC_CHG_CP_ONLY
			|| chip->dt.sec_charger_config == SEC_CHG_CP_AND_PL;

	chg->sec_pl_present = chip->dt.sec_charger_config == SEC_CHG_PL_ONLY
			|| chip->dt.sec_charger_config == SEC_CHG_CP_AND_PL;

	/* Use SW based VBUS control, disable HW autonomous mode */
	/* Use SW based VBUS control, disable HW autonomous mode */
	rc = smblib_masked_write(chg, USBIN_OPTIONS_1_CFG_REG,
	rc = smblib_masked_write(chg, USBIN_OPTIONS_1_CFG_REG,
		HVDCP_AUTH_ALG_EN_CFG_BIT | HVDCP_AUTONOMOUS_MODE_EN_CFG_BIT,
		HVDCP_AUTH_ALG_EN_CFG_BIT | HVDCP_AUTONOMOUS_MODE_EN_CFG_BIT,
+21 −16
Original line number Original line Diff line number Diff line
@@ -117,8 +117,7 @@ int smblib_get_jeita_cc_delta(struct smb_charger *chg, int *cc_delta_ua)
	return 0;
	return 0;
}
}


static int smblib_select_sec_charger(struct smb_charger *chg,
static int smblib_select_sec_charger(struct smb_charger *chg, int sec_chg)
					enum sec_charger_type sec_chg)
{
{
	int rc;
	int rc;


@@ -126,7 +125,7 @@ static int smblib_select_sec_charger(struct smb_charger *chg,
		return 0;
		return 0;


	switch (sec_chg) {
	switch (sec_chg) {
	case SEC_CHG_CP:
	case POWER_SUPPLY_CHARGER_SEC_CP:
		/* select Charge Pump instead of slave charger */
		/* select Charge Pump instead of slave charger */
		rc = smblib_masked_write(chg, MISC_SMB_CFG_REG,
		rc = smblib_masked_write(chg, MISC_SMB_CFG_REG,
					SMB_EN_SEL_BIT, SMB_EN_SEL_BIT);
					SMB_EN_SEL_BIT, SMB_EN_SEL_BIT);
@@ -143,7 +142,7 @@ static int smblib_select_sec_charger(struct smb_charger *chg,
			return rc;
			return rc;
		}
		}
		break;
		break;
	case SEC_CHG_PL:
	case POWER_SUPPLY_CHARGER_SEC_PL:
		/* select slave charger instead of Charge Pump */
		/* select slave charger instead of Charge Pump */
		rc = smblib_masked_write(chg, MISC_SMB_CFG_REG,
		rc = smblib_masked_write(chg, MISC_SMB_CFG_REG,
					SMB_EN_SEL_BIT, 0);
					SMB_EN_SEL_BIT, 0);
@@ -160,7 +159,7 @@ static int smblib_select_sec_charger(struct smb_charger *chg,
			return rc;
			return rc;
		}
		}
		break;
		break;
	case SEC_CHG_NONE:
	case POWER_SUPPLY_CHARGER_SEC_NONE:
	default:
	default:
		/* SW override, disabling secondary charger(s) */
		/* SW override, disabling secondary charger(s) */
		rc = smblib_write(chg, MISC_SMB_EN_CMD_REG,
		rc = smblib_write(chg, MISC_SMB_EN_CMD_REG,
@@ -2452,8 +2451,10 @@ int smblib_set_prop_pd_active(struct smb_charger *chg,
		 * For PPS, Charge Pump is preferred over parallel charger if
		 * For PPS, Charge Pump is preferred over parallel charger if
		 * present.
		 * present.
		 */
		 */
		if (chg->pd_active == 2 && chg->sec_cp_present) {
		if (chg->pd_active == POWER_SUPPLY_PD_PPS_ACTIVE
			rc = smblib_select_sec_charger(chg, SEC_CHG_CP);
						&& chg->sec_cp_present) {
			rc = smblib_select_sec_charger(chg,
						POWER_SUPPLY_CHARGER_SEC_CP);
			if (rc < 0)
			if (rc < 0)
				dev_err(chg->dev, "Couldn't enable secondary charger rc=%d\n",
				dev_err(chg->dev, "Couldn't enable secondary charger rc=%d\n",
					rc);
					rc);
@@ -2464,7 +2465,8 @@ int smblib_set_prop_pd_active(struct smb_charger *chg,
		vote(chg->usb_irq_enable_votable, PD_VOTER, false, 0);
		vote(chg->usb_irq_enable_votable, PD_VOTER, false, 0);


		rc = smblib_select_sec_charger(chg,
		rc = smblib_select_sec_charger(chg,
			chg->sec_pl_present ? SEC_CHG_PL : SEC_CHG_NONE);
			chg->sec_pl_present ? POWER_SUPPLY_CHARGER_SEC_PL :
						POWER_SUPPLY_CHARGER_SEC_NONE);
		if (rc < 0)
		if (rc < 0)
			dev_err(chg->dev,
			dev_err(chg->dev,
				"Couldn't enable secondary charger rc=%d\n",
				"Couldn't enable secondary charger rc=%d\n",
@@ -3004,7 +3006,8 @@ static void smblib_handle_hvdcp_3p0_auth_done(struct smb_charger *chg,


	/* for QC3, switch to CP if present */
	/* for QC3, switch to CP if present */
	if ((apsd_result->bit & QC_3P0_BIT) && chg->sec_cp_present) {
	if ((apsd_result->bit & QC_3P0_BIT) && chg->sec_cp_present) {
		rc = smblib_select_sec_charger(chg, SEC_CHG_CP);
		rc = smblib_select_sec_charger(chg,
					POWER_SUPPLY_CHARGER_SEC_CP);
		if (rc < 0)
		if (rc < 0)
			dev_err(chg->dev,
			dev_err(chg->dev,
			"Couldn't enable secondary chargers  rc=%d\n", rc);
			"Couldn't enable secondary chargers  rc=%d\n", rc);
@@ -3264,7 +3267,8 @@ static void typec_src_removal(struct smb_charger *chg)
	struct storm_watch *wdata;
	struct storm_watch *wdata;


	rc = smblib_select_sec_charger(chg,
	rc = smblib_select_sec_charger(chg,
			chg->sec_pl_present ? SEC_CHG_PL : SEC_CHG_NONE);
			chg->sec_pl_present ? POWER_SUPPLY_CHARGER_SEC_PL :
						POWER_SUPPLY_CHARGER_SEC_NONE);
	if (rc < 0)
	if (rc < 0)
		dev_err(chg->dev,
		dev_err(chg->dev,
			"Couldn't disable secondary charger rc=%d\n", rc);
			"Couldn't disable secondary charger rc=%d\n", rc);
@@ -3699,10 +3703,10 @@ static void pl_update_work(struct work_struct *work)
	struct smb_charger *chg = container_of(work, struct smb_charger,
	struct smb_charger *chg = container_of(work, struct smb_charger,
						pl_update_work);
						pl_update_work);


	if (chg->sec_chg_selected == SEC_CHG_CP)
	if (chg->sec_chg_selected == POWER_SUPPLY_CHARGER_SEC_CP)
		return;
		return;


	smblib_select_sec_charger(chg, SEC_CHG_PL);
	smblib_select_sec_charger(chg, POWER_SUPPLY_CHARGER_SEC_PL);
}
}


static void clear_hdc_work(struct work_struct *work)
static void clear_hdc_work(struct work_struct *work)
@@ -3959,7 +3963,7 @@ int smblib_init(struct smb_charger *chg)
	chg->fake_batt_status = -EINVAL;
	chg->fake_batt_status = -EINVAL;
	chg->sink_src_mode = UNATTACHED_MODE;
	chg->sink_src_mode = UNATTACHED_MODE;
	chg->jeita_configured = false;
	chg->jeita_configured = false;
	chg->sec_chg_selected = SEC_CHG_NONE;
	chg->sec_chg_selected = POWER_SUPPLY_CHARGER_SEC_NONE;


	switch (chg->mode) {
	switch (chg->mode) {
	case PARALLEL_MASTER:
	case PARALLEL_MASTER:
@@ -3989,9 +3993,10 @@ int smblib_init(struct smb_charger *chg)


		if (chg->sec_pl_present) {
		if (chg->sec_pl_present) {
			chg->pl.psy = power_supply_get_by_name("parallel");
			chg->pl.psy = power_supply_get_by_name("parallel");
			if (chg->pl.psy &&
			if (chg->sec_chg_selected != POWER_SUPPLY_CHARGER_SEC_CP
					chg->sec_chg_selected != SEC_CHG_CP) {
				&& chg->pl.psy) {
				rc = smblib_select_sec_charger(chg, SEC_CHG_PL);
				rc = smblib_select_sec_charger(chg,
						POWER_SUPPLY_CHARGER_SEC_PL);
				if (rc < 0) {
				if (rc < 0) {
					smblib_err(chg, "Couldn't config pl charger rc=%d\n",
					smblib_err(chg, "Couldn't config pl charger rc=%d\n",
						rc);
						rc);
+0 −13
Original line number Original line Diff line number Diff line
@@ -78,19 +78,6 @@ enum smb_mode {
	NUM_MODES,
	NUM_MODES,
};
};


enum sec_charger_config {
	MAIN_STANDALONE = 0,
	SEC_CHG_CP_ONLY,
	SEC_CHG_PL_ONLY,
	SEC_CHG_CP_AND_PL,
};

enum sec_charger_type {
	SEC_CHG_NONE = 0,
	SEC_CHG_CP,
	SEC_CHG_PL,
};

enum sink_src_mode {
enum sink_src_mode {
	SINK_MODE,
	SINK_MODE,
	SRC_MODE,
	SRC_MODE,