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

Commit de321e13 authored by Ankit Sharma's avatar Ankit Sharma Committed by Ashay Jaiswal
Browse files

power: smb-lib: Add USB notification



In designs without the pd-phy interface the usb
insertion/removal and CC_orientation needs to be
notified to the usb stack by the charger driver.
Add this notification support via the extcon interface.

CRs-Fixed: 2086422
Change-Id: I22eae3f818859c8fbd08066f690517d4210c7dd3
Signed-off-by: default avatarAnkit Sharma <ansharma@codeaurora.org>
parent d41da87e
Loading
Loading
Loading
Loading
+45 −0
Original line number Diff line number Diff line
@@ -3642,6 +3642,37 @@ static void smblib_force_legacy_icl(struct smb_charger *chg, int pst)
	}
}

static void smblib_notify_extcon_props(struct smb_charger *chg, int id)
{
	union extcon_property_value val;
	union power_supply_propval prop_val;

	smblib_get_prop_typec_cc_orientation(chg, &prop_val);
	val.intval = ((prop_val.intval == 2) ? 1 : 0);
	extcon_set_property(chg->extcon, id,
				EXTCON_PROP_USB_TYPEC_POLARITY, val);

	val.intval = true;
	extcon_set_property(chg->extcon, id,
				EXTCON_PROP_USB_SS, val);
}

static void smblib_notify_device_mode(struct smb_charger *chg, bool enable)
{
	if (enable)
		smblib_notify_extcon_props(chg, EXTCON_USB);

	extcon_set_state_sync(chg->extcon, EXTCON_USB, enable);
}

static void smblib_notify_usb_host(struct smb_charger *chg, bool enable)
{
	if (enable)
		smblib_notify_extcon_props(chg, EXTCON_USB_HOST);

	extcon_set_state_sync(chg->extcon, EXTCON_USB_HOST, enable);
}

#define HVDCP_DET_MS 2500
static void smblib_handle_apsd_done(struct smb_charger *chg, bool rising)
{
@@ -3664,6 +3695,8 @@ static void smblib_handle_apsd_done(struct smb_charger *chg, bool rising)
		/* if not DCP then no hvdcp timeout happens. Enable pd here */
		vote(chg->pd_disallowed_votable_indirect, HVDCP_TIMEOUT_VOTER,
				false, 0);
		if (chg->use_extcon)
			smblib_notify_device_mode(chg, true);
		break;
	case OCP_CHARGER_BIT:
	case FLOAT_CHARGER_BIT:
@@ -3749,6 +3782,10 @@ static void typec_sink_insertion(struct smb_charger *chg)
	 */
	vote(chg->pd_disallowed_votable_indirect, HVDCP_TIMEOUT_VOTER,
			false, 0);
	if (chg->use_extcon) {
		smblib_notify_usb_host(chg, true);
		chg->otg_present = true;
	}
}

static void typec_sink_removal(struct smb_charger *chg)
@@ -3899,6 +3936,14 @@ static void smblib_handle_typec_removal(struct smb_charger *chg)

	typec_sink_removal(chg);
	smblib_update_usb_type(chg);

	if (chg->use_extcon) {
		if (chg->otg_present)
			smblib_notify_usb_host(chg, false);
		else
			smblib_notify_device_mode(chg, false);
	}
	chg->otg_present = false;
}

static void smblib_handle_typec_insertion(struct smb_charger *chg)
+5 −0
Original line number Diff line number Diff line
@@ -144,6 +144,9 @@ static const unsigned int smblib_extcon_cable[] = {
	EXTCON_NONE,
};

/* EXTCON_USB and EXTCON_USB_HOST are mutually exclusive */
static const u32 smblib_extcon_exclusive[] = {0x3, 0};

struct smb_regulator {
	struct regulator_dev	*rdev;
	struct regulator_desc	rdesc;
@@ -331,6 +334,8 @@ struct smb_charger {
	int			usb_icl_change_irq_enabled;
	u32			jeita_status;
	u8			float_cfg;
	bool			use_extcon;
	bool			otg_present;

	/* workaround flag */
	u32			wa_flags;