diff options
| -rw-r--r-- | Documentation/devicetree/bindings/power/qcom-charger/qpnp-smb2.txt | 6 | ||||
| -rw-r--r-- | drivers/power/qcom-charger/qpnp-smb2.c | 23 | ||||
| -rw-r--r-- | drivers/power/qcom-charger/smb-lib.c | 29 | ||||
| -rw-r--r-- | drivers/power/qcom-charger/smb-lib.h | 5 | ||||
| -rw-r--r-- | drivers/power/qcom-charger/smb-reg.h | 1 |
5 files changed, 63 insertions, 1 deletions
diff --git a/Documentation/devicetree/bindings/power/qcom-charger/qpnp-smb2.txt b/Documentation/devicetree/bindings/power/qcom-charger/qpnp-smb2.txt index 382587ea5922..94a1fdceec8f 100644 --- a/Documentation/devicetree/bindings/power/qcom-charger/qpnp-smb2.txt +++ b/Documentation/devicetree/bindings/power/qcom-charger/qpnp-smb2.txt @@ -64,6 +64,12 @@ Charger specific properties: Value type: <u32> Definition: Specifies the DC input current limit in micro-amps. +- qcom,boost-threshold-ua + Usage: optional + Value type: <u32> + Definition: Specifies the boost current threshold in micro-amps. + If the value is not present, 100mA is used as default. + - qcom,wipower-max-uw Usage: optional Value type: <u32> diff --git a/drivers/power/qcom-charger/qpnp-smb2.c b/drivers/power/qcom-charger/qpnp-smb2.c index e73ed2f1d288..543189ae5498 100644 --- a/drivers/power/qcom-charger/qpnp-smb2.c +++ b/drivers/power/qcom-charger/qpnp-smb2.c @@ -210,6 +210,13 @@ static struct smb_params v1_params = { .max_u = 2000, .step_u = 200, }, + .freq_boost = { + .name = "boost switching frequency", + .reg = CFG_BUCKBOOST_FREQ_SELECT_BOOST_REG, + .min_u = 600, + .max_u = 2000, + .step_u = 200, + }, }; #define STEP_CHARGING_MAX_STEPS 5 @@ -218,6 +225,7 @@ struct smb_dt_props { int usb_icl_ua; int otg_cl_ua; int dc_icl_ua; + int boost_threshold_ua; int fv_uv; int wipower_max_uw; u32 step_soc_threshold[STEP_CHARGING_MAX_STEPS - 1]; @@ -243,6 +251,7 @@ module_param_named( ); #define MICRO_1P5A 1500000 +#define MICRO_P1A 100000 static int smb2_parse_dt(struct smb2 *chip) { struct smb_charger *chg = &chip->chg; @@ -304,6 +313,12 @@ static int smb2_parse_dt(struct smb2 *chip) if (rc < 0) chip->dt.dc_icl_ua = -EINVAL; + rc = of_property_read_u32(node, + "qcom,boost-threshold-ua", + &chip->dt.boost_threshold_ua); + if (rc < 0) + chip->dt.boost_threshold_ua = MICRO_P1A; + rc = of_property_read_u32(node, "qcom,wipower-max-uw", &chip->dt.wipower_max_uw); if (rc < 0) @@ -370,6 +385,7 @@ static enum power_supply_property smb2_usb_props[] = { POWER_SUPPLY_PROP_PD_ACTIVE, POWER_SUPPLY_PROP_INPUT_CURRENT_SETTLED, POWER_SUPPLY_PROP_INPUT_CURRENT_NOW, + POWER_SUPPLY_PROP_BOOST_CURRENT, POWER_SUPPLY_PROP_PE_START, }; @@ -436,6 +452,9 @@ static int smb2_usb_get_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_INPUT_CURRENT_NOW: rc = smblib_get_prop_usb_current_now(chg, val); break; + case POWER_SUPPLY_PROP_BOOST_CURRENT: + val->intval = chg->boost_current_ua; + break; case POWER_SUPPLY_PROP_PD_IN_HARD_RESET: rc = smblib_get_prop_pd_in_hard_reset(chg, val); break; @@ -490,6 +509,9 @@ static int smb2_usb_set_prop(struct power_supply *psy, case POWER_SUPPLY_PROP_PD_USB_SUSPEND_SUPPORTED: chg->system_suspend_supported = val->intval; break; + case POWER_SUPPLY_PROP_BOOST_CURRENT: + rc = smblib_set_prop_boost_current(chg, val); + break; default: pr_err("set prop %d is not supported\n", psp); rc = -EINVAL; @@ -1073,6 +1095,7 @@ static int smb2_init_hw(struct smb2 *chip) chg->otg_cl_ua = chip->dt.otg_cl_ua; chg->dcp_icl_ua = chip->dt.usb_icl_ua; + chg->boost_threshold_ua = chip->dt.boost_threshold_ua; rc = smblib_read(chg, APSD_RESULT_STATUS_REG, &stat); if (rc < 0) { diff --git a/drivers/power/qcom-charger/smb-lib.c b/drivers/power/qcom-charger/smb-lib.c index f1380af1bfa1..64e4354b5707 100644 --- a/drivers/power/qcom-charger/smb-lib.c +++ b/drivers/power/qcom-charger/smb-lib.c @@ -1501,7 +1501,7 @@ int smblib_get_prop_dc_current_max(struct smb_charger *chg, } /******************* - * USB PSY SETTERS * + * DC PSY SETTERS * * *****************/ int smblib_set_prop_dc_current_max(struct smb_charger *chg, @@ -1883,6 +1883,25 @@ int smblib_set_prop_usb_current_max(struct smb_charger *chg, return rc; } +#define FSW_2MHZ 2000 +#define FSW_800KHZ_RESET 800 +int smblib_set_prop_boost_current(struct smb_charger *chg, + const union power_supply_propval *val) +{ + int rc = 0; + + rc = smblib_set_charge_param(chg, &chg->param.freq_boost, + val->intval <= chg->boost_threshold_ua ? + FSW_2MHZ : FSW_800KHZ_RESET); + if (rc < 0) { + dev_err(chg->dev, "Error in setting freq_boost rc=%d\n", rc); + return rc; + } + + chg->boost_current_ua = val->intval; + return rc; +} + int smblib_set_prop_typec_power_role(struct smb_charger *chg, const union power_supply_propval *val) { @@ -2753,6 +2772,12 @@ static void typec_sink_insertion(struct smb_charger *chg) false, 0); } +static void typec_sink_removal(struct smb_charger *chg) +{ + smblib_set_charge_param(chg, &chg->param.freq_boost, FSW_800KHZ_RESET); + chg->boost_current_ua = 0; +} + static void smblib_handle_typec_removal(struct smb_charger *chg) { vote(chg->pd_disallowed_votable_indirect, CC_DETACHED_VOTER, true, 0); @@ -2772,6 +2797,7 @@ static void smblib_handle_typec_removal(struct smb_charger *chg) vote(chg->apsd_disable_votable, PD_HARD_RESET_VOTER, false, 0); typec_source_removal(chg); + typec_sink_removal(chg); smblib_update_usb_type(chg); } @@ -2789,6 +2815,7 @@ static void smblib_handle_typec_insertion(struct smb_charger *chg, typec_sink_insertion(chg); } else { typec_source_insertion(chg); + typec_sink_removal(chg); } vote(chg->pd_disallowed_votable_indirect, LEGACY_CABLE_VOTER, diff --git a/drivers/power/qcom-charger/smb-lib.h b/drivers/power/qcom-charger/smb-lib.h index b309095b04c1..fce76a0732b6 100644 --- a/drivers/power/qcom-charger/smb-lib.h +++ b/drivers/power/qcom-charger/smb-lib.h @@ -110,6 +110,7 @@ struct smb_params { 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; }; struct parallel_params { @@ -198,6 +199,7 @@ struct smb_charger { int voltage_max_uv; int pd_active; bool system_suspend_supported; + int boost_threshold_ua; int system_temp_level; int thermal_levels; @@ -216,6 +218,7 @@ struct smb_charger { /* workaround flag */ u32 wa_flags; enum cc2_sink_type cc2_sink_detach_flag; + int boost_current_ua; }; int smblib_read(struct smb_charger *chg, u16 addr, u8 *val); @@ -346,6 +349,8 @@ int smblib_set_prop_usb_voltage_min(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_usb_voltage_max(struct smb_charger *chg, const union power_supply_propval *val); +int smblib_set_prop_boost_current(struct smb_charger *chg, + const union power_supply_propval *val); int smblib_set_prop_typec_power_role(struct smb_charger *chg, const union power_supply_propval *val); int smblib_set_prop_pd_active(struct smb_charger *chg, diff --git a/drivers/power/qcom-charger/smb-reg.h b/drivers/power/qcom-charger/smb-reg.h index c2a2b0c86d73..1986a185be4a 100644 --- a/drivers/power/qcom-charger/smb-reg.h +++ b/drivers/power/qcom-charger/smb-reg.h @@ -1000,5 +1000,6 @@ enum { #define SYSOK_OPTIONS_MASK GENMASK(2, 0) #define CFG_BUCKBOOST_FREQ_SELECT_BUCK_REG (MISC_BASE + 0xA0) +#define CFG_BUCKBOOST_FREQ_SELECT_BOOST_REG (MISC_BASE + 0xA1) #endif /* __SMB2_CHARGER_REG_H */ |
