diff options
author | Alexey Starikovskiy <astarikovskiy@suse.de> | 2008-01-10 18:42:51 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2008-01-10 20:49:14 -0500 |
commit | 3e71a87d03055de0b8c8e42aba758ee6494af083 (patch) | |
tree | a1fb6be330f06e82a1565ccbdd37a9db260dc756 /drivers/acpi/ec.c | |
parent | fd0b45dfd1858c6b49d06355a460bcf36d654c06 (diff) |
ACPI: EC: Do the byte access with a fast path
Specification allows only byte access for EC region, so
make it separate from bug-compatible multi-byte access.
Also do not allow return of garbage in supplied *value.
Reference: http://bugzilla.kernel.org/show_bug.cgi?id=9341
Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/ec.c')
-rw-r--r-- | drivers/acpi/ec.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index d411017f8c06..63862dfe347b 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -563,7 +563,7 @@ acpi_ec_space_handler(u32 function, acpi_physical_address address, | |||
563 | void *handler_context, void *region_context) | 563 | void *handler_context, void *region_context) |
564 | { | 564 | { |
565 | struct acpi_ec *ec = handler_context; | 565 | struct acpi_ec *ec = handler_context; |
566 | int result = 0, i = 0; | 566 | int result = 0, i; |
567 | u8 temp = 0; | 567 | u8 temp = 0; |
568 | 568 | ||
569 | if ((address > 0xFF) || !value || !handler_context) | 569 | if ((address > 0xFF) || !value || !handler_context) |
@@ -575,7 +575,16 @@ acpi_ec_space_handler(u32 function, acpi_physical_address address, | |||
575 | if (bits != 8 && acpi_strict) | 575 | if (bits != 8 && acpi_strict) |
576 | return AE_BAD_PARAMETER; | 576 | return AE_BAD_PARAMETER; |
577 | 577 | ||
578 | while (bits - i > 0) { | 578 | if (function == ACPI_READ) { |
579 | result = acpi_ec_read(ec, address, &temp); | ||
580 | *value = temp; | ||
581 | } else { | ||
582 | temp = 0xff & (*value); | ||
583 | result = acpi_ec_write(ec, address, temp); | ||
584 | } | ||
585 | |||
586 | for (i = 8; unlikely(bits - i > 0); i += 8) { | ||
587 | ++address; | ||
579 | if (function == ACPI_READ) { | 588 | if (function == ACPI_READ) { |
580 | result = acpi_ec_read(ec, address, &temp); | 589 | result = acpi_ec_read(ec, address, &temp); |
581 | (*value) |= ((acpi_integer)temp) << i; | 590 | (*value) |= ((acpi_integer)temp) << i; |
@@ -583,8 +592,6 @@ acpi_ec_space_handler(u32 function, acpi_physical_address address, | |||
583 | temp = 0xff & ((*value) >> i); | 592 | temp = 0xff & ((*value) >> i); |
584 | result = acpi_ec_write(ec, address, temp); | 593 | result = acpi_ec_write(ec, address, temp); |
585 | } | 594 | } |
586 | i += 8; | ||
587 | ++address; | ||
588 | } | 595 | } |
589 | 596 | ||
590 | switch (result) { | 597 | switch (result) { |