aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-02-20 19:09:33 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-02-20 19:09:33 -0500
commit96075315c5e7077fc5a3ac54c9b9e97e376e66ed (patch)
treea75bfd74f4ff52997dfb3dda4f0da95be613296f
parent59b42fa01fe2d84f3c3f28ee6f25510820ace35b (diff)
parentcc6254e00eb676dda6501655f8185aef7b761b4f (diff)
Merge branch 'acpi-pci-hotplug' into acpi-dock
-rw-r--r--drivers/pci/hotplug/acpiphp_glue.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
index 4228c67ceffe..d3d2cc6bb40a 100644
--- a/drivers/pci/hotplug/acpiphp_glue.c
+++ b/drivers/pci/hotplug/acpiphp_glue.c
@@ -255,9 +255,15 @@ static void acpiphp_dock_release(void *data)
255 put_bridge(context->func.parent); 255 put_bridge(context->func.parent);
256} 256}
257 257
258/* callback routine to register each ACPI PCI slot object */ 258/**
259static acpi_status register_slot(acpi_handle handle, u32 lvl, void *data, 259 * acpiphp_add_context - Add ACPIPHP context to an ACPI device object.
260 void **rv) 260 * @handle: ACPI handle of the object to add a context to.
261 * @lvl: Not used.
262 * @data: The object's parent ACPIPHP bridge.
263 * @rv: Not used.
264 */
265static acpi_status acpiphp_add_context(acpi_handle handle, u32 lvl, void *data,
266 void **rv)
261{ 267{
262 struct acpiphp_bridge *bridge = data; 268 struct acpiphp_bridge *bridge = data;
263 struct acpiphp_context *context; 269 struct acpiphp_context *context;
@@ -271,9 +277,6 @@ static acpi_status register_slot(acpi_handle handle, u32 lvl, void *data,
271 struct pci_dev *pdev = bridge->pci_dev; 277 struct pci_dev *pdev = bridge->pci_dev;
272 u32 val; 278 u32 val;
273 279
274 if (pdev && device_is_managed_by_native_pciehp(pdev))
275 return AE_OK;
276
277 status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr); 280 status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
278 if (ACPI_FAILURE(status)) { 281 if (ACPI_FAILURE(status)) {
279 if (status != AE_NOT_FOUND) 282 if (status != AE_NOT_FOUND)
@@ -325,8 +328,14 @@ static acpi_status register_slot(acpi_handle handle, u32 lvl, void *data,
325 328
326 list_add_tail(&slot->node, &bridge->slots); 329 list_add_tail(&slot->node, &bridge->slots);
327 330
328 /* Register slots for ejectable functions only. */ 331 /*
329 if (acpi_pci_check_ejectable(pbus, handle) || is_dock_device(handle)) { 332 * Expose slots to user space for functions that have _EJ0 or _RMV or
333 * are located in dock stations. Do not expose them for devices handled
334 * by the native PCIe hotplug (PCIeHP), becuase that code is supposed to
335 * expose slots to user space in those cases.
336 */
337 if ((acpi_pci_check_ejectable(pbus, handle) || is_dock_device(handle))
338 && !(pdev && device_is_managed_by_native_pciehp(pdev))) {
330 unsigned long long sun; 339 unsigned long long sun;
331 int retval; 340 int retval;
332 341
@@ -923,14 +932,14 @@ void acpiphp_enumerate_slots(struct pci_bus *bus)
923 acpi_unlock_hp_context(); 932 acpi_unlock_hp_context();
924 } 933 }
925 934
926 /* must be added to the list prior to calling register_slot */ 935 /* Must be added to the list prior to calling acpiphp_add_context(). */
927 mutex_lock(&bridge_mutex); 936 mutex_lock(&bridge_mutex);
928 list_add(&bridge->list, &bridge_list); 937 list_add(&bridge->list, &bridge_list);
929 mutex_unlock(&bridge_mutex); 938 mutex_unlock(&bridge_mutex);
930 939
931 /* register all slot objects under this bridge */ 940 /* register all slot objects under this bridge */
932 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1, 941 status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
933 register_slot, NULL, bridge, NULL); 942 acpiphp_add_context, NULL, bridge, NULL);
934 if (ACPI_FAILURE(status)) { 943 if (ACPI_FAILURE(status)) {
935 acpi_handle_err(handle, "failed to register slots\n"); 944 acpi_handle_err(handle, "failed to register slots\n");
936 cleanup_bridge(bridge); 945 cleanup_bridge(bridge);