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: Ankit Sharma <ansharma@codeaurora.org>
This commit is contained in:
parent
86db25491e
commit
8cd61d5d11
2 changed files with 47 additions and 0 deletions
|
@ -3566,6 +3566,32 @@ static void smblib_force_legacy_icl(struct smb_charger *chg, int pst)
|
|||
}
|
||||
}
|
||||
|
||||
static void smblib_notify_extcon_props(struct smb_charger *chg)
|
||||
{
|
||||
union power_supply_propval val;
|
||||
|
||||
smblib_get_prop_typec_cc_orientation(chg, &val);
|
||||
extcon_set_cable_state_(chg->extcon, EXTCON_USB_CC,
|
||||
(val.intval == 2) ? 1 : 0);
|
||||
extcon_set_cable_state_(chg->extcon, EXTCON_USB_SPEED, true);
|
||||
}
|
||||
|
||||
static void smblib_notify_device_mode(struct smb_charger *chg, bool enable)
|
||||
{
|
||||
if (enable)
|
||||
smblib_notify_extcon_props(chg);
|
||||
|
||||
extcon_set_cable_state_(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_set_cable_state_(chg->extcon, EXTCON_USB_HOST, enable);
|
||||
}
|
||||
|
||||
#define HVDCP_DET_MS 2500
|
||||
static void smblib_handle_apsd_done(struct smb_charger *chg, bool rising)
|
||||
{
|
||||
|
@ -3585,6 +3611,8 @@ static void smblib_handle_apsd_done(struct smb_charger *chg, bool rising)
|
|||
if (chg->micro_usb_mode)
|
||||
extcon_set_cable_state_(chg->extcon, EXTCON_USB,
|
||||
true);
|
||||
if (chg->use_extcon)
|
||||
smblib_notify_device_mode(chg, true);
|
||||
case OCP_CHARGER_BIT:
|
||||
case FLOAT_CHARGER_BIT:
|
||||
/* if not DCP then no hvdcp timeout happens, Enable pd here. */
|
||||
|
@ -3669,6 +3697,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)
|
||||
|
@ -3817,6 +3849,14 @@ unlock:
|
|||
|
||||
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)
|
||||
|
|
|
@ -139,9 +139,14 @@ struct smb_irq_info {
|
|||
static const unsigned int smblib_extcon_cable[] = {
|
||||
EXTCON_USB,
|
||||
EXTCON_USB_HOST,
|
||||
EXTCON_USB_CC,
|
||||
EXTCON_USB_SPEED,
|
||||
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;
|
||||
|
@ -327,6 +332,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;
|
||||
|
|
Loading…
Add table
Reference in a new issue