Skip to content

Commit

Permalink
ACPICA: For PM1B registers, do not shift value read or written
Browse files Browse the repository at this point in the history
The PM1B registers are mirrors of the PM1A registers with
different bits actually implemented. From the ACPI specification:
"Although the bits can be split between the two register blocks
(each register block has a unique pointer within the FADT), the bit
positions are maintained. The register block with unimplemented
bits (that is, those implemented in the other register block)
always returns zeros, and writes have no side effects"

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
  • Loading branch information
Bob Moore authored and Len Brown committed Mar 26, 2009
1 parent 227243a commit aefc7f9
Showing 1 changed file with 24 additions and 9 deletions.
33 changes: 24 additions & 9 deletions drivers/acpi/acpica/hwregs.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,9 +372,17 @@ acpi_hw_read_multiple(u32 *value,
}
}

/* Shift the B bits above the A bits */

*value = value_a | (value_b << register_a->bit_width);
/*
* OR the two return values together. No shifting or masking is necessary,
* because of how the PM1 registers are defined in the ACPI specification:
*
* "Although the bits can be split between the two register blocks (each
* register block has a unique pointer within the FADT), the bit positions
* are maintained. The register block with unimplemented bits (that is,
* those implemented in the other register block) always returns zeros,
* and writes have no side effects"
*/
*value = (value_a | value_b);
return (AE_OK);
}

Expand Down Expand Up @@ -406,13 +414,20 @@ acpi_hw_write_multiple(u32 value,
return (status);
}

/* Second register is optional */

/*
* Second register is optional
*
* No bit shifting or clearing is necessary, because of how the PM1
* registers are defined in the ACPI specification:
*
* "Although the bits can be split between the two register blocks (each
* register block has a unique pointer within the FADT), the bit positions
* are maintained. The register block with unimplemented bits (that is,
* those implemented in the other register block) always returns zeros,
* and writes have no side effects"
*/
if (register_b->address) {

/* Normalize the B bits before write */

status = acpi_write(value >> register_a->bit_width, register_b);
status = acpi_write(value, register_b);
}

return (status);
Expand Down

0 comments on commit aefc7f9

Please sign in to comment.