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

Commit 87313e3e authored by Zhenhua Huang's avatar Zhenhua Huang
Browse files

power: qpnp-linear-charger: avoid mutex_lock in atomic context



Spin_lock_irqsave function called in get_prop_capacity() introduces
an atomic context. A mutex_lock is called in the context and this
results a warning message. Use mutex instead of spin_lock to avoid
this condition.

Change-Id: I8098f74bb6888f4cb514199c5636d3fc6cede91d
Signed-off-by: default avatarZhenhua Huang <zhenhuah@codeaurora.org>
parent 91719459
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -292,9 +292,9 @@ struct qpnp_lbc_chip {
	int				usb_psy_ma;
	struct qpnp_lbc_irq		irqs[MAX_IRQS];
	struct mutex			jeita_configure_lock;
	struct mutex			chg_enable_lock;
	spinlock_t			ibat_change_lock;
	spinlock_t			hw_access_lock;
	spinlock_t			chg_enable_lock;
	struct power_supply		*usb_psy;
	struct power_supply		*bms_psy;
	struct power_supply		batt_psy;
@@ -870,7 +870,6 @@ static int get_prop_capacity(struct qpnp_lbc_chip *chip)
{
	union power_supply_propval ret = {0,};
	int soc, battery_status, charger_in;
	unsigned long flags;

	if (chip->fake_battery_soc >= 0)
		return chip->fake_battery_soc;
@@ -879,7 +878,7 @@ static int get_prop_capacity(struct qpnp_lbc_chip *chip)
		return DEFAULT_CAPACITY;

	if (chip->bms_psy) {
		spin_lock_irqsave(&chip->chg_enable_lock, flags);
		mutex_lock(&chip->chg_enable_lock);
		chip->bms_psy->get_property(chip->bms_psy,
				POWER_SUPPLY_PROP_CAPACITY, &ret);
		battery_status = get_prop_batt_status(chip);
@@ -901,7 +900,7 @@ static int get_prop_capacity(struct qpnp_lbc_chip *chip)
			qpnp_lbc_vbatdet_override(chip, OVERRIDE_0);
			qpnp_lbc_charger_enable(chip, SOC, 1);
		}
		spin_unlock_irqrestore(&chip->chg_enable_lock, flags);
		mutex_unlock(&chip->chg_enable_lock);

		soc = ret.intval;
		if (soc == 0) {
@@ -1166,13 +1165,12 @@ static int qpnp_batt_power_set_property(struct power_supply *psy,
	struct qpnp_lbc_chip *chip = container_of(psy, struct qpnp_lbc_chip,
								batt_psy);
	int rc = 0;
	unsigned long flags;

	switch (psp) {
	case POWER_SUPPLY_PROP_STATUS:
		if (val->intval == POWER_SUPPLY_STATUS_FULL &&
				!chip->cfg_float_charge) {
			spin_lock_irqsave(&chip->chg_enable_lock, flags);
			mutex_lock(&chip->chg_enable_lock);
			/* No override for VBAT_DET_LO comp */
			rc = qpnp_lbc_vbatdet_override(chip, OVERRIDE_NONE);
			if (rc)
@@ -1185,7 +1183,7 @@ static int qpnp_batt_power_set_property(struct power_supply *psy,
						rc);
			else
				chip->chg_done = true;
			spin_unlock_irqrestore(&chip->chg_enable_lock, flags);
			mutex_unlock(&chip->chg_enable_lock);
		}
		break;
	case POWER_SUPPLY_PROP_COOL_TEMP:
@@ -2027,9 +2025,9 @@ static int qpnp_lbc_probe(struct spmi_device *spmi)
	dev_set_drvdata(&spmi->dev, chip);
	device_init_wakeup(&spmi->dev, 1);
	mutex_init(&chip->jeita_configure_lock);
	mutex_init(&chip->chg_enable_lock);
	spin_lock_init(&chip->hw_access_lock);
	spin_lock_init(&chip->ibat_change_lock);
	spin_lock_init(&chip->chg_enable_lock);

	/* Get all device-tree properties */
	rc = qpnp_charger_read_dt_props(chip);
@@ -2224,6 +2222,7 @@ static int qpnp_lbc_remove(struct spmi_device *spmi)
	if (chip->bat_if_base)
		power_supply_unregister(&chip->batt_psy);
	mutex_destroy(&chip->jeita_configure_lock);
	mutex_destroy(&chip->chg_enable_lock);
	dev_set_drvdata(&spmi->dev, NULL);
	return 0;
}