From 461ffa02631a0a20ba53ae64a5e599111b26110b Mon Sep 17 00:00:00 2001 From: mahj8 Date: Tue, 27 Oct 2020 11:49:00 +0800 Subject: [PATCH] DLKM: bring up charging module bring up charging module base on kernel 5.4 use iio instead of private power supply Change-Id: I36fc162663179df7ee4f9f57b425ec4374dab64b Signed-off-by: mahj8 Reviewed-on: https://gerrit.mot.com/1785446 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- .../mmi-smbcharger-iio/mmi-smbcharger-iio.c | 542 ++++++++---------- 1 file changed, 255 insertions(+), 287 deletions(-) diff --git a/drivers/power/mmi-smbcharger-iio/mmi-smbcharger-iio.c b/drivers/power/mmi-smbcharger-iio/mmi-smbcharger-iio.c index c21e56dbfc24..2d42458af083 100755 --- a/drivers/power/mmi-smbcharger-iio/mmi-smbcharger-iio.c +++ b/drivers/power/mmi-smbcharger-iio/mmi-smbcharger-iio.c @@ -17,7 +17,7 @@ #include #include #include -#include +#include #include #include #include @@ -28,6 +28,8 @@ #include #include #include +#include +#include #define MODULE_LOG "SMBMMI" @@ -75,12 +77,12 @@ MODULE_PARM_DESC(debug_enabled, "Enable debug for SMBMMI driver"); static struct smb_mmi_charger *this_chip = NULL; -#ifndef PM8150B_SUBTYPE -#define PM8150B_SUBTYPE PM855B_SUBTYPE -#endif -#ifndef PM7250B_SUBTYPE -#define PM7250B_SUBTYPE 0x2E -#endif +enum pmic_type { + PM8150B, + PM7250B, + PM6150, + PMI632, +}; #define CHGR_BASE 0x1000 #define DCDC_BASE 0x1100 @@ -334,6 +336,8 @@ struct smb_mmi_charger { char *name; int smb_version; + struct iio_channel **ext_iio_chans; + bool factory_mode; int demo_mode; struct notifier_block smb_reboot; @@ -343,7 +347,6 @@ struct smb_mmi_charger { struct power_supply *qcom_psy; struct power_supply *usb_psy; struct power_supply *bms_psy; - struct power_supply *main_psy; struct power_supply *pc_port_psy; struct power_supply *dc_psy; struct power_supply *wls_psy; @@ -521,37 +524,98 @@ static struct smb_mmi_params smb5_pmi632_params = { }, }; -static struct smb_mmi_params smb2_pm660_params = { - .fcc = { - .name = "fast charge current", - .reg = CHGR_FAST_CHARGE_CURRENT_CFG_REG, - .min_u = 0, - .max_u = 4500000, - .step_u = 25000, - }, - .fv = { - .name = "float voltage", - .reg = CHGR_FLOAT_VOLTAGE_CFG_REG, - .min_u = 3487500, - .max_u = 4920000, - .step_u = 7500, - }, - .usb_icl = { - .name = "usb input current limit", - .reg = USBIN_CURRENT_LIMIT_CFG_REG, - .min_u = 0, - .max_u = 4800000, - .step_u = 25000, - }, - .dc_icl = { - .name = "dc input current limit", - .reg = DCIN_CURRENT_LIMIT_CFG_REG, - .min_u = 0, - .max_u = 6000000, - .step_u = 25000, - }, +enum smb_mmi_ext_iio_channels { + //smb5 + SMB5_CTM_CURRENT_MAX = 0, + SMB5_CURRENT_MAX, + SMB5_TYPEC_MODE, + SMB5_DP_DM, + SMB5_PD_ACTIVE, + SMB5_USB_REAL_TYPE, + SMB5_HW_CURRENT_MAX, + SMB5_USB_INPUT_CURRENT_SETTLED, + SMB5_RERUN_AICL, + SMB5_SW_JEITA_ENABLED, + //bms + SMB5_QG_VOLTAGE_NOW, + SMB5_QG_CURRENT_NOW, + SMB5_QG_TEMP, + SMB5_QG_CAPACITY, + SMB5_QG_CHARGE_FULL, + SMB5_QG_CHARGE_FULL_DESIGN, }; +static const char * const smb_mmi_ext_iio_chan_name[] = { + //smb5 + [SMB5_CTM_CURRENT_MAX] = "usb_ctm_current_max", + [SMB5_CURRENT_MAX] = "main_current_max", + [SMB5_TYPEC_MODE] = "usb_typec_mode", + [SMB5_DP_DM] = "battery_dp_dm", + [SMB5_PD_ACTIVE] = "usb_pd_active", + [SMB5_USB_REAL_TYPE] = "usb_real_type", + [SMB5_HW_CURRENT_MAX] = "usb_hw_current_max", + [SMB5_USB_INPUT_CURRENT_SETTLED] = "usb_input_current_settled", + [SMB5_RERUN_AICL] = "battery_rerun_aicl", + [SMB5_SW_JEITA_ENABLED] = "battery_sw_jeita_enabled", + //bms + [SMB5_QG_VOLTAGE_NOW] = "voltage_now", + [SMB5_QG_CURRENT_NOW] = "current_now", + [SMB5_QG_TEMP] = "temp", + [SMB5_QG_CAPACITY] = "capacity", + [SMB5_QG_CHARGE_FULL] = "charge_full", + [SMB5_QG_CHARGE_FULL_DESIGN] = "charge_full_design", + +}; + +bool is_chan_valid(struct smb_mmi_charger *chip, + enum smb_mmi_ext_iio_channels chan) +{ + int rc; + + if (IS_ERR(chip->ext_iio_chans[chan])) + return false; + + if (!chip->ext_iio_chans[chan]) { + chip->ext_iio_chans[chan] = iio_channel_get(chip->dev, + smb_mmi_ext_iio_chan_name[chan]); + if (IS_ERR(chip->ext_iio_chans[chan])) { + rc = PTR_ERR(chip->ext_iio_chans[chan]); + if (rc == -EPROBE_DEFER) + chip->ext_iio_chans[chan] = NULL; + + pr_err("Failed to get IIO channel %s, rc=%d\n", + smb_mmi_ext_iio_chan_name[chan], rc); + return false; + } + } + + return true; +} + +int smb_mmi_read_iio_chan(struct smb_mmi_charger *chip, + enum smb_mmi_ext_iio_channels chan, int *val) +{ + int rc; + + if (is_chan_valid(chip, chan)) { + rc = iio_read_channel_processed( + chip->ext_iio_chans[chan], val); + return (rc < 0) ? rc : 0; + } + + return -EINVAL; +} + +int smb_mmi_write_iio_chan(struct smb_mmi_charger *chip, + enum smb_mmi_ext_iio_channels chan, int val) +{ + if (is_chan_valid(chip, chan)) + return iio_write_channel_raw(chip->ext_iio_chans[chan], + val); + + return -EINVAL; +} + int smblib_read_mmi(struct smb_mmi_charger *chg, u16 addr, u8 *val) { unsigned int value; @@ -813,10 +877,7 @@ int smblib_get_usb_suspend(struct smb_mmi_charger *chg, int *suspend) int rc = 0; u8 temp = 0; - if (chg->smb_version == PM660_SUBTYPE) { - rc = smblib_read_mmi(chg, MISC_POWER_PATH_STATUS_REG, &temp); - } else - rc = smblib_read_mmi(chg, POWER_PATH_STATUS_REG, &temp); + rc = smblib_read_mmi(chg, POWER_PATH_STATUS_REG, &temp); if (rc < 0) { mmi_err(chg, "Couldn't read POWER_PATH_STATUS_REG rc=%d\n", rc); return rc; @@ -1254,9 +1315,9 @@ static ssize_t force_chg_itrick_store(struct device *dev, } switch (mmi_chip->smb_version) { - case PM8150B_SUBTYPE: - case PM7250B_SUBTYPE: - case PMI632_SUBTYPE: + case PM8150B: + case PM7250B: + case PMI632: mask = PRE_CHARGE_CURRENT_SETTING_MASK; if (chg_current < PRE_CHARGE_MIN) chg_current = 0; @@ -1270,15 +1331,6 @@ static ssize_t force_chg_itrick_store(struct device *dev, else value = (u8)chg_current; break; - case PM660_SUBTYPE: - mask = PRE_CHARGE_SMB2_MAX; - chg_current /= PRE_CHARGE_SMB2_CONV_MV; - - if (chg_current > PRE_CHARGE_SMB2_MAX) - value = PRE_CHARGE_SMB2_MAX; - else - value = (u8)chg_current; - break; default: mmi_err(mmi_chip, "Set ITRICK PMIC subtype %d not supported\n", mmi_chip->smb_version); @@ -1321,16 +1373,12 @@ static ssize_t force_chg_itrick_show(struct device *dev, } switch (mmi_chip->smb_version) { - case PM8150B_SUBTYPE: - case PM7250B_SUBTYPE: - case PMI632_SUBTYPE: + case PM8150B: + case PM7250B: + case PMI632: value &= PRE_CHARGE_CURRENT_SETTING_MASK; state = (value * PRE_CHARGE_CONV_MV) + PRE_CHARGE_MIN; break; - case PM660_SUBTYPE: - value &= PRE_CHARGE_SMB2_MAX; - state = value * PRE_CHARGE_SMB2_CONV_MV; - break; default: mmi_err(mmi_chip, "Get ITRICK PMIC subtype %d not supported\n", mmi_chip->smb_version); @@ -1483,35 +1531,21 @@ static int smb_mmi_set_property(struct power_supply *psy, switch (psp) { case POWER_SUPPLY_PROP_CURRENT_MAX: if (val->intval) { - rc = power_supply_set_property(chip->usb_psy, - POWER_SUPPLY_PROP_CTM_CURRENT_MAX, - val); - rc = power_supply_set_property(chip->main_psy, - POWER_SUPPLY_PROP_CURRENT_MAX, - val); - if (chip->smb_version == PM660_SUBTYPE) - override = ICL_OVERRIDE_BIT; - else - override = USBIN_ICL_OVERRIDE_BIT; + rc = smb_mmi_write_iio_chan(chip, + SMB5_CTM_CURRENT_MAX, val->intval); + rc = smb_mmi_write_iio_chan(chip, + SMB5_CURRENT_MAX, val->intval); + override = USBIN_ICL_OVERRIDE_BIT; } mmi_warn(chip, "Request for ICL to %d uA\n", val->intval); - if (chip->smb_version == PM660_SUBTYPE) { - rc = smblib_masked_write_mmi(chip, CMD_APSD_REG, - ICL_OVERRIDE_BIT, - override); - if (rc < 0) - mmi_err(chip, - "Couldn't set ICL_OVERRIDE_BIT rc=%d\n", rc); - } else { - rc = smblib_masked_write_mmi(chip, - USBIN_CMD_ICL_OVERRIDE_REG, - USBIN_ICL_OVERRIDE_BIT, - override); - if (rc < 0) - mmi_err(chip, - "Couldn't set USBIN_CMD_ICL_OVERRIDE rc=%d\n", rc); - } + rc = smblib_masked_write_mmi(chip, + USBIN_CMD_ICL_OVERRIDE_REG, + USBIN_ICL_OVERRIDE_BIT, + override); + if (rc < 0) + mmi_err(chip, + "Couldn't set USBIN_CMD_ICL_OVERRIDE rc=%d\n", rc); break; case POWER_SUPPLY_PROP_UPDATE_NOW: chip->gen_log_rate_s = val->intval; @@ -1647,7 +1681,10 @@ static int get_prop_batt_voltage_now(struct smb_mmi_charger *chg, if (!psy) return -EINVAL; - rc = power_supply_get_property(psy, + if (!strcmp(psy->desc->name, "bms")) { + rc = smb_mmi_read_iio_chan(chg, SMB5_QG_VOLTAGE_NOW, &val->intval); + } else + rc = power_supply_get_property(psy, POWER_SUPPLY_PROP_VOLTAGE_NOW, val); return rc; } @@ -1661,7 +1698,10 @@ static int get_prop_batt_current_now(struct smb_mmi_charger *chg, if (!psy) return -EINVAL; - rc = power_supply_get_property(psy, + if (!strcmp(psy->desc->name, "bms")) { + rc = smb_mmi_read_iio_chan(chg, SMB5_QG_CURRENT_NOW, &val->intval); + } else + rc = power_supply_get_property(psy, POWER_SUPPLY_PROP_CURRENT_NOW, val); return rc; } @@ -1701,7 +1741,10 @@ static int get_prop_batt_temp(struct smb_mmi_charger *chg, if (!psy) return -EINVAL; - rc = power_supply_get_property(psy, + if (!strcmp(psy->desc->name, "bms")) { + rc = smb_mmi_read_iio_chan(chg, SMB5_QG_TEMP, &val->intval); + } else + rc = power_supply_get_property(psy, POWER_SUPPLY_PROP_TEMP, val); return rc; } @@ -1712,7 +1755,12 @@ static int get_prop_batt_capacity(struct smb_mmi_charger *chg, { int rc = -EINVAL; - if (psy) + if (!psy) + return -EINVAL; + + if (!strcmp(psy->desc->name, "bms")) { + rc = smb_mmi_read_iio_chan(chg, SMB5_QG_CAPACITY, &val->intval); + } else rc = power_supply_get_property(psy, POWER_SUPPLY_PROP_CAPACITY, val); return rc; @@ -1746,7 +1794,7 @@ static int get_prop_dc_present(struct smb_mmi_charger *chg, * so just return 0 to avoid too much err log and heatbeat_work * break */ - if (chg->smb_version == PMI632_SUBTYPE) { + if (chg->smb_version == PMI632) { val->intval = 0; return 0; } @@ -1787,17 +1835,15 @@ static int get_prop_charger_present(struct smb_mmi_charger *chg, return rc; } - if (chg->usb_psy) { - rc = power_supply_get_property(chg->usb_psy, - POWER_SUPPLY_PROP_TYPEC_MODE, val); - if (rc < 0) - mmi_err(chg, "Couldn't read typec mode rc=%d\n", rc); - else if (val->intval == POWER_SUPPLY_TYPEC_SOURCE_DEFAULT || - val->intval == POWER_SUPPLY_TYPEC_SOURCE_MEDIUM || - val->intval == POWER_SUPPLY_TYPEC_SOURCE_HIGH) { - val->intval = 1; - return rc; - } + rc = smb_mmi_read_iio_chan(chg, + SMB5_TYPEC_MODE, &val->intval); + if (rc < 0) + mmi_err(chg, "Couldn't read typec mode rc=%d\n", rc); + else if (val->intval == QTI_POWER_SUPPLY_TYPEC_SOURCE_DEFAULT || + val->intval == QTI_POWER_SUPPLY_TYPEC_SOURCE_MEDIUM || + val->intval == QTI_POWER_SUPPLY_TYPEC_SOURCE_HIGH) { + val->intval = 1; + return rc; } if (chg->wls_psy) { @@ -1827,13 +1873,11 @@ int mmi_usb_icl_override(struct smb_mmi_charger *chg, int icl) if (chg->factory_mode) return rc; - if (chg->usb_psy) { - val.intval = POWER_SUPPLY_TYPEC_NONE; - rc = power_supply_get_property(chg->usb_psy, - POWER_SUPPLY_PROP_TYPEC_MODE, &val); - if (rc < 0 || val.intval != POWER_SUPPLY_TYPEC_NONE) - return rc; - } + val.intval = QTI_POWER_SUPPLY_TYPEC_NONE; + rc = smb_mmi_read_iio_chan(chg, + SMB5_TYPEC_MODE, &val.intval); + if (rc < 0 || val.intval != QTI_POWER_SUPPLY_TYPEC_NONE) + return rc; rc = smblib_get_apsd_result(chg, &apsd); if (rc < 0 || apsd == CHG_BC1P2_UNKNOWN) @@ -1843,27 +1887,17 @@ int mmi_usb_icl_override(struct smb_mmi_charger *chg, int icl) (icl == USBIN_900MA || icl <= USBIN_500MA)) { usb51_mode = 0; apsd_override = 0; - if (chg->smb_version == PM660_SUBTYPE) - icl_override = ICL_OVERRIDE_BIT; - else - icl_override = USBIN_ICL_OVERRIDE_BIT; + icl_override = USBIN_ICL_OVERRIDE_BIT; } else { usb51_mode = USBIN_MODE_CHG_BIT; apsd_override = ICL_OVERRIDE_AFTER_APSD_BIT; - if (chg->smb_version == PM660_SUBTYPE) - icl_override = ICL_OVERRIDE_BIT; - else - icl_override = USBIN_ICL_OVERRIDE_BIT; + icl_override = USBIN_ICL_OVERRIDE_BIT; } - if (chg->main_psy) { - val.intval = icl; - rc = power_supply_set_property(chg->main_psy, - POWER_SUPPLY_PROP_CURRENT_MAX, - &val); - if (rc < 0) { - mmi_err(chg, "Couldn't set usb icl, rc=%d\n", rc); - } + rc = smb_mmi_write_iio_chan(chg, + SMB5_CURRENT_MAX, icl); + if (rc < 0) { + mmi_err(chg, "Couldn't set usb icl, rc=%d\n", rc); } rc = smblib_masked_write_mmi(chg, USBIN_ICL_OPTIONS_REG, @@ -1873,21 +1907,12 @@ int mmi_usb_icl_override(struct smb_mmi_charger *chg, int icl) mmi_err(chg, "Couldn't set USBIN_ICL_OPTIONS rc=%d\n", rc); - if (chg->smb_version == PM660_SUBTYPE) { - rc = smblib_masked_write_mmi(chg, CMD_APSD_REG, - ICL_OVERRIDE_BIT, - icl_override); - if (rc < 0) - mmi_err(chg, - "Couldn't set ICL_OVERRIDE_BIT rc=%d\n", rc); - } else { - rc = smblib_masked_write_mmi(chg, USBIN_CMD_ICL_OVERRIDE_REG, - USBIN_ICL_OVERRIDE_BIT, - icl_override); - if (rc < 0) - mmi_err(chg, - "Couldn't set USBIN_CMD_ICL_OVERRIDE rc=%d\n", rc); - } + rc = smblib_masked_write_mmi(chg, USBIN_CMD_ICL_OVERRIDE_REG, + USBIN_ICL_OVERRIDE_BIT, + icl_override); + if (rc < 0) + mmi_err(chg, + "Couldn't set USBIN_CMD_ICL_OVERRIDE rc=%d\n", rc); rc = smblib_masked_write_mmi(chg, USBIN_LOAD_CFG_REG, ICL_OVERRIDE_AFTER_APSD_BIT, @@ -1910,8 +1935,7 @@ static int mmi_increase_vbus_power(struct smb_mmi_charger *chg, int cur_mv) union power_supply_propval val = {0, }; int pulse_cnt; - rc = power_supply_get_property(chg->qcom_psy, - POWER_SUPPLY_PROP_DP_DM, &val); + rc = smb_mmi_read_iio_chan(chg, SMB5_DP_DM, &val.intval); if (rc < 0) { mmi_err(chg, "Couldn't read dpdm pulse count rc=%d\n", rc); return cur_mv; @@ -1927,9 +1951,8 @@ static int mmi_increase_vbus_power(struct smb_mmi_charger *chg, int cur_mv) vote(chg->chg_dis_votable, MMI_HB_VOTER, true, 0); while (cur_mv < HVDCP_VOLTAGE_NOM && pulse_cnt < chg->inc_hvdcp_cnt) { - val.intval = POWER_SUPPLY_DP_DM_DP_PULSE; - rc = power_supply_set_property(chg->qcom_psy, - POWER_SUPPLY_PROP_DP_DM, &val); + val.intval = QTI_POWER_SUPPLY_DP_DM_DP_PULSE; + rc = smb_mmi_write_iio_chan(chg, SMB5_DP_DM, val.intval); if (rc < 0) { mmi_err(chg, "Couldn't set dpdm pulse rc=%d\n", rc); break; @@ -1944,8 +1967,7 @@ static int mmi_increase_vbus_power(struct smb_mmi_charger *chg, int cur_mv) } else cur_mv = val.intval / 1000; - rc = power_supply_get_property(chg->qcom_psy, - POWER_SUPPLY_PROP_DP_DM, &val); + rc = smb_mmi_read_iio_chan(chg, SMB5_DP_DM, &val.intval); if (rc < 0) { mmi_err(chg, "Couldn't read dpdm pulse count rc=%d\n", rc); break; @@ -2037,7 +2059,7 @@ static DEVICE_ATTR(force_hvdcp_power_max, 0644, static void mmi_chrg_usb_vin_config(struct smb_mmi_charger *chg, int cur_mv) { int rc = -EINVAL; - union power_supply_propval val = {0, }; + int val = 0; if (!chg->usb_psy || !chg->qcom_psy) return; @@ -2045,22 +2067,20 @@ static void mmi_chrg_usb_vin_config(struct smb_mmi_charger *chg, int cur_mv) if (cur_mv < HVDCP_VOLTAGE_MIN) return; - rc = power_supply_get_property(chg->usb_psy, - POWER_SUPPLY_PROP_PD_ACTIVE, &val); + rc = smb_mmi_read_iio_chan(chg, SMB5_PD_ACTIVE, &val); if (rc < 0) { mmi_err(chg, "Couldn't read PD active rc=%d\n", rc); - } else if (val.intval) { + } else if (val) { mmi_dbg(chg, "Skip usb vbus voltage config for PD charger\n"); return; } - rc = power_supply_get_property(chg->usb_psy, - POWER_SUPPLY_PROP_REAL_TYPE, &val); + rc = smb_mmi_read_iio_chan(chg, SMB5_USB_REAL_TYPE, &val); if (rc < 0) { mmi_err(chg, "Couldn't read charger type rc=%d\n", rc); return; } - if (val.intval != POWER_SUPPLY_TYPE_USB_HVDCP_3) + if (val != QTI_POWER_SUPPLY_TYPE_USB_HVDCP_3) return; if (chg->hvdcp_power_max > CHARGER_POWER_15W) { @@ -2069,24 +2089,22 @@ static void mmi_chrg_usb_vin_config(struct smb_mmi_charger *chg, int cur_mv) } /* Maintain vbus voltage for QC3.0 5V/3A 15W charging */ - rc = power_supply_get_property(chg->qcom_psy, - POWER_SUPPLY_PROP_DP_DM, &val); + rc = smb_mmi_read_iio_chan(chg, SMB5_DP_DM, &val); if (rc < 0) { mmi_err(chg, "Couldn't read dpdm pulse count rc=%d\n", rc); return; } else - mmi_info(chg, "DP DM pulse count = %d\n", val.intval); + mmi_info(chg, "DP DM pulse count = %d\n", val); - if (cur_mv < HVDCP_VOLTAGE_NOM && val.intval < chg->inc_hvdcp_cnt) - val.intval = POWER_SUPPLY_DP_DM_DP_PULSE; - else if (cur_mv > HVDCP_VOLTAGE_MAX && val.intval > 0) - val.intval = POWER_SUPPLY_DP_DM_DM_PULSE; + if (cur_mv < HVDCP_VOLTAGE_NOM && val < chg->inc_hvdcp_cnt) + val = QTI_POWER_SUPPLY_DP_DM_DP_PULSE; + else if (cur_mv > HVDCP_VOLTAGE_MAX && val > 0) + val = QTI_POWER_SUPPLY_DP_DM_DM_PULSE; else { mmi_dbg(chg, "No need to change hvdcp voltage\n"); return; } - rc = power_supply_set_property(chg->qcom_psy, - POWER_SUPPLY_PROP_DP_DM, &val); + rc = smb_mmi_read_iio_chan(chg, SMB5_DP_DM, &val); if (rc < 0) { mmi_err(chg, "Couldn't set dpdm pulse rc=%d\n", rc); return; @@ -2171,8 +2189,7 @@ void mmi_chrg_rate_check(struct smb_mmi_charger *chg) if (val.intval) { val.intval = 0; - rc = power_supply_get_property(chg->usb_psy, - POWER_SUPPLY_PROP_HW_CURRENT_MAX, &val); + rc = smb_mmi_read_iio_chan(chg, SMB5_HW_CURRENT_MAX, &val.intval); if (rc < 0) { mmi_err(chg, "Error getting HW Current Max rc = %d\n", rc); return; @@ -2180,8 +2197,8 @@ void mmi_chrg_rate_check(struct smb_mmi_charger *chg) chrg_cm_ma = val.intval / 1000; val.intval = 0; - rc = power_supply_get_property(chg->usb_psy, - POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, &val); + rc = smb_mmi_read_iio_chan(chg, + SMB5_USB_INPUT_CURRENT_SETTLED, &val.intval); if (rc < 0) { mmi_err(chg, "Error getting ICL Settled rc = %d\n", rc); return; @@ -2284,9 +2301,9 @@ bool mmi_charge_halted(struct smb_mmi_charger *chg) } stat = stat & BATTERY_CHARGER_STATUS_MASK; - if (chg->smb_version == PM8150B_SUBTYPE || - chg->smb_version == PM7250B_SUBTYPE || - chg->smb_version == PMI632_SUBTYPE) { + if (chg->smb_version == PM8150B || + chg->smb_version == PM7250B || + chg->smb_version == PMI632) { switch (stat) { case TERMINATE_CHARGE_V5: case INHIBIT_CHARGE_V5: @@ -2779,9 +2796,8 @@ vote_now: /* Rerun AICL to recover USB ICL from recharge */ if (is_chg_dis != get_effective_result(chg->chg_dis_votable)) { - power_supply_set_property(chg->qcom_psy, - POWER_SUPPLY_PROP_RERUN_AICL, - NULL); + smb_mmi_write_iio_chan(chg, + SMB5_RERUN_AICL, 0); } if (!stat->charger_present && @@ -3013,9 +3029,8 @@ static void mmi_basic_charge_sm(struct smb_mmi_charger *chip, /* Rerun AICL to recover USB ICL from recharge */ if (is_chg_dis != get_effective_result(chip->chg_dis_votable)) { - power_supply_set_property(chip->qcom_psy, - POWER_SUPPLY_PROP_RERUN_AICL, - NULL); + smb_mmi_write_iio_chan(chip, + SMB5_RERUN_AICL, 0); } if (prm->pres_temp_zone == ZONE_HOT) { @@ -3415,18 +3430,18 @@ static void mmi_heartbeat_work(struct work_struct *work) } else if (!chip->factory_mode) { cap_err = 0; - rc = power_supply_get_property(chip->bms_psy, - POWER_SUPPLY_PROP_CHARGE_FULL, - &pval); + rc = smb_mmi_read_iio_chan(chip, + SMB5_QG_CHARGE_FULL, + &pval.intval); if (rc < 0) { mmi_err(chip, "Couldn't get charge full\n"); cap_err = rc; } else main_cap = pval.intval; - rc = power_supply_get_property(chip->bms_psy, - POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, - &pval); + rc = smb_mmi_read_iio_chan(chip, + SMB5_QG_CHARGE_FULL_DESIGN, + &pval.intval); if (rc < 0) { mmi_err(chip, "Couldn't get charge full design\n"); cap_err = rc; @@ -3634,7 +3649,7 @@ static int smbchg_reboot(struct notifier_block *nb, static const struct power_supply_desc mmi_psy_desc = { .name = "mmi_battery", - .type = POWER_SUPPLY_TYPE_MAIN, + .type = POWER_SUPPLY_TYPE_MAINS, .get_property = smb_mmi_get_property, .set_property = smb_mmi_set_property, .properties = smb_mmi_battery_props, @@ -3642,42 +3657,28 @@ static const struct power_supply_desc mmi_psy_desc = { }; static enum power_supply_property batt_props[] = { - POWER_SUPPLY_PROP_INPUT_SUSPEND, POWER_SUPPLY_PROP_STATUS, POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_PROP_PRESENT, POWER_SUPPLY_PROP_CHARGE_TYPE, POWER_SUPPLY_PROP_CAPACITY, - POWER_SUPPLY_PROP_CHARGER_TEMP, - POWER_SUPPLY_PROP_CHARGER_TEMP_MAX, - POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED, + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_VOLTAGE_MAX, - POWER_SUPPLY_PROP_VOLTAGE_QNOVO, POWER_SUPPLY_PROP_CURRENT_NOW, - POWER_SUPPLY_PROP_CURRENT_QNOVO, POWER_SUPPLY_PROP_CURRENT_MAX, POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, POWER_SUPPLY_PROP_TEMP, POWER_SUPPLY_PROP_TECHNOLOGY, - POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED, - POWER_SUPPLY_PROP_SW_JEITA_ENABLED, - POWER_SUPPLY_PROP_CHARGE_DONE, - POWER_SUPPLY_PROP_PARALLEL_DISABLE, - POWER_SUPPLY_PROP_SET_SHIP_MODE, - POWER_SUPPLY_PROP_DIE_HEALTH, - POWER_SUPPLY_PROP_RERUN_AICL, - POWER_SUPPLY_PROP_DP_DM, POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX, POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT, POWER_SUPPLY_PROP_CHARGE_COUNTER, POWER_SUPPLY_PROP_CYCLE_COUNT, - POWER_SUPPLY_PROP_RECHARGE_SOC, POWER_SUPPLY_PROP_CHARGE_FULL, - POWER_SUPPLY_PROP_FCC_STEPPER_ENABLE, - POWER_SUPPLY_PROP_HOT_TEMP, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, }; static int batt_get_prop(struct power_supply *psy, @@ -3711,17 +3712,11 @@ static int batt_get_prop(struct power_supply *psy, else val->intval = chip->sm_param[BASE_BATT].batt_health; break; - case POWER_SUPPLY_PROP_CHARGE_DONE: - if (chip->last_reported_status == POWER_SUPPLY_STATUS_FULL) - val->intval = 1; - else - val->intval = 0; - break; case POWER_SUPPLY_PROP_CURRENT_MAX: val->intval = get_effective_result(chip->fcc_votable); break; case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: - if (chip->smb_version == PMI632_SUBTYPE) { + if (chip->smb_version == PMI632) { val->intval = get_effective_result(chip->fcc_votable); break; } @@ -3732,23 +3727,6 @@ static int batt_get_prop(struct power_supply *psy, val->intval = -EINVAL; } break; - case POWER_SUPPLY_PROP_HOT_TEMP: - if (chip->max_main_psy && chip->max_flip_psy) { - if (chip->sm_param[MAIN_BATT].pres_temp_zone == - (chip->sm_param[MAIN_BATT].num_temp_zones - 1) || - chip->sm_param[MAIN_BATT].pres_temp_zone == ZONE_HOT) - val->intval = 1; - else if (chip->sm_param[FLIP_BATT].pres_temp_zone == - (chip->sm_param[FLIP_BATT].num_temp_zones - 1) || - chip->sm_param[FLIP_BATT].pres_temp_zone == ZONE_HOT) - val->intval = 1; - } else if (chip->sm_param[BASE_BATT].pres_temp_zone == - (chip->sm_param[BASE_BATT].num_temp_zones - 1) || - chip->sm_param[BASE_BATT].pres_temp_zone == ZONE_HOT) - val->intval = 1; - else - val->intval = 0; - break; case POWER_SUPPLY_PROP_TEMP: if (chip->max_main_psy && chip->max_flip_psy) { union power_supply_propval main_psy_val; @@ -3793,10 +3771,6 @@ static int batt_set_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_CYCLE_COUNT: chip->cycles += val->intval * 100; break; - case POWER_SUPPLY_PROP_DP_DM: - /* Skip the hvdcp request from hvdcp daemon */ - if (chip->hvdcp_power_max) - break; default: rc = power_supply_set_property(chip->qcom_psy, prop, val); if (rc < 0) { @@ -3814,16 +3788,8 @@ static int batt_prop_is_writeable(struct power_supply *psy, { switch (psp) { case POWER_SUPPLY_PROP_STATUS: - case POWER_SUPPLY_PROP_INPUT_SUSPEND: - case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: case POWER_SUPPLY_PROP_CAPACITY: - case POWER_SUPPLY_PROP_PARALLEL_DISABLE: - case POWER_SUPPLY_PROP_DP_DM: - case POWER_SUPPLY_PROP_RERUN_AICL: - case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMITED: - case POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED: - case POWER_SUPPLY_PROP_SW_JEITA_ENABLED: - case POWER_SUPPLY_PROP_DIE_HEALTH: + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: case POWER_SUPPLY_PROP_CYCLE_COUNT: case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT: return 1; @@ -4042,50 +4008,27 @@ static int parse_mmi_dual_dt(struct smb_mmi_charger *chg) static int smb_mmi_chg_config_init(struct smb_mmi_charger *chip) { - struct pmic_revid_data *pmic_rev_id; - struct device_node *revid_dev_node; + int subtype = (u8)of_device_get_match_data(chip->dev); - revid_dev_node = of_parse_phandle(chip->dev->of_node, - "qcom,pmic-revid", 0); - if (!revid_dev_node) { - pr_err("SMBMMI: Missing qcom,pmic-revid property\n"); - return -EINVAL; - } - - pmic_rev_id = get_revid_data(revid_dev_node); - if (IS_ERR_OR_NULL(pmic_rev_id)) { - /* - * the revid peripheral must be registered, any failure - * here only indicates that the rev-id module has not - * probed yet. - */ - return -EPROBE_DEFER; - } - - switch (pmic_rev_id->pmic_subtype) { - case PM8150B_SUBTYPE: - chip->smb_version = PM8150B_SUBTYPE; + switch (subtype) { + case PM8150B: + chip->smb_version = PM8150B; chip->name = "pm8150b_charger"; chip->param = smb5_pm8150b_params; break; - case PM7250B_SUBTYPE: - chip->smb_version = PM7250B_SUBTYPE; + case PM7250B: + chip->smb_version = PM7250B; chip->name = "pm7250b_charger"; chip->param = smb5_pm8150b_params; break; - case PMI632_SUBTYPE: - chip->smb_version = PMI632_SUBTYPE; + case PMI632: + chip->smb_version = PMI632; chip->name = "pmi632_charger"; chip->param = smb5_pmi632_params; break; - case PM660_SUBTYPE: - chip->smb_version = PM660_SUBTYPE; - chip->name = "pm660_charger"; - chip->param = smb2_pm660_params; - break; default: pr_err("SMBMMI: PMIC subtype %d not supported\n", - pmic_rev_id->pmic_subtype); + subtype); return -EINVAL; } @@ -4188,6 +4131,20 @@ static void smb_mmi_create_debugfs(struct smb_mmi_charger *chip) {} #endif +static int smb_mmi_init_iio_psy(struct smb_mmi_charger *chip, + struct platform_device *pdev) +{ + int rc = 0; + chip->ext_iio_chans = devm_kcalloc(chip->dev, + ARRAY_SIZE(smb_mmi_ext_iio_chan_name), + sizeof(*chip->ext_iio_chans), + GFP_KERNEL); + if (!chip->ext_iio_chans) + return -ENOMEM; + + return rc; +} + static int smb_mmi_probe(struct platform_device *pdev) { struct smb_mmi_charger *chip; @@ -4226,6 +4183,8 @@ static int smb_mmi_probe(struct platform_device *pdev) return -EINVAL; } + smb_mmi_init_iio_psy(chip, pdev); + parse_mmi_dt(chip); INIT_DELAYED_WORK(&chip->heartbeat_work, mmi_heartbeat_work); @@ -4280,7 +4239,6 @@ static int smb_mmi_probe(struct platform_device *pdev) chip->bms_psy = power_supply_get_by_name("bms"); chip->usb_psy = power_supply_get_by_name("usb"); - chip->main_psy = power_supply_get_by_name("main"); chip->pc_port_psy = power_supply_get_by_name("pc_port"); chip->dc_psy = power_supply_get_by_name("dc"); chip->wls_psy = power_supply_get_by_name("wireless"); @@ -4311,32 +4269,29 @@ static int smb_mmi_probe(struct platform_device *pdev) if (IS_ERR(chip->dc_suspend_votable)) chip->dc_suspend_votable = NULL; - if (chip->smb_version == PM8150B_SUBTYPE) { + if (chip->smb_version == PM8150B) { if (smblib_masked_write_mmi(chip, LEGACY_CABLE_CFG_REG, 0xFF, 0)) mmi_err(chip, "Could not set Legacy Cable CFG\n"); } - if (chip->smb_version == PM8150B_SUBTYPE || - chip->smb_version == PM7250B_SUBTYPE || - chip->smb_version == PMI632_SUBTYPE || - chip->smb_version == PM660_SUBTYPE) { + if (chip->smb_version == PM8150B || + chip->smb_version == PM7250B || + chip->smb_version == PMI632) { mmi_err(chip, "DISABLE all QCOM JEITA\n"); /* Ensure SW JEITA is DISABLED */ pval.intval = 0; - power_supply_set_property(chip->qcom_psy, - POWER_SUPPLY_PROP_SW_JEITA_ENABLED, - &pval); + smb_mmi_write_iio_chan(chip, + SMB5_SW_JEITA_ENABLED, pval.intval); /* Ensure HW JEITA is DISABLED */ if (smblib_masked_write_mmi(chip, PM8150B_JEITA_EN_CFG_REG, 0xFF, 0x00)) mmi_err(chip, "Could not disable JEITA CFG\n"); } - if ((chip->smb_version == PM8150B_SUBTYPE) || - (chip->smb_version == PM7250B_SUBTYPE) || - (chip->smb_version == PMI632_SUBTYPE) || - (chip->smb_version == PM660_SUBTYPE)) + if ((chip->smb_version == PM8150B) || + (chip->smb_version == PM7250B) || + (chip->smb_version == PMI632)) if (smblib_masked_write_mmi(chip, USBIN_ADAPTER_ALLOW_CFG_REG, USBIN_ADAPTER_ALLOW_MASK, USBIN_ADAPTER_ALLOW_5V_TO_9V)) @@ -4376,7 +4331,7 @@ static int smb_mmi_probe(struct platform_device *pdev) } if (chip->factory_mode && - (chip->smb_version == PMI632_SUBTYPE)) { + (chip->smb_version == PMI632)) { rc = smblib_masked_write_mmi(chip, USBIN_INT_EN_CLR, 0xFF, USBIN_OV_EN_CLR); if (rc) { @@ -4552,8 +4507,6 @@ static void smb_mmi_shutdown(struct platform_device *pdev) power_supply_put(chip->bms_psy); if (chip->usb_psy) power_supply_put(chip->usb_psy); - if (chip->main_psy) - power_supply_put(chip->main_psy); if (chip->pc_port_psy) power_supply_put(chip->pc_port_psy); if (chip->dc_psy) @@ -4600,13 +4553,28 @@ static const struct dev_pm_ops smb_mmi_dev_pm_ops = { }; static const struct of_device_id match_table[] = { - { .compatible = "qcom,qpnp-smbcharger-mmi", }, + { + .compatible = "qcom,mmi-pm8150-smb5", + .data = (void *)PM8150B, + }, + { + .compatible = "qcom,mmi-pm7250b-smb5", + .data = (void *)PM7250B, + }, + { + .compatible = "qcom,mmi-pm6150-smb5", + .data = (void *)PM6150, + }, + { + .compatible = "qcom,mmi-pmi632-smb5", + .data = (void *)PMI632, + }, { }, }; static struct platform_driver smb_mmi_driver = { .driver = { - .name = "qcom,qpnp-smbcharger-mmi", + .name = "qcom,mmi-smbcharger-iio", .owner = THIS_MODULE, .pm = &smb_mmi_dev_pm_ops, .of_match_table = match_table,