Loading arch/arm/boot/dts/qcom/msm-smb138x.dtsi +6 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,12 @@ "connector_temp_thr3", "charger_temp_max"; qcom,chgr@1000 { reg = <0x1000 0x100>; interrupts = <0x10 0x1 IRQ_TYPE_EDGE_RISING>; interrupt-names = "chg-state-change"; }; qcom,chgr-misc@1600 { reg = <0x1600 0x100>; interrupts = <0x16 0x1 IRQ_TYPE_EDGE_RISING>, Loading drivers/power/power_supply_sysfs.c +1 −0 Original line number Diff line number Diff line Loading @@ -239,6 +239,7 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(input_current_max), POWER_SUPPLY_ATTR(input_current_trim), POWER_SUPPLY_ATTR(input_current_settled), POWER_SUPPLY_ATTR(input_voltage_settled), POWER_SUPPLY_ATTR(bypass_vchg_loop_debouncer), POWER_SUPPLY_ATTR(charge_counter_shadow), POWER_SUPPLY_ATTR(hi_power), Loading drivers/power/supply/qcom/battery.c +19 −14 Original line number Diff line number Diff line Loading @@ -247,12 +247,11 @@ done: * FCC * **********/ #define EFFICIENCY_PCT 80 #define MICRO_5V 5000000 static void split_fcc(struct pl_data *chip, int total_ua, int *master_ua, int *slave_ua) { int rc, effective_total_ua, slave_limited_ua, hw_cc_delta_ua = 0, aicl_settled_ua, input_limited_fcc_ua; icl_ua, adapter_uv, bcl_ua; union power_supply_propval pval = {0, }; rc = power_supply_get_property(chip->main_psy, Loading @@ -262,24 +261,30 @@ static void split_fcc(struct pl_data *chip, int total_ua, else hw_cc_delta_ua = pval.intval; input_limited_fcc_ua = INT_MAX; bcl_ua = INT_MAX; if (chip->pl_mode == POWER_SUPPLY_PARALLEL_MID_MID) { rc = power_supply_get_property(chip->main_psy, POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, &pval); if (rc < 0) aicl_settled_ua = 0; else aicl_settled_ua = pval.intval; POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, &pval); if (rc < 0) { pr_err("Couldn't get aicl settled value rc=%d\n", rc); return; } icl_ua = pval.intval; rc = power_supply_get_property(chip->main_psy, POWER_SUPPLY_PROP_INPUT_VOLTAGE_SETTLED, &pval); if (rc < 0) { pr_err("Couldn't get adaptive voltage rc=%d\n", rc); return; } adapter_uv = pval.intval; input_limited_fcc_ua = div64_s64( (s64)aicl_settled_ua * MICRO_5V * EFFICIENCY_PCT, (s64)get_effective_result(chip->fv_votable) * 100); bcl_ua = div64_s64((s64)icl_ua * adapter_uv * EFFICIENCY_PCT, (s64)get_effective_result(chip->fv_votable) * 100); } effective_total_ua = max(0, total_ua + hw_cc_delta_ua); slave_limited_ua = min(effective_total_ua, input_limited_fcc_ua); slave_limited_ua = min(effective_total_ua, bcl_ua); *slave_ua = (slave_limited_ua * chip->slave_pct) / 100; *slave_ua = (*slave_ua * chip->taper_pct) / 100; *master_ua = max(0, total_ua - *slave_ua); Loading drivers/power/supply/qcom/qpnp-smb2.c +46 −48 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ #include <linux/platform_device.h> #include <linux/regmap.h> #include <linux/power_supply.h> #include <linux/interrupt.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/qpnp/qpnp-revid.h> Loading Loading @@ -615,6 +614,7 @@ static enum power_supply_property smb2_usb_main_props[] = { POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, POWER_SUPPLY_PROP_TYPE, POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, POWER_SUPPLY_PROP_INPUT_VOLTAGE_SETTLED, POWER_SUPPLY_PROP_FCC_DELTA, /* * TODO move the TEMP and TEMP_MAX properties here, Loading Loading @@ -647,6 +647,9 @@ static int smb2_usb_main_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED: rc = smblib_get_prop_input_current_settled(chg, val); break; case POWER_SUPPLY_PROP_INPUT_VOLTAGE_SETTLED: rc = smblib_get_prop_input_voltage_settled(chg, val); break; case POWER_SUPPLY_PROP_FCC_DELTA: rc = smblib_get_prop_fcc_delta(chg, val); break; Loading Loading @@ -1664,180 +1667,172 @@ static int smb2_determine_initial_status(struct smb2 *chip) * INTERRUPT REGISTRATION * **************************/ struct smb2_irq_info { const char *name; const irq_handler_t handler; const bool wake; const struct storm_watch storm_data; int irq; }; static struct smb2_irq_info smb2_irqs[] = { static struct smb_irq_info smb2_irqs[] = { /* CHARGER IRQs */ { [CHG_ERROR_IRQ] = { .name = "chg-error", .handler = smblib_handle_debug, }, { [CHG_STATE_CHANGE_IRQ] = { .name = "chg-state-change", .handler = smblib_handle_chg_state_change, .wake = true, }, { [STEP_CHG_STATE_CHANGE_IRQ] = { .name = "step-chg-state-change", .handler = smblib_handle_step_chg_state_change, .wake = true, }, { [STEP_CHG_SOC_UPDATE_FAIL_IRQ] = { .name = "step-chg-soc-update-fail", .handler = smblib_handle_step_chg_soc_update_fail, .wake = true, }, { [STEP_CHG_SOC_UPDATE_REQ_IRQ] = { .name = "step-chg-soc-update-request", .handler = smblib_handle_step_chg_soc_update_request, .wake = true, }, /* OTG IRQs */ { [OTG_FAIL_IRQ] = { .name = "otg-fail", .handler = smblib_handle_debug, }, { [OTG_OVERCURRENT_IRQ] = { .name = "otg-overcurrent", .handler = smblib_handle_otg_overcurrent, }, { [OTG_OC_DIS_SW_STS_IRQ] = { .name = "otg-oc-dis-sw-sts", .handler = smblib_handle_debug, }, { [TESTMODE_CHANGE_DET_IRQ] = { .name = "testmode-change-detect", .handler = smblib_handle_debug, }, /* BATTERY IRQs */ { [BATT_TEMP_IRQ] = { .name = "bat-temp", .handler = smblib_handle_batt_temp_changed, }, { [BATT_OCP_IRQ] = { .name = "bat-ocp", .handler = smblib_handle_batt_psy_changed, }, { [BATT_OV_IRQ] = { .name = "bat-ov", .handler = smblib_handle_batt_psy_changed, }, { [BATT_LOW_IRQ] = { .name = "bat-low", .handler = smblib_handle_batt_psy_changed, }, { [BATT_THERM_ID_MISS_IRQ] = { .name = "bat-therm-or-id-missing", .handler = smblib_handle_batt_psy_changed, }, { [BATT_TERM_MISS_IRQ] = { .name = "bat-terminal-missing", .handler = smblib_handle_batt_psy_changed, }, /* USB INPUT IRQs */ { [USBIN_COLLAPSE_IRQ] = { .name = "usbin-collapse", .handler = smblib_handle_debug, }, { [USBIN_LT_3P6V_IRQ] = { .name = "usbin-lt-3p6v", .handler = smblib_handle_debug, }, { [USBIN_UV_IRQ] = { .name = "usbin-uv", .handler = smblib_handle_debug, }, { [USBIN_OV_IRQ] = { .name = "usbin-ov", .handler = smblib_handle_debug, }, { [USBIN_PLUGIN_IRQ] = { .name = "usbin-plugin", .handler = smblib_handle_usb_plugin, .wake = true, }, { [USBIN_SRC_CHANGE_IRQ] = { .name = "usbin-src-change", .handler = smblib_handle_usb_source_change, .wake = true, }, { [USBIN_ICL_CHANGE_IRQ] = { .name = "usbin-icl-change", .handler = smblib_handle_icl_change, .wake = true, }, { [TYPE_C_CHANGE_IRQ] = { .name = "type-c-change", .handler = smblib_handle_usb_typec_change, .wake = true, }, /* DC INPUT IRQs */ { [DCIN_COLLAPSE_IRQ] = { .name = "dcin-collapse", .handler = smblib_handle_debug, }, { [DCIN_LT_3P6V_IRQ] = { .name = "dcin-lt-3p6v", .handler = smblib_handle_debug, }, { [DCIN_UV_IRQ] = { .name = "dcin-uv", .handler = smblib_handle_debug, }, { [DCIN_OV_IRQ] = { .name = "dcin-ov", .handler = smblib_handle_debug, }, { [DCIN_PLUGIN_IRQ] = { .name = "dcin-plugin", .handler = smblib_handle_dc_plugin, .wake = true, }, { [DIV2_EN_DG_IRQ] = { .name = "div2-en-dg", .handler = smblib_handle_debug, }, { [DCIN_ICL_CHANGE_IRQ] = { .name = "dcin-icl-change", .handler = smblib_handle_debug, }, /* MISCELLANEOUS IRQs */ { [WDOG_SNARL_IRQ] = { .name = "wdog-snarl", .handler = NULL, }, { [WDOG_BARK_IRQ] = { .name = "wdog-bark", .handler = NULL, }, { [AICL_FAIL_IRQ] = { .name = "aicl-fail", .handler = smblib_handle_debug, }, { [AICL_DONE_IRQ] = { .name = "aicl-done", .handler = smblib_handle_debug, }, { [HIGH_DUTY_CYCLE_IRQ] = { .name = "high-duty-cycle", .handler = smblib_handle_high_duty_cycle, .wake = true, }, { [INPUT_CURRENT_LIMIT_IRQ] = { .name = "input-current-limiting", .handler = smblib_handle_debug, }, { [TEMPERATURE_CHANGE_IRQ] = { .name = "temperature-change", .handler = smblib_handle_debug, }, { [SWITCH_POWER_OK_IRQ] = { .name = "switcher-power-ok", .handler = smblib_handle_switcher_power_ok, .storm_data = {true, 1000, 3}, Loading Loading @@ -1885,6 +1880,7 @@ static int smb2_request_interrupt(struct smb2 *chip, irq_data->parent_data = chip; irq_data->name = irq_name; irq_data->storm_data = smb2_irqs[irq_index].storm_data; mutex_init(&irq_data->storm_data.storm_lock); rc = devm_request_threaded_irq(chg->dev, irq, NULL, smb2_irqs[irq_index].handler, Loading @@ -1895,6 +1891,7 @@ static int smb2_request_interrupt(struct smb2 *chip, } smb2_irqs[irq_index].irq = irq; smb2_irqs[irq_index].irq_data = irq_data; if (smb2_irqs[irq_index].wake) enable_irq_wake(irq); Loading Loading @@ -2008,6 +2005,7 @@ static int smb2_probe(struct platform_device *pdev) chg->param = v1_params; chg->debug_mask = &__debug_mask; chg->mode = PARALLEL_MASTER; chg->irq_info = smb2_irqs; chg->name = "PMI"; chg->regmap = dev_get_regmap(chg->dev->parent, NULL); Loading drivers/power/supply/qcom/smb-lib.c +41 −20 Original line number Diff line number Diff line Loading @@ -331,7 +331,6 @@ static const struct apsd_result *smblib_get_apsd_result(struct smb_charger *chg) return result; } /******************** * REGISTER SETTERS * ********************/ Loading Loading @@ -1993,6 +1992,39 @@ int smblib_get_prop_input_current_settled(struct smb_charger *chg, return smblib_get_charge_param(chg, &chg->param.icl_stat, &val->intval); } #define HVDCP3_STEP_UV 200000 int smblib_get_prop_input_voltage_settled(struct smb_charger *chg, union power_supply_propval *val) { const struct apsd_result *apsd_result = smblib_get_apsd_result(chg); int rc, pulses; u8 stat; val->intval = MICRO_5V; if (apsd_result == NULL) { smblib_err(chg, "APSD result is NULL\n"); return 0; } switch (apsd_result->pst) { case POWER_SUPPLY_TYPE_USB_HVDCP_3: rc = smblib_read(chg, QC_PULSE_COUNT_STATUS_REG, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read QC_PULSE_COUNT rc=%d\n", rc); return 0; } pulses = (stat & QC_PULSE_COUNT_MASK); val->intval = MICRO_5V + HVDCP3_STEP_UV * pulses; break; default: val->intval = MICRO_5V; break; } return 0; } int smblib_get_prop_pd_in_hard_reset(struct smb_charger *chg, union power_supply_propval *val) { Loading Loading @@ -2840,22 +2872,20 @@ irqreturn_t smblib_handle_icl_change(int irq, void *data) struct smb_charger *chg = irq_data->parent_data; int rc, settled_ua; smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name); rc = smblib_get_charge_param(chg, &chg->param.icl_stat, &settled_ua); if (rc < 0) { smblib_err(chg, "Couldn't get ICL status rc=%d\n", rc); return IRQ_HANDLED; } if (chg->mode != PARALLEL_MASTER) return IRQ_HANDLED; if (chg->mode == PARALLEL_MASTER) { power_supply_changed(chg->usb_main_psy); vote(chg->pl_enable_votable_indirect, USBIN_I_VOTER, settled_ua >= USB_WEAK_INPUT_UA, 0); } smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s icl_settled=%d\n", irq_data->name, settled_ua); return IRQ_HANDLED; } Loading @@ -2882,6 +2912,7 @@ static void smblib_hvdcp_adaptive_voltage_change(struct smb_charger *chg) u8 stat; int pulses; power_supply_changed(chg->usb_main_psy); if (chg->usb_psy_desc.type == POWER_SUPPLY_TYPE_USB_HVDCP) { rc = smblib_read(chg, QC_CHANGE_STATUS_REG, &stat); if (rc < 0) { Loading Loading @@ -2934,13 +2965,6 @@ static void smblib_hvdcp_adaptive_voltage_change(struct smb_charger *chg) } } static void smblib_handle_adaptive_voltage_done(struct smb_charger *chg, bool rising) { smblib_dbg(chg, PR_INTERRUPT, "IRQ: adaptive-voltage-done %s\n", rising ? "rising" : "falling"); } /* triggers when HVDCP 3.0 authentication has finished */ static void smblib_handle_hvdcp_3p0_auth_done(struct smb_charger *chg, bool rising) Loading Loading @@ -3082,9 +3106,6 @@ irqreturn_t smblib_handle_usb_source_change(int irq, void *data) smblib_handle_hvdcp_3p0_auth_done(chg, (bool)(stat & QC_AUTH_DONE_STATUS_BIT)); smblib_handle_adaptive_voltage_done(chg, (bool)(stat & VADP_CHANGE_DONE_AFTER_AUTH_BIT)); smblib_handle_sdp_enumeration_done(chg, (bool)(stat & ENUMERATION_DONE_BIT)); Loading Loading
arch/arm/boot/dts/qcom/msm-smb138x.dtsi +6 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,12 @@ "connector_temp_thr3", "charger_temp_max"; qcom,chgr@1000 { reg = <0x1000 0x100>; interrupts = <0x10 0x1 IRQ_TYPE_EDGE_RISING>; interrupt-names = "chg-state-change"; }; qcom,chgr-misc@1600 { reg = <0x1600 0x100>; interrupts = <0x16 0x1 IRQ_TYPE_EDGE_RISING>, Loading
drivers/power/power_supply_sysfs.c +1 −0 Original line number Diff line number Diff line Loading @@ -239,6 +239,7 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(input_current_max), POWER_SUPPLY_ATTR(input_current_trim), POWER_SUPPLY_ATTR(input_current_settled), POWER_SUPPLY_ATTR(input_voltage_settled), POWER_SUPPLY_ATTR(bypass_vchg_loop_debouncer), POWER_SUPPLY_ATTR(charge_counter_shadow), POWER_SUPPLY_ATTR(hi_power), Loading
drivers/power/supply/qcom/battery.c +19 −14 Original line number Diff line number Diff line Loading @@ -247,12 +247,11 @@ done: * FCC * **********/ #define EFFICIENCY_PCT 80 #define MICRO_5V 5000000 static void split_fcc(struct pl_data *chip, int total_ua, int *master_ua, int *slave_ua) { int rc, effective_total_ua, slave_limited_ua, hw_cc_delta_ua = 0, aicl_settled_ua, input_limited_fcc_ua; icl_ua, adapter_uv, bcl_ua; union power_supply_propval pval = {0, }; rc = power_supply_get_property(chip->main_psy, Loading @@ -262,24 +261,30 @@ static void split_fcc(struct pl_data *chip, int total_ua, else hw_cc_delta_ua = pval.intval; input_limited_fcc_ua = INT_MAX; bcl_ua = INT_MAX; if (chip->pl_mode == POWER_SUPPLY_PARALLEL_MID_MID) { rc = power_supply_get_property(chip->main_psy, POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, &pval); if (rc < 0) aicl_settled_ua = 0; else aicl_settled_ua = pval.intval; POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, &pval); if (rc < 0) { pr_err("Couldn't get aicl settled value rc=%d\n", rc); return; } icl_ua = pval.intval; rc = power_supply_get_property(chip->main_psy, POWER_SUPPLY_PROP_INPUT_VOLTAGE_SETTLED, &pval); if (rc < 0) { pr_err("Couldn't get adaptive voltage rc=%d\n", rc); return; } adapter_uv = pval.intval; input_limited_fcc_ua = div64_s64( (s64)aicl_settled_ua * MICRO_5V * EFFICIENCY_PCT, (s64)get_effective_result(chip->fv_votable) * 100); bcl_ua = div64_s64((s64)icl_ua * adapter_uv * EFFICIENCY_PCT, (s64)get_effective_result(chip->fv_votable) * 100); } effective_total_ua = max(0, total_ua + hw_cc_delta_ua); slave_limited_ua = min(effective_total_ua, input_limited_fcc_ua); slave_limited_ua = min(effective_total_ua, bcl_ua); *slave_ua = (slave_limited_ua * chip->slave_pct) / 100; *slave_ua = (*slave_ua * chip->taper_pct) / 100; *master_ua = max(0, total_ua - *slave_ua); Loading
drivers/power/supply/qcom/qpnp-smb2.c +46 −48 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ #include <linux/platform_device.h> #include <linux/regmap.h> #include <linux/power_supply.h> #include <linux/interrupt.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/qpnp/qpnp-revid.h> Loading Loading @@ -615,6 +614,7 @@ static enum power_supply_property smb2_usb_main_props[] = { POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, POWER_SUPPLY_PROP_TYPE, POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, POWER_SUPPLY_PROP_INPUT_VOLTAGE_SETTLED, POWER_SUPPLY_PROP_FCC_DELTA, /* * TODO move the TEMP and TEMP_MAX properties here, Loading Loading @@ -647,6 +647,9 @@ static int smb2_usb_main_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED: rc = smblib_get_prop_input_current_settled(chg, val); break; case POWER_SUPPLY_PROP_INPUT_VOLTAGE_SETTLED: rc = smblib_get_prop_input_voltage_settled(chg, val); break; case POWER_SUPPLY_PROP_FCC_DELTA: rc = smblib_get_prop_fcc_delta(chg, val); break; Loading Loading @@ -1664,180 +1667,172 @@ static int smb2_determine_initial_status(struct smb2 *chip) * INTERRUPT REGISTRATION * **************************/ struct smb2_irq_info { const char *name; const irq_handler_t handler; const bool wake; const struct storm_watch storm_data; int irq; }; static struct smb2_irq_info smb2_irqs[] = { static struct smb_irq_info smb2_irqs[] = { /* CHARGER IRQs */ { [CHG_ERROR_IRQ] = { .name = "chg-error", .handler = smblib_handle_debug, }, { [CHG_STATE_CHANGE_IRQ] = { .name = "chg-state-change", .handler = smblib_handle_chg_state_change, .wake = true, }, { [STEP_CHG_STATE_CHANGE_IRQ] = { .name = "step-chg-state-change", .handler = smblib_handle_step_chg_state_change, .wake = true, }, { [STEP_CHG_SOC_UPDATE_FAIL_IRQ] = { .name = "step-chg-soc-update-fail", .handler = smblib_handle_step_chg_soc_update_fail, .wake = true, }, { [STEP_CHG_SOC_UPDATE_REQ_IRQ] = { .name = "step-chg-soc-update-request", .handler = smblib_handle_step_chg_soc_update_request, .wake = true, }, /* OTG IRQs */ { [OTG_FAIL_IRQ] = { .name = "otg-fail", .handler = smblib_handle_debug, }, { [OTG_OVERCURRENT_IRQ] = { .name = "otg-overcurrent", .handler = smblib_handle_otg_overcurrent, }, { [OTG_OC_DIS_SW_STS_IRQ] = { .name = "otg-oc-dis-sw-sts", .handler = smblib_handle_debug, }, { [TESTMODE_CHANGE_DET_IRQ] = { .name = "testmode-change-detect", .handler = smblib_handle_debug, }, /* BATTERY IRQs */ { [BATT_TEMP_IRQ] = { .name = "bat-temp", .handler = smblib_handle_batt_temp_changed, }, { [BATT_OCP_IRQ] = { .name = "bat-ocp", .handler = smblib_handle_batt_psy_changed, }, { [BATT_OV_IRQ] = { .name = "bat-ov", .handler = smblib_handle_batt_psy_changed, }, { [BATT_LOW_IRQ] = { .name = "bat-low", .handler = smblib_handle_batt_psy_changed, }, { [BATT_THERM_ID_MISS_IRQ] = { .name = "bat-therm-or-id-missing", .handler = smblib_handle_batt_psy_changed, }, { [BATT_TERM_MISS_IRQ] = { .name = "bat-terminal-missing", .handler = smblib_handle_batt_psy_changed, }, /* USB INPUT IRQs */ { [USBIN_COLLAPSE_IRQ] = { .name = "usbin-collapse", .handler = smblib_handle_debug, }, { [USBIN_LT_3P6V_IRQ] = { .name = "usbin-lt-3p6v", .handler = smblib_handle_debug, }, { [USBIN_UV_IRQ] = { .name = "usbin-uv", .handler = smblib_handle_debug, }, { [USBIN_OV_IRQ] = { .name = "usbin-ov", .handler = smblib_handle_debug, }, { [USBIN_PLUGIN_IRQ] = { .name = "usbin-plugin", .handler = smblib_handle_usb_plugin, .wake = true, }, { [USBIN_SRC_CHANGE_IRQ] = { .name = "usbin-src-change", .handler = smblib_handle_usb_source_change, .wake = true, }, { [USBIN_ICL_CHANGE_IRQ] = { .name = "usbin-icl-change", .handler = smblib_handle_icl_change, .wake = true, }, { [TYPE_C_CHANGE_IRQ] = { .name = "type-c-change", .handler = smblib_handle_usb_typec_change, .wake = true, }, /* DC INPUT IRQs */ { [DCIN_COLLAPSE_IRQ] = { .name = "dcin-collapse", .handler = smblib_handle_debug, }, { [DCIN_LT_3P6V_IRQ] = { .name = "dcin-lt-3p6v", .handler = smblib_handle_debug, }, { [DCIN_UV_IRQ] = { .name = "dcin-uv", .handler = smblib_handle_debug, }, { [DCIN_OV_IRQ] = { .name = "dcin-ov", .handler = smblib_handle_debug, }, { [DCIN_PLUGIN_IRQ] = { .name = "dcin-plugin", .handler = smblib_handle_dc_plugin, .wake = true, }, { [DIV2_EN_DG_IRQ] = { .name = "div2-en-dg", .handler = smblib_handle_debug, }, { [DCIN_ICL_CHANGE_IRQ] = { .name = "dcin-icl-change", .handler = smblib_handle_debug, }, /* MISCELLANEOUS IRQs */ { [WDOG_SNARL_IRQ] = { .name = "wdog-snarl", .handler = NULL, }, { [WDOG_BARK_IRQ] = { .name = "wdog-bark", .handler = NULL, }, { [AICL_FAIL_IRQ] = { .name = "aicl-fail", .handler = smblib_handle_debug, }, { [AICL_DONE_IRQ] = { .name = "aicl-done", .handler = smblib_handle_debug, }, { [HIGH_DUTY_CYCLE_IRQ] = { .name = "high-duty-cycle", .handler = smblib_handle_high_duty_cycle, .wake = true, }, { [INPUT_CURRENT_LIMIT_IRQ] = { .name = "input-current-limiting", .handler = smblib_handle_debug, }, { [TEMPERATURE_CHANGE_IRQ] = { .name = "temperature-change", .handler = smblib_handle_debug, }, { [SWITCH_POWER_OK_IRQ] = { .name = "switcher-power-ok", .handler = smblib_handle_switcher_power_ok, .storm_data = {true, 1000, 3}, Loading Loading @@ -1885,6 +1880,7 @@ static int smb2_request_interrupt(struct smb2 *chip, irq_data->parent_data = chip; irq_data->name = irq_name; irq_data->storm_data = smb2_irqs[irq_index].storm_data; mutex_init(&irq_data->storm_data.storm_lock); rc = devm_request_threaded_irq(chg->dev, irq, NULL, smb2_irqs[irq_index].handler, Loading @@ -1895,6 +1891,7 @@ static int smb2_request_interrupt(struct smb2 *chip, } smb2_irqs[irq_index].irq = irq; smb2_irqs[irq_index].irq_data = irq_data; if (smb2_irqs[irq_index].wake) enable_irq_wake(irq); Loading Loading @@ -2008,6 +2005,7 @@ static int smb2_probe(struct platform_device *pdev) chg->param = v1_params; chg->debug_mask = &__debug_mask; chg->mode = PARALLEL_MASTER; chg->irq_info = smb2_irqs; chg->name = "PMI"; chg->regmap = dev_get_regmap(chg->dev->parent, NULL); Loading
drivers/power/supply/qcom/smb-lib.c +41 −20 Original line number Diff line number Diff line Loading @@ -331,7 +331,6 @@ static const struct apsd_result *smblib_get_apsd_result(struct smb_charger *chg) return result; } /******************** * REGISTER SETTERS * ********************/ Loading Loading @@ -1993,6 +1992,39 @@ int smblib_get_prop_input_current_settled(struct smb_charger *chg, return smblib_get_charge_param(chg, &chg->param.icl_stat, &val->intval); } #define HVDCP3_STEP_UV 200000 int smblib_get_prop_input_voltage_settled(struct smb_charger *chg, union power_supply_propval *val) { const struct apsd_result *apsd_result = smblib_get_apsd_result(chg); int rc, pulses; u8 stat; val->intval = MICRO_5V; if (apsd_result == NULL) { smblib_err(chg, "APSD result is NULL\n"); return 0; } switch (apsd_result->pst) { case POWER_SUPPLY_TYPE_USB_HVDCP_3: rc = smblib_read(chg, QC_PULSE_COUNT_STATUS_REG, &stat); if (rc < 0) { smblib_err(chg, "Couldn't read QC_PULSE_COUNT rc=%d\n", rc); return 0; } pulses = (stat & QC_PULSE_COUNT_MASK); val->intval = MICRO_5V + HVDCP3_STEP_UV * pulses; break; default: val->intval = MICRO_5V; break; } return 0; } int smblib_get_prop_pd_in_hard_reset(struct smb_charger *chg, union power_supply_propval *val) { Loading Loading @@ -2840,22 +2872,20 @@ irqreturn_t smblib_handle_icl_change(int irq, void *data) struct smb_charger *chg = irq_data->parent_data; int rc, settled_ua; smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name); rc = smblib_get_charge_param(chg, &chg->param.icl_stat, &settled_ua); if (rc < 0) { smblib_err(chg, "Couldn't get ICL status rc=%d\n", rc); return IRQ_HANDLED; } if (chg->mode != PARALLEL_MASTER) return IRQ_HANDLED; if (chg->mode == PARALLEL_MASTER) { power_supply_changed(chg->usb_main_psy); vote(chg->pl_enable_votable_indirect, USBIN_I_VOTER, settled_ua >= USB_WEAK_INPUT_UA, 0); } smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s icl_settled=%d\n", irq_data->name, settled_ua); return IRQ_HANDLED; } Loading @@ -2882,6 +2912,7 @@ static void smblib_hvdcp_adaptive_voltage_change(struct smb_charger *chg) u8 stat; int pulses; power_supply_changed(chg->usb_main_psy); if (chg->usb_psy_desc.type == POWER_SUPPLY_TYPE_USB_HVDCP) { rc = smblib_read(chg, QC_CHANGE_STATUS_REG, &stat); if (rc < 0) { Loading Loading @@ -2934,13 +2965,6 @@ static void smblib_hvdcp_adaptive_voltage_change(struct smb_charger *chg) } } static void smblib_handle_adaptive_voltage_done(struct smb_charger *chg, bool rising) { smblib_dbg(chg, PR_INTERRUPT, "IRQ: adaptive-voltage-done %s\n", rising ? "rising" : "falling"); } /* triggers when HVDCP 3.0 authentication has finished */ static void smblib_handle_hvdcp_3p0_auth_done(struct smb_charger *chg, bool rising) Loading Loading @@ -3082,9 +3106,6 @@ irqreturn_t smblib_handle_usb_source_change(int irq, void *data) smblib_handle_hvdcp_3p0_auth_done(chg, (bool)(stat & QC_AUTH_DONE_STATUS_BIT)); smblib_handle_adaptive_voltage_done(chg, (bool)(stat & VADP_CHANGE_DONE_AFTER_AUTH_BIT)); smblib_handle_sdp_enumeration_done(chg, (bool)(stat & ENUMERATION_DONE_BIT)); Loading