The included patch adds support for the generic in-kernel AC status code. Each AC adapter device is added to a list - when queried, if at least one claims to be online then we assume that the system is on AC. Signed-Off-By: Matthew Garrett <mjg59@xxxxxxxxxxxxx> diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c index 61f95ce..aa2d9b9 100644 --- a/drivers/acpi/ac.c +++ b/drivers/acpi/ac.c @@ -29,6 +29,7 @@ #include <linux/types.h> #include <linux/proc_fs.h> #include <linux/seq_file.h> +#include <linux/pm.h> #include <acpi/acpi_bus.h> #include <acpi/acpi_drivers.h> @@ -67,8 +68,11 @@ static struct acpi_driver acpi_ac_driver struct acpi_ac { acpi_handle handle; unsigned long state; + struct list_head entry; }; +static struct list_head ac_adapter_list; + static struct file_operations acpi_ac_fops = { .open = acpi_ac_open_fs, .read = seq_read, @@ -255,6 +259,8 @@ static int acpi_ac_add(struct acpi_devic goto end; } + list_add(&ac->entry, &ac_adapter_list); + printk(KERN_INFO PREFIX "%s [%s] (%s)\n", acpi_device_name(device), acpi_device_bid(device), ac->state ? "on-line" : "off-line"); @@ -288,17 +294,34 @@ static int acpi_ac_remove(struct acpi_de acpi_ac_remove_fs(device); + list_del(&ac->entry); + kfree(ac); return_VALUE(0); } +static int acpi_ac_online_status(void) +{ + struct acpi_ac *adapter; + + list_for_each_entry(adapter, &ac_adapter_list, entry) { + acpi_ac_get_state(adapter); + if (adapter->state) + return 1; + } + + return 0; +} + static int __init acpi_ac_init(void) { int result = 0; ACPI_FUNCTION_TRACE("acpi_ac_init"); + INIT_LIST_HEAD(&ac_adapter_list); + acpi_ac_dir = proc_mkdir(ACPI_AC_CLASS, acpi_root_dir); if (!acpi_ac_dir) return_VALUE(-ENODEV); @@ -310,6 +333,8 @@ static int __init acpi_ac_init(void) return_VALUE(-ENODEV); } + pm_set_ac_status(acpi_ac_online_status); + return_VALUE(0); } @@ -317,6 +342,8 @@ static void __exit acpi_ac_exit(void) { ACPI_FUNCTION_TRACE("acpi_ac_exit"); + pm_set_ac_status(NULL); + acpi_bus_unregister_driver(&acpi_ac_driver); remove_proc_entry(ACPI_AC_CLASS, acpi_root_dir); -- Matthew Garrett | mjg59@xxxxxxxxxxxxx