static void apm_battery_apm_get_power_status(struct apm_power_info *info) { union power_supply_propval status; union power_supply_propval capacity, time_to_full, time_to_empty; mutex_lock(&apm_mutex); find_main_battery(); if (!main_battery) { mutex_unlock(&apm_mutex); return; } /* status */ if (MPSY_PROP(STATUS, &status)) status.intval = POWER_SUPPLY_STATUS_UNKNOWN; /* ac line status */ #ifdef CONFIG_ARCH_BCM4760 { union power_supply_propval online; MPSY_PROP(ONLINE, &online); if(online.intval){ info->ac_line_status = APM_AC_ONLINE; } else { info->ac_line_status = APM_AC_OFFLINE; } } #else if ((status.intval == POWER_SUPPLY_STATUS_CHARGING) || (status.intval == POWER_SUPPLY_STATUS_NOT_CHARGING) || (status.intval == POWER_SUPPLY_STATUS_FULL)) info->ac_line_status = APM_AC_ONLINE; else info->ac_line_status = APM_AC_OFFLINE; #endif /* battery life (i.e. capacity, in percents) */ if (MPSY_PROP(CAPACITY, &capacity) == 0) { info->battery_life = capacity.intval; } else { /* try calculate using energy */ info->battery_life = calculate_capacity(SOURCE_ENERGY); /* if failed try calculate using charge instead */ if (info->battery_life == -1) info->battery_life = calculate_capacity(SOURCE_CHARGE); if (info->battery_life == -1) info->battery_life = calculate_capacity(SOURCE_VOLTAGE); } /* charging status */ if (status.intval == POWER_SUPPLY_STATUS_CHARGING) { info->battery_status = APM_BATTERY_STATUS_CHARGING; } else { if (info->battery_life > 50) info->battery_status = APM_BATTERY_STATUS_HIGH; else if (info->battery_life > 5) info->battery_status = APM_BATTERY_STATUS_LOW; else info->battery_status = APM_BATTERY_STATUS_CRITICAL; } info->battery_flag = info->battery_status; /* time */ info->units = APM_UNITS_MINS; if (status.intval == POWER_SUPPLY_STATUS_CHARGING) { if (!MPSY_PROP(TIME_TO_FULL_AVG, &time_to_full) || !MPSY_PROP(TIME_TO_FULL_NOW, &time_to_full)) info->time = time_to_full.intval / 60; else info->time = calculate_time(status.intval); } else { if (!MPSY_PROP(TIME_TO_EMPTY_AVG, &time_to_empty) || !MPSY_PROP(TIME_TO_EMPTY_NOW, &time_to_empty)) info->time = time_to_empty.intval / 60; else info->time = calculate_time(status.intval); } mutex_unlock(&apm_mutex); }
static void apm_battery_apm_get_power_status(struct apm_power_info *info) { union power_supply_propval status; union power_supply_propval capacity, time_to_full, time_to_empty; mutex_lock(&apm_mutex); find_main_battery(); if (!main_battery) { mutex_unlock(&apm_mutex); return; } if (MPSY_PROP(STATUS, &status)) status.intval = POWER_SUPPLY_STATUS_UNKNOWN; if ((status.intval == POWER_SUPPLY_STATUS_CHARGING) || (status.intval == POWER_SUPPLY_STATUS_NOT_CHARGING) || (status.intval == POWER_SUPPLY_STATUS_FULL)) info->ac_line_status = APM_AC_ONLINE; else info->ac_line_status = APM_AC_OFFLINE; if (MPSY_PROP(CAPACITY, &capacity) == 0) { info->battery_life = capacity.intval; } else { info->battery_life = calculate_capacity(SOURCE_ENERGY); if (info->battery_life == -1) info->battery_life = calculate_capacity(SOURCE_CHARGE); if (info->battery_life == -1) info->battery_life = calculate_capacity(SOURCE_VOLTAGE); } if (status.intval == POWER_SUPPLY_STATUS_CHARGING) { info->battery_status = APM_BATTERY_STATUS_CHARGING; } else { if (info->battery_life > 50) info->battery_status = APM_BATTERY_STATUS_HIGH; else if (info->battery_life > 5) info->battery_status = APM_BATTERY_STATUS_LOW; else info->battery_status = APM_BATTERY_STATUS_CRITICAL; } info->battery_flag = info->battery_status; info->units = APM_UNITS_MINS; if (status.intval == POWER_SUPPLY_STATUS_CHARGING) { if (!MPSY_PROP(TIME_TO_FULL_AVG, &time_to_full) || !MPSY_PROP(TIME_TO_FULL_NOW, &time_to_full)) info->time = time_to_full.intval / 60; else info->time = calculate_time(status.intval); } else { if (!MPSY_PROP(TIME_TO_EMPTY_AVG, &time_to_empty) || !MPSY_PROP(TIME_TO_EMPTY_NOW, &time_to_empty)) info->time = time_to_empty.intval / 60; else info->time = calculate_time(status.intval); } mutex_unlock(&apm_mutex); }