From d31601786d2ea4e69c7dc3c648049a462c14d45a Mon Sep 17 00:00:00 2001 From: Haijian Ma Date: Wed, 8 Jun 2022 09:30:26 +0800 Subject: [PATCH] charging: add wireless icl increase step by step As HW require, add wireless icl increase step by step (100ma/200ms) for miami Change-Id: I8d5a3deb81f106282dcae6c9d41491457c4f222e Signed-off-by: Haijian Ma Reviewed-on: https://gerrit.mot.com/2292877 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Wei Wei Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- .../mmi_discrete_charger_core.c | 32 ++++++++++++++++--- .../mmi_discrete_charger_core.h | 2 ++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c index 84d469a714d3..672ad474a6ad 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c @@ -1076,14 +1076,36 @@ static void mmi_discrete_config_qc_charger(struct mmi_discrete_charger *chg) } } +#define WLS_ICL_INCREASE_STEP 100000 +static void mmi_discrete_wireless_icl_work(struct work_struct *work) +{ + struct mmi_discrete_charger *chip = container_of(work, + struct mmi_discrete_charger, + wireless_icl_work.work); + int wls_icl = 0; + + wls_icl = get_client_vote(chip->usb_icl_votable, SW_ICL_MAX_VOTER); + while((wls_icl + WLS_ICL_INCREASE_STEP) <= chip->wls_max_icl_ua) { + if(!is_wls_online(chip)) + break; + wls_icl += WLS_ICL_INCREASE_STEP; + vote(chip->usb_icl_votable, SW_ICL_MAX_VOTER, true, wls_icl); + msleep(200); + wls_icl = get_client_vote(chip->usb_icl_votable, SW_ICL_MAX_VOTER); + mmi_info(chip, "vote wireless charging icl %d ua\n", wls_icl); + } +} + /*MIN is 2.5W -> default icl 500mA * input vol 5V*/ #define WLS_POWER_MIN 2500 static void mmi_discrete_config_wls_charger(struct mmi_discrete_charger *chg) { mmi_dbg(chg, "Configure wireless charger\n"); - if (chg->bc1p2_charger_type != POWER_SUPPLY_TYPE_UNKNOWN) - vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true, chg->wls_max_icl_ua); + if (chg->bc1p2_charger_type != POWER_SUPPLY_TYPE_UNKNOWN) { + cancel_delayed_work(&chg->wireless_icl_work); + schedule_delayed_work(&chg->wireless_icl_work, msecs_to_jiffies(0)); + } } static void mmi_discrete_config_charger_input(struct mmi_discrete_charger *chip) @@ -1981,8 +2003,9 @@ static void update_sw_icl_max(struct mmi_discrete_charger *chg) SDP_CURRENT_UA); break; case POWER_SUPPLY_TYPE_WIRELESS: - vote(chg->usb_icl_votable, SW_ICL_MAX_VOTER, true, - chg->wls_max_icl_ua); + cancel_delayed_work(&chg->wireless_icl_work); + schedule_delayed_work(&chg->wireless_icl_work, + msecs_to_jiffies(0)); break; case POWER_SUPPLY_TYPE_UNKNOWN: default: @@ -3061,6 +3084,7 @@ static int mmi_discrete_probe(struct platform_device *pdev) INIT_DELAYED_WORK(&chip->charger_work, mmi_discrete_charger_work); INIT_DELAYED_WORK(&chip->monitor_ibat_work, mmi_discrete_monitor_ibat_work); + INIT_DELAYED_WORK(&chip->wireless_icl_work, mmi_discrete_wireless_icl_work); chip->batt_psy = devm_power_supply_register(chip->dev, &batt_psy_desc, diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h index 50d7315f4582..b0c6d65f680e 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.h @@ -93,6 +93,8 @@ struct mmi_discrete_charger { struct delayed_work monitor_ibat_work; int bat_ocp_ua; + struct delayed_work wireless_icl_work; + /* extcon for VBUS / ID notification to USB for type-c only */ struct extcon_dev *extcon;