Loading drivers/power/supply/qcom/qpnp-smb5.c +7 −0 Original line number Diff line number Diff line Loading @@ -1233,6 +1233,7 @@ static enum power_supply_property smb5_dc_props[] = { POWER_SUPPLY_PROP_VOLTAGE_MAX, POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION, POWER_SUPPLY_PROP_REAL_TYPE, POWER_SUPPLY_PROP_DC_RESET, }; static int smb5_dc_get_prop(struct power_supply *psy, Loading Loading @@ -1265,6 +1266,9 @@ static int smb5_dc_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_REAL_TYPE: val->intval = POWER_SUPPLY_TYPE_WIPOWER; break; case POWER_SUPPLY_PROP_DC_RESET: val->intval = 0; break; default: return -EINVAL; } Loading Loading @@ -1294,6 +1298,9 @@ static int smb5_dc_set_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION: rc = smblib_set_prop_voltage_wls_output(chg, val); break; case POWER_SUPPLY_PROP_DC_RESET: rc = smblib_set_prop_dc_reset(chg); break; default: return -EINVAL; } Loading drivers/power/supply/qcom/smb5-lib.c +51 −0 Original line number Diff line number Diff line Loading @@ -2861,6 +2861,57 @@ int smblib_set_prop_voltage_wls_output(struct smb_charger *chg, return rc; } int smblib_set_prop_dc_reset(struct smb_charger *chg) { int rc; rc = vote(chg->dc_suspend_votable, VOUT_VOTER, true, 0); if (rc < 0) { smblib_err(chg, "Couldn't suspend DC rc=%d\n", rc); return rc; } rc = smblib_masked_write(chg, DCIN_CMD_IL_REG, DCIN_EN_MASK, DCIN_EN_OVERRIDE_BIT); if (rc < 0) { smblib_err(chg, "Couldn't set DCIN_EN_OVERRIDE_BIT rc=%d\n", rc); return rc; } rc = smblib_write(chg, DCIN_CMD_PON_REG, DCIN_PON_BIT | MID_CHG_BIT); if (rc < 0) { smblib_err(chg, "Couldn't write %d to DCIN_CMD_PON_REG rc=%d\n", DCIN_PON_BIT | MID_CHG_BIT, rc); return rc; } /* Wait for 10ms to allow the charge to get drained */ usleep_range(10000, 10010); rc = smblib_write(chg, DCIN_CMD_PON_REG, 0); if (rc < 0) { smblib_err(chg, "Couldn't clear DCIN_CMD_PON_REG rc=%d\n", rc); return rc; } rc = smblib_masked_write(chg, DCIN_CMD_IL_REG, DCIN_EN_MASK, 0); if (rc < 0) { smblib_err(chg, "Couldn't clear DCIN_EN_OVERRIDE_BIT rc=%d\n", rc); return rc; } rc = vote(chg->dc_suspend_votable, VOUT_VOTER, false, 0); if (rc < 0) { smblib_err(chg, "Couldn't unsuspend DC rc=%d\n", rc); return rc; } smblib_dbg(chg, PR_MISC, "Wireless charger removal detection successful\n"); return rc; } /******************* * USB PSY GETTERS * *******************/ Loading drivers/power/supply/qcom/smb5-lib.h +2 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ enum print_reason { #define USBOV_DBC_VOTER "USBOV_DBC_VOTER" #define CHG_TERMINATION_VOTER "CHG_TERMINATION_VOTER" #define THERMAL_THROTTLE_VOTER "THERMAL_THROTTLE_VOTER" #define VOUT_VOTER "VOUT_VOTER" #define BOOST_BACK_STORM_COUNT 3 #define WEAK_CHG_STORM_COUNT 8 Loading Loading @@ -636,6 +637,7 @@ int smblib_get_prop_dc_voltage_max(struct smb_charger *chg, union power_supply_propval *val); int smblib_set_prop_voltage_wls_output(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_dc_reset(struct smb_charger *chg); int smblib_get_prop_usb_present(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_usb_online(struct smb_charger *chg, Loading drivers/power/supply/qcom/smb5-reg.h +6 −0 Original line number Diff line number Diff line Loading @@ -320,6 +320,12 @@ enum { #define DCIN_CMD_IL_REG (DCIN_BASE + 0x40) #define DCIN_SUSPEND_BIT BIT(0) #define DCIN_EN_OVERRIDE_BIT BIT(1) #define DCIN_EN_MASK GENMASK(2, 1) #define DCIN_CMD_PON_REG (DCIN_BASE + 0x45) #define DCIN_PON_BIT BIT(0) #define MID_CHG_BIT BIT(1) #define DCIN_LOAD_CFG_REG (DCIN_BASE + 0x65) #define INPUT_MISS_POLL_EN_BIT BIT(5) Loading Loading
drivers/power/supply/qcom/qpnp-smb5.c +7 −0 Original line number Diff line number Diff line Loading @@ -1233,6 +1233,7 @@ static enum power_supply_property smb5_dc_props[] = { POWER_SUPPLY_PROP_VOLTAGE_MAX, POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION, POWER_SUPPLY_PROP_REAL_TYPE, POWER_SUPPLY_PROP_DC_RESET, }; static int smb5_dc_get_prop(struct power_supply *psy, Loading Loading @@ -1265,6 +1266,9 @@ static int smb5_dc_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_REAL_TYPE: val->intval = POWER_SUPPLY_TYPE_WIPOWER; break; case POWER_SUPPLY_PROP_DC_RESET: val->intval = 0; break; default: return -EINVAL; } Loading Loading @@ -1294,6 +1298,9 @@ static int smb5_dc_set_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_INPUT_VOLTAGE_REGULATION: rc = smblib_set_prop_voltage_wls_output(chg, val); break; case POWER_SUPPLY_PROP_DC_RESET: rc = smblib_set_prop_dc_reset(chg); break; default: return -EINVAL; } Loading
drivers/power/supply/qcom/smb5-lib.c +51 −0 Original line number Diff line number Diff line Loading @@ -2861,6 +2861,57 @@ int smblib_set_prop_voltage_wls_output(struct smb_charger *chg, return rc; } int smblib_set_prop_dc_reset(struct smb_charger *chg) { int rc; rc = vote(chg->dc_suspend_votable, VOUT_VOTER, true, 0); if (rc < 0) { smblib_err(chg, "Couldn't suspend DC rc=%d\n", rc); return rc; } rc = smblib_masked_write(chg, DCIN_CMD_IL_REG, DCIN_EN_MASK, DCIN_EN_OVERRIDE_BIT); if (rc < 0) { smblib_err(chg, "Couldn't set DCIN_EN_OVERRIDE_BIT rc=%d\n", rc); return rc; } rc = smblib_write(chg, DCIN_CMD_PON_REG, DCIN_PON_BIT | MID_CHG_BIT); if (rc < 0) { smblib_err(chg, "Couldn't write %d to DCIN_CMD_PON_REG rc=%d\n", DCIN_PON_BIT | MID_CHG_BIT, rc); return rc; } /* Wait for 10ms to allow the charge to get drained */ usleep_range(10000, 10010); rc = smblib_write(chg, DCIN_CMD_PON_REG, 0); if (rc < 0) { smblib_err(chg, "Couldn't clear DCIN_CMD_PON_REG rc=%d\n", rc); return rc; } rc = smblib_masked_write(chg, DCIN_CMD_IL_REG, DCIN_EN_MASK, 0); if (rc < 0) { smblib_err(chg, "Couldn't clear DCIN_EN_OVERRIDE_BIT rc=%d\n", rc); return rc; } rc = vote(chg->dc_suspend_votable, VOUT_VOTER, false, 0); if (rc < 0) { smblib_err(chg, "Couldn't unsuspend DC rc=%d\n", rc); return rc; } smblib_dbg(chg, PR_MISC, "Wireless charger removal detection successful\n"); return rc; } /******************* * USB PSY GETTERS * *******************/ Loading
drivers/power/supply/qcom/smb5-lib.h +2 −0 Original line number Diff line number Diff line Loading @@ -74,6 +74,7 @@ enum print_reason { #define USBOV_DBC_VOTER "USBOV_DBC_VOTER" #define CHG_TERMINATION_VOTER "CHG_TERMINATION_VOTER" #define THERMAL_THROTTLE_VOTER "THERMAL_THROTTLE_VOTER" #define VOUT_VOTER "VOUT_VOTER" #define BOOST_BACK_STORM_COUNT 3 #define WEAK_CHG_STORM_COUNT 8 Loading Loading @@ -636,6 +637,7 @@ int smblib_get_prop_dc_voltage_max(struct smb_charger *chg, union power_supply_propval *val); int smblib_set_prop_voltage_wls_output(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_dc_reset(struct smb_charger *chg); int smblib_get_prop_usb_present(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_usb_online(struct smb_charger *chg, Loading
drivers/power/supply/qcom/smb5-reg.h +6 −0 Original line number Diff line number Diff line Loading @@ -320,6 +320,12 @@ enum { #define DCIN_CMD_IL_REG (DCIN_BASE + 0x40) #define DCIN_SUSPEND_BIT BIT(0) #define DCIN_EN_OVERRIDE_BIT BIT(1) #define DCIN_EN_MASK GENMASK(2, 1) #define DCIN_CMD_PON_REG (DCIN_BASE + 0x45) #define DCIN_PON_BIT BIT(0) #define MID_CHG_BIT BIT(1) #define DCIN_LOAD_CFG_REG (DCIN_BASE + 0x65) #define INPUT_MISS_POLL_EN_BIT BIT(5) Loading