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

Commit f721be6a authored by Guru Das Srinagesh's avatar Guru Das Srinagesh
Browse files

power: smb5: Advertise low battery in Type-C Source mode



In Type-C Source mode, enable the generation of a
"typec-or-rid-detect-change" interrupt whenever battery voltage crosses
a preset threshold value (currently set to 3.6V). Determine whether the
crossing is because the voltage is above or below the threshold, and
return this information via the USB PSY property LOW_POWER.

This property is displayed only when in Type-C Source mode.

Change-Id: Id305c7c454bf6423582a952312428d64121e45fb
Signed-off-by: default avatarGuru Das Srinagesh <gurus@codeaurora.org>
parent 47cb4b24
Loading
Loading
Loading
Loading
+20 −2
Original line number Diff line number Diff line
@@ -534,6 +534,7 @@ static enum power_supply_property smb5_usb_props[] = {
	POWER_SUPPLY_PROP_TYPEC_POWER_ROLE,
	POWER_SUPPLY_PROP_TYPEC_CC_ORIENTATION,
	POWER_SUPPLY_PROP_TYPEC_SRC_RP,
	POWER_SUPPLY_PROP_LOW_POWER,
	POWER_SUPPLY_PROP_PD_ACTIVE,
	POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED,
	POWER_SUPPLY_PROP_INPUT_CURRENT_NOW,
@@ -621,6 +622,12 @@ static int smb5_usb_get_prop(struct power_supply *psy,
	case POWER_SUPPLY_PROP_TYPEC_SRC_RP:
		rc = smblib_get_prop_typec_select_rp(chg, val);
		break;
	case POWER_SUPPLY_PROP_LOW_POWER:
		if (chg->sink_src_mode == SRC_MODE)
			rc = smblib_get_prop_low_power(chg, val);
		else
			rc = -ENODATA;
		break;
	case POWER_SUPPLY_PROP_PD_ACTIVE:
		val->intval = chg->pd_active;
		break;
@@ -1557,8 +1564,11 @@ static int smb5_configure_typec(struct smb_charger *chg)
		return rc;
	}

	rc = smblib_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG,
				TYPEC_WATER_DETECTION_INT_EN_BIT);
	rc = smblib_masked_write(chg, TYPE_C_INTERRUPT_EN_CFG_2_REG,
				TYPEC_SRC_BATT_HPWR_INT_EN_BIT |
				TYPEC_WATER_DETECTION_INT_EN_BIT,
				TYPEC_SRC_BATT_HPWR_INT_EN_BIT
				| TYPEC_WATER_DETECTION_INT_EN_BIT);
	if (rc < 0) {
		dev_err(chg->dev,
			"Couldn't configure Type-C interrupts rc=%d\n", rc);
@@ -2060,6 +2070,14 @@ static int smb5_init_hw(struct smb5 *chip)
		}
	}

	rc = smblib_masked_write(chg, DCDC_ENG_SDCDC_CFG5_REG,
			ENG_SDCDC_BAT_HPWR_MASK, BOOST_MODE_THRESH_3P6_V);
	if (rc < 0) {
		dev_err(chg->dev, "Couldn't configure DCDC_ENG_SDCDC_CFG5 rc=%d\n",
				rc);
		return rc;
	}

	return rc;
}

+25 −3
Original line number Diff line number Diff line
@@ -2616,6 +2616,24 @@ int smblib_get_prop_usb_current_now(struct smb_charger *chg,
	return rc;
}

int smblib_get_prop_low_power(struct smb_charger *chg,
					  union power_supply_propval *val)
{
	int rc;
	u8 stat;

	rc = smblib_read(chg, TYPE_C_SRC_STATUS_REG, &stat);
	if (rc < 0) {
		smblib_err(chg, "Couldn't read TYPE_C_SRC_STATUS_REG rc=%d\n",
				rc);
		return rc;
	}

	val->intval = !(stat & SRC_HIGH_BATT_BIT);

	return 0;
}

int smblib_get_prop_input_current_settled(struct smb_charger *chg,
					  union power_supply_propval *val)
{
@@ -4050,17 +4068,17 @@ irqreturn_t typec_or_rid_detection_change_irq_handler(int irq, void *data)
		smblib_dbg(chg, PR_INTERRUPT, "Scheduling OTG work\n");
		schedule_delayed_work(&chg->uusb_otg_work,
				msecs_to_jiffies(chg->otg_delay_ms));
		return IRQ_HANDLED;
		goto out;
	}

	if (chg->pr_swap_in_progress || chg->pd_hard_reset)
		return IRQ_HANDLED;
		goto out;

	rc = smblib_read(chg, TYPE_C_MISC_STATUS_REG, &stat);
	if (rc < 0) {
		smblib_err(chg, "Couldn't read TYPE_C_MISC_STATUS_REG rc=%d\n",
			rc);
		return IRQ_HANDLED;
		goto out;
	}

	/* liquid presence detected, to check further */
@@ -4073,6 +4091,10 @@ irqreturn_t typec_or_rid_detection_change_irq_handler(int irq, void *data)
						msecs_to_jiffies(300));
	}

	if (chg->usb_psy)
		power_supply_changed(chg->usb_psy);

out:
	return IRQ_HANDLED;
}

+2 −0
Original line number Diff line number Diff line
@@ -539,6 +539,8 @@ int smblib_get_prop_usb_voltage_max(struct smb_charger *chg,
				union power_supply_propval *val);
int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
				union power_supply_propval *val);
int smblib_get_prop_low_power(struct smb_charger *chg,
				union power_supply_propval *val);
int smblib_get_prop_usb_current_now(struct smb_charger *chg,
				union power_supply_propval *val);
int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg,
+10 −0
Original line number Diff line number Diff line
@@ -149,6 +149,15 @@ enum {

#define DCDC_CFG_REF_MAX_PSNS_REG		(DCDC_BASE + 0x8C)

#define DCDC_ENG_SDCDC_CFG5_REG			(DCDC_BASE + 0xC4)
#define ENG_SDCDC_BAT_HPWR_MASK			GENMASK(7, 6)
enum {
	BOOST_MODE_THRESH_3P3_V,
	BOOST_MODE_THRESH_3P4_V = 0x40,
	BOOST_MODE_THRESH_3P5_V = 0x80,
	BOOST_MODE_THRESH_3P6_V = 0xC0
};

/********************************
 *  BATIF Peripheral Registers  *
 ********************************/
@@ -298,6 +307,7 @@ enum {

#define TYPE_C_SRC_STATUS_REG			(TYPEC_BASE + 0x08)
#define DETECTED_SNK_TYPE_MASK			GENMASK(4, 0)
#define SRC_HIGH_BATT_BIT			BIT(5)
#define SRC_DEBUG_ACCESS_BIT			BIT(4)
#define SRC_RD_OPEN_BIT				BIT(3)
#define SRC_RD_RA_VCONN_BIT			BIT(2)