summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/power/qcom-charger/qpnp-smb2.txt6
-rw-r--r--drivers/power/qcom-charger/qpnp-smb2.c23
-rw-r--r--drivers/power/qcom-charger/smb-lib.c29
-rw-r--r--drivers/power/qcom-charger/smb-lib.h5
-rw-r--r--drivers/power/qcom-charger/smb-reg.h1
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 */