aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/namespace/nsinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/namespace/nsinit.c')
-rw-r--r--drivers/acpi/namespace/nsinit.c105
1 files changed, 56 insertions, 49 deletions
diff --git a/drivers/acpi/namespace/nsinit.c b/drivers/acpi/namespace/nsinit.c
index 0a08d2f04a06..9f929e479fd8 100644
--- a/drivers/acpi/namespace/nsinit.c
+++ b/drivers/acpi/namespace/nsinit.c
@@ -5,7 +5,7 @@
5 *****************************************************************************/ 5 *****************************************************************************/
6 6
7/* 7/*
8 * Copyright (C) 2000 - 2005, R. Byron Moore 8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved. 9 * All rights reserved.
10 * 10 *
11 * Redistribution and use in source and binary forms, with or without 11 * Redistribution and use in source and binary forms, with or without
@@ -93,8 +93,7 @@ acpi_status acpi_ns_initialize_objects(void)
93 ACPI_UINT32_MAX, acpi_ns_init_one_object, 93 ACPI_UINT32_MAX, acpi_ns_init_one_object,
94 &info, NULL); 94 &info, NULL);
95 if (ACPI_FAILURE(status)) { 95 if (ACPI_FAILURE(status)) {
96 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "walk_namespace failed! %s\n", 96 ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace"));
97 acpi_format_exception(status)));
98 } 97 }
99 98
100 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, 99 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
@@ -159,12 +158,11 @@ acpi_status acpi_ns_initialize_devices(void)
159 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); 158 (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
160 159
161 if (ACPI_FAILURE(status)) { 160 if (ACPI_FAILURE(status)) {
162 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "walk_namespace failed! %s\n", 161 ACPI_EXCEPTION((AE_INFO, status, "During walk_namespace"));
163 acpi_format_exception(status)));
164 } 162 }
165 163
166 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, 164 ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
167 "\n%hd Devices found containing: %hd _STA, %hd _INI methods\n", 165 "\n%hd Devices found - executed %hd _STA, %hd _INI methods\n",
168 info.device_count, info.num_STA, info.num_INI)); 166 info.device_count, info.num_STA, info.num_INI));
169 167
170 return_ACPI_STATUS(status); 168 return_ACPI_STATUS(status);
@@ -289,12 +287,10 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
289 } 287 }
290 288
291 if (ACPI_FAILURE(status)) { 289 if (ACPI_FAILURE(status)) {
292 ACPI_DEBUG_PRINT_RAW((ACPI_DB_ERROR, "\n")); 290 ACPI_EXCEPTION((AE_INFO, status,
293 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 291 "Could not execute arguments for [%4.4s] (%s)",
294 "Could not execute arguments for [%4.4s] (%s), %s\n", 292 acpi_ut_get_node_name(node),
295 acpi_ut_get_node_name(node), 293 acpi_ut_get_type_name(type)));
296 acpi_ut_get_type_name(type),
297 acpi_format_exception(status)));
298 } 294 }
299 295
300 /* 296 /*
@@ -336,23 +332,22 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
336 struct acpi_parameter_info pinfo; 332 struct acpi_parameter_info pinfo;
337 u32 flags; 333 u32 flags;
338 acpi_status status; 334 acpi_status status;
335 struct acpi_namespace_node *ini_node;
336 struct acpi_namespace_node *device_node;
339 337
340 ACPI_FUNCTION_TRACE("ns_init_one_device"); 338 ACPI_FUNCTION_TRACE("ns_init_one_device");
341 339
342 pinfo.parameters = NULL; 340 device_node = acpi_ns_map_handle_to_node(obj_handle);
343 pinfo.parameter_type = ACPI_PARAM_ARGS; 341 if (!device_node) {
344
345 pinfo.node = acpi_ns_map_handle_to_node(obj_handle);
346 if (!pinfo.node) {
347 return_ACPI_STATUS(AE_BAD_PARAMETER); 342 return_ACPI_STATUS(AE_BAD_PARAMETER);
348 } 343 }
349 344
350 /* 345 /*
351 * We will run _STA/_INI on Devices, Processors and thermal_zones only 346 * We will run _STA/_INI on Devices, Processors and thermal_zones only
352 */ 347 */
353 if ((pinfo.node->type != ACPI_TYPE_DEVICE) && 348 if ((device_node->type != ACPI_TYPE_DEVICE) &&
354 (pinfo.node->type != ACPI_TYPE_PROCESSOR) && 349 (device_node->type != ACPI_TYPE_PROCESSOR) &&
355 (pinfo.node->type != ACPI_TYPE_THERMAL)) { 350 (device_node->type != ACPI_TYPE_THERMAL)) {
356 return_ACPI_STATUS(AE_OK); 351 return_ACPI_STATUS(AE_OK);
357 } 352 }
358 353
@@ -364,57 +359,69 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
364 info->device_count++; 359 info->device_count++;
365 360
366 /* 361 /*
367 * Run _STA to determine if we can run _INI on the device. 362 * Check if the _INI method exists for this device -
363 * if _INI does not exist, there is no need to run _STA
364 * No _INI means device requires no initialization
365 */
366 status = acpi_ns_search_node(*ACPI_CAST_PTR(u32, METHOD_NAME__INI),
367 device_node, ACPI_TYPE_METHOD, &ini_node);
368 if (ACPI_FAILURE(status)) {
369 /* No _INI method found - move on to next device */
370
371 return_ACPI_STATUS(AE_OK);
372 }
373
374 /*
375 * Run _STA to determine if we can run _INI on the device -
376 * the device must be present before _INI can be run.
377 * However, _STA is not required - assume device present if no _STA
368 */ 378 */
369 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD, 379 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD,
370 pinfo.node, 380 device_node,
371 METHOD_NAME__STA)); 381 METHOD_NAME__STA));
372 status = acpi_ut_execute_STA(pinfo.node, &flags);
373 382
383 pinfo.node = device_node;
384 pinfo.parameters = NULL;
385 pinfo.parameter_type = ACPI_PARAM_ARGS;
386
387 status = acpi_ut_execute_STA(pinfo.node, &flags);
374 if (ACPI_FAILURE(status)) { 388 if (ACPI_FAILURE(status)) {
375 if (pinfo.node->type == ACPI_TYPE_DEVICE) { 389 /* Ignore error and move on to next device */
376 /* Ignore error and move on to next device */
377 390
378 return_ACPI_STATUS(AE_OK); 391 return_ACPI_STATUS(AE_OK);
379 } 392 }
380 393
381 /* _STA is not required for Processor or thermal_zone objects */ 394 if (flags != ACPI_UINT32_MAX) {
382 } else {
383 info->num_STA++; 395 info->num_STA++;
396 }
384 397
385 if (!(flags & 0x01)) { 398 if (!(flags & ACPI_STA_DEVICE_PRESENT)) {
386 /* Don't look at children of a not present device */ 399 /* Don't look at children of a not present device */
387 400
388 return_ACPI_STATUS(AE_CTRL_DEPTH); 401 return_ACPI_STATUS(AE_CTRL_DEPTH);
389 }
390 } 402 }
391 403
392 /* 404 /*
393 * The device is present. Run _INI. 405 * The device is present and _INI exists. Run the _INI method.
406 * (We already have the _INI node from above)
394 */ 407 */
395 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD, 408 ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_METHOD,
396 pinfo.node, 409 pinfo.node,
397 METHOD_NAME__INI)); 410 METHOD_NAME__INI));
398 status = acpi_ns_evaluate_relative(METHOD_NAME__INI, &pinfo);
399 if (ACPI_FAILURE(status)) {
400 /* No _INI (AE_NOT_FOUND) means device requires no initialization */
401 411
402 if (status != AE_NOT_FOUND) { 412 pinfo.node = ini_node;
403 /* Ignore error and move on to next device */ 413 status = acpi_ns_evaluate_by_handle(&pinfo);
414 if (ACPI_FAILURE(status)) {
415 /* Ignore error and move on to next device */
404 416
405#ifdef ACPI_DEBUG_OUTPUT 417#ifdef ACPI_DEBUG_OUTPUT
406 char *scope_name = 418 char *scope_name = acpi_ns_get_external_pathname(ini_node);
407 acpi_ns_get_external_pathname(pinfo.node);
408 419
409 ACPI_DEBUG_PRINT((ACPI_DB_WARN, "%s._INI failed: %s\n", 420 ACPI_WARNING((AE_INFO, "%s._INI failed: %s",
410 scope_name, 421 scope_name, acpi_format_exception(status)));
411 acpi_format_exception(status)));
412 422
413 ACPI_MEM_FREE(scope_name); 423 ACPI_MEM_FREE(scope_name);
414#endif 424#endif
415 }
416
417 status = AE_OK;
418 } else { 425 } else {
419 /* Delete any return object (especially if implicit_return is enabled) */ 426 /* Delete any return object (especially if implicit_return is enabled) */
420 427
@@ -434,5 +441,5 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
434 acpi_gbl_init_handler(pinfo.node, ACPI_INIT_DEVICE_INI); 441 acpi_gbl_init_handler(pinfo.node, ACPI_INIT_DEVICE_INI);
435 } 442 }
436 443
437 return_ACPI_STATUS(status); 444 return_ACPI_STATUS(AE_OK);
438} 445}