Loading drivers/power/supply/qcom/smb5-lib.c +54 −49 Original line number Diff line number Diff line Loading @@ -751,35 +751,22 @@ int smblib_set_dc_suspend(struct smb_charger *chg, bool suspend) return rc; } static int smblib_set_adapter_allowance(struct smb_charger *chg, static int smblib_usb_pd_adapter_allowance_override(struct smb_charger *chg, u8 allowed_voltage) { int rc = 0; /* PMI632 only support max. 9V */ if (chg->smb_version == PMI632_SUBTYPE) { switch (allowed_voltage) { case USBIN_ADAPTER_ALLOW_12V: case USBIN_ADAPTER_ALLOW_9V_TO_12V: allowed_voltage = USBIN_ADAPTER_ALLOW_9V; break; case USBIN_ADAPTER_ALLOW_5V_OR_12V: case USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V: allowed_voltage = USBIN_ADAPTER_ALLOW_5V_OR_9V; break; case USBIN_ADAPTER_ALLOW_5V_TO_12V: allowed_voltage = USBIN_ADAPTER_ALLOW_5V_TO_9V; break; } } if (chg->smb_version == PMI632_SUBTYPE) return 0; rc = smblib_write(chg, USBIN_ADAPTER_ALLOW_CFG_REG, allowed_voltage); if (rc < 0) { smblib_err(chg, "Couldn't write 0x%02x to USBIN_ADAPTER_ALLOW_CFG rc=%d\n", rc = smblib_write(chg, USBIN_ADAPTER_ALLOW_OVERRIDE_REG, allowed_voltage); if (rc < 0) smblib_err(chg, "Couldn't write 0x%02x to USBIN_ADAPTER_ALLOW_OVERRIDE_REG rc=%d\n", allowed_voltage, rc); return rc; } smblib_dbg(chg, PR_MISC, "set USBIN_ALLOW_OVERRIDE: %d\n", allowed_voltage); return rc; } Loading Loading @@ -808,33 +795,51 @@ static int smblib_set_usb_pd_fsw(struct smb_charger *chg, int voltage) return rc; } #define CONT_AICL_HEADROOM_MV 1000 #define AICL_THRESHOLD_MV_IN_CC 5000 static int smblib_set_usb_pd_allowed_voltage(struct smb_charger *chg, int min_allowed_uv, int max_allowed_uv) { int rc; u8 allowed_voltage; int rc, aicl_threshold; u8 vbus_allowance; if (min_allowed_uv == MICRO_5V && max_allowed_uv == MICRO_5V) { allowed_voltage = USBIN_ADAPTER_ALLOW_5V; if (chg->smb_version == PMI632_SUBTYPE) return 0; if (chg->pd_active == POWER_SUPPLY_PD_PPS_ACTIVE) { vbus_allowance = CONTINUOUS; } else if (min_allowed_uv == MICRO_5V && max_allowed_uv == MICRO_5V) { vbus_allowance = FORCE_5V; } else if (min_allowed_uv == MICRO_9V && max_allowed_uv == MICRO_9V) { allowed_voltage = USBIN_ADAPTER_ALLOW_9V; vbus_allowance = FORCE_9V; } else if (min_allowed_uv == MICRO_12V && max_allowed_uv == MICRO_12V) { allowed_voltage = USBIN_ADAPTER_ALLOW_12V; } else if (min_allowed_uv < MICRO_9V && max_allowed_uv <= MICRO_9V) { allowed_voltage = USBIN_ADAPTER_ALLOW_5V_TO_9V; } else if (min_allowed_uv < MICRO_9V && max_allowed_uv <= MICRO_12V) { allowed_voltage = USBIN_ADAPTER_ALLOW_5V_TO_12V; vbus_allowance = FORCE_12V; } else if (min_allowed_uv < MICRO_12V && max_allowed_uv <= MICRO_12V) { allowed_voltage = USBIN_ADAPTER_ALLOW_9V_TO_12V; vbus_allowance = CONTINUOUS; } else { smblib_err(chg, "invalid allowed voltage [%d, %d]\n", min_allowed_uv, max_allowed_uv); return -EINVAL; } rc = smblib_set_adapter_allowance(chg, allowed_voltage); rc = smblib_usb_pd_adapter_allowance_override(chg, vbus_allowance); if (rc < 0) { smblib_err(chg, "set CONTINUOUS allowance failed, rc=%d\n", rc); return rc; } if (vbus_allowance != CONTINUOUS) return 0; if (chg->adapter_cc_mode) aicl_threshold = AICL_THRESHOLD_MV_IN_CC; else aicl_threshold = min_allowed_uv / 1000 - CONT_AICL_HEADROOM_MV; rc = smblib_set_charge_param(chg, &chg->param.aicl_cont_threshold, aicl_threshold); if (rc < 0) { smblib_err(chg, "Couldn't configure adapter allowance rc=%d\n", smblib_err(chg, "set CONT_AICL_THRESHOLD failed, rc=%d\n", rc); return rc; } Loading Loading @@ -1148,13 +1153,6 @@ static void smblib_uusb_removal(struct smb_charger *chg) vote(chg->cp_disable_votable, SW_THERM_REGULATION_VOTER, false, 0); /* reconfigure allowed voltage for HVDCP */ rc = smblib_set_adapter_allowance(chg, USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V); if (rc < 0) smblib_err(chg, "Couldn't set USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V rc=%d\n", rc); /* reset USBOV votes and cancel work */ cancel_delayed_work_sync(&chg->usbov_dbc_work); vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); Loading Loading @@ -4362,6 +4360,8 @@ int smblib_set_prop_pd_active(struct smb_charger *chg, } } smblib_usb_pd_adapter_allowance_override(chg, !!chg->pd_active ? FORCE_5V : FORCE_NULL); smblib_update_usb_type(chg); power_supply_changed(chg->usb_psy); return rc; Loading Loading @@ -5667,13 +5667,18 @@ static void typec_src_removal(struct smb_charger *chg) smblib_err(chg, "Couldn't write float charger options rc=%d\n", rc); /* reconfigure allowed voltage for HVDCP */ rc = smblib_set_adapter_allowance(chg, USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V); if (!chg->pr_swap_in_progress) { rc = smblib_usb_pd_adapter_allowance_override(chg, FORCE_NULL); if (rc < 0) smblib_err(chg, "Couldn't set USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V rc=%d\n", rc); smblib_err(chg, "Couldn't set FORCE_NULL rc=%d\n", rc); rc = smblib_set_charge_param(chg, &chg->param.aicl_cont_threshold, chg->default_aicl_cont_threshold_mv); if (rc < 0) smblib_err(chg, "Couldn't restore aicl_cont_threshold, rc=%d", rc); } /* * if non-compliant charger caused UV, restore original max pulses * and turn SUSPEND_ON_COLLAPSE_USBIN_BIT back on. Loading drivers/power/supply/qcom/smb5-reg.h +7 −13 Original line number Diff line number Diff line Loading @@ -251,6 +251,13 @@ enum { #define SINGLE_DECREMENT_BIT BIT(1) #define SINGLE_INCREMENT_BIT BIT(0) #define USBIN_ADAPTER_ALLOW_OVERRIDE_REG (USBIN_BASE + 0x44) #define CONTINUOUS BIT(3) #define FORCE_12V BIT(2) #define FORCE_9V BIT(1) #define FORCE_5V BIT(0) #define FORCE_NULL 0 #define USB_CMD_PULLDOWN_REG (USBIN_BASE + 0x45) #define EN_PULLDOWN_USB_IN_BIT BIT(0) Loading @@ -266,19 +273,6 @@ enum { HVDCP_PULSE_COUNT_MAX_QC2_INVALID = 0xC0 }; #define USBIN_ADAPTER_ALLOW_CFG_REG (USBIN_BASE + 0x60) enum { USBIN_ADAPTER_ALLOW_5V = 0, USBIN_ADAPTER_ALLOW_9V = 2, USBIN_ADAPTER_ALLOW_5V_OR_9V = 3, USBIN_ADAPTER_ALLOW_12V = 4, USBIN_ADAPTER_ALLOW_5V_OR_12V = 5, USBIN_ADAPTER_ALLOW_9V_TO_12V = 6, USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V = 7, USBIN_ADAPTER_ALLOW_5V_TO_9V = 8, USBIN_ADAPTER_ALLOW_5V_TO_12V = 12, }; #define USBIN_OPTIONS_1_CFG_REG (USBIN_BASE + 0x62) #define HVDCP_AUTH_ALG_EN_CFG_BIT BIT(6) #define HVDCP_AUTONOMOUS_MODE_EN_CFG_BIT BIT(5) Loading Loading
drivers/power/supply/qcom/smb5-lib.c +54 −49 Original line number Diff line number Diff line Loading @@ -751,35 +751,22 @@ int smblib_set_dc_suspend(struct smb_charger *chg, bool suspend) return rc; } static int smblib_set_adapter_allowance(struct smb_charger *chg, static int smblib_usb_pd_adapter_allowance_override(struct smb_charger *chg, u8 allowed_voltage) { int rc = 0; /* PMI632 only support max. 9V */ if (chg->smb_version == PMI632_SUBTYPE) { switch (allowed_voltage) { case USBIN_ADAPTER_ALLOW_12V: case USBIN_ADAPTER_ALLOW_9V_TO_12V: allowed_voltage = USBIN_ADAPTER_ALLOW_9V; break; case USBIN_ADAPTER_ALLOW_5V_OR_12V: case USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V: allowed_voltage = USBIN_ADAPTER_ALLOW_5V_OR_9V; break; case USBIN_ADAPTER_ALLOW_5V_TO_12V: allowed_voltage = USBIN_ADAPTER_ALLOW_5V_TO_9V; break; } } if (chg->smb_version == PMI632_SUBTYPE) return 0; rc = smblib_write(chg, USBIN_ADAPTER_ALLOW_CFG_REG, allowed_voltage); if (rc < 0) { smblib_err(chg, "Couldn't write 0x%02x to USBIN_ADAPTER_ALLOW_CFG rc=%d\n", rc = smblib_write(chg, USBIN_ADAPTER_ALLOW_OVERRIDE_REG, allowed_voltage); if (rc < 0) smblib_err(chg, "Couldn't write 0x%02x to USBIN_ADAPTER_ALLOW_OVERRIDE_REG rc=%d\n", allowed_voltage, rc); return rc; } smblib_dbg(chg, PR_MISC, "set USBIN_ALLOW_OVERRIDE: %d\n", allowed_voltage); return rc; } Loading Loading @@ -808,33 +795,51 @@ static int smblib_set_usb_pd_fsw(struct smb_charger *chg, int voltage) return rc; } #define CONT_AICL_HEADROOM_MV 1000 #define AICL_THRESHOLD_MV_IN_CC 5000 static int smblib_set_usb_pd_allowed_voltage(struct smb_charger *chg, int min_allowed_uv, int max_allowed_uv) { int rc; u8 allowed_voltage; int rc, aicl_threshold; u8 vbus_allowance; if (min_allowed_uv == MICRO_5V && max_allowed_uv == MICRO_5V) { allowed_voltage = USBIN_ADAPTER_ALLOW_5V; if (chg->smb_version == PMI632_SUBTYPE) return 0; if (chg->pd_active == POWER_SUPPLY_PD_PPS_ACTIVE) { vbus_allowance = CONTINUOUS; } else if (min_allowed_uv == MICRO_5V && max_allowed_uv == MICRO_5V) { vbus_allowance = FORCE_5V; } else if (min_allowed_uv == MICRO_9V && max_allowed_uv == MICRO_9V) { allowed_voltage = USBIN_ADAPTER_ALLOW_9V; vbus_allowance = FORCE_9V; } else if (min_allowed_uv == MICRO_12V && max_allowed_uv == MICRO_12V) { allowed_voltage = USBIN_ADAPTER_ALLOW_12V; } else if (min_allowed_uv < MICRO_9V && max_allowed_uv <= MICRO_9V) { allowed_voltage = USBIN_ADAPTER_ALLOW_5V_TO_9V; } else if (min_allowed_uv < MICRO_9V && max_allowed_uv <= MICRO_12V) { allowed_voltage = USBIN_ADAPTER_ALLOW_5V_TO_12V; vbus_allowance = FORCE_12V; } else if (min_allowed_uv < MICRO_12V && max_allowed_uv <= MICRO_12V) { allowed_voltage = USBIN_ADAPTER_ALLOW_9V_TO_12V; vbus_allowance = CONTINUOUS; } else { smblib_err(chg, "invalid allowed voltage [%d, %d]\n", min_allowed_uv, max_allowed_uv); return -EINVAL; } rc = smblib_set_adapter_allowance(chg, allowed_voltage); rc = smblib_usb_pd_adapter_allowance_override(chg, vbus_allowance); if (rc < 0) { smblib_err(chg, "set CONTINUOUS allowance failed, rc=%d\n", rc); return rc; } if (vbus_allowance != CONTINUOUS) return 0; if (chg->adapter_cc_mode) aicl_threshold = AICL_THRESHOLD_MV_IN_CC; else aicl_threshold = min_allowed_uv / 1000 - CONT_AICL_HEADROOM_MV; rc = smblib_set_charge_param(chg, &chg->param.aicl_cont_threshold, aicl_threshold); if (rc < 0) { smblib_err(chg, "Couldn't configure adapter allowance rc=%d\n", smblib_err(chg, "set CONT_AICL_THRESHOLD failed, rc=%d\n", rc); return rc; } Loading Loading @@ -1148,13 +1153,6 @@ static void smblib_uusb_removal(struct smb_charger *chg) vote(chg->cp_disable_votable, SW_THERM_REGULATION_VOTER, false, 0); /* reconfigure allowed voltage for HVDCP */ rc = smblib_set_adapter_allowance(chg, USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V); if (rc < 0) smblib_err(chg, "Couldn't set USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V rc=%d\n", rc); /* reset USBOV votes and cancel work */ cancel_delayed_work_sync(&chg->usbov_dbc_work); vote(chg->awake_votable, USBOV_DBC_VOTER, false, 0); Loading Loading @@ -4362,6 +4360,8 @@ int smblib_set_prop_pd_active(struct smb_charger *chg, } } smblib_usb_pd_adapter_allowance_override(chg, !!chg->pd_active ? FORCE_5V : FORCE_NULL); smblib_update_usb_type(chg); power_supply_changed(chg->usb_psy); return rc; Loading Loading @@ -5667,13 +5667,18 @@ static void typec_src_removal(struct smb_charger *chg) smblib_err(chg, "Couldn't write float charger options rc=%d\n", rc); /* reconfigure allowed voltage for HVDCP */ rc = smblib_set_adapter_allowance(chg, USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V); if (!chg->pr_swap_in_progress) { rc = smblib_usb_pd_adapter_allowance_override(chg, FORCE_NULL); if (rc < 0) smblib_err(chg, "Couldn't set USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V rc=%d\n", rc); smblib_err(chg, "Couldn't set FORCE_NULL rc=%d\n", rc); rc = smblib_set_charge_param(chg, &chg->param.aicl_cont_threshold, chg->default_aicl_cont_threshold_mv); if (rc < 0) smblib_err(chg, "Couldn't restore aicl_cont_threshold, rc=%d", rc); } /* * if non-compliant charger caused UV, restore original max pulses * and turn SUSPEND_ON_COLLAPSE_USBIN_BIT back on. Loading
drivers/power/supply/qcom/smb5-reg.h +7 −13 Original line number Diff line number Diff line Loading @@ -251,6 +251,13 @@ enum { #define SINGLE_DECREMENT_BIT BIT(1) #define SINGLE_INCREMENT_BIT BIT(0) #define USBIN_ADAPTER_ALLOW_OVERRIDE_REG (USBIN_BASE + 0x44) #define CONTINUOUS BIT(3) #define FORCE_12V BIT(2) #define FORCE_9V BIT(1) #define FORCE_5V BIT(0) #define FORCE_NULL 0 #define USB_CMD_PULLDOWN_REG (USBIN_BASE + 0x45) #define EN_PULLDOWN_USB_IN_BIT BIT(0) Loading @@ -266,19 +273,6 @@ enum { HVDCP_PULSE_COUNT_MAX_QC2_INVALID = 0xC0 }; #define USBIN_ADAPTER_ALLOW_CFG_REG (USBIN_BASE + 0x60) enum { USBIN_ADAPTER_ALLOW_5V = 0, USBIN_ADAPTER_ALLOW_9V = 2, USBIN_ADAPTER_ALLOW_5V_OR_9V = 3, USBIN_ADAPTER_ALLOW_12V = 4, USBIN_ADAPTER_ALLOW_5V_OR_12V = 5, USBIN_ADAPTER_ALLOW_9V_TO_12V = 6, USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V = 7, USBIN_ADAPTER_ALLOW_5V_TO_9V = 8, USBIN_ADAPTER_ALLOW_5V_TO_12V = 12, }; #define USBIN_OPTIONS_1_CFG_REG (USBIN_BASE + 0x62) #define HVDCP_AUTH_ALG_EN_CFG_BIT BIT(6) #define HVDCP_AUTONOMOUS_MODE_EN_CFG_BIT BIT(5) Loading