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

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

Merge "power: smb2: Enable read/writing of Type-C Rp value"

parents 3a382a7d 241603fd
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -413,6 +413,7 @@ static enum power_supply_property smb2_usb_props[] = {
	POWER_SUPPLY_PROP_TYPEC_MODE,
	POWER_SUPPLY_PROP_TYPEC_POWER_ROLE,
	POWER_SUPPLY_PROP_TYPEC_CC_ORIENTATION,
	POWER_SUPPLY_PROP_TYPEC_SRC_RP,
	POWER_SUPPLY_PROP_PD_ALLOWED,
	POWER_SUPPLY_PROP_PD_ACTIVE,
	POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED,
@@ -503,6 +504,9 @@ static int smb2_usb_get_prop(struct power_supply *psy,
		else
			rc = smblib_get_prop_typec_cc_orientation(chg, val);
		break;
	case POWER_SUPPLY_PROP_TYPEC_SRC_RP:
		rc = smblib_get_prop_typec_select_rp(chg, val);
		break;
	case POWER_SUPPLY_PROP_PD_ALLOWED:
		rc = smblib_get_prop_pd_allowed(chg, val);
		break;
@@ -595,6 +599,9 @@ static int smb2_usb_set_prop(struct power_supply *psy,
	case POWER_SUPPLY_PROP_TYPEC_POWER_ROLE:
		rc = smblib_set_prop_typec_power_role(chg, val);
		break;
	case POWER_SUPPLY_PROP_TYPEC_SRC_RP:
		rc = smblib_set_prop_typec_select_rp(chg, val);
		break;
	case POWER_SUPPLY_PROP_PD_ACTIVE:
		rc = smblib_set_prop_pd_active(chg, val);
		break;
+74 −0
Original line number Diff line number Diff line
@@ -1187,6 +1187,44 @@ static int __smblib_set_prop_typec_power_role(struct smb_charger *chg,
	return rc;
}

static inline bool typec_in_src_mode(struct smb_charger *chg)
{
	return (chg->typec_mode > POWER_SUPPLY_TYPEC_NONE &&
		chg->typec_mode < POWER_SUPPLY_TYPEC_SOURCE_DEFAULT);
}

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

	if (!typec_in_src_mode(chg))
		return -ENODATA;

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

	switch (stat & EN_80UA_180UA_CUR_SOURCE_BIT) {
	case TYPEC_SRC_RP_STD:
		rp = POWER_SUPPLY_TYPEC_SRC_RP_STD;
		break;
	case TYPEC_SRC_RP_1P5A:
		rp = POWER_SUPPLY_TYPEC_SRC_RP_1P5A;
		break;
	default:
		return -EINVAL;
	}

	val->intval = rp;

	return 0;
}

/*********************
 * VOTABLE CALLBACKS *
 *********************/
@@ -2881,6 +2919,42 @@ int smblib_set_prop_typec_power_role(struct smb_charger *chg,
	return 0;
}

int smblib_set_prop_typec_select_rp(struct smb_charger *chg,
				    const union power_supply_propval *val)
{
	int rc = 0;

	if (!typec_in_src_mode(chg)) {
		smblib_err(chg, "Couldn't set curr src: not in SRC mode\n");
		return -EINVAL;
	}

	if (val->intval < 0 || val->intval >= TYPEC_SRC_RP_MAX_ELEMENTS)
		return -EINVAL;

	switch (val->intval) {
	case TYPEC_SRC_RP_STD:
		rc = smblib_masked_write(chg, TYPE_C_CFG_2_REG,
			EN_80UA_180UA_CUR_SOURCE_BIT,
			TYPEC_SRC_RP_STD);
		break;
	case TYPEC_SRC_RP_1P5A:
	case TYPEC_SRC_RP_3A:
	case TYPEC_SRC_RP_3A_DUPLICATE:
		rc = smblib_masked_write(chg, TYPE_C_CFG_2_REG,
			EN_80UA_180UA_CUR_SOURCE_BIT,
			TYPEC_SRC_RP_1P5A);
		break;
	default:
		return -EINVAL;
	}

	if (rc < 0)
		smblib_err(chg, "Couldn't write to TYPE_C_CURRSRC_CFG rc=%d\n",
				rc);
	return rc;
}

int smblib_set_prop_pd_voltage_min(struct smb_charger *chg,
				    const union power_supply_propval *val)
{
+4 −0
Original line number Diff line number Diff line
@@ -483,6 +483,8 @@ 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,
				union power_supply_propval *val);
int smblib_get_prop_typec_select_rp(struct smb_charger *chg,
				union power_supply_propval *val);
int smblib_get_prop_typec_power_role(struct smb_charger *chg,
				union power_supply_propval *val);
int smblib_get_prop_pd_allowed(struct smb_charger *chg,
@@ -515,6 +517,8 @@ int smblib_set_prop_boost_current(struct smb_charger *chg,
				const union power_supply_propval *val);
int smblib_set_prop_typec_power_role(struct smb_charger *chg,
				const union power_supply_propval *val);
int smblib_set_prop_typec_select_rp(struct smb_charger *chg,
				const union power_supply_propval *val);
int smblib_set_prop_pd_active(struct smb_charger *chg,
				const union power_supply_propval *val);
int smblib_set_prop_pd_in_hard_reset(struct smb_charger *chg,
+7 −0
Original line number Diff line number Diff line
@@ -568,6 +568,13 @@ enum {
#define USB_FACTORY_MODE_ENABLE_BIT		BIT(2)
#define TYPE_C_UFP_MODE_BIT			BIT(1)
#define EN_80UA_180UA_CUR_SOURCE_BIT		BIT(0)
enum {
	TYPEC_SRC_RP_STD,
	TYPEC_SRC_RP_1P5A,
	TYPEC_SRC_RP_3A,
	TYPEC_SRC_RP_3A_DUPLICATE,
	TYPEC_SRC_RP_MAX_ELEMENTS
};

#define TYPE_C_CFG_3_REG			(USBIN_BASE + 0x5A)
#define TVBUS_DEBOUNCE_BIT			BIT(7)