Merge "power_supply: add property to reflect switcher frequency"

This commit is contained in:
Linux Build Service Account 2016-10-18 03:24:44 -07:00 committed by Gerrit - the friendly Code Review server
commit d5fe1119ae
6 changed files with 232 additions and 124 deletions

View file

@ -249,6 +249,7 @@ static struct device_attribute power_supply_attrs[] = {
POWER_SUPPLY_ATTR(flash_current_max),
POWER_SUPPLY_ATTR(update_now),
POWER_SUPPLY_ATTR(esr_count),
POWER_SUPPLY_ATTR(buck_freq),
POWER_SUPPLY_ATTR(safety_timer_enabled),
POWER_SUPPLY_ATTR(charge_done),
POWER_SUPPLY_ATTR(flash_active),

View file

@ -346,6 +346,7 @@ static enum power_supply_property smb2_usb_props[] = {
POWER_SUPPLY_PROP_VOLTAGE_MIN,
POWER_SUPPLY_PROP_VOLTAGE_MAX,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_PD_CURRENT_MAX,
POWER_SUPPLY_PROP_CURRENT_MAX,
POWER_SUPPLY_PROP_TYPE,
POWER_SUPPLY_PROP_TYPEC_MODE,
@ -385,6 +386,9 @@ static int smb2_usb_get_prop(struct power_supply *psy,
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
rc = smblib_get_prop_usb_voltage_now(chg, val);
break;
case POWER_SUPPLY_PROP_PD_CURRENT_MAX:
rc = smblib_get_prop_pd_current_max(chg, val);
break;
case POWER_SUPPLY_PROP_CURRENT_MAX:
rc = smblib_get_prop_usb_current_max(chg, val);
break;
@ -425,6 +429,9 @@ static int smb2_usb_get_prop(struct power_supply *psy,
case POWER_SUPPLY_PROP_PD_IN_HARD_RESET:
rc = smblib_get_prop_pd_in_hard_reset(chg, val);
break;
case POWER_SUPPLY_PROP_PD_USB_SUSPEND_SUPPORTED:
val->intval = chg->system_suspend_supported;
break;
default:
pr_err("get prop %d is not supported\n", psp);
rc = -EINVAL;
@ -452,6 +459,9 @@ static int smb2_usb_set_prop(struct power_supply *psy,
case POWER_SUPPLY_PROP_VOLTAGE_MAX:
rc = smblib_set_prop_usb_voltage_max(chg, val);
break;
case POWER_SUPPLY_PROP_PD_CURRENT_MAX:
rc = smblib_set_prop_pd_current_max(chg, val);
break;
case POWER_SUPPLY_PROP_CURRENT_MAX:
rc = smblib_set_prop_usb_current_max(chg, val);
break;
@ -467,6 +477,9 @@ static int smb2_usb_set_prop(struct power_supply *psy,
case POWER_SUPPLY_PROP_PD_IN_HARD_RESET:
rc = smblib_set_prop_pd_in_hard_reset(chg, val);
break;
case POWER_SUPPLY_PROP_PD_USB_SUSPEND_SUPPORTED:
chg->system_suspend_supported = val->intval;
break;
default:
pr_err("set prop %d is not supported\n", psp);
rc = -EINVAL;
@ -1035,6 +1048,8 @@ static int smb2_init_hw(struct smb2 *chip)
DEFAULT_VOTER, true, chip->dt.dc_icl_ua);
vote(chg->hvdcp_disable_votable, DEFAULT_VOTER,
chip->dt.hvdcp_disable, 0);
vote(chg->hvdcp_disable_votable, PD_INACTIVE_VOTER,
true, 0);
vote(chg->pd_disallowed_votable_indirect, CC_DETACHED_VOTER,
true, 0);
vote(chg->pd_disallowed_votable_indirect, HVDCP_TIMEOUT_VOTER,
@ -1569,6 +1584,7 @@ static int smb2_probe(struct platform_device *pdev)
chg->param = v1_params;
chg->debug_mask = &__debug_mask;
chg->mode = PARALLEL_MASTER;
chg->name = "PMI";
chg->pl.master_percent = &__pl_master_percent;
chg->regmap = dev_get_regmap(chg->dev->parent, NULL);

View file

@ -22,12 +22,18 @@
#include "storm-watch.h"
#include "pmic-voter.h"
#define smblib_err(chg, fmt, ...) \
pr_err("%s: %s: " fmt, chg->name, \
__func__, ##__VA_ARGS__) \
#define smblib_dbg(chg, reason, fmt, ...) \
do { \
if (*chg->debug_mask & (reason)) \
dev_info(chg->dev, fmt, ##__VA_ARGS__); \
pr_info("%s: %s: " fmt, chg->name, \
__func__, ##__VA_ARGS__); \
else \
dev_dbg(chg->dev, fmt, ##__VA_ARGS__); \
pr_debug("%s: %s: " fmt, chg->name, \
__func__, ##__VA_ARGS__); \
} while (0)
static bool is_secure(struct smb_charger *chg, int addr)
@ -99,7 +105,7 @@ static int smblib_get_step_charging_adjustment(struct smb_charger *chg,
rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
rc);
return rc;
}
@ -136,7 +142,7 @@ static void smblib_fcc_split_ua(struct smb_charger *chg, int total_fcc,
&chg->param.jeita_cc_comp,
&cc_reduction_ua);
if (rc < 0) {
dev_err(chg->dev, "Could not get jeita comp, rc=%d\n",
smblib_err(chg, "Could not get jeita comp, rc=%d\n",
rc);
cc_reduction_ua = 0;
}
@ -172,7 +178,7 @@ int smblib_get_charge_param(struct smb_charger *chg,
rc = smblib_read(chg, param->reg, &val_raw);
if (rc < 0) {
dev_err(chg->dev, "%s: Couldn't read from 0x%04x rc=%d\n",
smblib_err(chg, "%s: Couldn't read from 0x%04x rc=%d\n",
param->name, param->reg, rc);
return rc;
}
@ -194,7 +200,7 @@ int smblib_get_usb_suspend(struct smb_charger *chg, int *suspend)
rc = smblib_read(chg, USBIN_CMD_IL_REG, &temp);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read USBIN_CMD_IL rc=%d\n", rc);
smblib_err(chg, "Couldn't read USBIN_CMD_IL rc=%d\n", rc);
return rc;
}
*suspend = temp & USBIN_SUSPEND_BIT;
@ -271,7 +277,7 @@ static const struct apsd_result *smblib_get_apsd_result(struct smb_charger *chg)
rc = smblib_read(chg, APSD_STATUS_REG, &apsd_stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read APSD_STATUS rc=%d\n", rc);
smblib_err(chg, "Couldn't read APSD_STATUS rc=%d\n", rc);
return result;
}
smblib_dbg(chg, PR_REGISTER, "APSD_STATUS = 0x%02x\n", apsd_stat);
@ -281,7 +287,7 @@ static const struct apsd_result *smblib_get_apsd_result(struct smb_charger *chg)
rc = smblib_read(chg, APSD_RESULT_STATUS_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read APSD_RESULT_STATUS rc=%d\n",
smblib_err(chg, "Couldn't read APSD_RESULT_STATUS rc=%d\n",
rc);
return result;
}
@ -318,7 +324,7 @@ int smblib_set_charge_param(struct smb_charger *chg,
return -EINVAL;
} else {
if (val_u > param->max_u || val_u < param->min_u) {
dev_err(chg->dev, "%s: %d is out of range [%d, %d]\n",
smblib_err(chg, "%s: %d is out of range [%d, %d]\n",
param->name, val_u, param->min_u, param->max_u);
return -EINVAL;
}
@ -328,7 +334,7 @@ int smblib_set_charge_param(struct smb_charger *chg,
rc = smblib_write(chg, param->reg, val_raw);
if (rc < 0) {
dev_err(chg->dev, "%s: Couldn't write 0x%02x to 0x%04x rc=%d\n",
smblib_err(chg, "%s: Couldn't write 0x%02x to 0x%04x rc=%d\n",
param->name, val_raw, param->reg, rc);
return rc;
}
@ -345,14 +351,14 @@ static int step_charge_soc_update(struct smb_charger *chg, int capacity)
rc = smblib_set_charge_param(chg, &chg->param.step_soc, capacity);
if (rc < 0) {
dev_err(chg->dev, "Error in updating soc, rc=%d\n", rc);
smblib_err(chg, "Error in updating soc, rc=%d\n", rc);
return rc;
}
rc = smblib_write(chg, STEP_CHG_SOC_VBATT_V_UPDATE_REG,
STEP_CHG_SOC_VBATT_V_UPDATE_BIT);
if (rc < 0) {
dev_err(chg->dev,
smblib_err(chg,
"Couldn't set STEP_CHG_SOC_VBATT_V_UPDATE_REG rc=%d\n",
rc);
return rc;
@ -368,7 +374,7 @@ int smblib_set_usb_suspend(struct smb_charger *chg, bool suspend)
rc = smblib_masked_write(chg, USBIN_CMD_IL_REG, USBIN_SUSPEND_BIT,
suspend ? USBIN_SUSPEND_BIT : 0);
if (rc < 0)
dev_err(chg->dev, "Couldn't write %s to USBIN_SUSPEND_BIT rc=%d\n",
smblib_err(chg, "Couldn't write %s to USBIN_SUSPEND_BIT rc=%d\n",
suspend ? "suspend" : "resume", rc);
return rc;
@ -381,7 +387,7 @@ int smblib_set_dc_suspend(struct smb_charger *chg, bool suspend)
rc = smblib_masked_write(chg, DCIN_CMD_IL_REG, DCIN_SUSPEND_BIT,
suspend ? DCIN_SUSPEND_BIT : 0);
if (rc < 0)
dev_err(chg->dev, "Couldn't write %s to DCIN_SUSPEND_BIT rc=%d\n",
smblib_err(chg, "Couldn't write %s to DCIN_SUSPEND_BIT rc=%d\n",
suspend ? "suspend" : "resume", rc);
return rc;
@ -409,14 +415,14 @@ static int smblib_set_usb_pd_allowed_voltage(struct smb_charger *chg,
} else if (min_allowed_uv < MICRO_12V && max_allowed_uv <= MICRO_12V) {
allowed_voltage = USBIN_ADAPTER_ALLOW_9V_TO_12V;
} else {
dev_err(chg->dev, "invalid allowed voltage [%d, %d]\n",
smblib_err(chg, "invalid allowed voltage [%d, %d]\n",
min_allowed_uv, max_allowed_uv);
return -EINVAL;
}
rc = smblib_write(chg, USBIN_ADAPTER_ALLOW_CFG_REG, allowed_voltage);
if (rc < 0) {
dev_err(chg->dev, "Couldn't write 0x%02x to USBIN_ADAPTER_ALLOW_CFG rc=%d\n",
smblib_err(chg, "Couldn't write 0x%02x to USBIN_ADAPTER_ALLOW_CFG rc=%d\n",
allowed_voltage, rc);
return rc;
}
@ -428,6 +434,31 @@ static int smblib_set_usb_pd_allowed_voltage(struct smb_charger *chg,
* HELPER FUNCTIONS *
********************/
static int try_rerun_apsd_for_hvdcp(struct smb_charger *chg)
{
const struct apsd_result *apsd_result;
/*
* PD_INACTIVE_VOTER on hvdcp_disable_votable indicates whether
* apsd rerun was tried earlier
*/
if (get_client_vote(chg->hvdcp_disable_votable, PD_INACTIVE_VOTER)) {
vote(chg->hvdcp_disable_votable, PD_INACTIVE_VOTER, false, 0);
/* ensure hvdcp is enabled */
if (!get_effective_result(chg->hvdcp_disable_votable)) {
apsd_result = smblib_get_apsd_result(chg);
if (apsd_result->pst == POWER_SUPPLY_TYPE_USB_HVDCP) {
/* rerun APSD */
smblib_dbg(chg, PR_MISC, "rerun APSD\n");
smblib_masked_write(chg, CMD_APSD_REG,
APSD_RERUN_BIT,
APSD_RERUN_BIT);
}
}
}
return 0;
}
static int smblib_update_usb_type(struct smb_charger *chg)
{
int rc = 0;
@ -472,7 +503,7 @@ static int smblib_register_notifier(struct smb_charger *chg)
chg->nb.notifier_call = smblib_notifier_call;
rc = power_supply_reg_notifier(&chg->nb);
if (rc < 0) {
pr_err("Couldn't register psy notifier rc = %d\n", rc);
smblib_err(chg, "Couldn't register psy notifier rc = %d\n", rc);
return rc;
}
@ -570,7 +601,7 @@ static int smblib_fcc_vote_callback(struct votable *votable, void *data,
rc = power_supply_set_property(chg->pl.psy,
POWER_SUPPLY_PROP_CURRENT_MAX, &pval);
if (rc < 0) {
dev_err(chg->dev, "Could not set parallel fcc, rc=%d\n",
smblib_err(chg, "Could not set parallel fcc, rc=%d\n",
rc);
return rc;
}
@ -580,7 +611,7 @@ static int smblib_fcc_vote_callback(struct votable *votable, void *data,
rc = smblib_set_charge_param(chg, &chg->param.fcc, master_ua);
if (rc < 0) {
dev_err(chg->dev, "Error in setting fcc, rc=%d\n", rc);
smblib_err(chg, "Error in setting fcc, rc=%d\n", rc);
return rc;
}
@ -602,8 +633,7 @@ static int smblib_fv_vote_callback(struct votable *votable, void *data,
rc = smblib_set_charge_param(chg, &chg->param.fv, fv_uv);
if (rc < 0) {
dev_err(chg->dev,
"Couldn't set floating voltage rc=%d\n", rc);
smblib_err(chg, "Couldn't set floating voltage rc=%d\n", rc);
return rc;
}
@ -612,7 +642,7 @@ static int smblib_fv_vote_callback(struct votable *votable, void *data,
rc = power_supply_set_property(chg->pl.psy,
POWER_SUPPLY_PROP_VOLTAGE_MAX, &pval);
if (rc < 0) {
dev_err(chg->dev,
smblib_err(chg,
"Couldn't set float on parallel rc=%d\n", rc);
return rc;
}
@ -640,7 +670,7 @@ static int smblib_usb_icl_vote_callback(struct votable *votable, void *data,
if (chg->usb_psy_desc.type != POWER_SUPPLY_TYPE_USB) {
rc = smblib_set_charge_param(chg, &chg->param.usb_icl, icl_ua);
if (rc < 0) {
dev_err(chg->dev, "Couldn't set HC ICL rc=%d\n", rc);
smblib_err(chg, "Couldn't set HC ICL rc=%d\n", rc);
return rc;
}
@ -666,7 +696,7 @@ static int smblib_usb_icl_vote_callback(struct votable *votable, void *data,
icl_options = CFG_USB3P0_SEL_BIT | USB51_MODE_BIT;
break;
default:
dev_err(chg->dev, "ICL %duA isn't supported for SDP\n", icl_ua);
smblib_err(chg, "ICL %duA isn't supported for SDP\n", icl_ua);
icl_options = 0;
break;
}
@ -675,13 +705,13 @@ out:
rc = smblib_masked_write(chg, USBIN_ICL_OPTIONS_REG,
CFG_USB3P0_SEL_BIT | USB51_MODE_BIT, icl_options);
if (rc < 0) {
dev_err(chg->dev, "Couldn't set ICL opetions rc=%d\n", rc);
smblib_err(chg, "Couldn't set ICL opetions rc=%d\n", rc);
return rc;
}
rc = vote(chg->usb_suspend_votable, PD_VOTER, suspend, 0);
if (rc < 0) {
dev_err(chg->dev, "Couldn't %s input rc=%d\n",
smblib_err(chg, "Couldn't %s input rc=%d\n",
suspend ? "suspend" : "resume", rc);
return rc;
}
@ -696,8 +726,7 @@ static int smblib_otg_cl_config(struct smb_charger *chg, int otg_cl_ua)
rc = smblib_set_charge_param(chg, &chg->param.otg_cl, otg_cl_ua);
if (rc < 0) {
dev_err(chg->dev, "Couldn't set otg current limit rc=%d\n",
rc);
smblib_err(chg, "Couldn't set otg current limit rc=%d\n", rc);
return rc;
}
@ -706,7 +735,7 @@ static int smblib_otg_cl_config(struct smb_charger *chg, int otg_cl_ua)
ENG_SSUPPLY_CFG_SKIP_TH_V0P2_BIT,
otg_cl_ua > MICRO_250MA ? 1 : 0);
if (rc < 0) {
dev_err(chg->dev,
smblib_err(chg,
"Couldn't write DC_ENG_SSUPPLY_CFG3_REG rc=%d\n", rc);
return rc;
}
@ -732,7 +761,7 @@ static int smblib_dc_icl_vote_callback(struct votable *votable, void *data,
rc = smblib_set_charge_param(chg, &chg->param.dc_icl, icl_ua);
if (rc < 0) {
dev_err(chg->dev, "Couldn't set DC input current limit rc=%d\n",
smblib_err(chg, "Couldn't set DC input current limit rc=%d\n",
rc);
return rc;
}
@ -740,7 +769,7 @@ static int smblib_dc_icl_vote_callback(struct votable *votable, void *data,
suspend:
rc = vote(chg->dc_suspend_votable, USER_VOTER, suspend, 0);
if (rc < 0) {
dev_err(chg->dev, "Couldn't vote to %s DC rc=%d\n",
smblib_err(chg, "Couldn't vote to %s DC rc=%d\n",
suspend ? "suspend" : "resume", rc);
return rc;
}
@ -790,7 +819,7 @@ static int smblib_pl_disable_vote_callback(struct votable *votable, void *data,
rc = power_supply_set_property(chg->pl.psy,
POWER_SUPPLY_PROP_INPUT_SUSPEND, &pval);
if (rc < 0) {
dev_err(chg->dev,
smblib_err(chg,
"Couldn't change slave suspend state rc=%d\n", rc);
return rc;
}
@ -808,7 +837,7 @@ static int smblib_chg_disable_vote_callback(struct votable *votable, void *data,
CHARGING_ENABLE_CMD_BIT,
chg_disable ? 0 : CHARGING_ENABLE_CMD_BIT);
if (rc < 0) {
dev_err(chg->dev, "Couldn't %s charging rc=%d\n",
smblib_err(chg, "Couldn't %s charging rc=%d\n",
chg_disable ? "disable" : "enable", rc);
return rc;
}
@ -849,7 +878,7 @@ static int smblib_hvdcp_disable_vote_callback(struct votable *votable,
| HVDCP_AUTH_ALG_EN_CFG_BIT,
val);
if (rc < 0) {
dev_err(chg->dev, "Couldn't %s hvdcp rc=%d\n",
smblib_err(chg, "Couldn't %s hvdcp rc=%d\n",
hvdcp_disable ? "disable" : "enable", rc);
return rc;
}
@ -868,7 +897,7 @@ static int smblib_apsd_disable_vote_callback(struct votable *votable,
AUTO_SRC_DETECT_BIT,
apsd_disable ? 0 : AUTO_SRC_DETECT_BIT);
if (rc < 0) {
dev_err(chg->dev, "Couldn't %s APSD rc=%d\n",
smblib_err(chg, "Couldn't %s APSD rc=%d\n",
apsd_disable ? "disable" : "enable", rc);
return rc;
}
@ -890,21 +919,21 @@ int smblib_vbus_regulator_enable(struct regulator_dev *rdev)
ENG_BUCKBOOST_HALT1_8_MODE_BIT,
ENG_BUCKBOOST_HALT1_8_MODE_BIT);
if (rc < 0) {
dev_err(chg->dev, "Couldn't set OTG_ENG_OTG_CFG_REG rc=%d\n",
smblib_err(chg, "Couldn't set OTG_ENG_OTG_CFG_REG rc=%d\n",
rc);
return rc;
}
rc = smblib_write(chg, CMD_OTG_REG, OTG_EN_BIT);
if (rc < 0) {
dev_err(chg->dev, "Couldn't enable OTG regulator rc=%d\n", rc);
smblib_err(chg, "Couldn't enable OTG regulator rc=%d\n", rc);
return rc;
}
msleep(OTG_SOFT_START_DELAY_MS);
rc = smblib_read(chg, OTG_STATUS_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read OTG_STATUS_REG rc=%d\n", rc);
smblib_err(chg, "Couldn't read OTG_STATUS_REG rc=%d\n", rc);
return rc;
}
if (stat & BOOST_SOFTSTART_DONE_BIT)
@ -920,7 +949,7 @@ int smblib_vbus_regulator_disable(struct regulator_dev *rdev)
rc = smblib_write(chg, CMD_OTG_REG, 0);
if (rc < 0) {
dev_err(chg->dev, "Couldn't disable OTG regulator rc=%d\n", rc);
smblib_err(chg, "Couldn't disable OTG regulator rc=%d\n", rc);
return rc;
}
@ -929,7 +958,7 @@ int smblib_vbus_regulator_disable(struct regulator_dev *rdev)
rc = smblib_masked_write(chg, OTG_ENG_OTG_CFG_REG,
ENG_BUCKBOOST_HALT1_8_MODE_BIT, 0);
if (rc < 0) {
dev_err(chg->dev, "Couldn't set OTG_ENG_OTG_CFG_REG rc=%d\n",
smblib_err(chg, "Couldn't set OTG_ENG_OTG_CFG_REG rc=%d\n",
rc);
return rc;
}
@ -946,7 +975,7 @@ int smblib_vbus_regulator_is_enabled(struct regulator_dev *rdev)
rc = smblib_read(chg, CMD_OTG_REG, &cmd);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read CMD_OTG rc=%d", rc);
smblib_err(chg, "Couldn't read CMD_OTG rc=%d", rc);
return rc;
}
@ -969,7 +998,7 @@ int smblib_vconn_regulator_enable(struct regulator_dev *rdev)
*/
rc = smblib_read(chg, TYPE_C_STATUS_4_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_STATUS_4 rc=%d\n", rc);
smblib_err(chg, "Couldn't read TYPE_C_STATUS_4 rc=%d\n", rc);
return rc;
}
stat = stat & CC_ORIENTATION_BIT ? 0 : VCONN_EN_ORIENTATION_BIT;
@ -977,7 +1006,7 @@ int smblib_vconn_regulator_enable(struct regulator_dev *rdev)
VCONN_EN_VALUE_BIT | VCONN_EN_ORIENTATION_BIT,
VCONN_EN_VALUE_BIT | stat);
if (rc < 0)
dev_err(chg->dev, "Couldn't enable vconn setting rc=%d\n", rc);
smblib_err(chg, "Couldn't enable vconn setting rc=%d\n", rc);
return rc;
}
@ -990,7 +1019,7 @@ int smblib_vconn_regulator_disable(struct regulator_dev *rdev)
rc = smblib_masked_write(chg, TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG,
VCONN_EN_VALUE_BIT, 0);
if (rc < 0)
dev_err(chg->dev, "Couldn't disable vconn regulator rc=%d\n",
smblib_err(chg, "Couldn't disable vconn regulator rc=%d\n",
rc);
return rc;
@ -1004,7 +1033,7 @@ int smblib_vconn_regulator_is_enabled(struct regulator_dev *rdev)
rc = smblib_read(chg, TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG, &cmd);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
smblib_err(chg, "Couldn't read TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
rc);
return rc;
}
@ -1032,8 +1061,7 @@ int smblib_get_prop_batt_present(struct smb_charger *chg,
rc = smblib_read(chg, BATIF_BASE + INT_RT_STS_OFFSET, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read BATIF_INT_RT_STS rc=%d\n",
rc);
smblib_err(chg, "Couldn't read BATIF_INT_RT_STS rc=%d\n", rc);
return rc;
}
@ -1069,7 +1097,7 @@ int smblib_get_prop_batt_status(struct smb_charger *chg,
rc = smblib_get_prop_usb_online(chg, &pval);
if (rc < 0) {
dev_err(chg->dev, "Couldn't get usb online property rc=%d\n",
smblib_err(chg, "Couldn't get usb online property rc=%d\n",
rc);
return rc;
}
@ -1077,7 +1105,7 @@ int smblib_get_prop_batt_status(struct smb_charger *chg,
rc = smblib_get_prop_dc_online(chg, &pval);
if (rc < 0) {
dev_err(chg->dev, "Couldn't get dc online property rc=%d\n",
smblib_err(chg, "Couldn't get dc online property rc=%d\n",
rc);
return rc;
}
@ -1090,7 +1118,7 @@ int smblib_get_prop_batt_status(struct smb_charger *chg,
rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
rc);
return rc;
}
@ -1127,7 +1155,7 @@ int smblib_get_prop_batt_charge_type(struct smb_charger *chg,
rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
rc);
return rc;
}
@ -1159,7 +1187,7 @@ int smblib_get_prop_batt_health(struct smb_charger *chg,
rc = smblib_read(chg, BATTERY_CHARGER_STATUS_2_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read BATTERY_CHARGER_STATUS_2 rc=%d\n",
smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_2 rc=%d\n",
rc);
return rc;
}
@ -1167,7 +1195,7 @@ int smblib_get_prop_batt_health(struct smb_charger *chg,
stat);
if (stat & CHARGER_ERROR_STATUS_BAT_OV_BIT) {
dev_err(chg->dev, "battery over-voltage\n");
smblib_err(chg, "battery over-voltage\n");
val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
goto done;
}
@ -1202,7 +1230,7 @@ int smblib_get_prop_input_current_limited(struct smb_charger *chg,
rc = smblib_read(chg, AICL_STATUS_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read AICL_STATUS rc=%d\n", rc);
smblib_err(chg, "Couldn't read AICL_STATUS rc=%d\n", rc);
return rc;
}
val->intval = (stat & SOFT_ILIMIT_BIT) || chg->is_hdc;
@ -1261,7 +1289,7 @@ int smblib_get_prop_step_chg_step(struct smb_charger *chg,
rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
rc);
return rc;
}
@ -1280,7 +1308,7 @@ int smblib_get_prop_batt_charge_done(struct smb_charger *chg,
rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
rc);
return rc;
}
@ -1301,14 +1329,14 @@ int smblib_set_prop_input_suspend(struct smb_charger *chg,
rc = vote(chg->usb_suspend_votable, USER_VOTER, (bool)val->intval, 0);
if (rc < 0) {
dev_err(chg->dev, "Couldn't vote to %s USB rc=%d\n",
smblib_err(chg, "Couldn't vote to %s USB rc=%d\n",
(bool)val->intval ? "suspend" : "resume", rc);
return rc;
}
rc = vote(chg->dc_suspend_votable, USER_VOTER, (bool)val->intval, 0);
if (rc < 0) {
dev_err(chg->dev, "Couldn't vote to %s DC rc=%d\n",
smblib_err(chg, "Couldn't vote to %s DC rc=%d\n",
(bool)val->intval ? "suspend" : "resume", rc);
return rc;
}
@ -1365,7 +1393,7 @@ int smblib_get_prop_dc_present(struct smb_charger *chg,
rc = smblib_read(chg, DC_INT_RT_STS_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read DC_INT_RT_STS_REG rc=%d\n",
smblib_err(chg, "Couldn't read DC_INT_RT_STS_REG rc=%d\n",
rc);
return rc;
}
@ -1390,7 +1418,7 @@ int smblib_get_prop_dc_online(struct smb_charger *chg,
rc = smblib_read(chg, POWER_PATH_STATUS_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read POWER_PATH_STATUS rc=%d\n",
smblib_err(chg, "Couldn't read POWER_PATH_STATUS rc=%d\n",
rc);
return rc;
}
@ -1435,8 +1463,7 @@ int smblib_get_prop_usb_present(struct smb_charger *chg,
rc = smblib_read(chg, TYPE_C_STATUS_4_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_STATUS_4 rc=%d\n",
rc);
smblib_err(chg, "Couldn't read TYPE_C_STATUS_4 rc=%d\n", rc);
return rc;
}
smblib_dbg(chg, PR_REGISTER, "TYPE_C_STATUS_4 = 0x%02x\n",
@ -1460,7 +1487,7 @@ int smblib_get_prop_usb_online(struct smb_charger *chg,
rc = smblib_read(chg, POWER_PATH_STATUS_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read POWER_PATH_STATUS rc=%d\n",
smblib_err(chg, "Couldn't read POWER_PATH_STATUS rc=%d\n",
rc);
return rc;
}
@ -1491,10 +1518,18 @@ int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
return iio_read_channel_processed(chg->iio.usbin_v_chan, &val->intval);
}
int smblib_get_prop_pd_current_max(struct smb_charger *chg,
union power_supply_propval *val)
{
val->intval = get_client_vote_locked(chg->usb_icl_votable, PD_VOTER);
return 0;
}
int smblib_get_prop_usb_current_max(struct smb_charger *chg,
union power_supply_propval *val)
{
val->intval = get_effective_result_locked(chg->usb_icl_votable);
val->intval = get_client_vote_locked(chg->usb_icl_votable,
USB_PSY_VOTER);
return 0;
}
@ -1559,8 +1594,7 @@ int smblib_get_prop_typec_cc_orientation(struct smb_charger *chg,
rc = smblib_read(chg, TYPE_C_STATUS_4_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_STATUS_4 rc=%d\n",
rc);
smblib_err(chg, "Couldn't read TYPE_C_STATUS_4 rc=%d\n", rc);
return rc;
}
smblib_dbg(chg, PR_REGISTER, "TYPE_C_STATUS_4 = 0x%02x\n",
@ -1594,7 +1628,7 @@ static int smblib_get_prop_ufp_mode(struct smb_charger *chg)
rc = smblib_read(chg, TYPE_C_STATUS_1_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_STATUS_1 rc=%d\n", rc);
smblib_err(chg, "Couldn't read TYPE_C_STATUS_1 rc=%d\n", rc);
return POWER_SUPPLY_TYPEC_NONE;
}
smblib_dbg(chg, PR_REGISTER, "TYPE_C_STATUS_1 = 0x%02x\n", stat);
@ -1622,7 +1656,7 @@ static int smblib_get_prop_dfp_mode(struct smb_charger *chg)
rc = smblib_read(chg, TYPE_C_STATUS_2_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_STATUS_2 rc=%d\n", rc);
smblib_err(chg, "Couldn't read TYPE_C_STATUS_2 rc=%d\n", rc);
return POWER_SUPPLY_TYPEC_NONE;
}
smblib_dbg(chg, PR_REGISTER, "TYPE_C_STATUS_2 = 0x%02x\n", stat);
@ -1653,7 +1687,7 @@ int smblib_get_prop_typec_mode(struct smb_charger *chg,
rc = smblib_read(chg, TYPE_C_STATUS_4_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_STATUS_4 rc=%d\n", rc);
smblib_err(chg, "Couldn't read TYPE_C_STATUS_4 rc=%d\n", rc);
val->intval = POWER_SUPPLY_TYPEC_NONE;
return rc;
}
@ -1680,7 +1714,7 @@ int smblib_get_prop_typec_power_role(struct smb_charger *chg,
rc = smblib_read(chg, TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG, &ctrl);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
smblib_err(chg, "Couldn't read TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
rc);
return rc;
}
@ -1704,7 +1738,7 @@ int smblib_get_prop_typec_power_role(struct smb_charger *chg,
break;
default:
val->intval = POWER_SUPPLY_TYPEC_PR_NONE;
dev_err(chg->dev, "unsupported power role 0x%02lx\n",
smblib_err(chg, "unsupported power role 0x%02lx\n",
ctrl & (DFP_EN_CMD_BIT | UFP_EN_CMD_BIT));
return -EINVAL;
}
@ -1733,7 +1767,7 @@ int smblib_get_prop_pd_in_hard_reset(struct smb_charger *chg,
rc = smblib_read(chg, TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG, &ctrl);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG rc=%d\n",
smblib_err(chg, "Couldn't read TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG rc=%d\n",
rc);
return rc;
}
@ -1745,12 +1779,35 @@ int smblib_get_prop_pd_in_hard_reset(struct smb_charger *chg,
* USB PSY SETTERS *
* *****************/
int smblib_set_prop_pd_current_max(struct smb_charger *chg,
const union power_supply_propval *val)
{
int rc;
if (chg->pd_active)
rc = vote(chg->usb_icl_votable, PD_VOTER, true, val->intval);
else
rc = -EPERM;
return rc;
}
int smblib_set_prop_usb_current_max(struct smb_charger *chg,
const union power_supply_propval *val)
{
int rc;
rc = vote(chg->usb_icl_votable, PD_VOTER, true, val->intval);
if (!chg->pd_active) {
rc = vote(chg->usb_icl_votable, USB_PSY_VOTER,
true, val->intval);
} else if (chg->system_suspend_supported) {
if (val->intval <= USBIN_25MA)
rc = vote(chg->usb_icl_votable, USB_PSY_VOTER,
true, val->intval);
else
rc = vote(chg->usb_icl_votable, USB_PSY_VOTER,
false, 0);
}
return rc;
}
@ -1774,14 +1831,14 @@ int smblib_set_prop_typec_power_role(struct smb_charger *chg,
power_role = DFP_EN_CMD_BIT;
break;
default:
dev_err(chg->dev, "power role %d not supported\n", val->intval);
smblib_err(chg, "power role %d not supported\n", val->intval);
return -EINVAL;
}
rc = smblib_masked_write(chg, TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG,
TYPEC_POWER_ROLE_CMD_MASK, power_role);
if (rc < 0) {
dev_err(chg->dev, "Couldn't write 0x%02x to TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
smblib_err(chg, "Couldn't write 0x%02x to TYPE_C_INTRPT_ENB_SOFTWARE_CTRL rc=%d\n",
power_role, rc);
return rc;
}
@ -1798,7 +1855,7 @@ int smblib_set_prop_usb_voltage_min(struct smb_charger *chg,
rc = smblib_set_usb_pd_allowed_voltage(chg, min_uv,
chg->voltage_max_uv);
if (rc < 0) {
dev_err(chg->dev, "invalid max voltage %duV rc=%d\n",
smblib_err(chg, "invalid max voltage %duV rc=%d\n",
val->intval, rc);
return rc;
}
@ -1820,7 +1877,7 @@ int smblib_set_prop_usb_voltage_max(struct smb_charger *chg,
rc = smblib_set_usb_pd_allowed_voltage(chg, chg->voltage_min_uv,
max_uv);
if (rc < 0) {
dev_err(chg->dev, "invalid min voltage %duV rc=%d\n",
smblib_err(chg, "invalid min voltage %duV rc=%d\n",
val->intval, rc);
return rc;
}
@ -1833,50 +1890,58 @@ int smblib_set_prop_pd_active(struct smb_charger *chg,
const union power_supply_propval *val)
{
int rc;
u8 stat;
u8 stat = 0;
bool cc_debounced;
bool orientation;
bool pd_active = val->intval;
if (!get_effective_result(chg->pd_allowed_votable)) {
dev_err(chg->dev, "PD is not allowed\n");
smblib_err(chg, "PD is not allowed\n");
return -EINVAL;
}
vote(chg->apsd_disable_votable, PD_VOTER, val->intval, 0);
vote(chg->pd_allowed_votable, PD_VOTER, val->intval, 0);
vote(chg->apsd_disable_votable, PD_VOTER, pd_active, 0);
vote(chg->pd_allowed_votable, PD_VOTER, pd_active, 0);
/*
* VCONN_EN_ORIENTATION_BIT controls whether to use CC1 or CC2 line
* when TYPEC_SPARE_CFG_BIT (CC pin selection s/w override) is set
* or when VCONN_EN_VALUE_BIT is set.
*/
if (val->intval) {
rc = smblib_read(chg, TYPE_C_STATUS_4_REG, &stat);
rc = smblib_read(chg, TYPE_C_STATUS_4_REG, &stat);
if (rc < 0) {
smblib_err(chg, "Couldn't read TYPE_C_STATUS_4 rc=%d\n", rc);
return rc;
}
if (pd_active) {
orientation = stat & CC_ORIENTATION_BIT;
rc = smblib_masked_write(chg,
TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG,
VCONN_EN_ORIENTATION_BIT,
orientation ? 0 : VCONN_EN_ORIENTATION_BIT);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_STATUS_4 rc=%d\n",
rc);
smblib_err(chg,
"Couldn't enable vconn on CC line rc=%d\n", rc);
return rc;
}
stat &= CC_ORIENTATION_BIT;
rc = smblib_masked_write(chg,
TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG,
VCONN_EN_ORIENTATION_BIT,
stat ? 0 : VCONN_EN_ORIENTATION_BIT);
if (rc < 0)
dev_err(chg->dev,
"Couldn't enable vconn on CC line rc=%d\n", rc);
}
/* CC pin selection s/w override in PD session; h/w otherwise. */
rc = smblib_masked_write(chg, TAPER_TIMER_SEL_CFG_REG,
TYPEC_SPARE_CFG_BIT,
val->intval ? TYPEC_SPARE_CFG_BIT : 0);
pd_active ? TYPEC_SPARE_CFG_BIT : 0);
if (rc < 0) {
dev_err(chg->dev, "Couldn't change cc_out ctrl to %s rc=%d\n",
val->intval ? "SW" : "HW", rc);
smblib_err(chg, "Couldn't change cc_out ctrl to %s rc=%d\n",
pd_active ? "SW" : "HW", rc);
return rc;
}
chg->pd_active = (bool)val->intval;
cc_debounced = (bool)(stat & TYPEC_DEBOUNCE_DONE_STATUS_BIT);
if (!pd_active && cc_debounced)
try_rerun_apsd_for_hvdcp(chg);
chg->pd_active = pd_active;
smblib_update_usb_type(chg);
power_supply_changed(chg->usb_psy);
@ -1966,7 +2031,7 @@ irqreturn_t smblib_handle_chg_state_change(int irq, void *data)
rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
smblib_err(chg, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
rc);
return IRQ_HANDLED;
}
@ -2021,7 +2086,7 @@ irqreturn_t smblib_handle_step_chg_soc_update_request(int irq, void *data)
rc = smblib_get_prop_batt_capacity(chg, &pval);
if (rc < 0)
dev_err(chg->dev, "Couldn't get batt capacity rc=%d\n", rc);
smblib_err(chg, "Couldn't get batt capacity rc=%d\n", rc);
else
step_charge_soc_update(chg, pval.intval);
@ -2070,7 +2135,7 @@ irqreturn_t smblib_handle_usb_plugin(int irq, void *data)
"dpdm-supply", NULL)) {
chg->dpdm_reg = devm_regulator_get(chg->dev, "dpdm");
if (IS_ERR(chg->dpdm_reg)) {
dev_err(chg->dev, "Couldn't get dpdm regulator rc=%ld\n",
smblib_err(chg, "Couldn't get dpdm regulator rc=%ld\n",
PTR_ERR(chg->dpdm_reg));
chg->dpdm_reg = NULL;
}
@ -2081,7 +2146,7 @@ irqreturn_t smblib_handle_usb_plugin(int irq, void *data)
rc = smblib_read(chg, USBIN_BASE + INT_RT_STS_OFFSET, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read USB_INT_RT_STS rc=%d\n", rc);
smblib_err(chg, "Couldn't read USB_INT_RT_STS rc=%d\n", rc);
return IRQ_HANDLED;
}
@ -2092,7 +2157,7 @@ irqreturn_t smblib_handle_usb_plugin(int irq, void *data)
smblib_dbg(chg, PR_MISC, "enabling DPDM regulator\n");
rc = regulator_enable(chg->dpdm_reg);
if (rc < 0)
dev_err(chg->dev, "Couldn't enable dpdm regulator rc=%d\n",
smblib_err(chg, "Couldn't enable dpdm regulator rc=%d\n",
rc);
}
} else {
@ -2100,7 +2165,7 @@ irqreturn_t smblib_handle_usb_plugin(int irq, void *data)
smblib_dbg(chg, PR_MISC, "disabling DPDM regulator\n");
rc = regulator_disable(chg->dpdm_reg);
if (rc < 0)
dev_err(chg->dev, "Couldn't disable dpdm regulator rc=%d\n",
smblib_err(chg, "Couldn't disable dpdm regulator rc=%d\n",
rc);
}
}
@ -2122,7 +2187,7 @@ irqreturn_t smblib_handle_icl_change(int irq, void *data)
rc = smblib_get_charge_param(chg, &chg->param.icl_stat, &icl_ma);
if (rc < 0) {
dev_err(chg->dev, "Couldn't get ICL status rc=%d\n", rc);
smblib_err(chg, "Couldn't get ICL status rc=%d\n", rc);
return IRQ_HANDLED;
}
@ -2178,9 +2243,13 @@ static void smblib_handle_hvdcp_check_timeout(struct smb_charger *chg,
bool rising, bool qc_charger)
{
/* Hold off PD only until hvdcp 2.0 detection timeout */
if (rising)
if (rising) {
vote(chg->pd_disallowed_votable_indirect, HVDCP_TIMEOUT_VOTER,
false, 0);
false, 0);
if (get_effective_result(chg->pd_disallowed_votable_indirect))
/* could be a legacy cable, try doing hvdcp */
try_rerun_apsd_for_hvdcp(chg);
}
smblib_dbg(chg, PR_INTERRUPT, "IRQ: smblib_handle_hvdcp_check_timeout %s\n",
rising ? "rising" : "falling");
@ -2229,7 +2298,7 @@ static void smblib_handle_apsd_done(struct smb_charger *chg, bool rising)
rc = smblib_update_usb_type(chg);
if (rc < 0)
dev_err(chg->dev, "Couldn't update usb type rc=%d\n", rc);
smblib_err(chg, "Couldn't update usb type rc=%d\n", rc);
smblib_dbg(chg, PR_INTERRUPT, "IRQ: apsd-done rising; %s detected\n",
apsd_result->name);
@ -2244,7 +2313,7 @@ irqreturn_t smblib_handle_usb_source_change(int irq, void *data)
rc = smblib_read(chg, APSD_STATUS_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read APSD_STATUS rc=%d\n", rc);
smblib_err(chg, "Couldn't read APSD_STATUS rc=%d\n", rc);
return IRQ_HANDLED;
}
smblib_dbg(chg, PR_REGISTER, "APSD_STATUS = 0x%02x\n", stat);
@ -2293,7 +2362,7 @@ static void typec_source_removal(struct smb_charger *chg)
rc = smblib_write(chg, USBIN_ADAPTER_ALLOW_CFG_REG,
USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V);
if (rc < 0)
dev_err(chg->dev, "Couldn't set USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V rc=%d\n",
smblib_err(chg, "Couldn't set USBIN_ADAPTER_ALLOW_5V_OR_9V_TO_12V rc=%d\n",
rc);
chg->voltage_min_uv = MICRO_5V;
@ -2302,7 +2371,12 @@ static void typec_source_removal(struct smb_charger *chg)
/* clear USB ICL vote for PD_VOTER */
rc = vote(chg->usb_icl_votable, PD_VOTER, false, 0);
if (rc < 0)
dev_err(chg->dev, "Couldn't vote for USB ICL rc=%d\n", rc);
smblib_err(chg, "Couldn't un-vote for USB ICL rc=%d\n", rc);
/* clear USB ICL vote for USB_PSY_VOTER */
rc = vote(chg->usb_icl_votable, USB_PSY_VOTER, false, 0);
if (rc < 0)
smblib_err(chg, "Couldn't un-vote for USB ICL rc=%d\n", rc);
}
static void typec_source_insertion(struct smb_charger *chg)
@ -2329,6 +2403,8 @@ static void smblib_handle_typec_removal(struct smb_charger *chg)
/* reset votes from vbus_cc_short */
vote(chg->hvdcp_disable_votable, VBUS_CC_SHORT_VOTER, true, 0);
vote(chg->hvdcp_disable_votable, PD_INACTIVE_VOTER, true, 0);
/*
* cable could be removed during hard reset, remove its vote to
* disable apsd
@ -2336,6 +2412,8 @@ 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);
smblib_update_usb_type(chg);
}
static void smblib_handle_typec_insertion(struct smb_charger *chg,
@ -2361,7 +2439,7 @@ static void smblib_handle_typec_insertion(struct smb_charger *chg,
if (rp == POWER_SUPPLY_TYPEC_SOURCE_HIGH
|| rp == POWER_SUPPLY_TYPEC_NON_COMPLIANT) {
vbus_cc_short = true;
pr_err("Disabling PD and HVDCP, VBUS-CC shorted, rp = %d found\n",
smblib_err(chg, "Disabling PD and HVDCP, VBUS-CC shorted, rp = %d found\n",
rp);
}
}
@ -2384,7 +2462,7 @@ static void smblib_handle_typec_debounce_done(struct smb_charger *chg,
rc = smblib_get_prop_typec_mode(chg, &pval);
if (rc < 0)
dev_err(chg->dev, "Couldn't get prop typec mode rc=%d\n", rc);
smblib_err(chg, "Couldn't get prop typec mode rc=%d\n", rc);
smblib_dbg(chg, PR_INTERRUPT, "IRQ: debounce-done %s; Type-C %s detected\n",
rising ? "rising" : "falling",
@ -2401,8 +2479,7 @@ irqreturn_t smblib_handle_usb_typec_change(int irq, void *data)
rc = smblib_read(chg, TYPE_C_STATUS_4_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_STATUS_4 rc=%d\n",
rc);
smblib_err(chg, "Couldn't read TYPE_C_STATUS_4 rc=%d\n", rc);
return IRQ_HANDLED;
}
smblib_dbg(chg, PR_REGISTER, "TYPE_C_STATUS_4 = 0x%02x\n", stat);
@ -2411,8 +2488,7 @@ irqreturn_t smblib_handle_usb_typec_change(int irq, void *data)
rc = smblib_read(chg, TYPE_C_STATUS_5_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read TYPE_C_STATUS_5 rc=%d\n",
rc);
smblib_err(chg, "Couldn't read TYPE_C_STATUS_5 rc=%d\n", rc);
return IRQ_HANDLED;
}
smblib_dbg(chg, PR_REGISTER, "TYPE_C_STATUS_5 = 0x%02x\n", stat);
@ -2452,7 +2528,12 @@ static void smblib_hvdcp_detect_work(struct work_struct *work)
vote(chg->pd_disallowed_votable_indirect, HVDCP_TIMEOUT_VOTER,
false, 0);
power_supply_changed(chg->usb_psy);
if (get_effective_result(chg->pd_disallowed_votable_indirect))
/* pd is still disabled, try hvdcp */
try_rerun_apsd_for_hvdcp(chg);
else
/* notify pd now that pd is allowed */
power_supply_changed(chg->usb_psy);
}
static void bms_update_work(struct work_struct *work)
@ -2471,7 +2552,7 @@ static void step_soc_req_work(struct work_struct *work)
rc = smblib_get_prop_batt_capacity(chg, &pval);
if (rc < 0) {
dev_err(chg->dev, "Couldn't get batt capacity rc=%d\n", rc);
smblib_err(chg, "Couldn't get batt capacity rc=%d\n", rc);
return;
}
@ -2503,7 +2584,7 @@ static void smblib_pl_taper_work(struct work_struct *work)
rc = smblib_get_prop_batt_charge_type(chg, &pval);
if (rc < 0) {
dev_err(chg->dev, "Couldn't get batt charge type rc=%d\n", rc);
smblib_err(chg, "Couldn't get batt charge type rc=%d\n", rc);
goto done;
}
@ -2725,14 +2806,14 @@ int smblib_init(struct smb_charger *chg)
case PARALLEL_MASTER:
rc = smblib_create_votables(chg);
if (rc < 0) {
dev_err(chg->dev, "Couldn't create votables rc=%d\n",
smblib_err(chg, "Couldn't create votables rc=%d\n",
rc);
return rc;
}
rc = smblib_register_notifier(chg);
if (rc < 0) {
dev_err(chg->dev,
smblib_err(chg,
"Couldn't register notifier rc=%d\n", rc);
return rc;
}
@ -2747,7 +2828,7 @@ int smblib_init(struct smb_charger *chg)
case PARALLEL_SLAVE:
break;
default:
dev_err(chg->dev, "Unsupported mode %d\n", chg->mode);
smblib_err(chg, "Unsupported mode %d\n", chg->mode);
return -EINVAL;
}
@ -2764,7 +2845,7 @@ int smblib_deinit(struct smb_charger *chg)
case PARALLEL_SLAVE:
break;
default:
dev_err(chg->dev, "Unsupported mode %d\n", chg->mode);
smblib_err(chg, "Unsupported mode %d\n", chg->mode);
return -EINVAL;
}

View file

@ -27,6 +27,7 @@ enum print_reason {
#define DEFAULT_VOTER "DEFAULT_VOTER"
#define USER_VOTER "USER_VOTER"
#define PD_VOTER "PD_VOTER"
#define USB_PSY_VOTER "USB_PSY_VOTER"
#define PL_TAPER_WORK_RUNNING_VOTER "PL_TAPER_WORK_RUNNING_VOTER"
#define PARALLEL_PSY_VOTER "PARALLEL_PSY_VOTER"
#define PL_INDIRECT_VOTER "PL_INDIRECT_VOTER"
@ -43,6 +44,7 @@ enum print_reason {
#define PD_HARD_RESET_VOTER "PD_HARD_RESET_VOTER"
#define VBUS_CC_SHORT_VOTER "VBUS_CC_SHORT_VOTER"
#define LEGACY_CABLE_VOTER "LEGACY_CABLE_VOTER"
#define PD_INACTIVE_VOTER "PD_INACTIVE_VOTER"
enum smb_mode {
PARALLEL_MASTER = 0,
@ -114,6 +116,7 @@ struct smb_iio {
struct smb_charger {
struct device *dev;
char *name;
struct regmap *regmap;
struct smb_params param;
struct smb_iio iio;
@ -173,6 +176,7 @@ struct smb_charger {
int voltage_max_uv;
int pd_active;
bool vbus_present;
bool system_suspend_supported;
int system_temp_level;
int thermal_levels;
@ -284,6 +288,8 @@ int smblib_get_prop_usb_suspend(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_usb_voltage_now(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_pd_current_max(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_usb_current_max(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_usb_current_now(struct smb_charger *chg,
@ -304,6 +310,8 @@ int smblib_get_prop_charger_temp(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_get_prop_charger_temp_max(struct smb_charger *chg,
union power_supply_propval *val);
int smblib_set_prop_pd_current_max(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_usb_current_max(struct smb_charger *chg,
const union power_supply_propval *val);
int smblib_set_prop_usb_voltage_min(struct smb_charger *chg,

View file

@ -1172,6 +1172,7 @@ static int smb138x_probe(struct platform_device *pdev)
chip->chg.dev = &pdev->dev;
chip->chg.debug_mask = &__debug_mask;
chip->chg.name = "SMB";
chip->chg.regmap = dev_get_regmap(chip->chg.dev->parent, NULL);
if (!chip->chg.regmap) {

View file

@ -198,6 +198,7 @@ enum power_supply_property {
POWER_SUPPLY_PROP_FLASH_CURRENT_MAX,
POWER_SUPPLY_PROP_UPDATE_NOW,
POWER_SUPPLY_PROP_ESR_COUNT,
POWER_SUPPLY_PROP_BUCK_FREQ,
POWER_SUPPLY_PROP_SAFETY_TIMER_ENABLE,
POWER_SUPPLY_PROP_CHARGE_DONE,
POWER_SUPPLY_PROP_FLASH_ACTIVE,