[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 <cpi00079@mediatek.com>
(cherry picked from commit 5cc4caaae73ba34ce920b94d66f42143e707d58a)
This commit is contained in:
Lucas Tsai
2021-01-29 02:41:23 +08:00
parent edebe6e5c4
commit 8f66a5f4b6

View File

@@ -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__);
}