static int acpi_battery_check ( struct acpi_battery *battery) { int result = 0; acpi_status status = AE_OK; acpi_handle handle = NULL; struct acpi_device *device = NULL; struct acpi_battery_info *bif = NULL; ACPI_FUNCTION_TRACE("acpi_battery_check"); if (!battery) return_VALUE(-EINVAL); result = acpi_bus_get_device(battery->handle, &device); if (result) return_VALUE(result); result = acpi_bus_get_status(device); if (result) return_VALUE(result); /* Insertion? */ if (!battery->flags.present && device->status.battery_present) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Battery inserted\n")); /* Evalute _BIF to get certain static information */ result = acpi_battery_get_info(battery, &bif); if (result) return_VALUE(result); battery->flags.power_unit = bif->power_unit; battery->trips.warning = bif->design_capacity_warning; battery->trips.low = bif->design_capacity_low; kfree(bif); /* See if alarms are supported, and if so, set default */ status = acpi_get_handle(battery->handle, "_BTP", &handle); if (ACPI_SUCCESS(status)) { battery->flags.alarm = 1; acpi_battery_set_alarm(battery, battery->trips.warning); } } /* Removal? */ else if (battery->flags.present && !device->status.battery_present) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Battery removed\n")); } battery->flags.present = device->status.battery_present; return_VALUE(result); }
static int acpi_battery_read_info ( char *page, char **start, off_t off, int count, int *eof, void *data) { int result = 0; struct acpi_battery *battery = (struct acpi_battery *) data; struct acpi_battery_info *bif = NULL; char *units = "?"; char *p = page; int len = 0; ACPI_FUNCTION_TRACE("acpi_battery_read_info"); if (!battery || (off != 0)) goto end; if (battery->flags.present) p += sprintf(p, "present: yes\n"); else { p += sprintf(p, "present: no\n"); goto end; } /* Battery Info (_BIF) */ result = acpi_battery_get_info(battery, &bif); if (result || !bif) { p += sprintf(p, "ERROR: Unable to read battery information\n"); goto end; } units = bif->power_unit ? ACPI_BATTERY_UNITS_AMPS : ACPI_BATTERY_UNITS_WATTS; if (bif->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) p += sprintf(p, "design capacity: unknown\n"); else p += sprintf(p, "design capacity: %d %sh\n", (u32) bif->design_capacity, units); if (bif->last_full_capacity == ACPI_BATTERY_VALUE_UNKNOWN) p += sprintf(p, "last full capacity: unknown\n"); else p += sprintf(p, "last full capacity: %d %sh\n", (u32) bif->last_full_capacity, units); switch ((u32) bif->battery_technology) { case 0: p += sprintf(p, "battery technology: non-rechargeable\n"); break; case 1: p += sprintf(p, "battery technology: rechargeable\n"); break; default: p += sprintf(p, "battery technology: unknown\n"); break; } if (bif->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN) p += sprintf(p, "design voltage: unknown\n"); else p += sprintf(p, "design voltage: %d mV\n", (u32) bif->design_voltage); p += sprintf(p, "design capacity warning: %d %sh\n", (u32) bif->design_capacity_warning, units); p += sprintf(p, "design capacity low: %d %sh\n", (u32) bif->design_capacity_low, units); p += sprintf(p, "capacity granularity 1: %d %sh\n", (u32) bif->battery_capacity_granularity_1, units); p += sprintf(p, "capacity granularity 2: %d %sh\n", (u32) bif->battery_capacity_granularity_2, units); p += sprintf(p, "model number: %s\n", bif->model_number); p += sprintf(p, "serial number: %s\n", bif->serial_number); p += sprintf(p, "battery type: %s\n", bif->battery_type); p += sprintf(p, "OEM info: %s\n", bif->oem_info); end: kfree(bif); len = (p - page); if (len <= off+count) *eof = 1; *start = page + off; len -= off; if (len>count) len = count; if (len<0) len = 0; return_VALUE(len); }
static int acpi_battery_read_info(struct seq_file *seq, void *offset) { int result = 0; struct acpi_battery *battery = (struct acpi_battery *)seq->private; struct acpi_battery_info *bif = NULL; char *units = "?"; if (!battery) goto end; if (battery->flags.present) seq_printf(seq, "present: yes\n"); else { seq_printf(seq, "present: no\n"); goto end; } /* Battery Info (_BIF) */ result = acpi_battery_get_info(battery, &bif); if (result || !bif) { seq_printf(seq, "ERROR: Unable to read battery information\n"); goto end; } units = bif-> power_unit ? ACPI_BATTERY_UNITS_AMPS : ACPI_BATTERY_UNITS_WATTS; if (bif->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) seq_printf(seq, "design capacity: unknown\n"); else seq_printf(seq, "design capacity: %d %sh\n", (u32) bif->design_capacity, units); if (bif->last_full_capacity == ACPI_BATTERY_VALUE_UNKNOWN) seq_printf(seq, "last full capacity: unknown\n"); else seq_printf(seq, "last full capacity: %d %sh\n", (u32) bif->last_full_capacity, units); switch ((u32) bif->battery_technology) { case 0: seq_printf(seq, "battery technology: non-rechargeable\n"); break; case 1: seq_printf(seq, "battery technology: rechargeable\n"); break; default: seq_printf(seq, "battery technology: unknown\n"); break; } if (bif->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN) seq_printf(seq, "design voltage: unknown\n"); else seq_printf(seq, "design voltage: %d mV\n", (u32) bif->design_voltage); seq_printf(seq, "design capacity warning: %d %sh\n", (u32) bif->design_capacity_warning, units); seq_printf(seq, "design capacity low: %d %sh\n", (u32) bif->design_capacity_low, units); seq_printf(seq, "capacity granularity 1: %d %sh\n", (u32) bif->battery_capacity_granularity_1, units); seq_printf(seq, "capacity granularity 2: %d %sh\n", (u32) bif->battery_capacity_granularity_2, units); seq_printf(seq, "model number: %s\n", bif->model_number); seq_printf(seq, "serial number: %s\n", bif->serial_number); seq_printf(seq, "battery type: %s\n", bif->battery_type); seq_printf(seq, "OEM info: %s\n", bif->oem_info); end: kfree(bif); return 0; }