From: Alan Jenkins <alan-jenkins@xxxxxxxxxxxxxx> Keeping this device around lets userspace know that we have a battery bay, even if there is nothing in it at the moment. This is what every other battery driver does, so ACPI should do it as well. For example, this means gnome-power-manager will now allow configuring behaviour for "on battery power" if the battery bay was empty on startup. (Thanks to Maxim Levitsky for pointing this out). There is no reason to preserve the old behaviour. We now correctly provide the "present" attribute, which will return "0" when the battery is removed. HAL was already trying to check this attribute when the old behaviour was implemented. This should not break any version of HAL. Signed-off-by: Alan Jenkins <alan-jenkins@xxxxxxxxxxxxxx> Signed-off-by: Alexey Starikovskiy <astarikovskiy@xxxxxxx> --- drivers/acpi/battery.c | 36 ++++++++++++++++-------------------- 1 files changed, 16 insertions(+), 20 deletions(-) diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c index db78b6e..5b9fd78 100644 --- a/drivers/acpi/battery.c +++ b/drivers/acpi/battery.c @@ -546,8 +546,6 @@ static int sysfs_add_battery(struct acpi_battery *battery) static void sysfs_remove_battery(struct acpi_battery *battery) { - if (!battery->bat.dev) - return; device_remove_file(battery->bat.dev, &alarm_attr); power_supply_unregister(&battery->bat); battery->bat.dev = NULL; @@ -568,9 +566,6 @@ static int acpi_battery_update(struct acpi_battery *battery) if (result) return result; if (!acpi_battery_present(battery)) { -#ifdef CONFIG_ACPI_SYSFS_POWER - sysfs_remove_battery(battery); -#endif battery->update_time = 0; return 0; } @@ -582,10 +577,6 @@ static int acpi_battery_update(struct acpi_battery *battery) acpi_battery_quirks(battery); acpi_battery_init_alarm(battery); } -#ifdef CONFIG_ACPI_SYSFS_POWER - if (!battery->bat.dev) - sysfs_add_battery(battery); -#endif return acpi_battery_get_state(battery); } @@ -877,9 +868,7 @@ static void acpi_battery_notify(struct acpi_device *device, u32 event) dev_name(&device->dev), event, acpi_battery_present(battery)); #ifdef CONFIG_ACPI_SYSFS_POWER - /* acpi_battery_update could remove power_supply object */ - if (battery->bat.dev) - power_supply_changed(&battery->bat); + power_supply_changed(&battery->bat); #endif } @@ -904,17 +893,24 @@ static int acpi_battery_add(struct acpi_device *device) acpi_battery_update(battery); #ifdef CONFIG_ACPI_PROCFS_POWER result = acpi_battery_add_fs(device); + if (result) + goto fail; #endif - if (!result) { - printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n", - ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device), - device->status.battery_present ? "present" : "absent"); - } else { +#ifdef CONFIG_ACPI_SYSFS_POWER + result = sysfs_add_battery(battery); + if (result) + goto fail; +#endif + printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n", + ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device), + device->status.battery_present ? "present" : "absent"); + return 0; + +fail: #ifdef CONFIG_ACPI_PROCFS_POWER - acpi_battery_remove_fs(device); + acpi_battery_remove_fs(device); #endif - kfree(battery); - } + kfree(battery); return result; } -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html