From 679e0a56d34e5b9dd8460c4721501ad8b94113b2 Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Tue, 22 Sep 2020 22:19:21 +0530 Subject: [PATCH] power: qpnp-smb5: Modify the usage of INPUT_CURRENT_LIMIT in batt_psy Use the property INPUT_CURRENT_LIMIT to suspend and un-suspend USB and DC paths. Change-Id: Id0636e7c792c63156597d5db4e9087bd5fdc262f Signed-off-by: Anirudh Ghayal --- drivers/power/supply/qcom/qpnp-smb5.c | 5 ++-- drivers/power/supply/qcom/smb5-lib.c | 34 +++++++++++++++++---------- drivers/power/supply/qcom/smb5-lib.h | 4 ++-- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/drivers/power/supply/qcom/qpnp-smb5.c b/drivers/power/supply/qcom/qpnp-smb5.c index 4d00989b8cd4..dafddbbea29c 100644 --- a/drivers/power/supply/qcom/qpnp-smb5.c +++ b/drivers/power/supply/qcom/qpnp-smb5.c @@ -1218,8 +1218,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); + rc = smblib_get_prop_input_suspend(chg, pval); break; case POWER_SUPPLY_PROP_CHARGE_TYPE: rc = smblib_get_prop_batt_charge_type(chg, pval); @@ -1313,7 +1312,7 @@ static int smb5_batt_set_prop(struct power_supply *psy, rc = smblib_set_prop_batt_status(chg, val); break; case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: - rc = smblib_set_prop_input_current_limit_usb(chg, val); + rc = smblib_set_prop_input_suspend(chg, val); break; case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT: rc = smblib_set_prop_system_temp_level(chg, val); diff --git a/drivers/power/supply/qcom/smb5-lib.c b/drivers/power/supply/qcom/smb5-lib.c index 72403cb4cb7a..f4f3d070c914 100644 --- a/drivers/power/supply/qcom/smb5-lib.c +++ b/drivers/power/supply/qcom/smb5-lib.c @@ -1967,10 +1967,12 @@ int smblib_vbus_regulator_is_enabled(struct regulator_dev *rdev) /******************** * BATT PSY GETTERS * ********************/ -int smblib_get_prop_input_current_limit_usb(struct smb_charger *chg, +int smblib_get_prop_input_suspend(struct smb_charger *chg, union power_supply_propval *val) { - val->intval = get_client_vote(chg->usb_icl_votable, USER_VOTER); + val->intval = (get_client_vote(chg->usb_icl_votable, USER_VOTER) == 0) + && get_client_vote(chg->dc_suspend_votable, USER_VOTER); + return 0; } @@ -2410,21 +2412,27 @@ int smblib_get_batt_current_now(struct smb_charger *chg, /*********************** * BATTERY PSY SETTERS * ***********************/ -int smblib_set_prop_input_current_limit_usb(struct smb_charger *chg, - const union power_supply_propval *val) +int smblib_set_prop_input_suspend(struct smb_charger *chg, + const union power_supply_propval *val) { int rc; - if (val->intval == 0) - rc = vote(chg->usb_icl_votable, USER_VOTER, true, 0); - else if (val->intval < 0) - rc = vote(chg->usb_icl_votable, USER_VOTER, false, 0); - else - rc = vote(chg->usb_icl_votable, USER_VOTER, true, val->intval); + /* vote 0mA when suspended */ + rc = vote(chg->usb_icl_votable, USER_VOTER, (bool)val->intval, 0); + if (rc < 0) { + smblib_err(chg, "Couldn't vote to %s USB rc=%d\n", + (bool)val->intval ? "suspend" : "resume", rc); + return rc; + } - if (rc < 0) - smblib_err(chg, "Couldn't vote to set USB ICL to %d rc=%d\n", - val->intval, rc); + rc = vote(chg->dc_suspend_votable, USER_VOTER, (bool)val->intval, 0); + if (rc < 0) { + smblib_err(chg, "Couldn't vote to %s DC rc=%d\n", + (bool)val->intval ? "suspend" : "resume", rc); + return rc; + } + + power_supply_changed(chg->batt_psy); return rc; } diff --git a/drivers/power/supply/qcom/smb5-lib.h b/drivers/power/supply/qcom/smb5-lib.h index 5b4385228183..1ef50504258b 100644 --- a/drivers/power/supply/qcom/smb5-lib.h +++ b/drivers/power/supply/qcom/smb5-lib.h @@ -673,7 +673,7 @@ irqreturn_t smb5_typec_or_rid_detection_change_irq_handler(int irq, void *data); irqreturn_t smb5_temp_change_irq_handler(int irq, void *data); irqreturn_t smb5_usbin_ov_irq_handler(int irq, void *data); irqreturn_t smb5_sdam_sts_change_irq_handler(int irq, void *data); -int smblib_get_prop_input_current_limit_usb(struct smb_charger *chg, +int smblib_get_prop_input_suspend(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_batt_present(struct smb_charger *chg, union power_supply_propval *val); @@ -697,7 +697,7 @@ int smblib_get_prop_input_current_limited(struct smb_charger *chg, int *val); int smblib_get_prop_batt_iterm(struct smb_charger *chg, union power_supply_propval *val); -int smblib_set_prop_input_current_limit_usb(struct smb_charger *chg, +int smblib_set_prop_input_suspend(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_batt_capacity(struct smb_charger *chg, const union power_supply_propval *val);