From c1f0f28cc9a9dc98eb7229fe7963bfc6bf402e18 Mon Sep 17 00:00:00 2001 From: Anirudh Ghayal Date: Mon, 31 Aug 2020 15:27:02 +0530 Subject: [PATCH] power: qpnp-qg: Add support for SMB-sensing for SMB1395/6 SMB1395/6 charger has the ability to report the charge current via IIN_SNS lines to QGauge (on ISNS_SMB pins). Add support to enable this SMB-sensing at runtime based on the status of SMB1395/6. The DT property 'qcom,use-cp-iin-sns' enables the feature. Change-Id: I742a7950f9fc53f17cb6f210f2b7f06ade842012 Signed-off-by: Anirudh Ghayal --- drivers/power/supply/qcom/qg-core.h | 2 ++ drivers/power/supply/qcom/qg-iio.h | 2 ++ drivers/power/supply/qcom/qg-util.c | 16 +++++++++++++++- drivers/power/supply/qcom/qg-util.h | 2 ++ drivers/power/supply/qcom/qpnp-qg.c | 18 ++++++++++++------ 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/drivers/power/supply/qcom/qg-core.h b/drivers/power/supply/qcom/qg-core.h index 0a1ecfb754bd..575b4a6ecca1 100644 --- a/drivers/power/supply/qcom/qg-core.h +++ b/drivers/power/supply/qcom/qg-core.h @@ -71,6 +71,7 @@ struct qg_dt { bool esr_disable; bool esr_discharge_enable; bool qg_ext_sense; + bool use_cp_iin_sns; bool use_s7_ocv; bool qg_sleep_config; bool qg_fast_chg_cfg; @@ -130,6 +131,7 @@ struct qpnp_qg { struct power_supply *usb_psy; struct power_supply *dc_psy; struct power_supply *parallel_psy; + struct power_supply *cp_psy; struct qg_esr_data esr_data[QG_MAX_ESR_COUNT]; /* status variable */ diff --git a/drivers/power/supply/qcom/qg-iio.h b/drivers/power/supply/qcom/qg-iio.h index 6cf4f8ac6194..46e2232cd74f 100644 --- a/drivers/power/supply/qcom/qg-iio.h +++ b/drivers/power/supply/qcom/qg-iio.h @@ -108,6 +108,7 @@ enum qg_ext_iio_channels { FORCE_RECHARGE, CHARGE_DONE, PARALLEL_CHARGING_ENABLED, + CP_CHARGING_ENABLED, }; static const char * const qg_ext_iio_chan_name[] = { @@ -116,6 +117,7 @@ static const char * const qg_ext_iio_chan_name[] = { [FORCE_RECHARGE] = "force_recharge", [CHARGE_DONE] = "charge_done", [PARALLEL_CHARGING_ENABLED] = "parallel_charging_enabled", + [CP_CHARGING_ENABLED] = "cp_charging_enabled", }; #endif diff --git a/drivers/power/supply/qcom/qg-util.c b/drivers/power/supply/qcom/qg-util.c index 447d623947a5..2e2f61225ee4 100644 --- a/drivers/power/supply/qcom/qg-util.c +++ b/drivers/power/supply/qcom/qg-util.c @@ -308,7 +308,7 @@ bool is_input_present(struct qpnp_qg *chip) return is_usb_present(chip) || is_dc_present(chip); } -static bool is_parallel_available(struct qpnp_qg *chip) +bool is_parallel_available(struct qpnp_qg *chip) { if (is_chan_valid(chip, PARALLEL_CHARGING_ENABLED)) return true; @@ -316,12 +316,26 @@ static bool is_parallel_available(struct qpnp_qg *chip) return false; } +bool is_cp_available(struct qpnp_qg *chip) +{ + if (chip->cp_psy) + return true; + + chip->cp_psy = power_supply_get_by_name("charge_pump_master"); + if (!chip->cp_psy) + return false; + + return true; +} + bool is_parallel_enabled(struct qpnp_qg *chip) { int val = 0; if (is_parallel_available(chip)) qg_read_iio_chan(chip, PARALLEL_CHARGING_ENABLED, &val); + else if (is_cp_available(chip)) + qg_read_iio_chan(chip, CP_CHARGING_ENABLED, &val); return val ? true : false; } diff --git a/drivers/power/supply/qcom/qg-util.h b/drivers/power/supply/qcom/qg-util.h index 5f4a71dcebe8..dbcb4d8198a4 100644 --- a/drivers/power/supply/qcom/qg-util.h +++ b/drivers/power/supply/qcom/qg-util.h @@ -21,6 +21,8 @@ bool is_usb_present(struct qpnp_qg *chip); bool is_dc_present(struct qpnp_qg *chip); bool is_input_present(struct qpnp_qg *chip); bool is_parallel_enabled(struct qpnp_qg *chip); +bool is_cp_available(struct qpnp_qg *chip); +bool is_parallel_available(struct qpnp_qg *chip); int qg_write_monotonic_soc(struct qpnp_qg *chip, int msoc); int qg_get_battery_temp(struct qpnp_qg *chip, int *batt_temp); int qg_get_battery_current(struct qpnp_qg *chip, int *ibat_ua); diff --git a/drivers/power/supply/qcom/qpnp-qg.c b/drivers/power/supply/qcom/qpnp-qg.c index bbe39eae5bce..8aae7aba5698 100644 --- a/drivers/power/supply/qcom/qpnp-qg.c +++ b/drivers/power/supply/qcom/qpnp-qg.c @@ -2418,13 +2418,15 @@ static int qg_parallel_status_update(struct qpnp_qg *chip) "Parallel status changed Enabled=%d\n", parallel_enabled); mutex_lock(&chip->data_lock); - /* - * Parallel charger uses the same external sense, hence do not - * enable SMB sensing if PMI632 is configured for external sense. + * dt.qg_ext_sense = Uses external rsense, if defined do not + * enable SMB sensing (for non-CP parallel charger). + * dt.cp_iin_sns = Uses CP IIN_SNS, enable SMB sensing (for CP charger). */ - if (!chip->dt.qg_ext_sense) - update_smb = true; + if (is_cp_available(chip)) + update_smb = chip->dt.use_cp_iin_sns ? true : false; + else if (is_parallel_available(chip)) + update_smb = chip->dt.qg_ext_sense ? false : true; rc = process_rt_fifo_data(chip, update_smb); if (rc < 0) @@ -2674,7 +2676,8 @@ static int qg_notifier_cb(struct notifier_block *nb, if ((strcmp(psy->desc->name, "battery") == 0) || (strcmp(psy->desc->name, "parallel") == 0) || (strcmp(psy->desc->name, "usb") == 0) - || (strcmp(psy->desc->name, "dc") == 0)) { + || (strcmp(psy->desc->name, "dc") == 0) + || (strcmp(psy->desc->name, "charge_pump_master") == 0)) { /* * We cannot vote for awake votable here as that takes * a mutex lock and this is executed in an atomic context. @@ -4362,6 +4365,9 @@ static int qg_parse_dt(struct qpnp_qg *chip) chip->dt.qg_ext_sense = of_property_read_bool(node, "qcom,qg-ext-sns"); + chip->dt.use_cp_iin_sns = of_property_read_bool(node, + "qcom,use-cp-iin-sns"); + chip->dt.use_s7_ocv = of_property_read_bool(node, "qcom,qg-use-s7-ocv"); rc = of_property_read_u32(node, "qcom,min-sleep-time-secs", &temp);