aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform/x86/eeepc-laptop.c
diff options
context:
space:
mode:
authorAlan Jenkins <alan-jenkins@tuffmail.co.uk>2009-12-03 07:45:04 +0000
committerLen Brown <len.brown@intel.com>2009-12-09 15:54:32 -0500
commitbf9598bcd5a73385ced7880ea09998a545e03dd8 (patch)
treed95811ba105cd2bf4fea7a2b93df4bc71ea77b92 /drivers/platform/x86/eeepc-laptop.c
parent463b4e474ed0905ffc27ee347648739dbfb03acc (diff)
downloadkernel_samsung_smdk4412-bf9598bcd5a73385ced7880ea09998a545e03dd8.zip
kernel_samsung_smdk4412-bf9598bcd5a73385ced7880ea09998a545e03dd8.tar.gz
kernel_samsung_smdk4412-bf9598bcd5a73385ced7880ea09998a545e03dd8.tar.bz2
eeepc-laptop: refactor notifications
Separate out input_notify(), in a similar way to how notify_brn() is already separated. This will allow all the functions which refer to the input device to be grouped together. This includes a small behaviour change - we now synthesize brightness up/down key events even if the brightness is already at the maximum/minimum value. This is consistent with the new uevent interface. Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/platform/x86/eeepc-laptop.c')
-rw-r--r--drivers/platform/x86/eeepc-laptop.c71
1 files changed, 39 insertions, 32 deletions
diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c
index 04a59d3..b4eacb6 100644
--- a/drivers/platform/x86/eeepc-laptop.c
+++ b/drivers/platform/x86/eeepc-laptop.c
@@ -655,9 +655,8 @@ static int eeepc_hotk_init(void)
return 0;
}
-static int notify_brn(void)
+static int eeepc_backlight_notify(void)
{
- /* returns the *previous* brightness, or -1 */
struct backlight_device *bd = eeepc_backlight_device;
int old = bd->props.brightness;
@@ -731,50 +730,58 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
eeepc_rfkill_hotplug();
}
-static void eeepc_hotk_notify(struct acpi_device *device, u32 event)
+static void eeepc_input_notify(int event)
{
static struct key_entry *key;
+
+ key = eepc_get_entry_by_scancode(event);
+ if (key) {
+ switch (key->type) {
+ case KE_KEY:
+ input_report_key(ehotk->inputdev, key->keycode,
+ 1);
+ input_sync(ehotk->inputdev);
+ input_report_key(ehotk->inputdev, key->keycode,
+ 0);
+ input_sync(ehotk->inputdev);
+ break;
+ }
+ }
+}
+
+static void eeepc_hotk_notify(struct acpi_device *device, u32 event)
+{
u16 count;
- int brn = -ENODEV;
if (event > ACPI_MAX_SYS_NOTIFY)
return;
- if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX)
- brn = notify_brn();
count = ehotk->event_count[event % 128]++;
acpi_bus_generate_proc_event(ehotk->device, event, count);
acpi_bus_generate_netlink_event(ehotk->device->pnp.device_class,
dev_name(&ehotk->device->dev), event,
count);
- if (ehotk->inputdev) {
- /* brightness-change events need special
- * handling for conversion to key events
- */
- if (brn < 0)
- brn = event;
- else
- brn += NOTIFY_BRN_MIN;
- if (event < brn)
+
+ if (event >= NOTIFY_BRN_MIN && event <= NOTIFY_BRN_MAX) {
+ int old_brightness, new_brightness;
+
+ /* Update backlight device. */
+ old_brightness = eeepc_backlight_notify();
+
+ /* Convert brightness event to keypress (obsolescent hack). */
+ new_brightness = event - NOTIFY_BRN_MIN;
+
+ if (new_brightness < old_brightness) {
event = NOTIFY_BRN_MIN; /* brightness down */
- else if (event > brn)
- event = NOTIFY_BRN_MIN + 2; /* ... up */
- else
- event = NOTIFY_BRN_MIN + 1; /* ... unchanged */
-
- key = eepc_get_entry_by_scancode(event);
- if (key) {
- switch (key->type) {
- case KE_KEY:
- input_report_key(ehotk->inputdev, key->keycode,
- 1);
- input_sync(ehotk->inputdev);
- input_report_key(ehotk->inputdev, key->keycode,
- 0);
- input_sync(ehotk->inputdev);
- break;
- }
+ } else if (new_brightness > old_brightness) {
+ event = NOTIFY_BRN_MAX; /* brightness up */
+ } else {
+ /*
+ * no change in brightness - already at min/max,
+ * event will be desired value (or else ignored).
+ */
}
}
+ eeepc_input_notify(event);
}
static int eeepc_register_rfkill_notifier(char *node)