Ejemplo n.º 1
0
static int ulpmc_get_charger_property(struct power_supply *psy,
					enum power_supply_property psp,
					union power_supply_propval *val)
{
	int ret = 0;
	struct ulpmc_chip_info *chip = container_of(psy,
				struct ulpmc_chip_info, chrg);

	mutex_lock(&chip->lock);
	switch (psp) {
	case POWER_SUPPLY_PROP_PRESENT:
		ret = ulpmc_read_reg8(chip->client, ULPMC_BC_REG_STAT);
		if (ret < 0)
			goto i2c_read_err;
		if ((ret & BC_STAT_VBUS_MASK) == BC_STAT_VBUS_ADP)
			val->intval = 1;
		else
			val->intval = 0;
		break;
	case POWER_SUPPLY_PROP_ONLINE:
		ret = ulpmc_read_reg8(chip->client, ULPMC_BC_REG_STAT);
		if (ret < 0)
			goto i2c_read_err;
		if (ret & BC_STAT_PWR_GOOD)
			val->intval = 1;
		else
			val->intval = 0;
		break;
	case POWER_SUPPLY_PROP_HEALTH:
		val->intval = get_charger_health(chip);
		break;
	default:
		mutex_unlock(&chip->lock);
		return -EINVAL;
	}

	mutex_unlock(&chip->lock);
	return 0;

i2c_read_err:
	mutex_unlock(&chip->lock);
	return ret;
}
static int pmic_chrg_usb_get_property(struct power_supply *psy,
                                      enum power_supply_property psp,
                                      union power_supply_propval *val)
{
    struct pmic_chrg_info *info = container_of(psy,
                                  struct pmic_chrg_info, psy_usb);
    int ret = 0;

    mutex_lock(&info->lock);

    switch (psp) {
    case POWER_SUPPLY_PROP_PRESENT:
        /* check for OTG case first */
        if (info->id_short) {
            val->intval = 0;
            break;
        }
        ret = pmic_chrg_is_present(info);
        if (ret < 0)
            goto psy_get_prop_fail;
        val->intval = ret;
        break;
    case POWER_SUPPLY_PROP_ONLINE:
        /* check for OTG case first */
        if (info->id_short) {
            val->intval = 0;
            break;
        }
        val->intval = info->online;
        break;
    case POWER_SUPPLY_PROP_HEALTH:
        val->intval = get_charger_health(info);
        /*
         * X-Power Inlimit is getting set to default(500mA)
         * whenever we hit the Charger UVP condition and the
         * setting remains same even after UVP recovery.
         * As a WA to make sure INLMT is intact, we are
         * reprogramming the inlimit.
         */
        if (val->intval == POWER_SUPPLY_HEALTH_GOOD) {
            ret = pmic_chrg_set_inlmt(info, info->inlmt);
            if (ret < 0)
                dev_warn(&info->pdev->dev, "set inlimit failed\n");
        }
        break;
    case POWER_SUPPLY_PROP_MAX_CHARGE_CURRENT:
        val->intval = info->max_cc;
        break;
    case POWER_SUPPLY_PROP_MAX_CHARGE_VOLTAGE:
        val->intval = info->max_cv;
        break;
    case POWER_SUPPLY_PROP_CHARGE_CURRENT:
        val->intval = info->cc;
        break;
    case POWER_SUPPLY_PROP_CHARGE_VOLTAGE:
        val->intval = info->cv;
        break;
    case POWER_SUPPLY_PROP_INLMT:
        val->intval = info->inlmt;
        break;
    case POWER_SUPPLY_PROP_CHARGE_TERM_CUR:
        val->intval = info->iterm;
        break;
    case POWER_SUPPLY_PROP_CABLE_TYPE:
        val->intval = info->cable_type;
        break;
    case POWER_SUPPLY_PROP_ENABLE_CHARGING:
        val->intval = info->is_charging_enabled;
        break;
    case POWER_SUPPLY_PROP_ENABLE_CHARGER:
        val->intval = info->is_charger_enabled;
        break;
    case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
        val->intval = info->cntl_state;
        break;
    case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX:
        val->intval = info->pdata->num_throttle_states;
        break;
    case POWER_SUPPLY_PROP_MAX_TEMP:
        val->intval = info->max_temp;
        break;
    case POWER_SUPPLY_PROP_MIN_TEMP:
        val->intval = info->min_temp;
        break;
    default:
        mutex_unlock(&info->lock);
        return -EINVAL;
    }

psy_get_prop_fail:
    mutex_unlock(&info->lock);
    return ret;
}
static int crystalcove_chgr_usb_get_property(struct power_supply *psy,
				    enum power_supply_property psp,
				    union power_supply_propval *val)
{
	struct chgr_info *info = container_of(psy,
				struct chgr_info, psy_usb);
	int ret = 0;

	mutex_lock(&info->lock);

	switch (psp) {
	case POWER_SUPPLY_PROP_PRESENT:
		ret = crystal_cove_vbus_on_status();
		if (ret < 0)
			goto psy_get_prop_fail;
		val->intval = ret;
		break;
	case POWER_SUPPLY_PROP_ONLINE:
		val->intval = info->online;
		break;
	case POWER_SUPPLY_PROP_HEALTH:
		val->intval = get_charger_health(info);
		break;
	case POWER_SUPPLY_PROP_MAX_CHARGE_CURRENT:
		val->intval = info->max_cc;
		break;
	case POWER_SUPPLY_PROP_MAX_CHARGE_VOLTAGE:
		val->intval = info->max_cv;
		break;
	case POWER_SUPPLY_PROP_CHARGE_CURRENT:
		val->intval = info->cc;
		break;
	case POWER_SUPPLY_PROP_CHARGE_VOLTAGE:
		val->intval = info->cv;
		break;
	case POWER_SUPPLY_PROP_INLMT:
		val->intval = info->inlmt;
		break;
	case POWER_SUPPLY_PROP_CHARGE_TERM_CUR:
		val->intval = info->iterm;
		break;
	case POWER_SUPPLY_PROP_CABLE_TYPE:
		val->intval = info->cable_type;
		break;
	case POWER_SUPPLY_PROP_ENABLE_CHARGING:
		val->intval = info->is_charging_enabled;
		break;
	case POWER_SUPPLY_PROP_ENABLE_CHARGER:
		val->intval = info->is_charger_enabled;
		break;
	case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT:
		val->intval = info->cntl_state;
		break;
	case POWER_SUPPLY_PROP_CHARGE_CONTROL_LIMIT_MAX:
		val->intval = info->pdata->num_throttle_states;
		break;
	case POWER_SUPPLY_PROP_MAX_TEMP:
		val->intval = info->max_temp;
		break;
	case POWER_SUPPLY_PROP_MIN_TEMP:
		val->intval = info->min_temp;
		break;
	default:
		mutex_unlock(&info->lock);
		return -EINVAL;
	}

psy_get_prop_fail:
	mutex_unlock(&info->lock);
	return ret;
}