vserver 1.9.5.x5
[linux-2.6.git] / drivers / acpi / hardware / hwregs.c
index cb998fe..91af0c2 100644 (file)
@@ -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 <linux/module.h>
 
 #include <acpi/acpi.h>
 #include <acpi/acnamesp.h>
@@ -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, &reg->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, &reg->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);