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

Commit e41f39ea authored by Rajkumar Kasirajan's avatar Rajkumar Kasirajan Committed by Lee Jones
Browse files

pm2301: Enable vbat low monitoring



Enable support for low battery checking.

Signed-off-by: default avatarRajkumar Kasirajan <rajkumar.kasirajan@stericsson.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
Reviewed-by: default avatarJonas ABERG <jonas.aberg@stericsson.com>
Tested-by: default avatarJonas ABERG <jonas.aberg@stericsson.com>
parent 53ef1f59
Loading
Loading
Loading
Loading
+45 −41
Original line number Original line Diff line number Diff line
@@ -118,6 +118,8 @@ static int pm2xxx_reg_read(struct pm2xxx_charger *pm2, int reg, u8 *val)
				1, val);
				1, val);
	if (ret < 0)
	if (ret < 0)
		dev_err(pm2->dev, "Error reading register at 0x%x\n", reg);
		dev_err(pm2->dev, "Error reading register at 0x%x\n", reg);
	else
		ret = 0;


	return ret;
	return ret;
}
}
@@ -130,6 +132,8 @@ static int pm2xxx_reg_write(struct pm2xxx_charger *pm2, int reg, u8 val)
				1, &val);
				1, &val);
	if (ret < 0)
	if (ret < 0)
		dev_err(pm2->dev, "Error writing register at 0x%x\n", reg);
		dev_err(pm2->dev, "Error writing register at 0x%x\n", reg);
	else
		ret = 0;


	return ret;
	return ret;
}
}
@@ -227,7 +231,7 @@ static int pm2xxx_charger_bat_disc_mngt(struct pm2xxx_charger *pm2, int val)


static int pm2xxx_charger_detection(struct pm2xxx_charger *pm2, u8 *val)
static int pm2xxx_charger_detection(struct pm2xxx_charger *pm2, u8 *val)
{
{
	int ret = 0;
	int ret;


	ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT2, val);
	ret = pm2xxx_reg_read(pm2, PM2XXX_SRCE_REG_INT2, val);


@@ -237,6 +241,7 @@ static int pm2xxx_charger_detection(struct pm2xxx_charger *pm2, u8 *val)
	}
	}


	*val &= (PM2XXX_INT2_S_ITVPWR1PLUG | PM2XXX_INT2_S_ITVPWR2PLUG);
	*val &= (PM2XXX_INT2_S_ITVPWR1PLUG | PM2XXX_INT2_S_ITVPWR2PLUG);

out:
out:
	return ret;
	return ret;
}
}
@@ -628,7 +633,7 @@ static int pm2xxx_charging_init(struct pm2xxx_charger *pm2)


	/* Disable battery low monitoring */
	/* Disable battery low monitoring */
	ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_LOW_LEV_COMP_REG,
	ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_LOW_LEV_COMP_REG,
		PM2XXX_VBAT_LOW_MONITORING_DIS);
		PM2XXX_VBAT_LOW_MONITORING_ENA);


	/* Disable LED */
	/* Disable LED */
	ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG,
	ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG,
@@ -677,53 +682,51 @@ static int pm2xxx_charger_ac_en(struct ux500_charger *charger,
		}
		}


		ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG8, &val);
		ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG8, &val);
		if (ret >= 0) {
		if (ret < 0) {
			dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
			goto error_occured;
		}
		val &= ~PM2XXX_CH_VOLT_MASK;
		val &= ~PM2XXX_CH_VOLT_MASK;
		val |= volt_index;
		val |= volt_index;
		ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8, val);
		ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG8, val);

		if (ret < 0) {
		if (ret < 0) {
				dev_err(pm2->dev,
			dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
					"%s write failed\n", __func__);
			goto error_occured;
			goto error_occured;
		}
		}
		else
			dev_err(pm2->dev, "%s read failed\n", __func__);
		}


		ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val);
		ret = pm2xxx_reg_read(pm2, PM2XXX_BATT_CTRL_REG6, &val);
		if (ret >= 0) {
		if (ret < 0) {
			dev_err(pm2->dev, "%s pm2xxx read failed\n", __func__);
			goto error_occured;
		}
		val &= ~PM2XXX_DIR_CH_CC_CURRENT_MASK;
		val &= ~PM2XXX_DIR_CH_CC_CURRENT_MASK;
		val |= curr_index;
		val |= curr_index;
		ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val);
		ret = pm2xxx_reg_write(pm2, PM2XXX_BATT_CTRL_REG6, val);
		if (ret < 0) {
		if (ret < 0) {
				dev_err(pm2->dev,
			dev_err(pm2->dev, "%s pm2xxx write failed\n", __func__);
					"%s write failed\n", __func__);
			goto error_occured;
			goto error_occured;
		}
		}
		else
			dev_err(pm2->dev, "%s read failed\n", __func__);
		}


		if (!pm2->bat->enable_overshoot) {
		if (!pm2->bat->enable_overshoot) {
			ret = pm2xxx_reg_read(pm2, PM2XXX_LED_CTRL_REG, &val);
			ret = pm2xxx_reg_read(pm2, PM2XXX_LED_CTRL_REG, &val);
			if (ret >= 0) {
				val |= PM2XXX_ANTI_OVERSHOOT_EN;
				ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG,
							val);
			if (ret < 0) {
			if (ret < 0) {
					dev_err(pm2->dev, "%s write failed\n",
				dev_err(pm2->dev, "%s pm2xxx read failed\n",
								__func__);
								__func__);
				goto error_occured;
				goto error_occured;
			}
			}
			val |= PM2XXX_ANTI_OVERSHOOT_EN;
			ret = pm2xxx_reg_write(pm2, PM2XXX_LED_CTRL_REG, val);
			if (ret < 0) {
				dev_err(pm2->dev, "%s pm2xxx write failed\n",
								__func__);
				goto error_occured;
			}
			}
		else
			dev_err(pm2->dev, "%s read failed\n", __func__);
		}
		}


		ret = pm2xxx_charging_enable_mngt(pm2);
		ret = pm2xxx_charging_enable_mngt(pm2);
		if (ret) {
		if (ret < 0) {
			dev_err(pm2->dev, "%s write failed\n", __func__);
			dev_err(pm2->dev, "Failed to enable"
						"pm2xxx ac charger\n");
			goto error_occured;
			goto error_occured;
		}
		}


@@ -739,9 +742,10 @@ static int pm2xxx_charger_ac_en(struct ux500_charger *charger,
		}
		}


		ret = pm2xxx_charging_disable_mngt(pm2);
		ret = pm2xxx_charging_disable_mngt(pm2);
		if (ret) {
		if (ret < 0) {
			dev_err(pm2->dev, "%s write failed\n", __func__);
			dev_err(pm2->dev, "failed to disable"
			return ret;
						"pm2xxx ac charger\n");
			goto error_occured;
		}
		}


		dev_dbg(pm2->dev, "PM2301: " "Disabled AC charging\n");
		dev_dbg(pm2->dev, "PM2301: " "Disabled AC charging\n");