From 8cd61d5d11ccbe0038523b60006dc5f41893f68c Mon Sep 17 00:00:00 2001 From: Ankit Sharma Date: Mon, 14 Aug 2017 17:08:23 +0530 Subject: [PATCH] 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 --- drivers/power/supply/qcom/smb-lib.c | 40 +++++++++++++++++++++++++++++ drivers/power/supply/qcom/smb-lib.h | 7 +++++ 2 files changed, 47 insertions(+) diff --git a/drivers/power/supply/qcom/smb-lib.c b/drivers/power/supply/qcom/smb-lib.c index 0ed07aa13855..58a317e62bbd 100644 --- a/drivers/power/supply/qcom/smb-lib.c +++ b/drivers/power/supply/qcom/smb-lib.c @@ -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) diff --git a/drivers/power/supply/qcom/smb-lib.h b/drivers/power/supply/qcom/smb-lib.h index 8c810352f78f..89ad7e7b5580 100644 --- a/drivers/power/supply/qcom/smb-lib.h +++ b/drivers/power/supply/qcom/smb-lib.h @@ -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;