static void acpi_battery_notify ( acpi_handle handle, u32 event, void *data) { struct acpi_battery *battery = (struct acpi_battery *) data; struct acpi_device *device = NULL; ACPI_FUNCTION_TRACE("acpi_battery_notify"); if (!battery) return_VOID; if (acpi_bus_get_device(handle, &device)) return_VOID; switch (event) { case ACPI_BATTERY_NOTIFY_STATUS: case ACPI_BATTERY_NOTIFY_INFO: acpi_battery_check(battery); acpi_bus_generate_event(device, event, battery->flags.present); break; default: ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Unsupported event [0x%x]\n", event)); break; } return_VOID; }
static void acpi_battery_notify(acpi_handle handle, u32 event, void *data) { struct acpi_battery *battery = (struct acpi_battery *)data; struct acpi_device *device = NULL; if (!battery) return; device = battery->device; switch (event) { case ACPI_BATTERY_NOTIFY_STATUS: case ACPI_BATTERY_NOTIFY_INFO: case ACPI_NOTIFY_BUS_CHECK: case ACPI_NOTIFY_DEVICE_CHECK: acpi_battery_check(battery); acpi_bus_generate_event(device, event, battery->flags.present); break; default: ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Unsupported event [0x%x]\n", event)); break; } return; }
/* this is needed to learn about changes made in suspended state */ static int acpi_battery_resume(struct acpi_device *device) { struct acpi_battery *battery; if (!device) return -EINVAL; battery = device->driver_data; return acpi_battery_check(battery); }
static int acpi_battery_add ( struct acpi_device *device) { int result = 0; acpi_status status = 0; struct acpi_battery *battery = NULL; ACPI_FUNCTION_TRACE("acpi_battery_add"); if (!device) return_VALUE(-EINVAL); battery = kmalloc(sizeof(struct acpi_battery), GFP_KERNEL); if (!battery) return_VALUE(-ENOMEM); memset(battery, 0, sizeof(struct acpi_battery)); battery->handle = device->handle; strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME); strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS); acpi_driver_data(device) = battery; result = acpi_battery_check(battery); if (result) goto end; result = acpi_battery_add_fs(device); if (result) goto end; status = acpi_install_notify_handler(battery->handle, ACPI_DEVICE_NOTIFY, acpi_battery_notify, battery); if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error installing notify handler\n")); result = -ENODEV; goto end; } printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n", ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device), device->status.battery_present?"present":"absent"); end: if (result) { acpi_battery_remove_fs(device); kfree(battery); } return_VALUE(result); }
static int acpi_battery_add(struct acpi_device *device) { int result = 0; acpi_status status = 0; struct acpi_battery *battery = NULL; if (!device) return -EINVAL; battery = kzalloc(sizeof(struct acpi_battery), GFP_KERNEL); if (!battery) return -ENOMEM; battery->device = device; strcpy(acpi_device_name(device), ACPI_BATTERY_DEVICE_NAME); strcpy(acpi_device_class(device), ACPI_BATTERY_CLASS); acpi_driver_data(device) = battery; result = acpi_battery_check(battery); if (result) goto end; result = acpi_battery_add_fs(device); if (result) goto end; status = acpi_install_notify_handler(device->handle, ACPI_ALL_NOTIFY, acpi_battery_notify, battery); if (ACPI_FAILURE(status)) { result = -ENODEV; goto end; } printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n", ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device), device->status.battery_present ? "present" : "absent"); end: if (result) { acpi_battery_remove_fs(device); kfree(battery); } return result; }
static void acpi_battery_check_present(struct acpi_battery *battery) { if (!battery->flags.present) { acpi_battery_check(battery); } }