aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/button.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/button.c')
-rw-r--r--drivers/acpi/button.c77
1 files changed, 8 insertions, 69 deletions
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index c2f06069dcd4..d73c94b8441d 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -78,6 +78,7 @@ MODULE_DEVICE_TABLE(acpi, button_device_ids);
78static int acpi_button_add(struct acpi_device *device); 78static int acpi_button_add(struct acpi_device *device);
79static int acpi_button_remove(struct acpi_device *device, int type); 79static int acpi_button_remove(struct acpi_device *device, int type);
80static int acpi_button_resume(struct acpi_device *device); 80static int acpi_button_resume(struct acpi_device *device);
81static void acpi_button_notify(struct acpi_device *device, u32 event);
81static int acpi_button_info_open_fs(struct inode *inode, struct file *file); 82static int acpi_button_info_open_fs(struct inode *inode, struct file *file);
82static int acpi_button_state_open_fs(struct inode *inode, struct file *file); 83static int acpi_button_state_open_fs(struct inode *inode, struct file *file);
83 84
@@ -89,6 +90,7 @@ static struct acpi_driver acpi_button_driver = {
89 .add = acpi_button_add, 90 .add = acpi_button_add,
90 .resume = acpi_button_resume, 91 .resume = acpi_button_resume,
91 .remove = acpi_button_remove, 92 .remove = acpi_button_remove,
93 .notify = acpi_button_notify,
92 }, 94 },
93}; 95};
94 96
@@ -263,15 +265,18 @@ static int acpi_lid_send_state(struct acpi_button *button)
263 return 0; 265 return 0;
264} 266}
265 267
266static void acpi_button_notify(acpi_handle handle, u32 event, void *data) 268static void acpi_button_notify(struct acpi_device *device, u32 event)
267{ 269{
268 struct acpi_button *button = data; 270 struct acpi_button *button = acpi_driver_data(device);
269 struct input_dev *input; 271 struct input_dev *input;
270 272
271 if (!button || !button->device) 273 if (!button || !button->device)
272 return; 274 return;
273 275
274 switch (event) { 276 switch (event) {
277 case ACPI_FIXED_HARDWARE_EVENT:
278 event = ACPI_BUTTON_NOTIFY_STATUS;
279 /* fall through */
275 case ACPI_BUTTON_NOTIFY_STATUS: 280 case ACPI_BUTTON_NOTIFY_STATUS:
276 input = button->input; 281 input = button->input;
277 if (button->type == ACPI_BUTTON_TYPE_LID) { 282 if (button->type == ACPI_BUTTON_TYPE_LID) {
@@ -298,46 +303,6 @@ static void acpi_button_notify(acpi_handle handle, u32 event, void *data)
298 return; 303 return;
299} 304}
300 305
301static acpi_status acpi_button_notify_fixed(void *data)
302{
303 struct acpi_button *button = data;
304
305 if (!button)
306 return AE_BAD_PARAMETER;
307
308 acpi_button_notify(button->device->handle, ACPI_BUTTON_NOTIFY_STATUS, button);
309
310 return AE_OK;
311}
312
313static int acpi_button_install_notify_handlers(struct acpi_button *button)
314{
315 acpi_status status;
316
317 switch (button->type) {
318 case ACPI_BUTTON_TYPE_POWERF:
319 status =
320 acpi_install_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
321 acpi_button_notify_fixed,
322 button);
323 break;
324 case ACPI_BUTTON_TYPE_SLEEPF:
325 status =
326 acpi_install_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
327 acpi_button_notify_fixed,
328 button);
329 break;
330 default:
331 status = acpi_install_notify_handler(button->device->handle,
332 ACPI_DEVICE_NOTIFY,
333 acpi_button_notify,
334 button);
335 break;
336 }
337
338 return ACPI_FAILURE(status) ? -ENODEV : 0;
339}
340
341static int acpi_button_resume(struct acpi_device *device) 306static int acpi_button_resume(struct acpi_device *device)
342{ 307{
343 struct acpi_button *button; 308 struct acpi_button *button;
@@ -349,25 +314,6 @@ static int acpi_button_resume(struct acpi_device *device)
349 return 0; 314 return 0;
350} 315}
351 316
352static void acpi_button_remove_notify_handlers(struct acpi_button *button)
353{
354 switch (button->type) {
355 case ACPI_BUTTON_TYPE_POWERF:
356 acpi_remove_fixed_event_handler(ACPI_EVENT_POWER_BUTTON,
357 acpi_button_notify_fixed);
358 break;
359 case ACPI_BUTTON_TYPE_SLEEPF:
360 acpi_remove_fixed_event_handler(ACPI_EVENT_SLEEP_BUTTON,
361 acpi_button_notify_fixed);
362 break;
363 default:
364 acpi_remove_notify_handler(button->device->handle,
365 ACPI_DEVICE_NOTIFY,
366 acpi_button_notify);
367 break;
368 }
369}
370
371static int acpi_button_add(struct acpi_device *device) 317static int acpi_button_add(struct acpi_device *device)
372{ 318{
373 int error; 319 int error;
@@ -432,10 +378,6 @@ static int acpi_button_add(struct acpi_device *device)
432 if (error) 378 if (error)
433 goto err_free_input; 379 goto err_free_input;
434 380
435 error = acpi_button_install_notify_handlers(button);
436 if (error)
437 goto err_remove_fs;
438
439 snprintf(button->phys, sizeof(button->phys), 381 snprintf(button->phys, sizeof(button->phys),
440 "%s/button/input0", acpi_device_hid(device)); 382 "%s/button/input0", acpi_device_hid(device));
441 383
@@ -466,7 +408,7 @@ static int acpi_button_add(struct acpi_device *device)
466 408
467 error = input_register_device(input); 409 error = input_register_device(input);
468 if (error) 410 if (error)
469 goto err_remove_handlers; 411 goto err_remove_fs;
470 if (button->type == ACPI_BUTTON_TYPE_LID) 412 if (button->type == ACPI_BUTTON_TYPE_LID)
471 acpi_lid_send_state(button); 413 acpi_lid_send_state(button);
472 414
@@ -485,8 +427,6 @@ static int acpi_button_add(struct acpi_device *device)
485 427
486 return 0; 428 return 0;
487 429
488 err_remove_handlers:
489 acpi_button_remove_notify_handlers(button);
490 err_remove_fs: 430 err_remove_fs:
491 acpi_button_remove_fs(device); 431 acpi_button_remove_fs(device);
492 err_free_input: 432 err_free_input:
@@ -505,7 +445,6 @@ static int acpi_button_remove(struct acpi_device *device, int type)
505 445
506 button = acpi_driver_data(device); 446 button = acpi_driver_data(device);
507 447
508 acpi_button_remove_notify_handlers(button);
509 acpi_button_remove_fs(device); 448 acpi_button_remove_fs(device);
510 input_unregister_device(button->input); 449 input_unregister_device(button->input);
511 kfree(button); 450 kfree(button);