diff options
Diffstat (limited to 'drivers/acpi/fan.c')
| -rw-r--r-- | drivers/acpi/fan.c | 105 | 
1 files changed, 44 insertions, 61 deletions
diff --git a/drivers/acpi/fan.c b/drivers/acpi/fan.c index 60049080c86..8acf53e6296 100644 --- a/drivers/acpi/fan.c +++ b/drivers/acpi/fan.c @@ -29,8 +29,7 @@  #include <linux/types.h>  #include <asm/uaccess.h>  #include <linux/thermal.h> -#include <acpi/acpi_bus.h> -#include <acpi/acpi_drivers.h> +#include <linux/acpi.h>  #define PREFIX "ACPI: " @@ -45,9 +44,7 @@ MODULE_DESCRIPTION("ACPI Fan Driver");  MODULE_LICENSE("GPL");  static int acpi_fan_add(struct acpi_device *device); -static int acpi_fan_remove(struct acpi_device *device, int type); -static int acpi_fan_suspend(struct acpi_device *device, pm_message_t state); -static int acpi_fan_resume(struct acpi_device *device); +static int acpi_fan_remove(struct acpi_device *device);  static const struct acpi_device_id fan_device_ids[] = {  	{"PNP0C0B", 0}, @@ -55,6 +52,20 @@ static const struct acpi_device_id fan_device_ids[] = {  };  MODULE_DEVICE_TABLE(acpi, fan_device_ids); +#ifdef CONFIG_PM_SLEEP +static int acpi_fan_suspend(struct device *dev); +static int acpi_fan_resume(struct device *dev); +static struct dev_pm_ops acpi_fan_pm = { +	.resume = acpi_fan_resume, +	.freeze = acpi_fan_suspend, +	.thaw = acpi_fan_resume, +	.restore = acpi_fan_resume, +}; +#define FAN_PM_OPS_PTR (&acpi_fan_pm) +#else +#define FAN_PM_OPS_PTR NULL +#endif +  static struct acpi_driver acpi_fan_driver = {  	.name = "fan",  	.class = ACPI_FAN_CLASS, @@ -62,9 +73,8 @@ static struct acpi_driver acpi_fan_driver = {  	.ops = {  		.add = acpi_fan_add,  		.remove = acpi_fan_remove, -		.suspend = acpi_fan_suspend, -		.resume = acpi_fan_resume,  		}, +	.drv.pm = FAN_PM_OPS_PTR,  };  /* thermal cooling device callbacks */ @@ -81,16 +91,16 @@ static int fan_get_cur_state(struct thermal_cooling_device *cdev, unsigned long  {  	struct acpi_device *device = cdev->devdata;  	int result; -	int acpi_state; +	int acpi_state = ACPI_STATE_D0;  	if (!device)  		return -EINVAL; -	result = acpi_bus_get_power(device->handle, &acpi_state); +	result = acpi_bus_update_power(device->handle, &acpi_state);  	if (result)  		return result; -	*state = (acpi_state == ACPI_STATE_D3 ? 0 : +	*state = (acpi_state == ACPI_STATE_D3_COLD ? 0 :  		 (acpi_state == ACPI_STATE_D0 ? 1 : -1));  	return 0;  } @@ -105,12 +115,12 @@ fan_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)  		return -EINVAL;  	result = acpi_bus_set_power(device->handle, -				state ? ACPI_STATE_D0 : ACPI_STATE_D3); +				state ? ACPI_STATE_D0 : ACPI_STATE_D3_COLD);  	return result;  } -static struct thermal_cooling_device_ops fan_cooling_ops = { +static const struct thermal_cooling_device_ops fan_cooling_ops = {  	.get_max_state = fan_get_max_state,  	.get_cur_state = fan_get_cur_state,  	.set_cur_state = fan_set_cur_state, @@ -123,7 +133,6 @@ static struct thermal_cooling_device_ops fan_cooling_ops = {  static int acpi_fan_add(struct acpi_device *device)  {  	int result = 0; -	int state = 0;  	struct thermal_cooling_device *cdev;  	if (!device) @@ -132,16 +141,12 @@ static int acpi_fan_add(struct acpi_device *device)  	strcpy(acpi_device_name(device), "Fan");  	strcpy(acpi_device_class(device), ACPI_FAN_CLASS); -	result = acpi_bus_get_power(device->handle, &state); +	result = acpi_bus_update_power(device->handle, NULL);  	if (result) { -		printk(KERN_ERR PREFIX "Reading power state\n"); +		printk(KERN_ERR PREFIX "Setting initial power state\n");  		goto end;  	} -	device->flags.force_power_state = 1; -	acpi_bus_set_power(device->handle, state); -	device->flags.force_power_state = 0; -  	cdev = thermal_cooling_device_register("Fan", device,  						&fan_cooling_ops);  	if (IS_ERR(cdev)) { @@ -170,15 +175,19 @@ static int acpi_fan_add(struct acpi_device *device)  	       acpi_device_name(device), acpi_device_bid(device),  	       !device->power.state ? "on" : "off"); -      end: +end:  	return result;  } -static int acpi_fan_remove(struct acpi_device *device, int type) +static int acpi_fan_remove(struct acpi_device *device)  { -	struct thermal_cooling_device *cdev = acpi_driver_data(device); +	struct thermal_cooling_device *cdev; + +	if (!device) +		return -EINVAL; -	if (!device || !cdev) +	cdev =  acpi_driver_data(device); +	if (!cdev)  		return -EINVAL;  	sysfs_remove_link(&device->dev.kobj, "thermal_cooling"); @@ -188,56 +197,30 @@ static int acpi_fan_remove(struct acpi_device *device, int type)  	return 0;  } -static int acpi_fan_suspend(struct acpi_device *device, pm_message_t state) +#ifdef CONFIG_PM_SLEEP +static int acpi_fan_suspend(struct device *dev)  { -	if (!device) +	if (!dev)  		return -EINVAL; -	acpi_bus_set_power(device->handle, ACPI_STATE_D0); +	acpi_bus_set_power(to_acpi_device(dev)->handle, ACPI_STATE_D0);  	return AE_OK;  } -static int acpi_fan_resume(struct acpi_device *device) +static int acpi_fan_resume(struct device *dev)  { -	int result = 0; -	int power_state = 0; +	int result; -	if (!device) +	if (!dev)  		return -EINVAL; -	result = acpi_bus_get_power(device->handle, &power_state); -	if (result) { -		printk(KERN_ERR PREFIX -				  "Error reading fan power state\n"); -		return result; -	} - -	device->flags.force_power_state = 1; -	acpi_bus_set_power(device->handle, power_state); -	device->flags.force_power_state = 0; +	result = acpi_bus_update_power(to_acpi_device(dev)->handle, NULL); +	if (result) +		printk(KERN_ERR PREFIX "Error updating fan power state\n");  	return result;  } +#endif -static int __init acpi_fan_init(void) -{ -	int result = 0; - -	result = acpi_bus_register_driver(&acpi_fan_driver); -	if (result < 0) -		return -ENODEV; - -	return 0; -} - -static void __exit acpi_fan_exit(void) -{ - -	acpi_bus_unregister_driver(&acpi_fan_driver); - -	return; -} - -module_init(acpi_fan_init); -module_exit(acpi_fan_exit); +module_acpi_driver(acpi_fan_driver);  | 
