From a1d1c632e4a496a9e2589a7318c805884334b49c Mon Sep 17 00:00:00 2001 From: "[A" Date: Thu, 1 Dec 2022 11:13:02 +0800 Subject: [PATCH] Optimize time sequence of usb_therm mos control Details: Optimize time sequence of usb_therm mos control Change-Id: Ib55002ae5a968bd87675230436533d1a708d66e3 Reviewed-on: https://gerrit.mot.com/2447403 Reviewed-by: SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Lei Chen Reviewed-by: Xiangpo Zhao Submit-Approved: Jira Key --- .../power/bq2589x_chg_mmi/bq2589x_charger.c | 16 +++++++++++++ .../mmi_discrete_charger_class.c | 10 ++++++++ .../mmi_discrete_charger_core.c | 23 ++++++++++++++++--- .../power/sgm4154x_chg_mmi/sgm4154x_charger.c | 16 +++++++++++++ include/linux/mmi_discrete_charger_class.h | 5 ++++ 5 files changed, 67 insertions(+), 3 deletions(-) diff --git a/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c b/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c index 71cdf214aefb..8a724904189a 100644 --- a/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c +++ b/drivers/power/bq2589x_chg_mmi/bq2589x_charger.c @@ -2986,6 +2986,21 @@ static int bq2589x_set_boost_current_limit(struct charger_device *chg_dev, u32 u return ret; } +static int bq2589x_enable_hz(struct charger_device *chg_dev, bool enable) +{ + struct bq2589x *bq = dev_get_drvdata(&chg_dev->dev); + int ret; + + if (enable) + ret = bq2589x_enter_hiz_mode(bq); + else + ret = bq2589x_exit_hiz_mode(bq); + + dev_info(bq->dev,"%s, %s input hz %s\n", __func__, enable ? "enable" : "disable", ret == 0 ? "success":"failed"); + + return ret; +} + static int bq2589x_enable_charging(struct charger_device *chg_dev, bool enable) { struct bq2589x *bq = dev_get_drvdata(&chg_dev->dev); @@ -3107,6 +3122,7 @@ static struct charger_ops bq2589x_chg_ops = { .enable_otg = bq2589x_set_otg_enable, .set_boost_current_limit = bq2589x_set_boost_current_limit, .enable_charging = bq2589x_enable_charging, + .enable_hz = bq2589x_enable_hz, .set_charging_current = bq2589x_set_charging_current, .set_constant_voltage = bq2589x_set_charging_voltage, .is_charge_halted = bq2589x_is_charging_halted, diff --git a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_class.c b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_class.c index c9fa76d27026..da2fbb3a2e02 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_class.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_class.c @@ -71,6 +71,16 @@ int charger_dev_enable_charging(struct charger_device *chg_dev, bool en) } EXPORT_SYMBOL(charger_dev_enable_charging); +int charger_dev_enable_hz(struct charger_device *chg_dev, bool en) +{ + if (chg_dev != NULL && chg_dev->ops != NULL && + chg_dev->ops->enable_hz) + return chg_dev->ops->enable_hz(chg_dev, en); + + return -ENOTSUPP; +} +EXPORT_SYMBOL(charger_dev_enable_hz); + int charger_dev_enable_termination(struct charger_device *chg_dev, bool en) { if (chg_dev != NULL && chg_dev->ops != NULL && 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 3c9568f0540d..933c4416ca03 100644 --- a/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c +++ b/drivers/power/mmi_discrete_charger/mmi_discrete_charger_core.c @@ -1830,8 +1830,21 @@ static int usb_therm_set_mosfet(struct mmi_discrete_charger *chip,bool enable) /*set typec mosfet output*/ if (gpio_is_valid(chip->mos_en_gpio)) { - mmi_err(chip, "%s,set mos en.",__func__); - gpio_direction_output(chip->mos_en_gpio, enable); + mmi_err(chip, "%s,set mos en: %d.",__func__,enable); + if(enable){ + ret = charger_dev_enable_charging(chip->master_chg_dev,false); + ret = charger_dev_enable_hz(chip->master_chg_dev,true); + udelay(300); + gpio_direction_output(chip->mos_en_gpio, enable); + mmi_err(chip, "%s,open mos en: %d %d",__func__,enable,ret); + } + else{ + gpio_direction_output(chip->mos_en_gpio, enable); + udelay(300); + ret = charger_dev_enable_charging(chip->master_chg_dev,true); + ret = charger_dev_enable_hz(chip->master_chg_dev,false); + mmi_err(chip, "%s,close mos en: %d %d",__func__,enable,ret); + } } return ret; @@ -1843,7 +1856,7 @@ static int usb_therm_get_mosfet(struct mmi_discrete_charger *chip) /*get typec mosfet output*/ if (gpio_is_valid(chip->mos_en_gpio)) { - mmi_err(chip, "%s,get mos en.",__func__); +// mmi_err(chip, "%s,get mos en.",__func__); return gpio_get_value(chip->mos_en_gpio); } @@ -3291,6 +3304,10 @@ static int mmi_discrete_remove(struct platform_device *pdev) cancel_delayed_work(&chip->charger_work); mmi_discrete_charger_deinit(chip); + /*for usb thermal*/ + if(chip->mosfet_supported) + gpio_free(chip->mos_en_gpio); + if (chip->mmi_psy) power_supply_put(chip->mmi_psy); if (chip->bms_psy) diff --git a/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.c b/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.c index 68cc882fcddd..d7df093aedbd 100644 --- a/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.c +++ b/drivers/power/sgm4154x_chg_mmi/sgm4154x_charger.c @@ -3050,6 +3050,21 @@ static int sgm4154x_enable_charging(struct charger_device *chg_dev, bool enable) return rc; } +static int sgm4154x_enable_hz(struct charger_device *chg_dev, bool enable) +{ + struct sgm4154x_device *sgm = dev_get_drvdata(&chg_dev->dev); + int rc = 0; + + rc = mmi_regmap_update_bits(sgm, SGM4154x_CHRG_CTRL_0, SGM4154x_HIZ_EN, + enable ? SGM4154x_HIZ_EN : 0); + + pr_info("%s, %s hz %s\n", __func__, + enable ? "enable" : "disable", + rc ? "failed" : "success"); + + return rc; +} + static int sgm4154x_set_charging_current(struct charger_device *chg_dev, u32 uA) { struct sgm4154x_device *sgm = dev_get_drvdata(&chg_dev->dev); @@ -3229,6 +3244,7 @@ static struct charger_ops sgm4154x_chg_ops = { .enable_otg = sgm4154x_enable_otg, .set_boost_current_limit = sgm4154x_set_boost_current_limit, .enable_charging = sgm4154x_enable_charging, + .enable_hz = sgm4154x_enable_hz, .set_charging_current = sgm4154x_set_charging_current, .set_constant_voltage = sgm4154x_set_charging_voltage, .is_charge_halted = sgm4154x_is_charging_halted, diff --git a/include/linux/mmi_discrete_charger_class.h b/include/linux/mmi_discrete_charger_class.h index 7206a17d66a2..3b6c455e3631 100644 --- a/include/linux/mmi_discrete_charger_class.h +++ b/include/linux/mmi_discrete_charger_class.h @@ -50,6 +50,9 @@ struct charger_ops { int (*get_qc3p_power)(struct charger_device *dev, int *qc3p_power); int (*config_pd_active)(struct charger_device *dev, int val); + /* enable/disable hz */ + int (*enable_hz)(struct charger_device *dev, bool en); + /* enable/disable charger */ int (*enable_charging)(struct charger_device *dev, bool en); int (*is_enabled_charging)(struct charger_device *dev, bool *en); @@ -107,6 +110,8 @@ extern int charger_dev_set_charging_current(struct charger_device *chg_dev, u32 extern int charger_dev_get_charging_current(struct charger_device *chg_dev, u32 *uA); +extern int charger_dev_enable_hz(struct charger_device *chg_dev, bool en); + extern int charger_dev_enable_charging(struct charger_device *chg_dev, bool en); extern int charger_dev_enable_termination(struct charger_device *chg_dev, bool en);