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

Commit 8ce676ad authored by Hui Liu's avatar Hui Liu
Browse files

power: qcom: qbg: update OCV boost compensation into SDAM



Add boost headroom compensation on valid OCV value
and set it into SDAM to enable charger-boost to
operate optimally.

Change-Id: Iae66525b6899368061baeb50530c9c61488b5e2c
Signed-off-by: default avatarHui Liu <huliu@codeaurora.org>
parent 07852f68
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#define QBG_SDAM_FIFO_COUNT_OFFSET		0x46
#define QBG_ESSENTIAL_PARAMS_START_OFFSET	0x47
#define QBG_SDAM_START_OFFSET			0x4b
#define QBG_SDAM_BHARGER_OCV_HDRM_OFFSET	0x5b
#define QBG_SDAM_INT_TEST1			0xe0
#define QBG_SDAM_INT_TEST_VAL			0xe1
#define QBG_SDAM_DATA_PUSH_COUNTER_OFFSET	0x46
+40 −1
Original line number Diff line number Diff line
@@ -81,6 +81,11 @@
#define TBAT_LSB					7500
#define TBAT_DENOMINATOR				115600

#define BOOST_COMPENSATION_UV				400000
#define OCV_BOOST_MIN_UV				4100000
#define OCV_BOOST_MAX_UV				5600000
#define OCV_BOOST_STEP_UV				100000

enum qbg_data_tag {
	QBG_DATA_TAG_FAST_CHAR,
};
@@ -223,6 +228,30 @@ static int qbg_get_fifo_count(struct qti_qbg *chip, u32 *fifo_count)
	return rc;
}

static void update_ocv_for_boost(struct qti_qbg *chip)
{
	int ocv_for_boost = 0x00;

	/*
	 * Every time when OCV gets updated, add 0.4V headroom compensation
	 * and round it to a value between 4.1V to 5.6V, then map it to a
	 * setting between [0x00 - 0x0F] and set it in SDAM to notify charger-boost.
	 */
	ocv_for_boost = chip->ocv_uv + BOOST_COMPENSATION_UV;
	if (ocv_for_boost < OCV_BOOST_MIN_UV)
		ocv_for_boost = OCV_BOOST_MIN_UV;
	else if (ocv_for_boost > OCV_BOOST_MAX_UV)
		ocv_for_boost = OCV_BOOST_MAX_UV;

	ocv_for_boost -= OCV_BOOST_MIN_UV;
	ocv_for_boost /= OCV_BOOST_STEP_UV;

	qbg_dbg(chip, QBG_DEBUG_STATUS, "Boost OCV value written =%d\n", ocv_for_boost);
	qbg_sdam_write(chip,
		QBG_SDAM_DATA_START_OFFSET(chip, SDAM_CTRL0) + QBG_SDAM_BHARGER_OCV_HDRM_OFFSET,
		(u8 *)&ocv_for_boost, 1);
}

static void process_udata_work(struct work_struct *work)
{
	struct qti_qbg *chip = container_of(work, struct qti_qbg, udata_work);
@@ -252,8 +281,10 @@ static void process_udata_work(struct work_struct *work)
			power_supply_changed(chip->qbg_psy);
	}

	if (chip->udata.param[QBG_PARAM_OCV_UV].valid)
	if (chip->udata.param[QBG_PARAM_OCV_UV].valid) {
		chip->ocv_uv = chip->udata.param[QBG_PARAM_OCV_UV].data;
		update_ocv_for_boost(chip);
	}

	if (chip->udata.param[QBG_PARAM_CHARGE_CYCLE_COUNT].valid)
		chip->charge_cycle_count =
@@ -881,6 +912,7 @@ static int get_batt_id_ohm(struct qti_qbg *chip, u32 *batt_id_ohm)
static int qbg_setup_battery(struct qti_qbg *chip)
{
	int rc = 0;
	u8 ocv_boost_val = 0x02;

	chip->profile_loaded = false;

@@ -899,6 +931,13 @@ static int qbg_setup_battery(struct qti_qbg *chip)
			else
				chip->profile_loaded = true;
		}

		/* Update OCV boost headroom compensation value to 4.3V in debug battery case */
		if (is_debug_batt_id(chip)) {
			rc = qbg_sdam_write(chip,
				QBG_SDAM_DATA_START_OFFSET(chip, SDAM_CTRL0) +
				QBG_SDAM_BHARGER_OCV_HDRM_OFFSET, &ocv_boost_val, 1);
		}
	}

	qbg_dbg(chip, QBG_DEBUG_PROFILE, "battery_missing=%s batt_id=%d Ohm profile_loaded=%d battery_type=%s\n",