aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/pci_slot.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/pci_slot.c')
-rw-r--r--drivers/acpi/pci_slot.c44
1 files changed, 10 insertions, 34 deletions
diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c
index e50e31a518af..d22585f21aeb 100644
--- a/drivers/acpi/pci_slot.c
+++ b/drivers/acpi/pci_slot.c
@@ -67,8 +67,8 @@ struct acpi_pci_slot {
67 struct list_head list; /* node in the list of slots */ 67 struct list_head list; /* node in the list of slots */
68}; 68};
69 69
70static int acpi_pci_slot_add(acpi_handle handle); 70static int acpi_pci_slot_add(struct acpi_pci_root *root);
71static void acpi_pci_slot_remove(acpi_handle handle); 71static void acpi_pci_slot_remove(struct acpi_pci_root *root);
72 72
73static LIST_HEAD(slot_list); 73static LIST_HEAD(slot_list);
74static DEFINE_MUTEX(slot_list_lock); 74static DEFINE_MUTEX(slot_list_lock);
@@ -233,45 +233,20 @@ out:
233 233
234/* 234/*
235 * walk_root_bridge - generic root bridge walker 235 * walk_root_bridge - generic root bridge walker
236 * @handle: points to an acpi_pci_root 236 * @root: poiner of an acpi_pci_root
237 * @user_function: user callback for slot objects 237 * @user_function: user callback for slot objects
238 * 238 *
239 * Call user_function for all objects underneath this root bridge. 239 * Call user_function for all objects underneath this root bridge.
240 * Walk p2p bridges underneath us and call user_function on those too. 240 * Walk p2p bridges underneath us and call user_function on those too.
241 */ 241 */
242static int 242static int
243walk_root_bridge(acpi_handle handle, acpi_walk_callback user_function) 243walk_root_bridge(struct acpi_pci_root *root, acpi_walk_callback user_function)
244{ 244{
245 int seg, bus;
246 unsigned long long tmp;
247 acpi_status status; 245 acpi_status status;
248 acpi_handle dummy_handle; 246 acpi_handle handle = root->device->handle;
249 struct pci_bus *pci_bus; 247 struct pci_bus *pci_bus = root->bus;
250 struct callback_args context; 248 struct callback_args context;
251 249
252 /* If the bridge doesn't have _STA, we assume it is always there */
253 status = acpi_get_handle(handle, "_STA", &dummy_handle);
254 if (ACPI_SUCCESS(status)) {
255 status = acpi_evaluate_integer(handle, "_STA", NULL, &tmp);
256 if (ACPI_FAILURE(status)) {
257 info("%s: _STA evaluation failure\n", __func__);
258 return 0;
259 }
260 if ((tmp & ACPI_STA_DEVICE_FUNCTIONING) == 0)
261 /* don't register this object */
262 return 0;
263 }
264
265 status = acpi_evaluate_integer(handle, "_SEG", NULL, &tmp);
266 seg = ACPI_SUCCESS(status) ? tmp : 0;
267
268 status = acpi_evaluate_integer(handle, "_BBN", NULL, &tmp);
269 bus = ACPI_SUCCESS(status) ? tmp : 0;
270
271 pci_bus = pci_find_bus(seg, bus);
272 if (!pci_bus)
273 return 0;
274
275 context.pci_bus = pci_bus; 250 context.pci_bus = pci_bus;
276 context.user_function = user_function; 251 context.user_function = user_function;
277 context.root_handle = handle; 252 context.root_handle = handle;
@@ -295,11 +270,11 @@ walk_root_bridge(acpi_handle handle, acpi_walk_callback user_function)
295 * @handle: points to an acpi_pci_root 270 * @handle: points to an acpi_pci_root
296 */ 271 */
297static int 272static int
298acpi_pci_slot_add(acpi_handle handle) 273acpi_pci_slot_add(struct acpi_pci_root *root)
299{ 274{
300 acpi_status status; 275 acpi_status status;
301 276
302 status = walk_root_bridge(handle, register_slot); 277 status = walk_root_bridge(root, register_slot);
303 if (ACPI_FAILURE(status)) 278 if (ACPI_FAILURE(status))
304 err("%s: register_slot failure - %d\n", __func__, status); 279 err("%s: register_slot failure - %d\n", __func__, status);
305 280
@@ -311,10 +286,11 @@ acpi_pci_slot_add(acpi_handle handle)
311 * @handle: points to an acpi_pci_root 286 * @handle: points to an acpi_pci_root
312 */ 287 */
313static void 288static void
314acpi_pci_slot_remove(acpi_handle handle) 289acpi_pci_slot_remove(struct acpi_pci_root *root)
315{ 290{
316 struct acpi_pci_slot *slot, *tmp; 291 struct acpi_pci_slot *slot, *tmp;
317 struct pci_bus *pbus; 292 struct pci_bus *pbus;
293 acpi_handle handle = root->device->handle;
318 294
319 mutex_lock(&slot_list_lock); 295 mutex_lock(&slot_list_lock);
320 list_for_each_entry_safe(slot, tmp, &slot_list, list) { 296 list_for_each_entry_safe(slot, tmp, &slot_list, list) {