diff options
| -rw-r--r-- | drivers/acpi/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/acpi/ac.c | 1 | ||||
| -rw-r--r-- | drivers/acpi/button.c | 3 | ||||
| -rw-r--r-- | drivers/acpi/pci_root.c | 11 | ||||
| -rw-r--r-- | drivers/acpi/video.c | 7 | ||||
| -rw-r--r-- | drivers/acpi/video_detect.c | 2 | ||||
| -rw-r--r-- | drivers/platform/x86/eeepc-laptop.c | 31 | ||||
| -rw-r--r-- | drivers/platform/x86/fujitsu-laptop.c | 2 |
8 files changed, 46 insertions, 15 deletions
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index 0ed42d8870c7..93d2c7971df6 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig | |||
| @@ -218,10 +218,10 @@ config ACPI_PROCESSOR_AGGREGATOR | |||
| 218 | depends on X86 | 218 | depends on X86 |
| 219 | help | 219 | help |
| 220 | ACPI 4.0 defines processor Aggregator, which enables OS to perform | 220 | ACPI 4.0 defines processor Aggregator, which enables OS to perform |
| 221 | specfic processor configuration and control that applies to all | 221 | specific processor configuration and control that applies to all |
| 222 | processors in the platform. Currently only logical processor idling | 222 | processors in the platform. Currently only logical processor idling |
| 223 | is defined, which is to reduce power consumption. This driver | 223 | is defined, which is to reduce power consumption. This driver |
| 224 | support the new device. | 224 | supports the new device. |
| 225 | 225 | ||
| 226 | config ACPI_THERMAL | 226 | config ACPI_THERMAL |
| 227 | tristate "Thermal Zone" | 227 | tristate "Thermal Zone" |
diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c index 98b9690b0159..b6ed60b57b0d 100644 --- a/drivers/acpi/ac.c +++ b/drivers/acpi/ac.c | |||
| @@ -245,6 +245,7 @@ static void acpi_ac_notify(struct acpi_device *device, u32 event) | |||
| 245 | acpi_bus_generate_netlink_event(device->pnp.device_class, | 245 | acpi_bus_generate_netlink_event(device->pnp.device_class, |
| 246 | dev_name(&device->dev), event, | 246 | dev_name(&device->dev), event, |
| 247 | (u32) ac->state); | 247 | (u32) ac->state); |
| 248 | acpi_notifier_call_chain(device, event, (u32) ac->state); | ||
| 248 | #ifdef CONFIG_ACPI_SYSFS_POWER | 249 | #ifdef CONFIG_ACPI_SYSFS_POWER |
| 249 | kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); | 250 | kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); |
| 250 | #endif | 251 | #endif |
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c index 9335b87c5174..0c9c6a9a002c 100644 --- a/drivers/acpi/button.c +++ b/drivers/acpi/button.c | |||
| @@ -251,6 +251,9 @@ int acpi_lid_open(void) | |||
| 251 | acpi_status status; | 251 | acpi_status status; |
| 252 | unsigned long long state; | 252 | unsigned long long state; |
| 253 | 253 | ||
| 254 | if (!lid_device) | ||
| 255 | return -ENODEV; | ||
| 256 | |||
| 254 | status = acpi_evaluate_integer(lid_device->handle, "_LID", NULL, | 257 | status = acpi_evaluate_integer(lid_device->handle, "_LID", NULL, |
| 255 | &state); | 258 | &state); |
| 256 | if (ACPI_FAILURE(status)) | 259 | if (ACPI_FAILURE(status)) |
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 31122214e0ec..1af808171d46 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c | |||
| @@ -389,6 +389,17 @@ struct pci_dev *acpi_get_pci_dev(acpi_handle handle) | |||
| 389 | 389 | ||
| 390 | pbus = pdev->subordinate; | 390 | pbus = pdev->subordinate; |
| 391 | pci_dev_put(pdev); | 391 | pci_dev_put(pdev); |
| 392 | |||
| 393 | /* | ||
| 394 | * This function may be called for a non-PCI device that has a | ||
| 395 | * PCI parent (eg. a disk under a PCI SATA controller). In that | ||
| 396 | * case pdev->subordinate will be NULL for the parent. | ||
| 397 | */ | ||
| 398 | if (!pbus) { | ||
| 399 | dev_dbg(&pdev->dev, "Not a PCI-to-PCI bridge\n"); | ||
| 400 | pdev = NULL; | ||
| 401 | break; | ||
| 402 | } | ||
| 392 | } | 403 | } |
| 393 | out: | 404 | out: |
| 394 | list_for_each_entry_safe(node, tmp, &device_list, node) | 405 | list_for_each_entry_safe(node, tmp, &device_list, node) |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index f6e54bf8dd96..64e3c581b7a9 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -1109,7 +1109,12 @@ static int acpi_video_bus_check(struct acpi_video_bus *video) | |||
| 1109 | */ | 1109 | */ |
| 1110 | 1110 | ||
| 1111 | /* Does this device support video switching? */ | 1111 | /* Does this device support video switching? */ |
| 1112 | if (video->cap._DOS) { | 1112 | if (video->cap._DOS || video->cap._DOD) { |
| 1113 | if (!video->cap._DOS) { | ||
| 1114 | printk(KERN_WARNING FW_BUG | ||
| 1115 | "ACPI(%s) defines _DOD but not _DOS\n", | ||
| 1116 | acpi_device_bid(video->device)); | ||
| 1117 | } | ||
| 1113 | video->flags.multihead = 1; | 1118 | video->flags.multihead = 1; |
| 1114 | status = 0; | 1119 | status = 0; |
| 1115 | } | 1120 | } |
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c index 7032f25da9b5..575593a8b4e6 100644 --- a/drivers/acpi/video_detect.c +++ b/drivers/acpi/video_detect.c | |||
| @@ -84,7 +84,7 @@ long acpi_is_video_device(struct acpi_device *device) | |||
| 84 | return 0; | 84 | return 0; |
| 85 | 85 | ||
| 86 | /* Does this device able to support video switching ? */ | 86 | /* Does this device able to support video switching ? */ |
| 87 | if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) && | 87 | if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) || |
| 88 | ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy))) | 88 | ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy))) |
| 89 | video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING; | 89 | video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING; |
| 90 | 90 | ||
diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index 749e2102b2be..d379e74a05d0 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c | |||
| @@ -150,6 +150,8 @@ struct eeepc_hotk { | |||
| 150 | /* The actual device the driver binds to */ | 150 | /* The actual device the driver binds to */ |
| 151 | static struct eeepc_hotk *ehotk; | 151 | static struct eeepc_hotk *ehotk; |
| 152 | 152 | ||
| 153 | static void eeepc_rfkill_hotplug(bool real); | ||
| 154 | |||
| 153 | /* Platform device/driver */ | 155 | /* Platform device/driver */ |
| 154 | static int eeepc_hotk_thaw(struct device *device); | 156 | static int eeepc_hotk_thaw(struct device *device); |
| 155 | static int eeepc_hotk_restore(struct device *device); | 157 | static int eeepc_hotk_restore(struct device *device); |
| @@ -343,14 +345,23 @@ static bool eeepc_wlan_rfkill_blocked(void) | |||
| 343 | static int eeepc_rfkill_set(void *data, bool blocked) | 345 | static int eeepc_rfkill_set(void *data, bool blocked) |
| 344 | { | 346 | { |
| 345 | unsigned long asl = (unsigned long)data; | 347 | unsigned long asl = (unsigned long)data; |
| 346 | return set_acpi(asl, !blocked); | 348 | int ret; |
| 349 | |||
| 350 | if (asl != CM_ASL_WLAN) | ||
| 351 | return set_acpi(asl, !blocked); | ||
| 352 | |||
| 353 | /* hack to avoid panic with rt2860sta */ | ||
| 354 | if (blocked) | ||
| 355 | eeepc_rfkill_hotplug(false); | ||
| 356 | ret = set_acpi(asl, !blocked); | ||
| 357 | return ret; | ||
| 347 | } | 358 | } |
| 348 | 359 | ||
| 349 | static const struct rfkill_ops eeepc_rfkill_ops = { | 360 | static const struct rfkill_ops eeepc_rfkill_ops = { |
| 350 | .set_block = eeepc_rfkill_set, | 361 | .set_block = eeepc_rfkill_set, |
| 351 | }; | 362 | }; |
| 352 | 363 | ||
| 353 | static void __init eeepc_enable_camera(void) | 364 | static void __devinit eeepc_enable_camera(void) |
| 354 | { | 365 | { |
| 355 | /* | 366 | /* |
| 356 | * If the following call to set_acpi() fails, it's because there's no | 367 | * If the following call to set_acpi() fails, it's because there's no |
| @@ -643,13 +654,13 @@ static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot, | |||
| 643 | return 0; | 654 | return 0; |
| 644 | } | 655 | } |
| 645 | 656 | ||
| 646 | static void eeepc_rfkill_hotplug(void) | 657 | static void eeepc_rfkill_hotplug(bool real) |
| 647 | { | 658 | { |
| 648 | struct pci_dev *dev; | 659 | struct pci_dev *dev; |
| 649 | struct pci_bus *bus; | 660 | struct pci_bus *bus; |
| 650 | bool blocked = eeepc_wlan_rfkill_blocked(); | 661 | bool blocked = real ? eeepc_wlan_rfkill_blocked() : true; |
| 651 | 662 | ||
| 652 | if (ehotk->wlan_rfkill) | 663 | if (real && ehotk->wlan_rfkill) |
| 653 | rfkill_set_sw_state(ehotk->wlan_rfkill, blocked); | 664 | rfkill_set_sw_state(ehotk->wlan_rfkill, blocked); |
| 654 | 665 | ||
| 655 | mutex_lock(&ehotk->hotplug_lock); | 666 | mutex_lock(&ehotk->hotplug_lock); |
| @@ -692,7 +703,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) | |||
| 692 | if (event != ACPI_NOTIFY_BUS_CHECK) | 703 | if (event != ACPI_NOTIFY_BUS_CHECK) |
| 693 | return; | 704 | return; |
| 694 | 705 | ||
| 695 | eeepc_rfkill_hotplug(); | 706 | eeepc_rfkill_hotplug(true); |
| 696 | } | 707 | } |
| 697 | 708 | ||
| 698 | static void eeepc_hotk_notify(struct acpi_device *device, u32 event) | 709 | static void eeepc_hotk_notify(struct acpi_device *device, u32 event) |
| @@ -850,7 +861,7 @@ static int eeepc_hotk_restore(struct device *device) | |||
| 850 | { | 861 | { |
| 851 | /* Refresh both wlan rfkill state and pci hotplug */ | 862 | /* Refresh both wlan rfkill state and pci hotplug */ |
| 852 | if (ehotk->wlan_rfkill) | 863 | if (ehotk->wlan_rfkill) |
| 853 | eeepc_rfkill_hotplug(); | 864 | eeepc_rfkill_hotplug(true); |
| 854 | 865 | ||
| 855 | if (ehotk->bluetooth_rfkill) | 866 | if (ehotk->bluetooth_rfkill) |
| 856 | rfkill_set_sw_state(ehotk->bluetooth_rfkill, | 867 | rfkill_set_sw_state(ehotk->bluetooth_rfkill, |
| @@ -993,7 +1004,7 @@ static void eeepc_rfkill_exit(void) | |||
| 993 | * Refresh pci hotplug in case the rfkill state was changed after | 1004 | * Refresh pci hotplug in case the rfkill state was changed after |
| 994 | * eeepc_unregister_rfkill_notifier() | 1005 | * eeepc_unregister_rfkill_notifier() |
| 995 | */ | 1006 | */ |
| 996 | eeepc_rfkill_hotplug(); | 1007 | eeepc_rfkill_hotplug(true); |
| 997 | if (ehotk->hotplug_slot) | 1008 | if (ehotk->hotplug_slot) |
| 998 | pci_hp_deregister(ehotk->hotplug_slot); | 1009 | pci_hp_deregister(ehotk->hotplug_slot); |
| 999 | 1010 | ||
| @@ -1109,7 +1120,7 @@ static int eeepc_rfkill_init(struct device *dev) | |||
| 1109 | * Refresh pci hotplug in case the rfkill state was changed during | 1120 | * Refresh pci hotplug in case the rfkill state was changed during |
| 1110 | * setup. | 1121 | * setup. |
| 1111 | */ | 1122 | */ |
| 1112 | eeepc_rfkill_hotplug(); | 1123 | eeepc_rfkill_hotplug(true); |
| 1113 | 1124 | ||
| 1114 | exit: | 1125 | exit: |
| 1115 | if (result && result != -ENODEV) | 1126 | if (result && result != -ENODEV) |
| @@ -1189,7 +1200,7 @@ static int eeepc_input_init(struct device *dev) | |||
| 1189 | return 0; | 1200 | return 0; |
| 1190 | } | 1201 | } |
| 1191 | 1202 | ||
| 1192 | static int eeepc_hotk_add(struct acpi_device *device) | 1203 | static int __devinit eeepc_hotk_add(struct acpi_device *device) |
| 1193 | { | 1204 | { |
| 1194 | struct device *dev; | 1205 | struct device *dev; |
| 1195 | int result; | 1206 | int result; |
diff --git a/drivers/platform/x86/fujitsu-laptop.c b/drivers/platform/x86/fujitsu-laptop.c index f35aee5c2149..bcd4ba8be7db 100644 --- a/drivers/platform/x86/fujitsu-laptop.c +++ b/drivers/platform/x86/fujitsu-laptop.c | |||
| @@ -944,7 +944,7 @@ static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type) | |||
| 944 | struct fujitsu_hotkey_t *fujitsu_hotkey = acpi_driver_data(device); | 944 | struct fujitsu_hotkey_t *fujitsu_hotkey = acpi_driver_data(device); |
| 945 | struct input_dev *input = fujitsu_hotkey->input; | 945 | struct input_dev *input = fujitsu_hotkey->input; |
| 946 | 946 | ||
| 947 | #ifdef CONFIG_LEDS_CLASS | 947 | #if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE) |
| 948 | if (fujitsu_hotkey->logolamp_registered) | 948 | if (fujitsu_hotkey->logolamp_registered) |
| 949 | led_classdev_unregister(&logolamp_led); | 949 | led_classdev_unregister(&logolamp_led); |
| 950 | 950 | ||
