diff options
author | Darren Hart (VMware) | 2017-12-08 14:57:54 -0800 |
---|---|---|
committer | Darren Hart (VMware) | 2017-12-11 16:30:51 -0800 |
commit | 1c3fdf125ef416227e43fdedf6b5097c41e8c467 (patch) | |
tree | 9b7266732ce8d13c0e1b29ccea7d74f37db3d843 | |
parent | 9678d0ef77d71a25e2194606238d9cb5b544c0f3 (diff) |
platform/x86: intel-vbtn: Simplify autorelease logic
The new notify_handler logic determining if autorelease should be used or
not is a bit awkward, and can result in more than one call to
sparse_keymap_report_event for the same event (scancode). The nesting
and long lines also made it difficult to read.
Simplify the logic by eliminating a level of nesting with a goto and
always calculate autorelease and val so we can make a single call to
sparse_keymap_report_event.
Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
Reviewed-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
Tested-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
Cc: AceLan Kao <acelan.kao@canonical.com>
-rw-r--r-- | drivers/platform/x86/intel-vbtn.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/platform/x86/intel-vbtn.c b/drivers/platform/x86/intel-vbtn.c index 0861efe490d0..5fc4315f7382 100644 --- a/drivers/platform/x86/intel-vbtn.c +++ b/drivers/platform/x86/intel-vbtn.c @@ -80,6 +80,7 @@ static void notify_handler(acpi_handle handle, u32 event, void *context) { struct platform_device *device = context; struct intel_vbtn_priv *priv = dev_get_drvdata(&device->dev); + unsigned int val = !(event & 1); /* Even=press, Odd=release */ const struct key_entry *ke_rel; bool autorelease; @@ -88,20 +89,20 @@ static void notify_handler(acpi_handle handle, u32 event, void *context) pm_wakeup_hard_event(&device->dev); return; } - } else { - /* Use the fact press/release come in even/odd pairs */ - if ((event & 1) && sparse_keymap_report_event(priv->input_dev, - event, 0, false)) - return; + goto out_unknown; + } - ke_rel = sparse_keymap_entry_from_scancode(priv->input_dev, - event | 1); - autorelease = !ke_rel || ke_rel->type == KE_IGNORE; + /* + * Even press events are autorelease if there is no corresponding odd + * release event, or if the odd event is KE_IGNORE. + */ + ke_rel = sparse_keymap_entry_from_scancode(priv->input_dev, event | 1); + autorelease = val && (!ke_rel || ke_rel->type == KE_IGNORE); - if (sparse_keymap_report_event(priv->input_dev, event, 1, - autorelease)) - return; - } + if (sparse_keymap_report_event(priv->input_dev, event, val, autorelease)) + return; + +out_unknown: dev_dbg(&device->dev, "unknown event index 0x%x\n", event); } |