diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-24 10:30:41 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-24 10:30:41 -0700 | 
| commit | 94e0fb086fc5663c38bbc0fe86d698be8314f82f (patch) | |
| tree | 1c3be6c71ec3511aa2a4eb6dfa25f35677464ebb /drivers/acpi/button.c | |
| parent | b7f21bb2e23b4fec16b448a34889f467465be659 (diff) | |
| parent | c715089f49844260f1eeae8e3b55af9468ba1325 (diff) | |
| download | olio-linux-3.10-94e0fb086fc5663c38bbc0fe86d698be8314f82f.tar.xz olio-linux-3.10-94e0fb086fc5663c38bbc0fe86d698be8314f82f.zip  | |
Merge branch 'drm-intel-next' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel
* 'drm-intel-next' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel: (57 commits)
  drm/i915: Handle ERESTARTSYS during page fault
  drm/i915: Warn before mmaping a purgeable buffer.
  drm/i915: Track purged state.
  drm/i915: Remove eviction debug spam
  drm/i915: Immediately discard any backing storage for uneeded objects
  drm/i915: Do not mis-classify clean objects as purgeable
  drm/i915: Whitespace correction for madv
  drm/i915: BUG_ON page refleak during unbind
  drm/i915: Search harder for a reusable object
  drm/i915: Clean up evict from list.
  drm/i915: Add tracepoints
  drm/i915: framebuffer compression for GM45+
  drm/i915: split display functions by chip type
  drm/i915: Skip the sanity checks if the current relocation is valid
  drm/i915: Check that the relocation points to within the target
  drm/i915: correct FBC update when pipe base update occurs
  drm/i915: blacklist Acer AspireOne lid status
  ACPI: make ACPI button funcs no-ops if not built in
  drm/i915: prevent FIFO calculation overflows on 32 bits with high dotclocks
  drm/i915: intel_display.c handle latency variable efficiently
  ...
Fix up trivial conflicts in drivers/gpu/drm/i915/{i915_dma.c|i915_drv.h}
Diffstat (limited to 'drivers/acpi/button.c')
| -rw-r--r-- | drivers/acpi/button.c | 45 | 
1 files changed, 43 insertions, 2 deletions
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c index d295bdccc09..9335b87c517 100644 --- a/drivers/acpi/button.c +++ b/drivers/acpi/button.c @@ -115,6 +115,9 @@ static const struct file_operations acpi_button_state_fops = {  	.release = single_release,  }; +static BLOCKING_NOTIFIER_HEAD(acpi_lid_notifier); +static struct acpi_device *lid_device; +  /* --------------------------------------------------------------------------                                FS Interface (/proc)     -------------------------------------------------------------------------- */ @@ -231,11 +234,38 @@ static int acpi_button_remove_fs(struct acpi_device *device)  /* --------------------------------------------------------------------------                                  Driver Interface     -------------------------------------------------------------------------- */ +int acpi_lid_notifier_register(struct notifier_block *nb) +{ +	return blocking_notifier_chain_register(&acpi_lid_notifier, nb); +} +EXPORT_SYMBOL(acpi_lid_notifier_register); + +int acpi_lid_notifier_unregister(struct notifier_block *nb) +{ +	return blocking_notifier_chain_unregister(&acpi_lid_notifier, nb); +} +EXPORT_SYMBOL(acpi_lid_notifier_unregister); + +int acpi_lid_open(void) +{ +	acpi_status status; +	unsigned long long state; + +	status = acpi_evaluate_integer(lid_device->handle, "_LID", NULL, +				       &state); +	if (ACPI_FAILURE(status)) +		return -ENODEV; + +	return !!state; +} +EXPORT_SYMBOL(acpi_lid_open); +  static int acpi_lid_send_state(struct acpi_device *device)  {  	struct acpi_button *button = acpi_driver_data(device);  	unsigned long long state;  	acpi_status status; +	int ret;  	status = acpi_evaluate_integer(device->handle, "_LID", NULL, &state);  	if (ACPI_FAILURE(status)) @@ -244,7 +274,12 @@ static int acpi_lid_send_state(struct acpi_device *device)  	/* input layer checks if event is redundant */  	input_report_switch(button->input, SW_LID, !state);  	input_sync(button->input); -	return 0; + +	ret = blocking_notifier_call_chain(&acpi_lid_notifier, state, device); +	if (ret == NOTIFY_DONE) +		ret = blocking_notifier_call_chain(&acpi_lid_notifier, state, +						   device); +	return ret;  }  static void acpi_button_notify(struct acpi_device *device, u32 event) @@ -366,8 +401,14 @@ static int acpi_button_add(struct acpi_device *device)  	error = input_register_device(input);  	if (error)  		goto err_remove_fs; -	if (button->type == ACPI_BUTTON_TYPE_LID) +	if (button->type == ACPI_BUTTON_TYPE_LID) {  		acpi_lid_send_state(device); +		/* +		 * This assumes there's only one lid device, or if there are +		 * more we only care about the last one... +		 */ +		lid_device = device; +	}  	if (device->wakeup.flags.valid) {  		/* Button's GPE is run-wake GPE */  |