aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi
diff options
context:
space:
mode:
authorAlexey Starikovskiy <astarikovskiy@suse.de>2008-01-10 18:42:51 -0500
committerLen Brown <len.brown@intel.com>2008-01-10 20:49:14 -0500
commit3e71a87d03055de0b8c8e42aba758ee6494af083 (patch)
treea1fb6be330f06e82a1565ccbdd37a9db260dc756 /drivers/acpi
parentfd0b45dfd1858c6b49d06355a460bcf36d654c06 (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')
-rw-r--r--drivers/acpi/ec.c15
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) {