Merge "qpnp-smb2: smb-lib: add charge_done property"

This commit is contained in:
Linux Build Service Account 2016-10-07 22:15:39 -07:00 committed by Gerrit - the friendly Code Review server
commit eb3e44cc3f
4 changed files with 84 additions and 47 deletions

View file

@ -605,6 +605,7 @@ static enum power_supply_property smb2_batt_props[] = {
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_STEP_CHARGING_ENABLED,
POWER_SUPPLY_PROP_STEP_CHARGING_STEP,
POWER_SUPPLY_PROP_CHARGE_DONE,
};
static int smb2_batt_get_prop(struct power_supply *psy,
@ -662,6 +663,9 @@ static int smb2_batt_get_prop(struct power_supply *psy,
case POWER_SUPPLY_PROP_TECHNOLOGY:
val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
break;
case POWER_SUPPLY_PROP_CHARGE_DONE:
val->intval = chg->chg_done;
break;
default:
pr_err("batt power supply prop %d not supported\n", psp);
return -EINVAL;
@ -692,6 +696,9 @@ static int smb2_batt_set_prop(struct power_supply *psy,
case POWER_SUPPLY_PROP_CAPACITY:
rc = smblib_set_prop_batt_capacity(chg, val);
break;
case POWER_SUPPLY_PROP_CHARGE_DONE:
chg->chg_done = val->intval;
break;
default:
rc = -EINVAL;
}

View file

@ -883,25 +883,28 @@ int smblib_get_prop_batt_capacity(struct smb_charger *chg,
int smblib_get_prop_batt_status(struct smb_charger *chg,
union power_supply_propval *val)
{
int rc;
u8 stat;
union power_supply_propval pval = {0, };
bool usb_online, dc_online;
u8 stat;
int rc;
smblib_get_prop_input_suspend(chg, &pval);
if (pval.intval) {
val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
return rc;
}
rc = smblib_read(chg, POWER_PATH_STATUS_REG, &stat);
rc = smblib_get_prop_usb_online(chg, &pval);
if (rc < 0) {
dev_err(chg->dev, "Couldn't read POWER_PATH_STATUS rc=%d\n",
dev_err(chg->dev, "Couldn't get usb online property rc=%d\n",
rc);
return rc;
}
usb_online = (bool)pval.intval;
if (!(stat & (USE_USBIN_BIT | USE_DCIN_BIT)) ||
!(stat & VALID_INPUT_POWER_SOURCE_BIT)) {
rc = smblib_get_prop_dc_online(chg, &pval);
if (rc < 0) {
dev_err(chg->dev, "Couldn't get dc online property rc=%d\n",
rc);
return rc;
}
dc_online = (bool)pval.intval;
if (!usb_online && !dc_online) {
val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
return rc;
}
@ -912,16 +915,29 @@ int smblib_get_prop_batt_status(struct smb_charger *chg,
rc);
return rc;
}
smblib_dbg(chg, PR_REGISTER, "BATTERY_CHARGER_STATUS_1 = 0x%02x\n",
stat);
stat = stat & BATTERY_CHARGER_STATUS_MASK;
if (stat >= COMPLETED_CHARGE)
val->intval = POWER_SUPPLY_STATUS_FULL;
else
switch (stat) {
case TRICKLE_CHARGE:
case PRE_CHARGE:
case FAST_CHARGE:
case FULLON_CHARGE:
case TAPER_CHARGE:
val->intval = POWER_SUPPLY_STATUS_CHARGING;
break;
case TERMINATE_CHARGE:
case INHIBIT_CHARGE:
val->intval = POWER_SUPPLY_STATUS_FULL;
break;
case DISABLE_CHARGE:
val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
break;
default:
val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
break;
}
return rc;
return 0;
}
int smblib_get_prop_batt_charge_type(struct smb_charger *chg,
@ -936,8 +952,6 @@ int smblib_get_prop_batt_charge_type(struct smb_charger *chg,
rc);
return rc;
}
smblib_dbg(chg, PR_REGISTER, "BATTERY_CHARGER_STATUS_1 = 0x%02x\n",
stat);
switch (stat & BATTERY_CHARGER_STATUS_MASK) {
case TRICKLE_CHARGE:
@ -1257,7 +1271,6 @@ int smblib_get_prop_usb_online(struct smb_charger *chg,
val->intval = (stat & USE_USBIN_BIT) &&
(stat & VALID_INPUT_POWER_SOURCE_BIT);
return rc;
}
@ -1672,43 +1685,58 @@ irqreturn_t smblib_handle_debug(int irq, void *data)
return IRQ_HANDLED;
}
static void smblib_pl_handle_chg_state_change(struct smb_charger *chg, u8 stat)
{
bool pl_enabled;
if (chg->mode != PARALLEL_MASTER)
return;
pl_enabled = !get_effective_result_locked(chg->pl_disable_votable);
switch (stat) {
case FAST_CHARGE:
case FULLON_CHARGE:
vote(chg->pl_disable_votable, CHG_STATE_VOTER, false, 0);
break;
case TAPER_CHARGE:
if (pl_enabled) {
cancel_delayed_work_sync(&chg->pl_taper_work);
schedule_delayed_work(&chg->pl_taper_work, 0);
}
break;
case TERMINATE_CHARGE:
case INHIBIT_CHARGE:
case DISABLE_CHARGE:
vote(chg->pl_disable_votable, TAPER_END_VOTER, false, 0);
break;
default:
break;
}
}
irqreturn_t smblib_handle_chg_state_change(int irq, void *data)
{
union power_supply_propval pval = {0, };
struct smb_irq_data *irq_data = data;
struct smb_charger *chg = irq_data->parent_data;
union power_supply_propval pval = {0, };
u8 stat;
int rc;
smblib_dbg(chg, PR_INTERRUPT, "IRQ: %s\n", irq_data->name);
if (chg->mode != PARALLEL_MASTER)
return IRQ_HANDLED;
rc = smblib_get_prop_batt_charge_type(chg, &pval);
rc = smblib_read(chg, BATTERY_CHARGER_STATUS_1_REG, &stat);
if (rc < 0) {
dev_err(chg->dev, "Couldn't get batt charge type rc=%d\n", rc);
dev_err(chg->dev, "Couldn't read BATTERY_CHARGER_STATUS_1 rc=%d\n",
rc);
return IRQ_HANDLED;
}
if (pval.intval == POWER_SUPPLY_CHARGE_TYPE_FAST)
vote(chg->pl_disable_votable, CHG_STATE_VOTER, false, 0);
if (pval.intval == POWER_SUPPLY_CHARGE_TYPE_TAPER
&& !get_effective_result_locked(chg->pl_disable_votable)) {
cancel_delayed_work_sync(&chg->pl_taper_work);
schedule_delayed_work(&chg->pl_taper_work, 0);
}
rc = smblib_get_prop_batt_status(chg, &pval);
if (rc < 0) {
dev_err(chg->dev, "Couldn't get batt status type rc=%d\n", rc);
return IRQ_HANDLED;
}
if (pval.intval == POWER_SUPPLY_STATUS_FULL) {
power_supply_changed(chg->batt_psy);
vote(chg->pl_disable_votable, TAPER_END_VOTER, false, 0);
}
stat = stat & BATTERY_CHARGER_STATUS_MASK;
smblib_pl_handle_chg_state_change(chg, stat);
pval.intval = (stat == TERMINATE_CHARGE);
power_supply_set_property(chg->batt_psy, POWER_SUPPLY_PROP_CHARGE_DONE,
&pval);
power_supply_changed(chg->batt_psy);
return IRQ_HANDLED;
}

View file

@ -163,6 +163,7 @@ struct smb_charger {
bool step_chg_enabled;
bool is_hdc;
bool chg_done;
/* workaround flag */
u32 wa_flags;

View file

@ -41,8 +41,9 @@ enum {
FAST_CHARGE,
FULLON_CHARGE,
TAPER_CHARGE,
COMPLETED_CHARGE,
TERMINATE_CHARGE,
INHIBIT_CHARGE,
DISABLE_CHARGE,
};
#define BATTERY_CHARGER_STATUS_2_REG (CHGR_BASE + 0x07)