diff options
Diffstat (limited to 'drivers/acpi/ibm_acpi.c')
| -rw-r--r-- | drivers/acpi/ibm_acpi.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/acpi/ibm_acpi.c b/drivers/acpi/ibm_acpi.c index 36901362fd24..dc1096608f43 100644 --- a/drivers/acpi/ibm_acpi.c +++ b/drivers/acpi/ibm_acpi.c | |||
| @@ -2507,7 +2507,7 @@ static int __init setup_notify(struct ibm_struct *ibm) | |||
| 2507 | ret = acpi_bus_get_device(*ibm->handle, &ibm->device); | 2507 | ret = acpi_bus_get_device(*ibm->handle, &ibm->device); |
| 2508 | if (ret < 0) { | 2508 | if (ret < 0) { |
| 2509 | printk(IBM_ERR "%s device not present\n", ibm->name); | 2509 | printk(IBM_ERR "%s device not present\n", ibm->name); |
| 2510 | return 0; | 2510 | return -ENODEV; |
| 2511 | } | 2511 | } |
| 2512 | 2512 | ||
| 2513 | acpi_driver_data(ibm->device) = ibm; | 2513 | acpi_driver_data(ibm->device) = ibm; |
| @@ -2516,8 +2516,13 @@ static int __init setup_notify(struct ibm_struct *ibm) | |||
| 2516 | status = acpi_install_notify_handler(*ibm->handle, ibm->type, | 2516 | status = acpi_install_notify_handler(*ibm->handle, ibm->type, |
| 2517 | dispatch_notify, ibm); | 2517 | dispatch_notify, ibm); |
| 2518 | if (ACPI_FAILURE(status)) { | 2518 | if (ACPI_FAILURE(status)) { |
| 2519 | printk(IBM_ERR "acpi_install_notify_handler(%s) failed: %d\n", | 2519 | if (status == AE_ALREADY_EXISTS) { |
| 2520 | ibm->name, status); | 2520 | printk(IBM_NOTICE "another device driver is already handling %s events\n", |
| 2521 | ibm->name); | ||
| 2522 | } else { | ||
| 2523 | printk(IBM_ERR "acpi_install_notify_handler(%s) failed: %d\n", | ||
| 2524 | ibm->name, status); | ||
| 2525 | } | ||
| 2521 | return -ENODEV; | 2526 | return -ENODEV; |
| 2522 | } | 2527 | } |
| 2523 | ibm->notify_installed = 1; | 2528 | ibm->notify_installed = 1; |
| @@ -2553,6 +2558,8 @@ static int __init register_driver(struct ibm_struct *ibm) | |||
| 2553 | return ret; | 2558 | return ret; |
| 2554 | } | 2559 | } |
| 2555 | 2560 | ||
| 2561 | static void ibm_exit(struct ibm_struct *ibm); | ||
| 2562 | |||
| 2556 | static int __init ibm_init(struct ibm_struct *ibm) | 2563 | static int __init ibm_init(struct ibm_struct *ibm) |
| 2557 | { | 2564 | { |
| 2558 | int ret; | 2565 | int ret; |
| @@ -2594,6 +2601,12 @@ static int __init ibm_init(struct ibm_struct *ibm) | |||
| 2594 | 2601 | ||
| 2595 | if (ibm->notify) { | 2602 | if (ibm->notify) { |
| 2596 | ret = setup_notify(ibm); | 2603 | ret = setup_notify(ibm); |
| 2604 | if (ret == -ENODEV) { | ||
| 2605 | printk(IBM_NOTICE "disabling subdriver %s\n", | ||
| 2606 | ibm->name); | ||
| 2607 | ibm_exit(ibm); | ||
| 2608 | return 0; | ||
| 2609 | } | ||
| 2597 | if (ret < 0) | 2610 | if (ret < 0) |
| 2598 | return ret; | 2611 | return ret; |
| 2599 | } | 2612 | } |
