static int bd9995x_power_supply_get_property()

in supply/bd99954-charger.c [280:441]


static int bd9995x_power_supply_get_property(struct power_supply *psy,
					     enum power_supply_property psp,
					     union power_supply_propval *val)
{
	int ret, tmp;
	struct bd9995x_device *bd = power_supply_get_drvdata(psy);
	struct bd9995x_state state;

	mutex_lock(&bd->lock);
	state = bd->state;
	mutex_unlock(&bd->lock);

	switch (psp) {
	case POWER_SUPPLY_PROP_STATUS:
		switch (state.chgstm_status) {
		case CHGSTM_TRICKLE_CHARGE:
		case CHGSTM_PRE_CHARGE:
		case CHGSTM_FAST_CHARGE:
		case CHGSTM_TOP_OFF:
			val->intval = POWER_SUPPLY_STATUS_CHARGING;
			break;

		case CHGSTM_DONE:
			val->intval = POWER_SUPPLY_STATUS_FULL;
			break;

		case CHGSTM_SUSPEND:
		case CHGSTM_TEMPERATURE_ERROR_1:
		case CHGSTM_TEMPERATURE_ERROR_2:
		case CHGSTM_TEMPERATURE_ERROR_3:
		case CHGSTM_TEMPERATURE_ERROR_4:
		case CHGSTM_TEMPERATURE_ERROR_5:
		case CHGSTM_TEMPERATURE_ERROR_6:
		case CHGSTM_TEMPERATURE_ERROR_7:
		case CHGSTM_THERMAL_SHUT_DOWN_1:
		case CHGSTM_THERMAL_SHUT_DOWN_2:
		case CHGSTM_THERMAL_SHUT_DOWN_3:
		case CHGSTM_THERMAL_SHUT_DOWN_4:
		case CHGSTM_THERMAL_SHUT_DOWN_5:
		case CHGSTM_THERMAL_SHUT_DOWN_6:
		case CHGSTM_THERMAL_SHUT_DOWN_7:
		case CHGSTM_BATTERY_ERROR:
			val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
			break;

		default:
			val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
			break;
		}
		break;

	case POWER_SUPPLY_PROP_MANUFACTURER:
		val->strval = BD9995X_MANUFACTURER;
		break;

	case POWER_SUPPLY_PROP_ONLINE:
		val->intval = state.online;
		break;

	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT:
		ret = regmap_field_read(bd->rmap_fields[F_IBATP_VAL], &tmp);
		if (ret)
			return ret;
		val->intval = tmp * 1000;
		break;

	case POWER_SUPPLY_PROP_CHARGE_AVG:
		ret = regmap_field_read(bd->rmap_fields[F_IBATP_AVE_VAL], &tmp);
		if (ret)
			return ret;
		val->intval = tmp * 1000;
		break;

	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
		/*
		 * Currently the DT uses this property to give the
		 * target current for fast-charging constant current phase.
		 * I think it is correct in a sense.
		 *
		 * Yet, this prop we read and return here is the programmed
		 * safety limit for combined input currents. This feels
		 * also correct in a sense.
		 *
		 * However, this results a mismatch to DT value and value
		 * read from sysfs.
		 */
		ret = regmap_field_read(bd->rmap_fields[F_SEL_ILIM_VAL], &tmp);
		if (ret)
			return ret;
		val->intval = tmp * 1000;
		break;

	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
		if (!state.online) {
			val->intval = 0;
			break;
		}

		ret = regmap_field_read(bd->rmap_fields[F_VFASTCHG_REG_SET1],
					&tmp);
		if (ret)
			return ret;

		/*
		 * The actual range : 2560 to 19200 mV. No matter what the
		 * register says
		 */
		val->intval = clamp_val(tmp << 4, 2560, 19200);
		val->intval *= 1000;
		break;

	case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT:
		ret = regmap_field_read(bd->rmap_fields[F_ITERM_SET], &tmp);
		if (ret)
			return ret;
		/* Start step is 64 mA */
		val->intval = tmp << 6;
		/* Maximum is 1024 mA - no matter what register says */
		val->intval = min(val->intval, 1024);
		val->intval *= 1000;
		break;

	/* Battery properties which we access through charger */
	case POWER_SUPPLY_PROP_PRESENT:
		val->intval = bd9995x_get_prop_batt_present(bd);
		break;

	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
		val->intval = bd9995x_get_prop_batt_voltage(bd);
		break;

	case POWER_SUPPLY_PROP_CURRENT_NOW:
		val->intval = bd9995x_get_prop_batt_current(bd);
		break;

	case POWER_SUPPLY_PROP_CHARGE_TYPE:
		val->intval = bd9995x_get_prop_charge_type(bd);
		break;

	case POWER_SUPPLY_PROP_HEALTH:
		val->intval = bd9995x_get_prop_batt_health(bd);
		break;

	case POWER_SUPPLY_PROP_TEMP:
		val->intval = bd9995x_get_prop_batt_temp(bd);
		break;

	case POWER_SUPPLY_PROP_TECHNOLOGY:
		val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
		break;

	case POWER_SUPPLY_PROP_MODEL_NAME:
		val->strval = "bd99954";
		break;

	default:
		return -EINVAL;

	}

	return 0;
}