diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 11:59:37 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 14:20:42 +0200 | 
| commit | dbb6be6d5e974c42bbecd183effaa0df69e1dd8b (patch) | |
| tree | 5735cb47e70853d057a9881dd0ce44b83e88fa63 /drivers/acpi/video.c | |
| parent | 6a867a395558a7f882d041783e4cdea6744ca2bf (diff) | |
| parent | b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (diff) | |
| download | olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.tar.xz olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.zip  | |
Merge branch 'linus' into timers/core
Reason: Further posix_cpu_timer patches depend on mainline changes
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/acpi/video.c')
| -rw-r--r-- | drivers/acpi/video.c | 77 | 
1 files changed, 53 insertions, 24 deletions
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 2ff2b6ab5b6..a0c93b32148 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c @@ -39,10 +39,12 @@  #include <linux/sort.h>  #include <linux/pci.h>  #include <linux/pci_ids.h> +#include <linux/slab.h>  #include <asm/uaccess.h>  #include <linux/dmi.h>  #include <acpi/acpi_bus.h>  #include <acpi/acpi_drivers.h> +#include <linux/suspend.h>  #define PREFIX "ACPI: " @@ -88,7 +90,6 @@ module_param(allow_duplicates, bool, 0644);  static int register_count = 0;  static int acpi_video_bus_add(struct acpi_device *device);  static int acpi_video_bus_remove(struct acpi_device *device, int type); -static int acpi_video_resume(struct acpi_device *device);  static void acpi_video_bus_notify(struct acpi_device *device, u32 event);  static const struct acpi_device_id video_device_ids[] = { @@ -104,7 +105,6 @@ static struct acpi_driver acpi_video_bus = {  	.ops = {  		.add = acpi_video_bus_add,  		.remove = acpi_video_bus_remove, -		.resume = acpi_video_resume,  		.notify = acpi_video_bus_notify,  		},  }; @@ -159,6 +159,7 @@ struct acpi_video_bus {  	struct proc_dir_entry *dir;  	struct input_dev *input;  	char phys[32];	/* for input device */ +	struct notifier_block pm_nb;  };  struct acpi_video_device_flags { @@ -998,6 +999,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)  	}  	if (acpi_video_backlight_support()) { +		struct backlight_properties props;  		int result;  		static int count = 0;  		char *name; @@ -1010,12 +1012,21 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)  			return;  		sprintf(name, "acpi_video%d", count++); -		device->backlight = backlight_device_register(name, -			NULL, device, &acpi_backlight_ops); +		memset(&props, 0, sizeof(struct backlight_properties)); +		props.max_brightness = device->brightness->count - 3; +		device->backlight = backlight_device_register(name, NULL, device, +							      &acpi_backlight_ops, +							      &props);  		kfree(name);  		if (IS_ERR(device->backlight))  			return; -		device->backlight->props.max_brightness = device->brightness->count-3; + +		/* +		 * Save current brightness level in case we have to restore it +		 * before acpi_video_device_lcd_set_level() is called next time. +		 */ +		device->backlight->props.brightness = +				acpi_video_get_brightness(device->backlight);  		result = sysfs_create_link(&device->backlight->dev.kobj,  					   &device->dev->dev.kobj, "device"); @@ -2119,7 +2130,7 @@ static void acpi_video_bus_notify(struct acpi_device *device, u32 event)  {  	struct acpi_video_bus *video = acpi_driver_data(device);  	struct input_dev *input; -	int keycode; +	int keycode = 0;  	if (!video)  		return; @@ -2155,17 +2166,19 @@ static void acpi_video_bus_notify(struct acpi_device *device, u32 event)  		break;  	default: -		keycode = KEY_UNKNOWN;  		ACPI_DEBUG_PRINT((ACPI_DB_INFO,  				  "Unsupported event [0x%x]\n", event));  		break;  	}  	acpi_notifier_call_chain(device, event, 0); -	input_report_key(input, keycode, 1); -	input_sync(input); -	input_report_key(input, keycode, 0); -	input_sync(input); + +	if (keycode) { +		input_report_key(input, keycode, 1); +		input_sync(input); +		input_report_key(input, keycode, 0); +		input_sync(input); +	}  	return;  } @@ -2176,7 +2189,7 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)  	struct acpi_device *device = NULL;  	struct acpi_video_bus *bus;  	struct input_dev *input; -	int keycode; +	int keycode = 0;  	if (!video_device)  		return; @@ -2217,39 +2230,48 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)  		keycode = KEY_DISPLAY_OFF;  		break;  	default: -		keycode = KEY_UNKNOWN;  		ACPI_DEBUG_PRINT((ACPI_DB_INFO,  				  "Unsupported event [0x%x]\n", event));  		break;  	}  	acpi_notifier_call_chain(device, event, 0); -	input_report_key(input, keycode, 1); -	input_sync(input); -	input_report_key(input, keycode, 0); -	input_sync(input); + +	if (keycode) { +		input_report_key(input, keycode, 1); +		input_sync(input); +		input_report_key(input, keycode, 0); +		input_sync(input); +	}  	return;  } -static int instance; -static int acpi_video_resume(struct acpi_device *device) +static int acpi_video_resume(struct notifier_block *nb, +				unsigned long val, void *ign)  {  	struct acpi_video_bus *video;  	struct acpi_video_device *video_device;  	int i; -	if (!device || !acpi_driver_data(device)) -		return -EINVAL; +	switch (val) { +	case PM_HIBERNATION_PREPARE: +	case PM_SUSPEND_PREPARE: +	case PM_RESTORE_PREPARE: +		return NOTIFY_DONE; +	} -	video = acpi_driver_data(device); +	video = container_of(nb, struct acpi_video_bus, pm_nb); + +	dev_info(&video->device->dev, "Restoring backlight state\n");  	for (i = 0; i < video->attached_count; i++) {  		video_device = video->attached_array[i].bind_info;  		if (video_device && video_device->backlight)  			acpi_video_set_brightness(video_device->backlight);  	} -	return AE_OK; + +	return NOTIFY_OK;  }  static acpi_status @@ -2273,6 +2295,8 @@ acpi_video_bus_match(acpi_handle handle, u32 level, void *context,  	return AE_OK;  } +static int instance; +  static int acpi_video_bus_add(struct acpi_device *device)  {  	struct acpi_video_bus *video; @@ -2354,7 +2378,6 @@ static int acpi_video_bus_add(struct acpi_device *device)  	set_bit(KEY_BRIGHTNESSDOWN, input->keybit);  	set_bit(KEY_BRIGHTNESS_ZERO, input->keybit);  	set_bit(KEY_DISPLAY_OFF, input->keybit); -	set_bit(KEY_UNKNOWN, input->keybit);  	error = input_register_device(input);  	if (error) @@ -2366,6 +2389,10 @@ static int acpi_video_bus_add(struct acpi_device *device)  	       video->flags.rom ? "yes" : "no",  	       video->flags.post ? "yes" : "no"); +	video->pm_nb.notifier_call = acpi_video_resume; +	video->pm_nb.priority = 0; +	register_pm_notifier(&video->pm_nb); +  	return 0;   err_free_input_dev: @@ -2392,6 +2419,8 @@ static int acpi_video_bus_remove(struct acpi_device *device, int type)  	video = acpi_driver_data(device); +	unregister_pm_notifier(&video->pm_nb); +  	acpi_video_bus_stop_devices(video);  	acpi_video_bus_put_devices(video);  	acpi_video_bus_remove_fs(device);  |