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

Commit 83a82dec authored by Harry Yang's avatar Harry Yang Committed by Guru Das Srinagesh
Browse files

power: smb5-lib: Export SKIN thermal health on wireless charging



In PM8150B, ADC skin channel is used for wireless receiver temp.

Expose SKIN thermal health via CONNECTOR_HEALTH during DC wireless
charging.

CRs-Fixed: 2390642
Change-Id: I8c5599a62f6cf67c5e7c5af09af4bdfa152751c4
Signed-off-by: default avatarHarry Yang <harryy@codeaurora.org>
parent 5a791bdd
Loading
Loading
Loading
Loading
+51 −1
Original line number Diff line number Diff line
@@ -3694,7 +3694,7 @@ int smblib_get_prop_scope(struct smb_charger *chg,
	return 0;
}

int smblib_get_prop_connector_health(struct smb_charger *chg)
static int smblib_get_typec_connector_temp_status(struct smb_charger *chg)
{
	int rc;
	u8 stat;
@@ -3737,6 +3737,56 @@ int smblib_get_prop_connector_health(struct smb_charger *chg)
	return POWER_SUPPLY_HEALTH_COOL;
}

static int smblib_get_skin_temp_status(struct smb_charger *chg)
{
	int rc;
	u8 stat;

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

	if (stat & SKIN_TEMP_RST_BIT)
		return POWER_SUPPLY_HEALTH_OVERHEAT;

	if (stat & SKIN_TEMP_UB_BIT)
		return POWER_SUPPLY_HEALTH_HOT;

	if (stat & SKIN_TEMP_LB_BIT)
		return POWER_SUPPLY_HEALTH_WARM;

	return POWER_SUPPLY_HEALTH_COOL;
}

int smblib_get_prop_connector_health(struct smb_charger *chg)
{
	bool dc_present, usb_present;
	int input_present;
	int rc;

	rc = smblib_is_input_present(chg, &input_present);
	if (rc < 0)
		return POWER_SUPPLY_HEALTH_UNKNOWN;

	dc_present = input_present & INPUT_PRESENT_DC;
	usb_present = input_present & INPUT_PRESENT_USB;

	if (usb_present)
		return smblib_get_typec_connector_temp_status(chg);

	/*
	 * In PM8150B, SKIN channel measures Wireless charger receiver
	 * temp, used to regulate DC ICL.
	 */
	if (chg->smb_version == PM8150B_SUBTYPE && dc_present)
		return smblib_get_skin_temp_status(chg);

	return POWER_SUPPLY_HEALTH_COOL;
}

static int get_rp_based_dcp_current(struct smb_charger *chg, int typec_mode)
{
	int rp_ua;
+6 −0
Original line number Diff line number Diff line
@@ -468,6 +468,12 @@ enum {
#define DIE_TEMP_UB_BIT				BIT(1)
#define DIE_TEMP_LB_BIT				BIT(0)

#define SKIN_TEMP_STATUS_REG			(MISC_BASE + 0x08)
#define SKIN_TEMP_SHDN_BIT			BIT(3)
#define SKIN_TEMP_RST_BIT			BIT(2)
#define SKIN_TEMP_UB_BIT			BIT(1)
#define SKIN_TEMP_LB_BIT			BIT(0)

#define CONNECTOR_TEMP_STATUS_REG		(MISC_BASE + 0x09)
#define CONNECTOR_TEMP_SHDN_BIT			BIT(3)
#define CONNECTOR_TEMP_RST_BIT			BIT(2)