X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Facpi%2Fhardware%2Fhwregs.c;h=91af0c2ddcf7e74d2b1234bc67710b33bb097bc3;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=cb998fe9e9700ef494380b8b5ad75c9d38d878e3;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/drivers/acpi/hardware/hwregs.c b/drivers/acpi/hardware/hwregs.c index cb998fe9e..91af0c2dd 100644 --- a/drivers/acpi/hardware/hwregs.c +++ b/drivers/acpi/hardware/hwregs.c @@ -7,7 +7,7 @@ ******************************************************************************/ /* - * Copyright (C) 2000 - 2004, R. Byron Moore + * Copyright (C) 2000 - 2005, R. Byron Moore * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,6 +43,7 @@ * POSSIBILITY OF SUCH DAMAGES. */ +#include #include #include @@ -211,6 +212,7 @@ acpi_get_sleep_type_data ( acpi_ut_remove_reference (info.return_object); return_ACPI_STATUS (status); } +EXPORT_SYMBOL(acpi_get_sleep_type_data); /******************************************************************************* @@ -307,6 +309,7 @@ acpi_get_register ( return_ACPI_STATUS (status); } +EXPORT_SYMBOL(acpi_get_register); /******************************************************************************* @@ -457,6 +460,7 @@ unlock_and_exit: value, register_value, bit_reg_info->parent_register)); return_ACPI_STATUS (status); } +EXPORT_SYMBOL(acpi_set_register); /****************************************************************************** @@ -709,6 +713,7 @@ acpi_hw_low_level_read ( u32 *value, struct acpi_generic_address *reg) { + u64 address; acpi_status status; @@ -720,8 +725,14 @@ acpi_hw_low_level_read ( * a non-zero address within. However, don't return an error * because the PM1A/B code must not fail if B isn't present. */ - if ((!reg) || - (!reg->address)) { + if (!reg) { + return (AE_OK); + } + + /* Get a local copy of the address. Handles possible alignment issues */ + + ACPI_MOVE_64_TO_64 (&address, ®->address); + if (!address) { return (AE_OK); } *value = 0; @@ -734,14 +745,14 @@ acpi_hw_low_level_read ( case ACPI_ADR_SPACE_SYSTEM_MEMORY: status = acpi_os_read_memory ( - (acpi_physical_address) reg->address, + (acpi_physical_address) address, value, width); break; case ACPI_ADR_SPACE_SYSTEM_IO: - status = acpi_os_read_port ((acpi_io_address) reg->address, + status = acpi_os_read_port ((acpi_io_address) address, value, width); break; @@ -754,7 +765,7 @@ acpi_hw_low_level_read ( ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Read: %8.8X width %2d from %8.8X%8.8X (%s)\n", *value, width, - ACPI_FORMAT_UINT64 (reg->address), + ACPI_FORMAT_UINT64 (address), acpi_ut_get_region_name (reg->address_space_id))); return (status); @@ -781,6 +792,7 @@ acpi_hw_low_level_write ( u32 value, struct acpi_generic_address *reg) { + u64 address; acpi_status status; @@ -792,8 +804,14 @@ acpi_hw_low_level_write ( * a non-zero address within. However, don't return an error * because the PM1A/B code must not fail if B isn't present. */ - if ((!reg) || - (!reg->address)) { + if (!reg) { + return (AE_OK); + } + + /* Get a local copy of the address. Handles possible alignment issues */ + + ACPI_MOVE_64_TO_64 (&address, ®->address); + if (!address) { return (AE_OK); } @@ -805,14 +823,14 @@ acpi_hw_low_level_write ( case ACPI_ADR_SPACE_SYSTEM_MEMORY: status = acpi_os_write_memory ( - (acpi_physical_address) reg->address, + (acpi_physical_address) address, value, width); break; case ACPI_ADR_SPACE_SYSTEM_IO: - status = acpi_os_write_port ((acpi_io_address) reg->address, + status = acpi_os_write_port ((acpi_io_address) address, value, width); break; @@ -825,7 +843,7 @@ acpi_hw_low_level_write ( ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n", value, width, - ACPI_FORMAT_UINT64 (reg->address), + ACPI_FORMAT_UINT64 (address), acpi_ut_get_region_name (reg->address_space_id))); return (status);