Merge "power: smb-lib: Add support for SW based OV detection"
This commit is contained in:
commit
6b9ca47dab
3 changed files with 33 additions and 1 deletions
|
@ -1844,7 +1844,7 @@ static int smb2_chg_config_init(struct smb2 *chip)
|
||||||
break;
|
break;
|
||||||
case PM660_SUBTYPE:
|
case PM660_SUBTYPE:
|
||||||
chip->chg.smb_version = PM660_SUBTYPE;
|
chip->chg.smb_version = PM660_SUBTYPE;
|
||||||
chip->chg.wa_flags |= BOOST_BACK_WA | OTG_WA;
|
chip->chg.wa_flags |= BOOST_BACK_WA | OTG_WA | OV_IRQ_WA_BIT;
|
||||||
chg->param.freq_buck = pm660_params.freq_buck;
|
chg->param.freq_buck = pm660_params.freq_buck;
|
||||||
chg->param.freq_boost = pm660_params.freq_boost;
|
chg->param.freq_boost = pm660_params.freq_boost;
|
||||||
chg->chg_freq.freq_5V = 650;
|
chg->chg_freq.freq_5V = 650;
|
||||||
|
|
|
@ -670,6 +670,7 @@ static void smblib_uusb_removal(struct smb_charger *chg)
|
||||||
vote(chg->pl_enable_votable_indirect, USBIN_V_VOTER, false, 0);
|
vote(chg->pl_enable_votable_indirect, USBIN_V_VOTER, false, 0);
|
||||||
vote(chg->usb_icl_votable, SW_QC3_VOTER, false, 0);
|
vote(chg->usb_icl_votable, SW_QC3_VOTER, false, 0);
|
||||||
vote(chg->usb_icl_votable, USBIN_USBIN_BOOST_VOTER, false, 0);
|
vote(chg->usb_icl_votable, USBIN_USBIN_BOOST_VOTER, false, 0);
|
||||||
|
vote(chg->hvdcp_hw_inov_dis_votable, OV_VOTER, false, 0);
|
||||||
|
|
||||||
cancel_delayed_work_sync(&chg->hvdcp_detect_work);
|
cancel_delayed_work_sync(&chg->hvdcp_detect_work);
|
||||||
|
|
||||||
|
@ -3453,6 +3454,33 @@ static void smblib_handle_sdp_enumeration_done(struct smb_charger *chg,
|
||||||
rising ? "rising" : "falling");
|
rising ? "rising" : "falling");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MICRO_10P3V 10300000
|
||||||
|
static void smblib_check_ov_condition(struct smb_charger *chg)
|
||||||
|
{
|
||||||
|
union power_supply_propval pval = {0, };
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (chg->wa_flags & OV_IRQ_WA_BIT) {
|
||||||
|
rc = power_supply_get_property(chg->usb_psy,
|
||||||
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, &pval);
|
||||||
|
if (rc < 0) {
|
||||||
|
smblib_err(chg, "Couldn't get current voltage, rc=%d\n",
|
||||||
|
rc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pval.intval > MICRO_10P3V) {
|
||||||
|
smblib_err(chg, "USBIN OV detected\n");
|
||||||
|
vote(chg->hvdcp_hw_inov_dis_votable, OV_VOTER, true,
|
||||||
|
0);
|
||||||
|
pval.intval = POWER_SUPPLY_DP_DM_FORCE_5V;
|
||||||
|
rc = power_supply_set_property(chg->batt_psy,
|
||||||
|
POWER_SUPPLY_PROP_DP_DM, &pval);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#define QC3_PULSES_FOR_6V 5
|
#define QC3_PULSES_FOR_6V 5
|
||||||
#define QC3_PULSES_FOR_9V 20
|
#define QC3_PULSES_FOR_9V 20
|
||||||
#define QC3_PULSES_FOR_12V 35
|
#define QC3_PULSES_FOR_12V 35
|
||||||
|
@ -3462,6 +3490,7 @@ static void smblib_hvdcp_adaptive_voltage_change(struct smb_charger *chg)
|
||||||
u8 stat;
|
u8 stat;
|
||||||
int pulses;
|
int pulses;
|
||||||
|
|
||||||
|
smblib_check_ov_condition(chg);
|
||||||
power_supply_changed(chg->usb_main_psy);
|
power_supply_changed(chg->usb_main_psy);
|
||||||
if (chg->real_charger_type == POWER_SUPPLY_TYPE_USB_HVDCP) {
|
if (chg->real_charger_type == POWER_SUPPLY_TYPE_USB_HVDCP) {
|
||||||
rc = smblib_read(chg, QC_CHANGE_STATUS_REG, &stat);
|
rc = smblib_read(chg, QC_CHANGE_STATUS_REG, &stat);
|
||||||
|
@ -3994,6 +4023,7 @@ static void smblib_handle_typec_removal(struct smb_charger *chg)
|
||||||
/* reset hvdcp voters */
|
/* reset hvdcp voters */
|
||||||
vote(chg->hvdcp_disable_votable_indirect, VBUS_CC_SHORT_VOTER, true, 0);
|
vote(chg->hvdcp_disable_votable_indirect, VBUS_CC_SHORT_VOTER, true, 0);
|
||||||
vote(chg->hvdcp_disable_votable_indirect, PD_INACTIVE_VOTER, true, 0);
|
vote(chg->hvdcp_disable_votable_indirect, PD_INACTIVE_VOTER, true, 0);
|
||||||
|
vote(chg->hvdcp_hw_inov_dis_votable, OV_VOTER, false, 0);
|
||||||
|
|
||||||
/* reset power delivery voters */
|
/* reset power delivery voters */
|
||||||
vote(chg->pd_allowed_votable, PD_VOTER, false, 0);
|
vote(chg->pd_allowed_votable, PD_VOTER, false, 0);
|
||||||
|
|
|
@ -66,6 +66,7 @@ enum print_reason {
|
||||||
#define USBIN_I_VOTER "USBIN_I_VOTER"
|
#define USBIN_I_VOTER "USBIN_I_VOTER"
|
||||||
#define WEAK_CHARGER_VOTER "WEAK_CHARGER_VOTER"
|
#define WEAK_CHARGER_VOTER "WEAK_CHARGER_VOTER"
|
||||||
#define WBC_VOTER "WBC_VOTER"
|
#define WBC_VOTER "WBC_VOTER"
|
||||||
|
#define OV_VOTER "OV_VOTER"
|
||||||
|
|
||||||
#define VCONN_MAX_ATTEMPTS 3
|
#define VCONN_MAX_ATTEMPTS 3
|
||||||
#define OTG_MAX_ATTEMPTS 3
|
#define OTG_MAX_ATTEMPTS 3
|
||||||
|
@ -84,6 +85,7 @@ enum {
|
||||||
TYPEC_CC2_REMOVAL_WA_BIT = BIT(2),
|
TYPEC_CC2_REMOVAL_WA_BIT = BIT(2),
|
||||||
QC_AUTH_INTERRUPT_WA_BIT = BIT(3),
|
QC_AUTH_INTERRUPT_WA_BIT = BIT(3),
|
||||||
OTG_WA = BIT(4),
|
OTG_WA = BIT(4),
|
||||||
|
OV_IRQ_WA_BIT = BIT(5),
|
||||||
};
|
};
|
||||||
|
|
||||||
enum smb_irq_index {
|
enum smb_irq_index {
|
||||||
|
|
Loading…
Add table
Reference in a new issue