[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:
@@ -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__);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user