struct msic_power_module_info *mbi =
container_of(psy, struct msic_power_module_info, usb);
int retval = 0;
+ int err_event;
+
+ mutex_lock(&mbi->event_lock);
+ err_event = mbi->msic_chr_err;
+ mutex_unlock(&mbi->event_lock);
mutex_lock(&mbi->usb_chrg_lock);
val->intval = mbi->usb_chrg_props.charger_present;
break;
case POWER_SUPPLY_PROP_ONLINE:
- if (mbi->batt_props.status != POWER_SUPPLY_STATUS_NOT_CHARGING)
+ if (mbi->batt_props.status != POWER_SUPPLY_STATUS_NOT_CHARGING
+ || (err_event != MSIC_CHRG_ERROR_NONE &&
+ err_event != MSIC_CHRG_ERROR_WEAKVIN))
val->intval = mbi->usb_chrg_props.charger_present;
else
val->intval = 0;
mutex_lock(&mbi->batt_lock);
mbi->batt_props.health = POWER_SUPPLY_HEALTH_OVERHEAT;
mutex_unlock(&mbi->batt_lock);
+
+ mutex_lock(&mbi->event_lock);
+ mbi->msic_chr_err = MSIC_CHRG_ERROR_OVERHEAT;
+ mutex_unlock(&mbi->event_lock);
}
/* set battery charging status */
if (mbi->batt_props.status !=
}
if (vbus_voltage < WEAKVIN_VOLTAGE_LEVEL) {
+ dev_warn(msic_dev, "vbus_volt:%d less than"
+ "WEAKVIN threshold", vbus_voltage);
mutex_lock(&mbi->usb_chrg_lock);
mbi->usb_chrg_props.charger_health =
POWER_SUPPLY_HEALTH_DEAD;
mutex_unlock(&mbi->usb_chrg_lock);
+
+ mutex_lock(&mbi->event_lock);
+ mbi->msic_chr_err = MSIC_CHRG_ERROR_WEAKVIN;
+ mutex_unlock(&mbi->event_lock);
}
iprev = -1;
mbi->usb_chrg_props.charger_health = POWER_SUPPLY_HEALTH_GOOD;
+ mutex_lock(&mbi->event_lock);
+ if (mbi->msic_chr_err == MSIC_CHRG_ERROR_WEAKVIN)
+ mbi->msic_chr_err = MSIC_CHRG_ERROR_NONE;
+ mutex_unlock(&mbi->event_lock);
+
} else if (mbi->batt_props.health ==
POWER_SUPPLY_HEALTH_UNSPEC_FAILURE){
mbi->batt_props.health = POWER_SUPPLY_HEALTH_GOOD;
dev_dbg(msic_dev, "Setting battery-health, power-supply good");
+
+ mutex_lock(&mbi->event_lock);
+ if (mbi->msic_chr_err == MSIC_CHRG_ERROR_OVERHEAT)
+ mbi->msic_chr_err = MSIC_CHRG_ERROR_NONE;
+ mutex_unlock(&mbi->event_lock);
} else if (mbi->batt_props.health ==
POWER_SUPPLY_HEALTH_UNSPEC_FAILURE){
dev_info(msic_dev, "Stopping charging due to "
"charge-timer expiry");
break;
+ case MSIC_CHRG_ERROR_USER_DISABLE:
+ dev_info(msic_dev, "Stopping charging due to "
+ "user-disable event");
+ break;
default:
dev_warn(msic_dev, "Stopping charging due to "
"unknown error event:%d\n", err_event);
/* No need to process if same value given
* or charging stopped due to an error */
if (value == mbi->usr_chrg_enbl ||
- mbi->msic_chr_err != MSIC_CHRG_ERROR_NONE) {
+ mbi->msic_chr_err == MSIC_CHRG_ERROR_CHRTMR_EXPIRY) {
mutex_unlock(&mbi->event_lock);
return -EIO;
}
if (!value && (chr_mode != BATT_CHARGING_MODE_NONE)) {
dev_dbg(msic_dev, "User App charger disable !\n");
+ mutex_lock(&mbi->event_lock);
+ mbi->msic_chr_err = MSIC_CHRG_ERROR_USER_DISABLE;
+ mutex_unlock(&mbi->event_lock);
+
/* Disable charger before setting the usr_chrg_enbl */
msic_event_handler(mbi, USBCHRG_EVENT_SUSPEND, NULL);
/* enable usr_chrg_enbl before checking charger connection */
mutex_lock(&mbi->event_lock);
+ mbi->msic_chr_err = MSIC_CHRG_ERROR_NONE;
mbi->usr_chrg_enbl = value;
mutex_unlock(&mbi->event_lock);