diff --git a/drivers/power/supply/qcom/qg-core.h b/drivers/power/supply/qcom/qg-core.h index b0909d23c20c..2796e16c2a11 100644 --- a/drivers/power/supply/qcom/qg-core.h +++ b/drivers/power/supply/qcom/qg-core.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. */ #ifndef __QG_CORE_H__ @@ -154,6 +154,7 @@ struct qpnp_qg { bool fvss_active; bool tcss_active; bool bass_active; + bool first_profile_load; int charge_status; int charge_type; int chg_iterm_ma; diff --git a/drivers/power/supply/qcom/qg-iio.h b/drivers/power/supply/qcom/qg-iio.h index 46e2232cd74f..b1ee2c4ea3f5 100644 --- a/drivers/power/supply/qcom/qg-iio.h +++ b/drivers/power/supply/qcom/qg-iio.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. */ #ifndef __QG_IIO_H @@ -91,6 +91,7 @@ static const struct qg_iio_channels qg_iio_psy_channels[] = { QG_CHAN_RES("esr_actual", PSY_IIO_ESR_ACTUAL) QG_CHAN_RES("esr_nominal", PSY_IIO_ESR_NOMINAL) QG_CHAN_INDEX("soh", PSY_IIO_SOH) + QG_CHAN_INDEX("clear_soh", PSY_IIO_CLEAR_SOH) QG_CHAN_ENERGY("cc_soc", PSY_IIO_CC_SOC) QG_CHAN_ACT("fg_reset", PSY_IIO_FG_RESET) QG_CHAN_VOLT("voltage_avg", PSY_IIO_VOLTAGE_AVG) diff --git a/drivers/power/supply/qcom/qpnp-qg.c b/drivers/power/supply/qcom/qpnp-qg.c index 96526b23a1c6..4c8839273140 100644 --- a/drivers/power/supply/qcom/qpnp-qg.c +++ b/drivers/power/supply/qcom/qpnp-qg.c @@ -2135,6 +2135,9 @@ static int qg_iio_write_raw(struct iio_dev *indio_dev, if (chip->sp) soh_profile_update(chip->sp, chip->soh); break; + case PSY_IIO_CLEAR_SOH: + chip->first_profile_load = val1; + break; case PSY_IIO_ESR_ACTUAL: chip->esr_actual = val1; break; @@ -2260,6 +2263,9 @@ static int qg_iio_read_raw(struct iio_dev *indio_dev, case PSY_IIO_SOH: *val1 = chip->soh; break; + case PSY_IIO_CLEAR_SOH: + *val1 = chip->first_profile_load; + break; case PSY_IIO_CC_SOC: rc = qg_get_cc_soc(chip, val1); break; @@ -3470,6 +3476,7 @@ static int qg_sanitize_sdam(struct qpnp_qg *chip) rc = qg_sdam_write(SDAM_MAGIC, SDAM_MAGIC_NUMBER); if (!rc) qg_dbg(chip, QG_DEBUG_PON, "First boot. SDAM initilized\n"); + chip->first_profile_load = true; } else { /* SDAM has invalid value */ rc = qg_sdam_clear(); @@ -3477,6 +3484,7 @@ static int qg_sanitize_sdam(struct qpnp_qg *chip) pr_err("SDAM uninitialized, SDAM reset\n"); rc = qg_sdam_write(SDAM_MAGIC, SDAM_MAGIC_NUMBER); } + chip->first_profile_load = true; } if (rc < 0) diff --git a/include/dt-bindings/iio/qti_power_supply_iio.h b/include/dt-bindings/iio/qti_power_supply_iio.h index c48865098c6a..84611eb3bcc6 100644 --- a/include/dt-bindings/iio/qti_power_supply_iio.h +++ b/include/dt-bindings/iio/qti_power_supply_iio.h @@ -151,4 +151,7 @@ /* USB */ #define PSY_IIO_MOISTURE_DETECTION_EN 0x7b + +/* BMS */ +#define PSY_IIO_CLEAR_SOH 0x7c #endif /* __QTI_POWER_SUPPLY_IIO_H__ */