Loading Documentation/devicetree/bindings/power/supply/qcom/qpnp-smb2.txt +12 −18 Original line number Diff line number Diff line Loading @@ -85,21 +85,6 @@ Charger specific properties: maximum charge current in mA for each thermal level. - qcom,step-soc-thresholds Usage: optional Value type: Array of <u32> Definition: Array of SOC threshold values, size of 4. This should be a flat array that denotes the percentage ranging from 0 to 100. If the array is not present, step charging is disabled. - qcom,step-current-deltas Usage: optional Value type: Array of <s32> Definition: Array of delta values for charging current, size of 5, with FCC as base. This should be a flat array that denotes the offset of charging current in uA, from -3100000 to 3200000. If the array is not present, step charging is disabled. - io-channels Usage: optional Value type: List of <phandle u32> Loading Loading @@ -182,6 +167,18 @@ Charger specific properties: Definition: Specifies the deglitch interval for OTG detection. If the value is not present, 50 msec is used as default. - qcom,step-charging-enable Usage: optional Value type: bool Definition: Boolean flag which when present enables step-charging. - qcom,wd-bark-time-secs Usage: optional Value type: <u32> Definition: WD bark-timeout in seconds. The possible values are 16, 32, 64, 128. If not defined it defaults to 64. ============================================= Second Level Nodes - SMB2 Charger Peripherals ============================================= Loading Loading @@ -217,9 +214,6 @@ pmi8998_charger: qcom,qpnp-smb2 { dpdm-supply = <&qusb_phy0>; qcom,step-soc-thresholds = <60 70 80 90>; qcom,step-current-deltas = <500000 250000 150000 0 (-150000)>; qcom,chgr@1000 { reg = <0x1000 0x100>; interrupts = <0x2 0x10 0x0 IRQ_TYPE_NONE>, Loading drivers/power/supply/qcom/Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,6 @@ obj-$(CONFIG_QPNP_FG_GEN3) += qpnp-fg-gen3.o fg-memif.o fg-util.o obj-$(CONFIG_SMB135X_CHARGER) += smb135x-charger.o pmic-voter.o obj-$(CONFIG_SMB1355_SLAVE_CHARGER) += smb1355-charger.o pmic-voter.o obj-$(CONFIG_SMB1351_USB_CHARGER) += smb1351-charger.o pmic-voter.o battery.o obj-$(CONFIG_QPNP_SMB2) += qpnp-smb2.o smb-lib.o pmic-voter.o storm-watch.o battery.o obj-$(CONFIG_QPNP_SMB2) += step-chg-jeita.o battery.o qpnp-smb2.o smb-lib.o pmic-voter.o storm-watch.o obj-$(CONFIG_SMB138X_CHARGER) += smb138x-charger.o smb-lib.o pmic-voter.o storm-watch.o battery.o obj-$(CONFIG_QPNP_QNOVO) += qpnp-qnovo.o battery.o drivers/power/supply/qcom/qpnp-smb2.c +66 −194 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <linux/power_supply.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/log2.h> #include <linux/qpnp/qpnp-revid.h> #include <linux/regulator/driver.h> #include <linux/regulator/of_regulator.h> Loading Loading @@ -122,87 +123,6 @@ static struct smb_params v1_params = { .max_u = 1575000, .step_u = 25000, }, .step_soc_threshold[0] = { .name = "step charge soc threshold 1", .reg = STEP_CHG_SOC_OR_BATT_V_TH1_REG, .min_u = 0, .max_u = 100, .step_u = 1, }, .step_soc_threshold[1] = { .name = "step charge soc threshold 2", .reg = STEP_CHG_SOC_OR_BATT_V_TH2_REG, .min_u = 0, .max_u = 100, .step_u = 1, }, .step_soc_threshold[2] = { .name = "step charge soc threshold 3", .reg = STEP_CHG_SOC_OR_BATT_V_TH3_REG, .min_u = 0, .max_u = 100, .step_u = 1, }, .step_soc_threshold[3] = { .name = "step charge soc threshold 4", .reg = STEP_CHG_SOC_OR_BATT_V_TH4_REG, .min_u = 0, .max_u = 100, .step_u = 1, }, .step_soc = { .name = "step charge soc", .reg = STEP_CHG_SOC_VBATT_V_REG, .min_u = 0, .max_u = 100, .step_u = 1, .set_proc = smblib_mapping_soc_from_field_value, }, .step_cc_delta[0] = { .name = "step charge current delta 1", .reg = STEP_CHG_CURRENT_DELTA1_REG, .min_u = 100000, .max_u = 3200000, .step_u = 100000, .get_proc = smblib_mapping_cc_delta_to_field_value, .set_proc = smblib_mapping_cc_delta_from_field_value, }, .step_cc_delta[1] = { .name = "step charge current delta 2", .reg = STEP_CHG_CURRENT_DELTA2_REG, .min_u = 100000, .max_u = 3200000, .step_u = 100000, .get_proc = smblib_mapping_cc_delta_to_field_value, .set_proc = smblib_mapping_cc_delta_from_field_value, }, .step_cc_delta[2] = { .name = "step charge current delta 3", .reg = STEP_CHG_CURRENT_DELTA3_REG, .min_u = 100000, .max_u = 3200000, .step_u = 100000, .get_proc = smblib_mapping_cc_delta_to_field_value, .set_proc = smblib_mapping_cc_delta_from_field_value, }, .step_cc_delta[3] = { .name = "step charge current delta 4", .reg = STEP_CHG_CURRENT_DELTA4_REG, .min_u = 100000, .max_u = 3200000, .step_u = 100000, .get_proc = smblib_mapping_cc_delta_to_field_value, .set_proc = smblib_mapping_cc_delta_from_field_value, }, .step_cc_delta[4] = { .name = "step charge current delta 5", .reg = STEP_CHG_CURRENT_DELTA5_REG, .min_u = 100000, .max_u = 3200000, .step_u = 100000, .get_proc = smblib_mapping_cc_delta_to_field_value, .set_proc = smblib_mapping_cc_delta_from_field_value, }, .freq_buck = { .name = "buck switching frequency", .reg = CFG_BUCKBOOST_FREQ_SELECT_BUCK_REG, Loading Loading @@ -236,7 +156,6 @@ static struct smb_params pm660_params = { }, }; #define STEP_CHARGING_MAX_STEPS 5 struct smb_dt_props { int usb_icl_ua; int dc_icl_ua; Loading @@ -244,14 +163,13 @@ struct smb_dt_props { int wipower_max_uw; int min_freq_khz; int max_freq_khz; u32 step_soc_threshold[STEP_CHARGING_MAX_STEPS - 1]; s32 step_cc_delta[STEP_CHARGING_MAX_STEPS]; struct device_node *revid_dev_node; int float_option; int chg_inhibit_thr_mv; bool no_battery; bool hvdcp_disable; bool auto_recharge_soc; int wd_bark_time; }; struct smb2 { Loading @@ -273,6 +191,11 @@ module_param_named( #define MICRO_1P5A 1500000 #define MICRO_P1A 100000 #define OTG_DEFAULT_DEGLITCH_TIME_MS 50 #define MIN_WD_BARK_TIME 16 #define DEFAULT_WD_BARK_TIME 64 #define BITE_WDOG_TIMEOUT_8S 0x3 #define BARK_WDOG_TIMEOUT_MASK GENMASK(3, 2) #define BARK_WDOG_TIMEOUT_SHIFT 2 static int smb2_parse_dt(struct smb2 *chip) { struct smb_charger *chg = &chip->chg; Loading @@ -284,27 +207,13 @@ static int smb2_parse_dt(struct smb2 *chip) return -EINVAL; } chg->step_chg_enabled = true; if (of_property_count_u32_elems(node, "qcom,step-soc-thresholds") != STEP_CHARGING_MAX_STEPS - 1) chg->step_chg_enabled = false; rc = of_property_read_u32_array(node, "qcom,step-soc-thresholds", chip->dt.step_soc_threshold, STEP_CHARGING_MAX_STEPS - 1); if (rc < 0) chg->step_chg_enabled = false; chg->step_chg_enabled = of_property_read_bool(node, "qcom,step-charging-enable"); if (of_property_count_u32_elems(node, "qcom,step-current-deltas") != STEP_CHARGING_MAX_STEPS) chg->step_chg_enabled = false; rc = of_property_read_u32_array(node, "qcom,step-current-deltas", chip->dt.step_cc_delta, STEP_CHARGING_MAX_STEPS); if (rc < 0) chg->step_chg_enabled = false; rc = of_property_read_u32(node, "qcom,wd-bark-time-secs", &chip->dt.wd_bark_time); if (rc < 0 || chip->dt.wd_bark_time < MIN_WD_BARK_TIME) chip->dt.wd_bark_time = DEFAULT_WD_BARK_TIME; chip->dt.no_battery = of_property_read_bool(node, "qcom,batteryless-platform"); Loading Loading @@ -988,7 +897,6 @@ static enum power_supply_property smb2_batt_props[] = { POWER_SUPPLY_PROP_TEMP, POWER_SUPPLY_PROP_TECHNOLOGY, POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED, POWER_SUPPLY_PROP_STEP_CHARGING_STEP, POWER_SUPPLY_PROP_CHARGE_DONE, POWER_SUPPLY_PROP_PARALLEL_DISABLE, POWER_SUPPLY_PROP_SET_SHIP_MODE, Loading Loading @@ -1051,9 +959,6 @@ static int smb2_batt_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED: val->intval = chg->step_chg_enabled; break; case POWER_SUPPLY_PROP_STEP_CHARGING_STEP: rc = smblib_get_prop_step_chg_step(chg, val); break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: rc = smblib_get_prop_batt_voltage_now(chg, val); break; Loading Loading @@ -1167,6 +1072,9 @@ static int smb2_batt_set_prop(struct power_supply *psy, vote(chg->fcc_votable, BATT_PROFILE_VOTER, false, 0); } break; case POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED: chg->step_chg_enabled = !!val->intval; break; case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: chg->batt_profile_fcc_ua = val->intval; vote(chg->fcc_votable, BATT_PROFILE_VOTER, true, val->intval); Loading Loading @@ -1207,6 +1115,7 @@ static int smb2_batt_prop_is_writeable(struct power_supply *psy, 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: return 1; default: break; Loading Loading @@ -1334,73 +1243,6 @@ static int smb2_init_vconn_regulator(struct smb2 *chip) /*************************** * HARDWARE INITIALIZATION * ***************************/ static int smb2_config_step_charging(struct smb2 *chip) { struct smb_charger *chg = &chip->chg; int rc = 0; int i; if (!chg->step_chg_enabled) return rc; for (i = 0; i < STEP_CHARGING_MAX_STEPS - 1; i++) { rc = smblib_set_charge_param(chg, &chg->param.step_soc_threshold[i], chip->dt.step_soc_threshold[i]); if (rc < 0) { pr_err("Couldn't configure soc thresholds rc = %d\n", rc); goto err_out; } } for (i = 0; i < STEP_CHARGING_MAX_STEPS; i++) { rc = smblib_set_charge_param(chg, &chg->param.step_cc_delta[i], chip->dt.step_cc_delta[i]); if (rc < 0) { pr_err("Couldn't configure cc delta rc = %d\n", rc); goto err_out; } } rc = smblib_write(chg, STEP_CHG_UPDATE_REQUEST_TIMEOUT_CFG_REG, STEP_CHG_UPDATE_REQUEST_TIMEOUT_40S); if (rc < 0) { dev_err(chg->dev, "Couldn't configure soc request timeout reg rc=%d\n", rc); goto err_out; } rc = smblib_write(chg, STEP_CHG_UPDATE_FAIL_TIMEOUT_CFG_REG, STEP_CHG_UPDATE_FAIL_TIMEOUT_120S); if (rc < 0) { dev_err(chg->dev, "Couldn't configure soc fail timeout reg rc=%d\n", rc); goto err_out; } /* * enable step charging, source soc, standard mode, go to final * state in case of failure. */ rc = smblib_write(chg, CHGR_STEP_CHG_MODE_CFG_REG, STEP_CHARGING_ENABLE_BIT | STEP_CHARGING_SOURCE_SELECT_BIT | STEP_CHARGING_SOC_FAIL_OPTION_BIT); if (rc < 0) { dev_err(chg->dev, "Couldn't configure charger rc=%d\n", rc); goto err_out; } return 0; err_out: chg->step_chg_enabled = false; return rc; } static int smb2_config_wipower_input_power(struct smb2 *chip, int uw) { int rc; Loading Loading @@ -1576,7 +1418,7 @@ static int smb2_init_hw(struct smb2 *chip) { struct smb_charger *chg = &chip->chg; int rc; u8 stat; u8 stat, val; if (chip->dt.no_battery) chg->fake_capacity = 50; Loading Loading @@ -1724,11 +1566,27 @@ static int smb2_init_hw(struct smb2 *chip) return rc; } /* configure step charging */ rc = smb2_config_step_charging(chip); if (rc < 0) { dev_err(chg->dev, "Couldn't configure step charging rc=%d\n", rc); val = (ilog2(chip->dt.wd_bark_time / 16) << BARK_WDOG_TIMEOUT_SHIFT) & BARK_WDOG_TIMEOUT_MASK; val |= BITE_WDOG_TIMEOUT_8S; rc = smblib_masked_write(chg, SNARL_BARK_BITE_WD_CFG_REG, BITE_WDOG_DISABLE_CHARGING_CFG_BIT | BARK_WDOG_TIMEOUT_MASK | BITE_WDOG_TIMEOUT_MASK, val); if (rc) { pr_err("Couldn't configue WD config rc=%d\n", rc); return rc; } /* enable WD BARK and enable it on plugin */ rc = smblib_masked_write(chg, WD_CFG_REG, WATCHDOG_TRIGGER_AFP_EN_BIT | WDOG_TIMER_EN_ON_PLUGIN_BIT | BARK_WDOG_INT_EN_BIT, WDOG_TIMER_EN_ON_PLUGIN_BIT | BARK_WDOG_INT_EN_BIT); if (rc) { pr_err("Couldn't configue WD config rc=%d\n", rc); return rc; } Loading Loading @@ -1787,6 +1645,13 @@ static int smb2_init_hw(struct smb2 *chip) return rc; } rc = smblib_read(chg, USBIN_OPTIONS_2_CFG_REG, &chg->float_cfg); if (rc < 0) { dev_err(chg->dev, "Couldn't read float charger options rc=%d\n", rc); return rc; } switch (chip->dt.chg_inhibit_thr_mv) { case 50: rc = smblib_masked_write(chg, CHARGE_INHIBIT_THRESHOLD_CFG_REG, Loading Loading @@ -1851,6 +1716,12 @@ static int smb2_post_init(struct smb2 *chip) struct smb_charger *chg = &chip->chg; int rc; /* In case the usb path is suspended, we would have missed disabling * the icl change interrupt because the interrupt could have been * not requested */ rerun_election(chg->usb_icl_votable); /* configure power role for dual-role */ rc = smblib_masked_write(chg, TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG, TYPEC_POWER_ROLE_CMD_MASK, 0); Loading Loading @@ -1942,8 +1813,8 @@ static int smb2_determine_initial_status(struct smb2 *chip) smblib_handle_usb_source_change(0, &irq_data); smblib_handle_chg_state_change(0, &irq_data); smblib_handle_icl_change(0, &irq_data); smblib_handle_step_chg_state_change(0, &irq_data); smblib_handle_step_chg_soc_update_request(0, &irq_data); smblib_handle_batt_temp_changed(0, &irq_data); smblib_handle_wdog_bark(0, &irq_data); return 0; } Loading @@ -1965,18 +1836,15 @@ static struct smb_irq_info smb2_irqs[] = { }, [STEP_CHG_STATE_CHANGE_IRQ] = { .name = "step-chg-state-change", .handler = smblib_handle_step_chg_state_change, .wake = true, .handler = NULL, }, [STEP_CHG_SOC_UPDATE_FAIL_IRQ] = { .name = "step-chg-soc-update-fail", .handler = smblib_handle_step_chg_soc_update_fail, .wake = true, .handler = NULL, }, [STEP_CHG_SOC_UPDATE_REQ_IRQ] = { .name = "step-chg-soc-update-request", .handler = smblib_handle_step_chg_soc_update_request, .wake = true, .handler = NULL, }, /* OTG IRQs */ [OTG_FAIL_IRQ] = { Loading @@ -1999,6 +1867,7 @@ static struct smb_irq_info smb2_irqs[] = { [BATT_TEMP_IRQ] = { .name = "bat-temp", .handler = smblib_handle_batt_temp_changed, .wake = true, }, [BATT_OCP_IRQ] = { .name = "bat-ocp", Loading Loading @@ -2094,7 +1963,8 @@ static struct smb_irq_info smb2_irqs[] = { }, [WDOG_BARK_IRQ] = { .name = "wdog-bark", .handler = NULL, .handler = smblib_handle_wdog_bark, .wake = true, }, [AICL_FAIL_IRQ] = { .name = "aicl-fail", Loading Loading @@ -2200,6 +2070,8 @@ static int smb2_request_interrupts(struct smb2 *chip) return rc; } } if (chg->irq_info[USBIN_ICL_CHANGE_IRQ].irq) chg->usb_icl_change_irq_enabled = true; return rc; } Loading Loading @@ -2332,15 +2204,15 @@ static int smb2_probe(struct platform_device *pdev) return rc; } rc = smblib_init(chg); rc = smb2_parse_dt(chip); if (rc < 0) { pr_err("Smblib_init failed rc=%d\n", rc); pr_err("Couldn't parse device tree rc=%d\n", rc); goto cleanup; } rc = smb2_parse_dt(chip); rc = smblib_init(chg); if (rc < 0) { pr_err("Couldn't parse device tree rc=%d\n", rc); pr_err("Smblib_init failed rc=%d\n", rc); goto cleanup; } Loading drivers/power/supply/qcom/smb-lib.c +278 −218 File changed.Preview size limit exceeded, changes collapsed. Show changes drivers/power/supply/qcom/smb-lib.h +4 −11 Original line number Diff line number Diff line Loading @@ -192,9 +192,6 @@ struct smb_params { struct smb_chg_param dc_icl_div2_mid_hv; struct smb_chg_param dc_icl_div2_hv; struct smb_chg_param jeita_cc_comp; struct smb_chg_param step_soc_threshold[4]; struct smb_chg_param step_soc; struct smb_chg_param step_cc_delta[5]; struct smb_chg_param freq_buck; struct smb_chg_param freq_boost; }; Loading Loading @@ -289,7 +286,6 @@ struct smb_charger { struct work_struct rdstd_cc2_detach_work; struct delayed_work hvdcp_detect_work; struct delayed_work ps_change_timeout_work; struct delayed_work step_soc_req_work; struct delayed_work clear_hdc_work; struct work_struct otg_oc_work; struct work_struct vconn_oc_work; Loading Loading @@ -330,6 +326,9 @@ struct smb_charger { int fake_input_current_limited; bool pr_swap_in_progress; int typec_mode; int usb_icl_change_irq_enabled; u32 jeita_status; u8 float_cfg; /* workaround flag */ u32 wa_flags; Loading Loading @@ -384,9 +383,6 @@ int smblib_vconn_regulator_is_enabled(struct regulator_dev *rdev); irqreturn_t smblib_handle_debug(int irq, void *data); irqreturn_t smblib_handle_otg_overcurrent(int irq, void *data); irqreturn_t smblib_handle_chg_state_change(int irq, void *data); irqreturn_t smblib_handle_step_chg_state_change(int irq, void *data); irqreturn_t smblib_handle_step_chg_soc_update_fail(int irq, void *data); irqreturn_t smblib_handle_step_chg_soc_update_request(int irq, void *data); irqreturn_t smblib_handle_batt_temp_changed(int irq, void *data); irqreturn_t smblib_handle_batt_psy_changed(int irq, void *data); irqreturn_t smblib_handle_usb_psy_changed(int irq, void *data); Loading Loading @@ -426,9 +422,6 @@ int smblib_get_prop_batt_current_now(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_batt_temp(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_step_chg_step(struct smb_charger *chg, union power_supply_propval *val); int smblib_set_prop_input_suspend(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_batt_capacity(struct smb_charger *chg, Loading Loading
Documentation/devicetree/bindings/power/supply/qcom/qpnp-smb2.txt +12 −18 Original line number Diff line number Diff line Loading @@ -85,21 +85,6 @@ Charger specific properties: maximum charge current in mA for each thermal level. - qcom,step-soc-thresholds Usage: optional Value type: Array of <u32> Definition: Array of SOC threshold values, size of 4. This should be a flat array that denotes the percentage ranging from 0 to 100. If the array is not present, step charging is disabled. - qcom,step-current-deltas Usage: optional Value type: Array of <s32> Definition: Array of delta values for charging current, size of 5, with FCC as base. This should be a flat array that denotes the offset of charging current in uA, from -3100000 to 3200000. If the array is not present, step charging is disabled. - io-channels Usage: optional Value type: List of <phandle u32> Loading Loading @@ -182,6 +167,18 @@ Charger specific properties: Definition: Specifies the deglitch interval for OTG detection. If the value is not present, 50 msec is used as default. - qcom,step-charging-enable Usage: optional Value type: bool Definition: Boolean flag which when present enables step-charging. - qcom,wd-bark-time-secs Usage: optional Value type: <u32> Definition: WD bark-timeout in seconds. The possible values are 16, 32, 64, 128. If not defined it defaults to 64. ============================================= Second Level Nodes - SMB2 Charger Peripherals ============================================= Loading Loading @@ -217,9 +214,6 @@ pmi8998_charger: qcom,qpnp-smb2 { dpdm-supply = <&qusb_phy0>; qcom,step-soc-thresholds = <60 70 80 90>; qcom,step-current-deltas = <500000 250000 150000 0 (-150000)>; qcom,chgr@1000 { reg = <0x1000 0x100>; interrupts = <0x2 0x10 0x0 IRQ_TYPE_NONE>, Loading
drivers/power/supply/qcom/Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -2,6 +2,6 @@ obj-$(CONFIG_QPNP_FG_GEN3) += qpnp-fg-gen3.o fg-memif.o fg-util.o obj-$(CONFIG_SMB135X_CHARGER) += smb135x-charger.o pmic-voter.o obj-$(CONFIG_SMB1355_SLAVE_CHARGER) += smb1355-charger.o pmic-voter.o obj-$(CONFIG_SMB1351_USB_CHARGER) += smb1351-charger.o pmic-voter.o battery.o obj-$(CONFIG_QPNP_SMB2) += qpnp-smb2.o smb-lib.o pmic-voter.o storm-watch.o battery.o obj-$(CONFIG_QPNP_SMB2) += step-chg-jeita.o battery.o qpnp-smb2.o smb-lib.o pmic-voter.o storm-watch.o obj-$(CONFIG_SMB138X_CHARGER) += smb138x-charger.o smb-lib.o pmic-voter.o storm-watch.o battery.o obj-$(CONFIG_QPNP_QNOVO) += qpnp-qnovo.o battery.o
drivers/power/supply/qcom/qpnp-smb2.c +66 −194 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <linux/power_supply.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/log2.h> #include <linux/qpnp/qpnp-revid.h> #include <linux/regulator/driver.h> #include <linux/regulator/of_regulator.h> Loading Loading @@ -122,87 +123,6 @@ static struct smb_params v1_params = { .max_u = 1575000, .step_u = 25000, }, .step_soc_threshold[0] = { .name = "step charge soc threshold 1", .reg = STEP_CHG_SOC_OR_BATT_V_TH1_REG, .min_u = 0, .max_u = 100, .step_u = 1, }, .step_soc_threshold[1] = { .name = "step charge soc threshold 2", .reg = STEP_CHG_SOC_OR_BATT_V_TH2_REG, .min_u = 0, .max_u = 100, .step_u = 1, }, .step_soc_threshold[2] = { .name = "step charge soc threshold 3", .reg = STEP_CHG_SOC_OR_BATT_V_TH3_REG, .min_u = 0, .max_u = 100, .step_u = 1, }, .step_soc_threshold[3] = { .name = "step charge soc threshold 4", .reg = STEP_CHG_SOC_OR_BATT_V_TH4_REG, .min_u = 0, .max_u = 100, .step_u = 1, }, .step_soc = { .name = "step charge soc", .reg = STEP_CHG_SOC_VBATT_V_REG, .min_u = 0, .max_u = 100, .step_u = 1, .set_proc = smblib_mapping_soc_from_field_value, }, .step_cc_delta[0] = { .name = "step charge current delta 1", .reg = STEP_CHG_CURRENT_DELTA1_REG, .min_u = 100000, .max_u = 3200000, .step_u = 100000, .get_proc = smblib_mapping_cc_delta_to_field_value, .set_proc = smblib_mapping_cc_delta_from_field_value, }, .step_cc_delta[1] = { .name = "step charge current delta 2", .reg = STEP_CHG_CURRENT_DELTA2_REG, .min_u = 100000, .max_u = 3200000, .step_u = 100000, .get_proc = smblib_mapping_cc_delta_to_field_value, .set_proc = smblib_mapping_cc_delta_from_field_value, }, .step_cc_delta[2] = { .name = "step charge current delta 3", .reg = STEP_CHG_CURRENT_DELTA3_REG, .min_u = 100000, .max_u = 3200000, .step_u = 100000, .get_proc = smblib_mapping_cc_delta_to_field_value, .set_proc = smblib_mapping_cc_delta_from_field_value, }, .step_cc_delta[3] = { .name = "step charge current delta 4", .reg = STEP_CHG_CURRENT_DELTA4_REG, .min_u = 100000, .max_u = 3200000, .step_u = 100000, .get_proc = smblib_mapping_cc_delta_to_field_value, .set_proc = smblib_mapping_cc_delta_from_field_value, }, .step_cc_delta[4] = { .name = "step charge current delta 5", .reg = STEP_CHG_CURRENT_DELTA5_REG, .min_u = 100000, .max_u = 3200000, .step_u = 100000, .get_proc = smblib_mapping_cc_delta_to_field_value, .set_proc = smblib_mapping_cc_delta_from_field_value, }, .freq_buck = { .name = "buck switching frequency", .reg = CFG_BUCKBOOST_FREQ_SELECT_BUCK_REG, Loading Loading @@ -236,7 +156,6 @@ static struct smb_params pm660_params = { }, }; #define STEP_CHARGING_MAX_STEPS 5 struct smb_dt_props { int usb_icl_ua; int dc_icl_ua; Loading @@ -244,14 +163,13 @@ struct smb_dt_props { int wipower_max_uw; int min_freq_khz; int max_freq_khz; u32 step_soc_threshold[STEP_CHARGING_MAX_STEPS - 1]; s32 step_cc_delta[STEP_CHARGING_MAX_STEPS]; struct device_node *revid_dev_node; int float_option; int chg_inhibit_thr_mv; bool no_battery; bool hvdcp_disable; bool auto_recharge_soc; int wd_bark_time; }; struct smb2 { Loading @@ -273,6 +191,11 @@ module_param_named( #define MICRO_1P5A 1500000 #define MICRO_P1A 100000 #define OTG_DEFAULT_DEGLITCH_TIME_MS 50 #define MIN_WD_BARK_TIME 16 #define DEFAULT_WD_BARK_TIME 64 #define BITE_WDOG_TIMEOUT_8S 0x3 #define BARK_WDOG_TIMEOUT_MASK GENMASK(3, 2) #define BARK_WDOG_TIMEOUT_SHIFT 2 static int smb2_parse_dt(struct smb2 *chip) { struct smb_charger *chg = &chip->chg; Loading @@ -284,27 +207,13 @@ static int smb2_parse_dt(struct smb2 *chip) return -EINVAL; } chg->step_chg_enabled = true; if (of_property_count_u32_elems(node, "qcom,step-soc-thresholds") != STEP_CHARGING_MAX_STEPS - 1) chg->step_chg_enabled = false; rc = of_property_read_u32_array(node, "qcom,step-soc-thresholds", chip->dt.step_soc_threshold, STEP_CHARGING_MAX_STEPS - 1); if (rc < 0) chg->step_chg_enabled = false; chg->step_chg_enabled = of_property_read_bool(node, "qcom,step-charging-enable"); if (of_property_count_u32_elems(node, "qcom,step-current-deltas") != STEP_CHARGING_MAX_STEPS) chg->step_chg_enabled = false; rc = of_property_read_u32_array(node, "qcom,step-current-deltas", chip->dt.step_cc_delta, STEP_CHARGING_MAX_STEPS); if (rc < 0) chg->step_chg_enabled = false; rc = of_property_read_u32(node, "qcom,wd-bark-time-secs", &chip->dt.wd_bark_time); if (rc < 0 || chip->dt.wd_bark_time < MIN_WD_BARK_TIME) chip->dt.wd_bark_time = DEFAULT_WD_BARK_TIME; chip->dt.no_battery = of_property_read_bool(node, "qcom,batteryless-platform"); Loading Loading @@ -988,7 +897,6 @@ static enum power_supply_property smb2_batt_props[] = { POWER_SUPPLY_PROP_TEMP, POWER_SUPPLY_PROP_TECHNOLOGY, POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED, POWER_SUPPLY_PROP_STEP_CHARGING_STEP, POWER_SUPPLY_PROP_CHARGE_DONE, POWER_SUPPLY_PROP_PARALLEL_DISABLE, POWER_SUPPLY_PROP_SET_SHIP_MODE, Loading Loading @@ -1051,9 +959,6 @@ static int smb2_batt_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED: val->intval = chg->step_chg_enabled; break; case POWER_SUPPLY_PROP_STEP_CHARGING_STEP: rc = smblib_get_prop_step_chg_step(chg, val); break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: rc = smblib_get_prop_batt_voltage_now(chg, val); break; Loading Loading @@ -1167,6 +1072,9 @@ static int smb2_batt_set_prop(struct power_supply *psy, vote(chg->fcc_votable, BATT_PROFILE_VOTER, false, 0); } break; case POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED: chg->step_chg_enabled = !!val->intval; break; case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: chg->batt_profile_fcc_ua = val->intval; vote(chg->fcc_votable, BATT_PROFILE_VOTER, true, val->intval); Loading Loading @@ -1207,6 +1115,7 @@ static int smb2_batt_prop_is_writeable(struct power_supply *psy, 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: return 1; default: break; Loading Loading @@ -1334,73 +1243,6 @@ static int smb2_init_vconn_regulator(struct smb2 *chip) /*************************** * HARDWARE INITIALIZATION * ***************************/ static int smb2_config_step_charging(struct smb2 *chip) { struct smb_charger *chg = &chip->chg; int rc = 0; int i; if (!chg->step_chg_enabled) return rc; for (i = 0; i < STEP_CHARGING_MAX_STEPS - 1; i++) { rc = smblib_set_charge_param(chg, &chg->param.step_soc_threshold[i], chip->dt.step_soc_threshold[i]); if (rc < 0) { pr_err("Couldn't configure soc thresholds rc = %d\n", rc); goto err_out; } } for (i = 0; i < STEP_CHARGING_MAX_STEPS; i++) { rc = smblib_set_charge_param(chg, &chg->param.step_cc_delta[i], chip->dt.step_cc_delta[i]); if (rc < 0) { pr_err("Couldn't configure cc delta rc = %d\n", rc); goto err_out; } } rc = smblib_write(chg, STEP_CHG_UPDATE_REQUEST_TIMEOUT_CFG_REG, STEP_CHG_UPDATE_REQUEST_TIMEOUT_40S); if (rc < 0) { dev_err(chg->dev, "Couldn't configure soc request timeout reg rc=%d\n", rc); goto err_out; } rc = smblib_write(chg, STEP_CHG_UPDATE_FAIL_TIMEOUT_CFG_REG, STEP_CHG_UPDATE_FAIL_TIMEOUT_120S); if (rc < 0) { dev_err(chg->dev, "Couldn't configure soc fail timeout reg rc=%d\n", rc); goto err_out; } /* * enable step charging, source soc, standard mode, go to final * state in case of failure. */ rc = smblib_write(chg, CHGR_STEP_CHG_MODE_CFG_REG, STEP_CHARGING_ENABLE_BIT | STEP_CHARGING_SOURCE_SELECT_BIT | STEP_CHARGING_SOC_FAIL_OPTION_BIT); if (rc < 0) { dev_err(chg->dev, "Couldn't configure charger rc=%d\n", rc); goto err_out; } return 0; err_out: chg->step_chg_enabled = false; return rc; } static int smb2_config_wipower_input_power(struct smb2 *chip, int uw) { int rc; Loading Loading @@ -1576,7 +1418,7 @@ static int smb2_init_hw(struct smb2 *chip) { struct smb_charger *chg = &chip->chg; int rc; u8 stat; u8 stat, val; if (chip->dt.no_battery) chg->fake_capacity = 50; Loading Loading @@ -1724,11 +1566,27 @@ static int smb2_init_hw(struct smb2 *chip) return rc; } /* configure step charging */ rc = smb2_config_step_charging(chip); if (rc < 0) { dev_err(chg->dev, "Couldn't configure step charging rc=%d\n", rc); val = (ilog2(chip->dt.wd_bark_time / 16) << BARK_WDOG_TIMEOUT_SHIFT) & BARK_WDOG_TIMEOUT_MASK; val |= BITE_WDOG_TIMEOUT_8S; rc = smblib_masked_write(chg, SNARL_BARK_BITE_WD_CFG_REG, BITE_WDOG_DISABLE_CHARGING_CFG_BIT | BARK_WDOG_TIMEOUT_MASK | BITE_WDOG_TIMEOUT_MASK, val); if (rc) { pr_err("Couldn't configue WD config rc=%d\n", rc); return rc; } /* enable WD BARK and enable it on plugin */ rc = smblib_masked_write(chg, WD_CFG_REG, WATCHDOG_TRIGGER_AFP_EN_BIT | WDOG_TIMER_EN_ON_PLUGIN_BIT | BARK_WDOG_INT_EN_BIT, WDOG_TIMER_EN_ON_PLUGIN_BIT | BARK_WDOG_INT_EN_BIT); if (rc) { pr_err("Couldn't configue WD config rc=%d\n", rc); return rc; } Loading Loading @@ -1787,6 +1645,13 @@ static int smb2_init_hw(struct smb2 *chip) return rc; } rc = smblib_read(chg, USBIN_OPTIONS_2_CFG_REG, &chg->float_cfg); if (rc < 0) { dev_err(chg->dev, "Couldn't read float charger options rc=%d\n", rc); return rc; } switch (chip->dt.chg_inhibit_thr_mv) { case 50: rc = smblib_masked_write(chg, CHARGE_INHIBIT_THRESHOLD_CFG_REG, Loading Loading @@ -1851,6 +1716,12 @@ static int smb2_post_init(struct smb2 *chip) struct smb_charger *chg = &chip->chg; int rc; /* In case the usb path is suspended, we would have missed disabling * the icl change interrupt because the interrupt could have been * not requested */ rerun_election(chg->usb_icl_votable); /* configure power role for dual-role */ rc = smblib_masked_write(chg, TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG, TYPEC_POWER_ROLE_CMD_MASK, 0); Loading Loading @@ -1942,8 +1813,8 @@ static int smb2_determine_initial_status(struct smb2 *chip) smblib_handle_usb_source_change(0, &irq_data); smblib_handle_chg_state_change(0, &irq_data); smblib_handle_icl_change(0, &irq_data); smblib_handle_step_chg_state_change(0, &irq_data); smblib_handle_step_chg_soc_update_request(0, &irq_data); smblib_handle_batt_temp_changed(0, &irq_data); smblib_handle_wdog_bark(0, &irq_data); return 0; } Loading @@ -1965,18 +1836,15 @@ static struct smb_irq_info smb2_irqs[] = { }, [STEP_CHG_STATE_CHANGE_IRQ] = { .name = "step-chg-state-change", .handler = smblib_handle_step_chg_state_change, .wake = true, .handler = NULL, }, [STEP_CHG_SOC_UPDATE_FAIL_IRQ] = { .name = "step-chg-soc-update-fail", .handler = smblib_handle_step_chg_soc_update_fail, .wake = true, .handler = NULL, }, [STEP_CHG_SOC_UPDATE_REQ_IRQ] = { .name = "step-chg-soc-update-request", .handler = smblib_handle_step_chg_soc_update_request, .wake = true, .handler = NULL, }, /* OTG IRQs */ [OTG_FAIL_IRQ] = { Loading @@ -1999,6 +1867,7 @@ static struct smb_irq_info smb2_irqs[] = { [BATT_TEMP_IRQ] = { .name = "bat-temp", .handler = smblib_handle_batt_temp_changed, .wake = true, }, [BATT_OCP_IRQ] = { .name = "bat-ocp", Loading Loading @@ -2094,7 +1963,8 @@ static struct smb_irq_info smb2_irqs[] = { }, [WDOG_BARK_IRQ] = { .name = "wdog-bark", .handler = NULL, .handler = smblib_handle_wdog_bark, .wake = true, }, [AICL_FAIL_IRQ] = { .name = "aicl-fail", Loading Loading @@ -2200,6 +2070,8 @@ static int smb2_request_interrupts(struct smb2 *chip) return rc; } } if (chg->irq_info[USBIN_ICL_CHANGE_IRQ].irq) chg->usb_icl_change_irq_enabled = true; return rc; } Loading Loading @@ -2332,15 +2204,15 @@ static int smb2_probe(struct platform_device *pdev) return rc; } rc = smblib_init(chg); rc = smb2_parse_dt(chip); if (rc < 0) { pr_err("Smblib_init failed rc=%d\n", rc); pr_err("Couldn't parse device tree rc=%d\n", rc); goto cleanup; } rc = smb2_parse_dt(chip); rc = smblib_init(chg); if (rc < 0) { pr_err("Couldn't parse device tree rc=%d\n", rc); pr_err("Smblib_init failed rc=%d\n", rc); goto cleanup; } Loading
drivers/power/supply/qcom/smb-lib.c +278 −218 File changed.Preview size limit exceeded, changes collapsed. Show changes
drivers/power/supply/qcom/smb-lib.h +4 −11 Original line number Diff line number Diff line Loading @@ -192,9 +192,6 @@ struct smb_params { struct smb_chg_param dc_icl_div2_mid_hv; struct smb_chg_param dc_icl_div2_hv; struct smb_chg_param jeita_cc_comp; struct smb_chg_param step_soc_threshold[4]; struct smb_chg_param step_soc; struct smb_chg_param step_cc_delta[5]; struct smb_chg_param freq_buck; struct smb_chg_param freq_boost; }; Loading Loading @@ -289,7 +286,6 @@ struct smb_charger { struct work_struct rdstd_cc2_detach_work; struct delayed_work hvdcp_detect_work; struct delayed_work ps_change_timeout_work; struct delayed_work step_soc_req_work; struct delayed_work clear_hdc_work; struct work_struct otg_oc_work; struct work_struct vconn_oc_work; Loading Loading @@ -330,6 +326,9 @@ struct smb_charger { int fake_input_current_limited; bool pr_swap_in_progress; int typec_mode; int usb_icl_change_irq_enabled; u32 jeita_status; u8 float_cfg; /* workaround flag */ u32 wa_flags; Loading Loading @@ -384,9 +383,6 @@ int smblib_vconn_regulator_is_enabled(struct regulator_dev *rdev); irqreturn_t smblib_handle_debug(int irq, void *data); irqreturn_t smblib_handle_otg_overcurrent(int irq, void *data); irqreturn_t smblib_handle_chg_state_change(int irq, void *data); irqreturn_t smblib_handle_step_chg_state_change(int irq, void *data); irqreturn_t smblib_handle_step_chg_soc_update_fail(int irq, void *data); irqreturn_t smblib_handle_step_chg_soc_update_request(int irq, void *data); irqreturn_t smblib_handle_batt_temp_changed(int irq, void *data); irqreturn_t smblib_handle_batt_psy_changed(int irq, void *data); irqreturn_t smblib_handle_usb_psy_changed(int irq, void *data); Loading Loading @@ -426,9 +422,6 @@ int smblib_get_prop_batt_current_now(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_batt_temp(struct smb_charger *chg, union power_supply_propval *val); int smblib_get_prop_step_chg_step(struct smb_charger *chg, union power_supply_propval *val); int smblib_set_prop_input_suspend(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_batt_capacity(struct smb_charger *chg, Loading