소스 검색

Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6

* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6:
  ACPI button: don't try to use a non-existent lid device
  ACPI: video: Loosen strictness of video bus detection code
  eeepc-laptop: Prevent a panic when disabling RT2860 wireless when associated
  eeepc-laptop: Properly annote eeepc_enable_camera().
  ACPI / PCI: Fix NULL pointer dereference in acpi_get_pci_dev() (rev. 2)
  fujitsu-laptop: address missed led-class ifdef fixup
  ACPI: Kconfig, fix proc aggregator text
  ACPI: add AC/DC notifier
Linus Torvalds 15 년 전
부모
커밋
bd72f85b9a
8개의 변경된 파일46개의 추가작업 그리고 15개의 파일을 삭제
  1. 2 2
      drivers/acpi/Kconfig
  2. 1 0
      drivers/acpi/ac.c
  3. 3 0
      drivers/acpi/button.c
  4. 11 0
      drivers/acpi/pci_root.c
  5. 6 1
      drivers/acpi/video.c
  6. 1 1
      drivers/acpi/video_detect.c
  7. 21 10
      drivers/platform/x86/eeepc-laptop.c
  8. 1 1
      drivers/platform/x86/fujitsu-laptop.c

+ 2 - 2
drivers/acpi/Kconfig

@@ -218,10 +218,10 @@ config ACPI_PROCESSOR_AGGREGATOR
 	depends on X86
 	depends on X86
 	help
 	help
 	  ACPI 4.0 defines processor Aggregator, which enables OS to perform
 	  ACPI 4.0 defines processor Aggregator, which enables OS to perform
-	  specfic processor configuration and control that applies to all
+	  specific processor configuration and control that applies to all
 	  processors in the platform. Currently only logical processor idling
 	  processors in the platform. Currently only logical processor idling
 	  is defined, which is to reduce power consumption. This driver
 	  is defined, which is to reduce power consumption. This driver
-	  support the new device.
+	  supports the new device.
 
 
 config ACPI_THERMAL
 config ACPI_THERMAL
 	tristate "Thermal Zone"
 	tristate "Thermal Zone"

+ 1 - 0
drivers/acpi/ac.c

@@ -245,6 +245,7 @@ static void acpi_ac_notify(struct acpi_device *device, u32 event)
 		acpi_bus_generate_netlink_event(device->pnp.device_class,
 		acpi_bus_generate_netlink_event(device->pnp.device_class,
 						  dev_name(&device->dev), event,
 						  dev_name(&device->dev), event,
 						  (u32) ac->state);
 						  (u32) ac->state);
+		acpi_notifier_call_chain(device, event, (u32) ac->state);
 #ifdef CONFIG_ACPI_SYSFS_POWER
 #ifdef CONFIG_ACPI_SYSFS_POWER
 		kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
 		kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE);
 #endif
 #endif

+ 3 - 0
drivers/acpi/button.c

@@ -251,6 +251,9 @@ int acpi_lid_open(void)
 	acpi_status status;
 	acpi_status status;
 	unsigned long long state;
 	unsigned long long state;
 
 
+	if (!lid_device)
+		return -ENODEV;
+
 	status = acpi_evaluate_integer(lid_device->handle, "_LID", NULL,
 	status = acpi_evaluate_integer(lid_device->handle, "_LID", NULL,
 				       &state);
 				       &state);
 	if (ACPI_FAILURE(status))
 	if (ACPI_FAILURE(status))

+ 11 - 0
drivers/acpi/pci_root.c

@@ -389,6 +389,17 @@ struct pci_dev *acpi_get_pci_dev(acpi_handle handle)
 
 
 		pbus = pdev->subordinate;
 		pbus = pdev->subordinate;
 		pci_dev_put(pdev);
 		pci_dev_put(pdev);
+
+		/*
+		 * This function may be called for a non-PCI device that has a
+		 * PCI parent (eg. a disk under a PCI SATA controller).  In that
+		 * case pdev->subordinate will be NULL for the parent.
+		 */
+		if (!pbus) {
+			dev_dbg(&pdev->dev, "Not a PCI-to-PCI bridge\n");
+			pdev = NULL;
+			break;
+		}
 	}
 	}
 out:
 out:
 	list_for_each_entry_safe(node, tmp, &device_list, node)
 	list_for_each_entry_safe(node, tmp, &device_list, node)

+ 6 - 1
drivers/acpi/video.c

@@ -1109,7 +1109,12 @@ static int acpi_video_bus_check(struct acpi_video_bus *video)
 	 */
 	 */
 
 
 	/* Does this device support video switching? */
 	/* Does this device support video switching? */
-	if (video->cap._DOS) {
+	if (video->cap._DOS || video->cap._DOD) {
+		if (!video->cap._DOS) {
+			printk(KERN_WARNING FW_BUG
+				"ACPI(%s) defines _DOD but not _DOS\n",
+				acpi_device_bid(video->device));
+		}
 		video->flags.multihead = 1;
 		video->flags.multihead = 1;
 		status = 0;
 		status = 0;
 	}
 	}

+ 1 - 1
drivers/acpi/video_detect.c

@@ -84,7 +84,7 @@ long acpi_is_video_device(struct acpi_device *device)
 		return 0;
 		return 0;
 
 
 	/* Does this device able to support video switching ? */
 	/* Does this device able to support video switching ? */
-	if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) &&
+	if (ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOD", &h_dummy)) ||
 	    ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy)))
 	    ACPI_SUCCESS(acpi_get_handle(device->handle, "_DOS", &h_dummy)))
 		video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING;
 		video_caps |= ACPI_VIDEO_OUTPUT_SWITCHING;
 
 

+ 21 - 10
drivers/platform/x86/eeepc-laptop.c

@@ -150,6 +150,8 @@ struct eeepc_hotk {
 /* The actual device the driver binds to */
 /* The actual device the driver binds to */
 static struct eeepc_hotk *ehotk;
 static struct eeepc_hotk *ehotk;
 
 
+static void eeepc_rfkill_hotplug(bool real);
+
 /* Platform device/driver */
 /* Platform device/driver */
 static int eeepc_hotk_thaw(struct device *device);
 static int eeepc_hotk_thaw(struct device *device);
 static int eeepc_hotk_restore(struct device *device);
 static int eeepc_hotk_restore(struct device *device);
@@ -343,14 +345,23 @@ static bool eeepc_wlan_rfkill_blocked(void)
 static int eeepc_rfkill_set(void *data, bool blocked)
 static int eeepc_rfkill_set(void *data, bool blocked)
 {
 {
 	unsigned long asl = (unsigned long)data;
 	unsigned long asl = (unsigned long)data;
-	return set_acpi(asl, !blocked);
+	int ret;
+
+	if (asl != CM_ASL_WLAN)
+		return set_acpi(asl, !blocked);
+
+	/* hack to avoid panic with rt2860sta */
+	if (blocked)
+		eeepc_rfkill_hotplug(false);
+	ret = set_acpi(asl, !blocked);
+	return ret;
 }
 }
 
 
 static const struct rfkill_ops eeepc_rfkill_ops = {
 static const struct rfkill_ops eeepc_rfkill_ops = {
 	.set_block = eeepc_rfkill_set,
 	.set_block = eeepc_rfkill_set,
 };
 };
 
 
-static void __init eeepc_enable_camera(void)
+static void __devinit eeepc_enable_camera(void)
 {
 {
 	/*
 	/*
 	 * If the following call to set_acpi() fails, it's because there's no
 	 * 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,
 	return 0;
 	return 0;
 }
 }
 
 
-static void eeepc_rfkill_hotplug(void)
+static void eeepc_rfkill_hotplug(bool real)
 {
 {
 	struct pci_dev *dev;
 	struct pci_dev *dev;
 	struct pci_bus *bus;
 	struct pci_bus *bus;
-	bool blocked = eeepc_wlan_rfkill_blocked();
+	bool blocked = real ? eeepc_wlan_rfkill_blocked() : true;
 
 
-	if (ehotk->wlan_rfkill)
+	if (real && ehotk->wlan_rfkill)
 		rfkill_set_sw_state(ehotk->wlan_rfkill, blocked);
 		rfkill_set_sw_state(ehotk->wlan_rfkill, blocked);
 
 
 	mutex_lock(&ehotk->hotplug_lock);
 	mutex_lock(&ehotk->hotplug_lock);
@@ -692,7 +703,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data)
 	if (event != ACPI_NOTIFY_BUS_CHECK)
 	if (event != ACPI_NOTIFY_BUS_CHECK)
 		return;
 		return;
 
 
-	eeepc_rfkill_hotplug();
+	eeepc_rfkill_hotplug(true);
 }
 }
 
 
 static void eeepc_hotk_notify(struct acpi_device *device, u32 event)
 static void eeepc_hotk_notify(struct acpi_device *device, u32 event)
@@ -850,7 +861,7 @@ static int eeepc_hotk_restore(struct device *device)
 {
 {
 	/* Refresh both wlan rfkill state and pci hotplug */
 	/* Refresh both wlan rfkill state and pci hotplug */
 	if (ehotk->wlan_rfkill)
 	if (ehotk->wlan_rfkill)
-		eeepc_rfkill_hotplug();
+		eeepc_rfkill_hotplug(true);
 
 
 	if (ehotk->bluetooth_rfkill)
 	if (ehotk->bluetooth_rfkill)
 		rfkill_set_sw_state(ehotk->bluetooth_rfkill,
 		rfkill_set_sw_state(ehotk->bluetooth_rfkill,
@@ -993,7 +1004,7 @@ static void eeepc_rfkill_exit(void)
 	 * Refresh pci hotplug in case the rfkill state was changed after
 	 * Refresh pci hotplug in case the rfkill state was changed after
 	 * eeepc_unregister_rfkill_notifier()
 	 * eeepc_unregister_rfkill_notifier()
 	 */
 	 */
-	eeepc_rfkill_hotplug();
+	eeepc_rfkill_hotplug(true);
 	if (ehotk->hotplug_slot)
 	if (ehotk->hotplug_slot)
 		pci_hp_deregister(ehotk->hotplug_slot);
 		pci_hp_deregister(ehotk->hotplug_slot);
 
 
@@ -1109,7 +1120,7 @@ static int eeepc_rfkill_init(struct device *dev)
 	 * Refresh pci hotplug in case the rfkill state was changed during
 	 * Refresh pci hotplug in case the rfkill state was changed during
 	 * setup.
 	 * setup.
 	 */
 	 */
-	eeepc_rfkill_hotplug();
+	eeepc_rfkill_hotplug(true);
 
 
 exit:
 exit:
 	if (result && result != -ENODEV)
 	if (result && result != -ENODEV)
@@ -1189,7 +1200,7 @@ static int eeepc_input_init(struct device *dev)
 	return 0;
 	return 0;
 }
 }
 
 
-static int eeepc_hotk_add(struct acpi_device *device)
+static int __devinit eeepc_hotk_add(struct acpi_device *device)
 {
 {
 	struct device *dev;
 	struct device *dev;
 	int result;
 	int result;

+ 1 - 1
drivers/platform/x86/fujitsu-laptop.c

@@ -944,7 +944,7 @@ static int acpi_fujitsu_hotkey_remove(struct acpi_device *device, int type)
 	struct fujitsu_hotkey_t *fujitsu_hotkey = acpi_driver_data(device);
 	struct fujitsu_hotkey_t *fujitsu_hotkey = acpi_driver_data(device);
 	struct input_dev *input = fujitsu_hotkey->input;
 	struct input_dev *input = fujitsu_hotkey->input;
 
 
-#ifdef CONFIG_LEDS_CLASS
+#if defined(CONFIG_LEDS_CLASS) || defined(CONFIG_LEDS_CLASS_MODULE)
 	if (fujitsu_hotkey->logolamp_registered)
 	if (fujitsu_hotkey->logolamp_registered)
 		led_classdev_unregister(&logolamp_led);
 		led_classdev_unregister(&logolamp_led);