From 8f66a5f4b600b140680db9cf16874e3b5fd37775 Mon Sep 17 00:00:00 2001 From: Lucas Tsai Date: Fri, 29 Jan 2021 02:41:23 +0800 Subject: [PATCH] [ALPS05341297] Charger: Fix unbalanced enable for MT637x MIVR IRQ 1. Fix unbalanced enable for MT637x MIVR IRQ, by using a flag pp_en to prevent from enabling MT637x MIVR IRQ repeatedly. 2. Keep the setting of MIVR from chg_ops even when pp is disabled MTK-Commit-Id: a3165c63489962fd45893d1c7eac2cbcc3b40bf7 Change-Id: I0a926dd8aa2493e78922ba4169ebe980ae9fd7d6 CR-Id: ALPS05341297 Feature: Charger Signed-off-by: Lucas Tsai (cherry picked from commit 5cc4caaae73ba34ce920b94d66f42143e707d58a) --- .../mediatek/pmic/mt6370/mt6370_pmu_charger.c | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/drivers/misc/mediatek/pmic/mt6370/mt6370_pmu_charger.c b/drivers/misc/mediatek/pmic/mt6370/mt6370_pmu_charger.c index 10ec17381c01..39c10b77382b 100644 --- a/drivers/misc/mediatek/pmic/mt6370/mt6370_pmu_charger.c +++ b/drivers/misc/mediatek/pmic/mt6370/mt6370_pmu_charger.c @@ -117,6 +117,7 @@ struct mt6370_pmu_charger_data { struct mutex hidden_mode_lock; struct mutex ieoc_lock; struct mutex tchg_lock; + struct mutex pp_lock; struct device *dev; wait_queue_head_t wait_queue; bool pwr_rdy; @@ -155,6 +156,7 @@ struct mt6370_pmu_charger_data { struct power_supply *psy; struct regulator_dev *otg_rdev; + bool pp_en; }; /* These default values will be used if there's no property in dts */ @@ -1383,7 +1385,6 @@ static int __mt6370_set_mivr(struct mt6370_pmu_charger_data *chg_data, u32 uV) ); return ret; - } static int __mt6370_set_aicr(struct mt6370_pmu_charger_data *chg_data, u32 uA) @@ -1917,36 +1918,39 @@ static int mt6370_enable_power_path(struct charger_device *chg_dev, bool en) int ret = 0; struct mt6370_pmu_charger_data *chg_data = dev_get_drvdata(&chg_dev->dev); - u32 mivr = en ? chg_data->mivr : MT6370_MIVR_MAX; - dev_info(chg_data->dev, "%s: en = %d\n", __func__, en); + mutex_lock(&chg_data->pp_lock); + dev_info(chg_data->dev, "%s: en = %d, pp_en = %d\n", + __func__, en, chg_data->pp_en); + if (en == chg_data->pp_en) + goto out; /* * enable power path -> unmask mivr irq * mask mivr irq -> disable power path */ if (!en) mt6370_enable_irq(chg_data, "chg_mivr", false); - - ret = __mt6370_set_mivr(chg_data, mivr); - + ret = __mt6370_set_mivr(chg_data, en ? chg_data->mivr : + MT6370_MIVR_MAX); if (en) mt6370_enable_irq(chg_data, "chg_mivr", true); - + chg_data->pp_en = en; +out: + mutex_unlock(&chg_data->pp_lock); return ret; } static int mt6370_is_power_path_enable(struct charger_device *chg_dev, bool *en) { - int ret = 0; struct mt6370_pmu_charger_data *chg_data = dev_get_drvdata(&chg_dev->dev); - u32 mivr = 0; - ret = __mt6370_get_mivr(chg_data, &mivr); - *en = (mivr == MT6370_MIVR_MAX ? false : true); + mutex_lock(&chg_data->pp_lock); + *en = chg_data->pp_en; + mutex_unlock(&chg_data->pp_lock); - return ret; + return 0; } static int mt6370_get_ichg(struct charger_device *chg_dev, u32 *ichg) @@ -2047,18 +2051,20 @@ static int mt6370_set_mivr(struct charger_device *chg_dev, u32 uV) int ret = 0; struct mt6370_pmu_charger_data *chg_data = dev_get_drvdata(&chg_dev->dev); - bool en = true; - ret = mt6370_is_power_path_enable(chg_dev, &en); - if (!en) { + mutex_lock(&chg_data->pp_lock); + + if (!chg_data->pp_en) { dev_err(chg_data->dev, "%s: power path is disabled\n", __func__); - return -EINVAL; + goto out; } ret = __mt6370_set_mivr(chg_data, uV); +out: if (ret >= 0) chg_data->mivr = uV; + mutex_unlock(&chg_data->pp_lock); return ret; } @@ -2306,10 +2312,6 @@ static int mt6370_set_pep20_reset(struct charger_device *chg_dev) dev_get_drvdata(&chg_dev->dev); mutex_lock(&chg_data->pe_access_lock); - ret = mt6370_set_mivr(chg_dev, chg_data->mivr); - if (ret < 0) - goto out; - /* disable skip mode */ mt6370_enable_hidden_mode(chg_data, true); @@ -4503,6 +4505,7 @@ static int mt6370_pmu_charger_probe(struct platform_device *pdev) mutex_init(&chg_data->hidden_mode_lock); mutex_init(&chg_data->ieoc_lock); mutex_init(&chg_data->tchg_lock); + mutex_init(&chg_data->pp_lock); chg_data->chip = dev_get_drvdata(pdev->dev.parent); chg_data->dev = &pdev->dev; chg_data->aicr_limit = -1; @@ -4520,6 +4523,7 @@ static int mt6370_pmu_charger_probe(struct platform_device *pdev) init_completion(&chg_data->chrdet_start); mutex_init(&chg_data->attach_lock); #endif + chg_data->pp_en = true; if (use_dt) { ret = mt_parse_dt(&pdev->dev, chg_data); @@ -4683,6 +4687,7 @@ err_chg_init_setting: mutex_destroy(&chg_data->hidden_mode_lock); mutex_destroy(&chg_data->ieoc_lock); mutex_destroy(&chg_data->tchg_lock); + mutex_destroy(&chg_data->pp_lock); return ret; } @@ -4703,6 +4708,7 @@ static int mt6370_pmu_charger_remove(struct platform_device *pdev) mutex_destroy(&chg_data->hidden_mode_lock); mutex_destroy(&chg_data->ieoc_lock); mutex_destroy(&chg_data->tchg_lock); + mutex_destroy(&chg_data->pp_lock); dev_info(chg_data->dev, "%s successfully\n", __func__); }