Patched against latest test tree. Compile and field tested. Check battery after resume Signed-off-by: Thomas Renninger <mail@xxxxxxxxxxxx> drivers/acpi/battery.c | 33 ++++++++++++++++++++++++++++++++- 1 files changed, 32 insertions(+), 1 deletion(-) Index: linux-acpi-2.6.git_i386/drivers/acpi/battery.c =================================================================== --- linux-acpi-2.6.git_i386.orig/drivers/acpi/battery.c +++ linux-acpi-2.6.git_i386/drivers/acpi/battery.c @@ -64,6 +64,7 @@ extern void *acpi_unlock_battery_dir(str static int acpi_battery_add(struct acpi_device *device); static int acpi_battery_remove(struct acpi_device *device, int type); +static int acpi_battery_resume(struct acpi_device *device, int state); static struct acpi_driver acpi_battery_driver = { .name = ACPI_BATTERY_DRIVER_NAME, @@ -72,6 +73,7 @@ static struct acpi_driver acpi_battery_d .ops = { .add = acpi_battery_add, .remove = acpi_battery_remove, + .resume = acpi_battery_resume, }, }; @@ -269,6 +271,14 @@ acpi_battery_set_alarm(struct acpi_batte return 0; } +/* + * returns: + * 0 on success + * <0 on failure + * 1 if new battery found + * 2 if battery got removed + */ + static int acpi_battery_check(struct acpi_battery *battery) { int result = 0; @@ -311,12 +321,14 @@ static int acpi_battery_check(struct acp battery->flags.alarm = 1; acpi_battery_set_alarm(battery, battery->trips.warning); } + result = 1; } /* Removal? */ else if (battery->flags.present && !device->status.battery_present) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Battery removed\n")); + result = 2; } battery->flags.present = device->status.battery_present; @@ -703,7 +715,7 @@ static int acpi_battery_add(struct acpi_ acpi_driver_data(device) = battery; result = acpi_battery_check(battery); - if (result) + if (result < 0) goto end; result = acpi_battery_add_fs(device); @@ -753,6 +765,25 @@ static int acpi_battery_remove(struct ac return 0; } +static int acpi_battery_resume(struct acpi_device *device, int state){ + + int result = 0; + struct acpi_battery *battery = NULL; + + if (!device || !acpi_driver_data(device)) + return -EINVAL; + + battery = (struct acpi_battery *)acpi_driver_data(device); + + result = acpi_battery_check(battery); + if (result > 0){ + acpi_bus_generate_event(device, + ACPI_NOTIFY_DEVICE_CHECK, + battery->flags.present); + } + return 0; +} + static int __init acpi_battery_init(void) { int result;
Check battery after resume Signed-off-by: Thomas Renninger <mail@xxxxxxxxxxxx> drivers/acpi/battery.c | 33 ++++++++++++++++++++++++++++++++- 1 files changed, 32 insertions(+), 1 deletion(-) Index: linux-acpi-2.6.git_i386/drivers/acpi/battery.c =================================================================== --- linux-acpi-2.6.git_i386.orig/drivers/acpi/battery.c +++ linux-acpi-2.6.git_i386/drivers/acpi/battery.c @@ -64,6 +64,7 @@ extern void *acpi_unlock_battery_dir(str static int acpi_battery_add(struct acpi_device *device); static int acpi_battery_remove(struct acpi_device *device, int type); +static int acpi_battery_resume(struct acpi_device *device, int state); static struct acpi_driver acpi_battery_driver = { .name = ACPI_BATTERY_DRIVER_NAME, @@ -72,6 +73,7 @@ static struct acpi_driver acpi_battery_d .ops = { .add = acpi_battery_add, .remove = acpi_battery_remove, + .resume = acpi_battery_resume, }, }; @@ -269,6 +271,14 @@ acpi_battery_set_alarm(struct acpi_batte return 0; } +/* + * returns: + * 0 on success + * <0 on failure + * 1 if new battery found + * 2 if battery got removed + */ + static int acpi_battery_check(struct acpi_battery *battery) { int result = 0; @@ -311,12 +321,14 @@ static int acpi_battery_check(struct acp battery->flags.alarm = 1; acpi_battery_set_alarm(battery, battery->trips.warning); } + result = 1; } /* Removal? */ else if (battery->flags.present && !device->status.battery_present) { ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Battery removed\n")); + result = 2; } battery->flags.present = device->status.battery_present; @@ -703,7 +715,7 @@ static int acpi_battery_add(struct acpi_ acpi_driver_data(device) = battery; result = acpi_battery_check(battery); - if (result) + if (result < 0) goto end; result = acpi_battery_add_fs(device); @@ -753,6 +765,25 @@ static int acpi_battery_remove(struct ac return 0; } +static int acpi_battery_resume(struct acpi_device *device, int state){ + + int result = 0; + struct acpi_battery *battery = NULL; + + if (!device || !acpi_driver_data(device)) + return -EINVAL; + + battery = (struct acpi_battery *)acpi_driver_data(device); + + result = acpi_battery_check(battery); + if (result > 0){ + acpi_bus_generate_event(device, + ACPI_NOTIFY_DEVICE_CHECK, + battery->flags.present); + } + return 0; +} + static int __init acpi_battery_init(void) { int result;