diff --git a/drivers/power/supply/qcom/battery.c b/drivers/power/supply/qcom/battery.c index 66487689937e..d8f2bfc01b81 100644 --- a/drivers/power/supply/qcom/battery.c +++ b/drivers/power/supply/qcom/battery.c @@ -945,7 +945,7 @@ static void pl_taper_work(struct work_struct *work) } chip->charge_type = pval.intval; - if (pval.intval == QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER) { + if (pval.intval == POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE) { fcc_ua = get_client_vote(chip->fcc_votable, TAPER_STEPPER_VOTER); if (fcc_ua < 0) { @@ -1558,7 +1558,7 @@ static int pl_disable_vote_callback(struct votable *votable, if (rc < 0) { pr_err("Couldn't get batt charge type rc=%d\n", rc); } else { - if (pval.intval == QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER + if (pval.intval == POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE && !chip->taper_work_running) { pl_dbg(chip, PR_PARALLEL, "pl enabled in Taper scheduing work\n"); @@ -1761,7 +1761,7 @@ static void handle_main_charge_type(struct pl_data *chip) /* not fast/not taper state to disables parallel */ if ((pval.intval != POWER_SUPPLY_CHARGE_TYPE_FAST) - && (pval.intval != QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER)) { + && (pval.intval != POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE)) { vote(chip->pl_disable_votable, CHG_STATE_VOTER, true, 0); chip->charge_type = pval.intval; return; @@ -1769,7 +1769,7 @@ static void handle_main_charge_type(struct pl_data *chip) /* handle taper charge entry */ if (chip->charge_type == POWER_SUPPLY_CHARGE_TYPE_FAST - && (pval.intval == QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER)) { + && (pval.intval == POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE)) { chip->charge_type = pval.intval; if (!chip->taper_work_running) { pl_dbg(chip, PR_PARALLEL, "taper entry scheduling work\n"); @@ -1780,7 +1780,7 @@ static void handle_main_charge_type(struct pl_data *chip) } /* handle fast/taper charge entry */ - if (pval.intval == QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER + if (pval.intval == POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE || pval.intval == POWER_SUPPLY_CHARGE_TYPE_FAST) { /* * Undo parallel charging termination if entered taper in @@ -1895,7 +1895,7 @@ static void handle_parallel_in_taper(struct pl_data *chip) * if parallel is seen in taper mode ever, that is an anomaly and * we disable parallel charger */ - if (pval.intval == QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER) { + if (pval.intval == POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE) { vote(chip->pl_disable_votable, PL_TAPER_EARLY_BAD_VOTER, true, 0); return; diff --git a/drivers/power/supply/qcom/fg-alg.c b/drivers/power/supply/qcom/fg-alg.c index 6f8916d55f8e..e780f28695f1 100644 --- a/drivers/power/supply/qcom/fg-alg.c +++ b/drivers/power/supply/qcom/fg-alg.c @@ -1213,7 +1213,7 @@ static int get_time_to_full_locked(struct ttf *ttf, int *val) pr_debug("TTF: i_cc2cv=%d\n", i_cc2cv); /* if we are already in CV state then we can skip estimating CC */ - if (charge_type == QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER) + if (charge_type == POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE) goto cv_estimate; /* estimated SOC at the CC to CV transition */ @@ -1343,14 +1343,14 @@ static int get_time_to_full_locked(struct ttf *ttf, int *val) cv_estimate: pr_debug("TTF: t_predicted_cc=%d\n", t_predicted); - if (charge_type == QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER) + if (charge_type == POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE) iterm = max(100, abs(iterm)); else iterm = max(100, abs(iterm) + ttf->iterm_delta); pr_debug("TTF: iterm=%d\n", iterm); - if (charge_type == QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER) + if (charge_type == POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE) tau = max(MILLI_UNIT, ibatt_avg * MILLI_UNIT / iterm); else tau = max(MILLI_UNIT, i_cc2cv * MILLI_UNIT / iterm); diff --git a/drivers/power/supply/qcom/qpnp-smb5.c b/drivers/power/supply/qcom/qpnp-smb5.c index e21f9234e853..879e398a53cd 100644 --- a/drivers/power/supply/qcom/qpnp-smb5.c +++ b/drivers/power/supply/qcom/qpnp-smb5.c @@ -869,6 +869,7 @@ static int smb5_usb_get_prop(struct power_supply *psy, rc = smblib_get_prop_scope(chg, val); break; case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: + /* USB uses this to set SDP current */ val->intval = get_client_vote(chg->usb_icl_votable, USB_PSY_VOTER); break; @@ -1072,6 +1073,7 @@ static int smb5_dc_get_prop(struct power_supply *psy, switch (psp) { case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: + /* For DC, INPUT_CURRENT_LIMIT equates to INPUT_SUSPEND */ val->intval = get_effective_result(chg->dc_suspend_votable); break; case POWER_SUPPLY_PROP_PRESENT: @@ -1209,6 +1211,7 @@ static int smb5_batt_get_prop(struct power_supply *psy, rc = smblib_get_prop_batt_present(chg, pval); break; case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: + /* For battery, INPUT_CURRENT_LIMIT equates to INPUT_SUSPEND */ rc = smblib_get_prop_input_current_limit_usb(chg, pval); break; case POWER_SUPPLY_PROP_CHARGE_TYPE: diff --git a/drivers/power/supply/qcom/smb5-iio.c b/drivers/power/supply/qcom/smb5-iio.c index 9b432c268aba..2d6576a3cf0c 100644 --- a/drivers/power/supply/qcom/smb5-iio.c +++ b/drivers/power/supply/qcom/smb5-iio.c @@ -260,6 +260,9 @@ int smb5_iio_get_prop(struct smb_charger *chg, int channel, int *val) case PSY_IIO_FCC_STEPPER_ENABLE: *val = chg->fcc_stepper_enable; break; + case PSY_IIO_TYPEC_ACCESSORY_MODE: + rc = smblib_get_usb_prop_typec_accessory_mode(chg, val); + break; default: pr_err("get prop %d is not supported\n", channel); rc = -EINVAL; diff --git a/drivers/power/supply/qcom/smb5-iio.h b/drivers/power/supply/qcom/smb5-iio.h index f90ec67d11fd..1ccae972cf44 100644 --- a/drivers/power/supply/qcom/smb5-iio.h +++ b/drivers/power/supply/qcom/smb5-iio.h @@ -199,6 +199,7 @@ static const struct smb5_iio_prop_channels smb5_chans_pmic[] = { SMB5_CHAN_ACTIVITY("battery_recharge_soc", RECHARGE_SOC) SMB5_CHAN_ACTIVITY("battery_force_recharge", FORCE_RECHARGE) SMB5_CHAN_ACTIVITY("battery_fcc_stepper_enable", FCC_STEPPER_ENABLE) + SMB5_CHAN_INDEX("usb_typec_accessory_mode", TYPEC_ACCESSORY_MODE) }; struct iio_channel **get_ext_channels(struct device *dev, diff --git a/drivers/power/supply/qcom/smb5-lib.c b/drivers/power/supply/qcom/smb5-lib.c index bfbe04eab916..8dc118fe9cb3 100644 --- a/drivers/power/supply/qcom/smb5-lib.c +++ b/drivers/power/supply/qcom/smb5-lib.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "smb5-lib.h" #include "smb5-reg.h" #include "schgm-flash.h" @@ -2224,7 +2225,7 @@ int smblib_get_prop_batt_charge_type(struct smb_charger *chg, val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST; break; case TAPER_CHARGE: - val->intval = QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER; + val->intval = POWER_SUPPLY_CHARGE_TYPE_ADAPTIVE; break; default: val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE; @@ -3087,8 +3088,10 @@ int smblib_get_prop_voltage_wls_output(struct smb_charger *chg, if (!chg->wls_psy) { chg->wls_psy = power_supply_get_by_name("wireless"); - if (!chg->wls_psy) - return -ENODEV; + if (!chg->wls_psy) { + val->intval = -EINVAL; + return 0; + } } rc = power_supply_get_property(chg->wls_psy, @@ -3193,8 +3196,10 @@ int smblib_get_prop_dc_voltage_now(struct smb_charger *chg, if (!chg->wls_psy) { chg->wls_psy = power_supply_get_by_name("wireless"); - if (!chg->wls_psy) - return -ENODEV; + if (!chg->wls_psy) { + val->intval = -EINVAL; + return 0; + } } rc = power_supply_get_property(chg->wls_psy, @@ -3838,6 +3843,31 @@ inline int smblib_get_usb_prop_typec_mode(struct smb_charger *chg, return 0; } +inline int smblib_get_usb_prop_typec_accessory_mode(struct smb_charger *chg, + int *val) +{ + if (chg->connector_type == QTI_POWER_SUPPLY_CONNECTOR_MICRO_USB) { + *val = TYPEC_ACCESSORY_NONE; + return 0; + } + + switch (chg->typec_mode) { + case QTI_POWER_SUPPLY_TYPEC_NONE: + *val = TYPEC_ACCESSORY_NONE; + break; + case QTI_POWER_SUPPLY_TYPEC_SINK_AUDIO_ADAPTER: + *val = TYPEC_ACCESSORY_AUDIO; + break; + case QTI_POWER_SUPPLY_TYPEC_SINK_DEBUG_ACCESSORY: + *val = TYPEC_ACCESSORY_DEBUG; + break; + default: + *val = -EINVAL; + } + + return 0; +} + int smblib_get_prop_typec_power_role(struct smb_charger *chg, int *val) { int rc = 0; @@ -3895,8 +3925,10 @@ int smblib_get_prop_typec_select_rp(struct smb_charger *chg, int rc, rp; u8 stat; - if (!typec_in_src_mode(chg)) - return -ENODATA; + if (!typec_in_src_mode(chg)) { + *val = -EINVAL; + return 0; + } rc = smblib_read(chg, TYPE_C_CURRSRC_CFG_REG, &stat); if (rc < 0) { diff --git a/drivers/power/supply/qcom/smb5-lib.h b/drivers/power/supply/qcom/smb5-lib.h index fc7965638320..bc6bb76c04ad 100644 --- a/drivers/power/supply/qcom/smb5-lib.h +++ b/drivers/power/supply/qcom/smb5-lib.h @@ -741,6 +741,8 @@ int smblib_get_prop_usb_current_now(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_usb_prop_typec_mode(struct smb_charger *chg, int *val); +int smblib_get_usb_prop_typec_accessory_mode(struct smb_charger *chg, + int *val); int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg, int *val); int smblib_get_prop_scope(struct smb_charger *chg, diff --git a/include/dt-bindings/iio/qti_power_supply_iio.h b/include/dt-bindings/iio/qti_power_supply_iio.h index 9f662f0d2b43..90c484e9fff2 100644 --- a/include/dt-bindings/iio/qti_power_supply_iio.h +++ b/include/dt-bindings/iio/qti_power_supply_iio.h @@ -119,4 +119,7 @@ #define PSY_IIO_SCALE_MODE_EN 0x61 #define PSY_IIO_BATT_AGE_LEVEL 0x62 #define PSY_IIO_FG_TYPE 0x63 + +#define PSY_IIO_TYPEC_ACCESSORY_MODE 0x64 + #endif /* __QTI_POWER_SUPPLY_IIO_H__ */ diff --git a/include/linux/qti_power_supply.h b/include/linux/qti_power_supply.h index a64d756a7b83..8b5386389c3d 100644 --- a/include/linux/qti_power_supply.h +++ b/include/linux/qti_power_supply.h @@ -6,7 +6,6 @@ #ifndef __QTI_POWER_SUPPLY_H_ #define __QTI_POWER_SUPPLY_H_ -#define QTI_POWER_SUPPLY_CHARGE_TYPE_TAPER 7 #define QTI_POWER_SUPPLY_TYPE_USB_HVDCP 20 #define QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3 21 #define QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3P5 22