diff options
Diffstat (limited to 'drivers/acpi/ac.c')
| -rw-r--r-- | drivers/acpi/ac.c | 32 | 
1 files changed, 17 insertions, 15 deletions
| diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c index 36ca365bcead..24ccf81d135f 100644 --- a/drivers/acpi/ac.c +++ b/drivers/acpi/ac.c @@ -50,6 +50,9 @@ ACPI_MODULE_NAME("acpi_ac")  MODULE_DESCRIPTION(ACPI_AC_DRIVER_NAME);  MODULE_LICENSE("GPL"); +extern struct proc_dir_entry *acpi_lock_ac_dir(void); +extern void *acpi_unlock_ac_dir(struct proc_dir_entry *acpi_ac_dir); +  static int acpi_ac_add(struct acpi_device *device);  static int acpi_ac_remove(struct acpi_device *device, int type);  static int acpi_ac_open_fs(struct inode *inode, struct file *file); @@ -65,7 +68,7 @@ static struct acpi_driver acpi_ac_driver = {  };  struct acpi_ac { -	acpi_handle handle; +	struct acpi_device * device;  	unsigned long state;  }; @@ -88,7 +91,7 @@ static int acpi_ac_get_state(struct acpi_ac *ac)  	if (!ac)  		return -EINVAL; -	status = acpi_evaluate_integer(ac->handle, "_PSR", NULL, &ac->state); +	status = acpi_evaluate_integer(ac->device->handle, "_PSR", NULL, &ac->state);  	if (ACPI_FAILURE(status)) {  		ACPI_EXCEPTION((AE_INFO, status, "Error reading AC Adapter state"));  		ac->state = ACPI_AC_STATUS_UNKNOWN; @@ -191,11 +194,11 @@ static void acpi_ac_notify(acpi_handle handle, u32 event, void *data)  	if (!ac)  		return; -	if (acpi_bus_get_device(ac->handle, &device)) -		return; - +	device = ac->device;  	switch (event) {  	case ACPI_AC_NOTIFY_STATUS: +	case ACPI_NOTIFY_BUS_CHECK: +	case ACPI_NOTIFY_DEVICE_CHECK:  		acpi_ac_get_state(ac);  		acpi_bus_generate_event(device, event, (u32) ac->state);  		break; @@ -223,7 +226,7 @@ static int acpi_ac_add(struct acpi_device *device)  		return -ENOMEM;  	memset(ac, 0, sizeof(struct acpi_ac)); -	ac->handle = device->handle; +	ac->device = device;  	strcpy(acpi_device_name(device), ACPI_AC_DEVICE_NAME);  	strcpy(acpi_device_class(device), ACPI_AC_CLASS);  	acpi_driver_data(device) = ac; @@ -236,8 +239,8 @@ static int acpi_ac_add(struct acpi_device *device)  	if (result)  		goto end; -	status = acpi_install_notify_handler(ac->handle, -					     ACPI_DEVICE_NOTIFY, acpi_ac_notify, +	status = acpi_install_notify_handler(device->handle, +					     ACPI_ALL_NOTIFY, acpi_ac_notify,  					     ac);  	if (ACPI_FAILURE(status)) {  		result = -ENODEV; @@ -268,8 +271,8 @@ static int acpi_ac_remove(struct acpi_device *device, int type)  	ac = (struct acpi_ac *)acpi_driver_data(device); -	status = acpi_remove_notify_handler(ac->handle, -					    ACPI_DEVICE_NOTIFY, acpi_ac_notify); +	status = acpi_remove_notify_handler(device->handle, +					    ACPI_ALL_NOTIFY, acpi_ac_notify);  	acpi_ac_remove_fs(device); @@ -280,17 +283,16 @@ static int acpi_ac_remove(struct acpi_device *device, int type)  static int __init acpi_ac_init(void)  { -	int result = 0; +	int result; -	acpi_ac_dir = proc_mkdir(ACPI_AC_CLASS, acpi_root_dir); +	acpi_ac_dir = acpi_lock_ac_dir();  	if (!acpi_ac_dir)  		return -ENODEV; -	acpi_ac_dir->owner = THIS_MODULE;  	result = acpi_bus_register_driver(&acpi_ac_driver);  	if (result < 0) { -		remove_proc_entry(ACPI_AC_CLASS, acpi_root_dir); +		acpi_unlock_ac_dir(acpi_ac_dir);  		return -ENODEV;  	} @@ -302,7 +304,7 @@ static void __exit acpi_ac_exit(void)  	acpi_bus_unregister_driver(&acpi_ac_driver); -	remove_proc_entry(ACPI_AC_CLASS, acpi_root_dir); +	acpi_unlock_ac_dir(acpi_ac_dir);  	return;  } | 
