ACPI: button: send initial lid state after add and resume
A message that is not in the archive (sent off-list or not yet received): 20071021094426.5025.54274.stgit@samsung
Quoted 34 lines · Alexey Starikovskiy
Input layer should know about initial state of lid switch, even before first notify.
Reference: https://bugzilla.novell.com/show_bug.cgi?id=326814
Signed-off-by Alexey Starikovskiy <[email protected]>---
drivers/acpi/button.c | 40 ++++++++++++++++++++++++++++++---------- 1 files changed, 30 insertions(+), 10 deletions(-)drivers/acpi/button.c +2
-0@@ -78,6 +78,7 @@ MODULE_DEVICE_TABLE(acpi, button_device_ids);static int acpi_button_add (struct acpi_device *device);static int acpi_button_remove (struct acpi_device *device,int type); +static int acpi_button_resume (struct acpi_device *device);static int acpi_button_info_open_fs (struct inode *inode,struct file *file);static int acpi_button_state_open_fs (struct inode *inode,struct file *file);@@ -87,6 +88,7 @@ static struct acpi_driver acpi_button_driver = { .ids = button_device_ids, .ops = { .add = acpi_button_add, + .resume = acpi_button_resume, .remove = acpi_button_remove, }, };@@ -253,6 +255,23 @@ static int acpi_button_remove_fs(struct acpi_device *device)/* -------------------------------------------------------------------------- Driver Interface
drivers/acpi/button.c static int acpi_button_remove_fs(struct acpi_device *device) · line 266
Quoted 10 lines
drivers/acpi/button.c +9
-0-------------------------------------------------------------------------- */ +static int acpi_button_send_state (struct acpi_button *button) +{ +unsigned long state; +acpi_status status; + +if (!button) +return -EINVAL ; +if (button->type !=ACPI_BUTTON_TYPE_LID ) +return 0 ;
Well, it looks like this function only does anything for _LID, so I'd call it acpi_lid_button_send_state() and probably the callers should do the above checks (for clarity).
Quoted 17 lines
drivers/acpi/button.c +8
-2+ status =acpi_evaluate_integer (button->device->handle,"_LID" ,NULL , + &state); +if (ACPI_FAILURE (status)) +return -ENODEV ; +/* input layer checks if event is redundant */ +input_report_switch (button->input,SW_LID , !state); +return 0 ; +}static void acpi_button_notify (acpi_handle handle,u32 event,void *data) {@@ -265,16 +284,8 @@ static void acpi_button_notify(acpi_handle handle, u32 event, void *data)switch (event) {case ACPI_BUTTON_NOTIFY_STATUS : input = button->input; - -if (button->type ==ACPI_BUTTON_TYPE_LID ) {
drivers/acpi/button.c static void acpi_button_notify(acpi_handle handle, u32 event, void *data) · line 288
Quoted 10 lines
drivers/acpi/button.c +2
-8-struct acpi_handle *handle = button->device->handle; -unsigned long state; - -if (!ACPI_FAILURE (acpi_evaluate_integer (handle,"_LID" , -NULL , &state))) -input_report_switch (input,SW_LID , !state); - - }else { +acpi_button_send_state (button); +if (button->type !=ACPI_BUTTON_TYPE_LID ) {
The type check is done here anyway, for example, and if button is NULL, it will oops.
Quoted 18 lines
drivers/acpi/button.c +7
-0int keycode =test_bit (KEY_SLEEP , input->keybit) ?KEY_SLEEP :KEY_POWER ;@@ -336,6 +347,13 @@ static int acpi_button_install_notify_handlers(struct acpi_button *button)return ACPI_FAILURE (status) ? -ENODEV :0 ; } +static int acpi_button_resume (struct acpi_device *device) +{ +if (!device) +return -EINVAL ; +return acpi_button_send_state (acpi_driver_data (device)); +} +static void acpi_button_remove_notify_handlers (struct acpi_button *button) {switch (button->type) {
drivers/acpi/button.c static int acpi_button_add(struct acpi_device *device) · line 476
Quoted 5 lines
drivers/acpi/button.c +2
-0@@ -454,6 +472,8 @@ static int acpi_button_add(struct acpi_device *device)if (error) goto err_remove_handlers; +acpi_button_send_state (button); +
Also, button cannot be NULL here.
drivers/acpi/button.c static int acpi_button_add(struct acpi_device *device) · line 479
Quoted 4 lines
drivers/acpi/button.c +0
-0if (device->wakeup.flags.valid) {/* Button's GPE is run-wake GPE */ acpi_set_gpe_type(device->wakeup.gpe_device,
Greetings,
Rafael