static int sec_fg_get_property(struct power_supply *psy,
                               enum power_supply_property psp,
                               union power_supply_propval *val)
{
    struct sec_fuelgauge_info *fuelgauge =
        container_of(psy, struct sec_fuelgauge_info, psy_fg);

    switch (psp) {
    case POWER_SUPPLY_PROP_VOLTAGE_NOW:
    case POWER_SUPPLY_PROP_VOLTAGE_AVG:
    case POWER_SUPPLY_PROP_CURRENT_NOW:
    case POWER_SUPPLY_PROP_CURRENT_AVG:
    case POWER_SUPPLY_PROP_CAPACITY:
    case POWER_SUPPLY_PROP_TEMP:
    case POWER_SUPPLY_PROP_TEMP_AMBIENT:
        if (!sec_hal_fg_get_property(fuelgauge->client, psp, val))
            return -EINVAL;
        if (psp == POWER_SUPPLY_PROP_CAPACITY) {
            if (fuelgauge->pdata->capacity_calculation_type &
                    SEC_FUELGAUGE_CAPACITY_TYPE_SCALE)
                sec_fg_get_scaled_capacity(fuelgauge, val);

            /* capacity should be between 0% and 100%
             * (0.1% degree)
             */
            if (val->intval > 1000)
                val->intval = 1000;
            if (val->intval < 0)
                val->intval = 0;

            /* get only integer part */
            val->intval /= 10;

            /* (Only for atomic capacity)
             * In initial time, capacity_old is 0.
             * and in resume from sleep,
             * capacity_old is too different from actual soc.
             * should update capacity_old
             * by val->intval in booting or resume.
             */
            if (fuelgauge->initial_update_of_soc) {
                /* updated old capacity */
                fuelgauge->capacity_old = val->intval;
                fuelgauge->initial_update_of_soc = false;
                break;
            }

            if (fuelgauge->pdata->capacity_calculation_type &
                    SEC_FUELGAUGE_CAPACITY_TYPE_ATOMIC)
                sec_fg_get_atomic_capacity(fuelgauge, val);
        }
        break;
    default:
        return -EINVAL;
    }
    return 0;
}
static int sec_fg_get_property(struct power_supply *psy,
			    enum power_supply_property psp,
			    union power_supply_propval *val)
{
	struct sec_fuelgauge_info *fuelgauge =
		container_of(psy, struct sec_fuelgauge_info, psy_fg);
	int soc_type = val->intval;

	switch (psp) {
	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
	case POWER_SUPPLY_PROP_VOLTAGE_AVG:
	case POWER_SUPPLY_PROP_CURRENT_NOW:
	case POWER_SUPPLY_PROP_CURRENT_AVG:
	case POWER_SUPPLY_PROP_ENERGY_NOW:
	case POWER_SUPPLY_PROP_CAPACITY:
	case POWER_SUPPLY_PROP_TEMP:
	case POWER_SUPPLY_PROP_TEMP_AMBIENT:
		if (!sec_hal_fg_get_property(fuelgauge->client, psp, val))
			return -EINVAL;
		if (psp == POWER_SUPPLY_PROP_CAPACITY) {
			if (soc_type == SEC_FUELGAUGE_CAPACITY_TYPE_RAW)
				break;

			if (fuelgauge->pdata->capacity_calculation_type &
				(SEC_FUELGAUGE_CAPACITY_TYPE_SCALE |
				 SEC_FUELGAUGE_CAPACITY_TYPE_DYNAMIC_SCALE))
				sec_fg_get_scaled_capacity(fuelgauge, val);

			/* capacity should be between 0% and 100%
			 * (0.1% degree)
			 */
			if (val->intval > 1000)
				val->intval = 1000;
			if (val->intval < 0)
				val->intval = 0;

			/* get only integer part */
			val->intval /= 10;

			/* check whether doing the wake_unlock */
			if ((val->intval > fuelgauge->pdata->fuel_alert_soc) &&
				fuelgauge->is_fuel_alerted) {
				wake_unlock(&fuelgauge->fuel_alert_wake_lock);
				sec_hal_fg_fuelalert_init(fuelgauge->client,
					fuelgauge->pdata->fuel_alert_soc);
			}

			/* (Only for atomic capacity)
			 * In initial time, capacity_old is 0.
			 * and in resume from sleep,
			 * capacity_old is too different from actual soc.
			 * should update capacity_old
			 * by val->intval in booting or resume.
			 */
			if (fuelgauge->initial_update_of_soc) {
				/* updated old capacity */
				fuelgauge->capacity_old = val->intval;
				fuelgauge->initial_update_of_soc = false;
				break;
			}

			if (fuelgauge->pdata->capacity_calculation_type &
				(SEC_FUELGAUGE_CAPACITY_TYPE_ATOMIC |
				 SEC_FUELGAUGE_CAPACITY_TYPE_SKIP_ABNORMAL))
				sec_fg_get_atomic_capacity(fuelgauge, val);
		}
		break;
	case POWER_SUPPLY_PROP_STATUS:
	case POWER_SUPPLY_PROP_CHARGE_FULL:
		break;
	default:
		return -EINVAL;
	}
	return 0;
}