diff options
Diffstat (limited to 'drivers/acpi/executer/exprep.c')
-rw-r--r-- | drivers/acpi/executer/exprep.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/drivers/acpi/executer/exprep.c b/drivers/acpi/executer/exprep.c index 7476c363e407..7719ae5d4f16 100644 --- a/drivers/acpi/executer/exprep.c +++ b/drivers/acpi/executer/exprep.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2005, R. Byron Moore | 9 | * Copyright (C) 2000 - 2006, R. Byron Moore |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
@@ -274,9 +274,8 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc, | |||
274 | default: | 274 | default: |
275 | /* Invalid field access type */ | 275 | /* Invalid field access type */ |
276 | 276 | ||
277 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 277 | ACPI_ERROR((AE_INFO, "Unknown field access type %X", access)); |
278 | "Unknown field access type %X\n", access)); | 278 | return_UINT32(0); |
279 | return_VALUE(0); | ||
280 | } | 279 | } |
281 | 280 | ||
282 | if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_BUFFER_FIELD) { | 281 | if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_BUFFER_FIELD) { |
@@ -289,7 +288,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc, | |||
289 | } | 288 | } |
290 | 289 | ||
291 | *return_byte_alignment = byte_alignment; | 290 | *return_byte_alignment = byte_alignment; |
292 | return_VALUE(bit_length); | 291 | return_UINT32(bit_length); |
293 | } | 292 | } |
294 | 293 | ||
295 | /******************************************************************************* | 294 | /******************************************************************************* |
@@ -422,15 +421,15 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info) | |||
422 | 421 | ||
423 | if (info->field_type != ACPI_TYPE_LOCAL_INDEX_FIELD) { | 422 | if (info->field_type != ACPI_TYPE_LOCAL_INDEX_FIELD) { |
424 | if (!info->region_node) { | 423 | if (!info->region_node) { |
425 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Null region_node\n")); | 424 | ACPI_ERROR((AE_INFO, "Null region_node")); |
426 | return_ACPI_STATUS(AE_AML_NO_OPERAND); | 425 | return_ACPI_STATUS(AE_AML_NO_OPERAND); |
427 | } | 426 | } |
428 | 427 | ||
429 | type = acpi_ns_get_type(info->region_node); | 428 | type = acpi_ns_get_type(info->region_node); |
430 | if (type != ACPI_TYPE_REGION) { | 429 | if (type != ACPI_TYPE_REGION) { |
431 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, | 430 | ACPI_ERROR((AE_INFO, |
432 | "Needed Region, found type %X (%s)\n", | 431 | "Needed Region, found type %X (%s)", |
433 | type, acpi_ut_get_type_name(type))); | 432 | type, acpi_ut_get_type_name(type))); |
434 | 433 | ||
435 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); | 434 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
436 | } | 435 | } |
@@ -499,17 +498,17 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info) | |||
499 | 498 | ||
500 | case ACPI_TYPE_LOCAL_INDEX_FIELD: | 499 | case ACPI_TYPE_LOCAL_INDEX_FIELD: |
501 | 500 | ||
501 | /* Get the Index and Data registers */ | ||
502 | |||
502 | obj_desc->index_field.index_obj = | 503 | obj_desc->index_field.index_obj = |
503 | acpi_ns_get_attached_object(info->register_node); | 504 | acpi_ns_get_attached_object(info->register_node); |
504 | obj_desc->index_field.data_obj = | 505 | obj_desc->index_field.data_obj = |
505 | acpi_ns_get_attached_object(info->data_register_node); | 506 | acpi_ns_get_attached_object(info->data_register_node); |
506 | obj_desc->index_field.value = (u32) | ||
507 | (info->field_bit_position / | ||
508 | ACPI_MUL_8(obj_desc->field.access_byte_width)); | ||
509 | 507 | ||
510 | if (!obj_desc->index_field.data_obj | 508 | if (!obj_desc->index_field.data_obj |
511 | || !obj_desc->index_field.index_obj) { | 509 | || !obj_desc->index_field.index_obj) { |
512 | ACPI_REPORT_ERROR(("Null Index Object during field prep\n")); | 510 | ACPI_ERROR((AE_INFO, |
511 | "Null Index Object during field prep")); | ||
513 | acpi_ut_delete_object_desc(obj_desc); | 512 | acpi_ut_delete_object_desc(obj_desc); |
514 | return_ACPI_STATUS(AE_AML_INTERNAL); | 513 | return_ACPI_STATUS(AE_AML_INTERNAL); |
515 | } | 514 | } |
@@ -519,6 +518,15 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info) | |||
519 | acpi_ut_add_reference(obj_desc->index_field.data_obj); | 518 | acpi_ut_add_reference(obj_desc->index_field.data_obj); |
520 | acpi_ut_add_reference(obj_desc->index_field.index_obj); | 519 | acpi_ut_add_reference(obj_desc->index_field.index_obj); |
521 | 520 | ||
521 | /* | ||
522 | * The value written to the Index register is the byte offset of the | ||
523 | * target field | ||
524 | * Note: may change code to: ACPI_DIV_8 (Info->field_bit_position) | ||
525 | */ | ||
526 | obj_desc->index_field.value = (u32) | ||
527 | (info->field_bit_position / | ||
528 | ACPI_MUL_8(obj_desc->field.access_byte_width)); | ||
529 | |||
522 | ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, | 530 | ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, |
523 | "index_field: bit_off %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n", | 531 | "index_field: bit_off %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n", |
524 | obj_desc->index_field.start_field_bit_offset, | 532 | obj_desc->index_field.start_field_bit_offset, |