Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 67182602 authored by Lucas Tsai's avatar Lucas Tsai Committed by Elvin Lin
Browse files

[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: 5cc4caaae73ba34ce920b94d66f42143e707d58a

Change-Id: I0a926dd8aa2493e78922ba4169ebe980ae9fd7d6
CR-Id: ALPS05341297
Feature: Charger
Signed-off-by: default avatarLucas Tsai <cpi00079@mediatek.com>
parent 88b584ac
Loading
Loading
Loading
Loading
+26 −20
Original line number Diff line number Diff line
@@ -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 @@ static int mt6370_pmu_charger_probe(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);
	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__);
	}