diff options
author | Luming Yu <luming.yu@intel.com> | 2005-03-19 01:54:47 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2005-07-11 23:53:38 -0400 |
commit | fa9cd547e097df4966b8bd5c94aeed953e32b14d (patch) | |
tree | 1f5fd7bf77154375fd337d4b98f2646cdc52fc9f /drivers/acpi/ec.c | |
parent | 451566f45a2e6cd10ba56e7220a9dd84ba3ef550 (diff) | |
download | lwn-fa9cd547e097df4966b8bd5c94aeed953e32b14d.tar.gz lwn-fa9cd547e097df4966b8bd5c94aeed953e32b14d.zip |
[ACPI] fix EC access width
http://bugzilla.kernel.org/show_bug.cgi?id=4346
Written-by: David Shaohua Li and Luming Yu
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/ec.c')
-rw-r--r-- | drivers/acpi/ec.c | 32 |
1 files changed, 14 insertions, 18 deletions
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 69b04d430f00..e37162229342 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c @@ -600,7 +600,7 @@ acpi_ec_space_handler ( { int result = 0; struct acpi_ec *ec = NULL; - u32 temp = 0; + u64 temp = *value; acpi_integer f_v = 0; int i = 0; @@ -609,10 +609,9 @@ acpi_ec_space_handler ( if ((address > 0xFF) || !value || !handler_context) return_VALUE(AE_BAD_PARAMETER); - if(bit_width != 8) { + if (bit_width != 8 && acpi_strict) { printk(KERN_WARNING PREFIX "acpi_ec_space_handler: bit_width should be 8\n"); - if (acpi_strict) - return_VALUE(AE_BAD_PARAMETER); + return_VALUE(AE_BAD_PARAMETER); } ec = (struct acpi_ec *) handler_context; @@ -620,11 +619,11 @@ acpi_ec_space_handler ( next_byte: switch (function) { case ACPI_READ: - result = acpi_ec_read(ec, (u8) address, &temp); - *value = (acpi_integer) temp; + temp = 0; + result = acpi_ec_read(ec, (u8) address, (u32 *)&temp); break; case ACPI_WRITE: - result = acpi_ec_write(ec, (u8) address, (u8) *value); + result = acpi_ec_write(ec, (u8) address, (u8) temp); break; default: result = -EINVAL; @@ -633,19 +632,18 @@ next_byte: } bit_width -= 8; - if(bit_width){ - - if(function == ACPI_READ) - f_v |= (acpi_integer) (*value) << 8*i; - if(function == ACPI_WRITE) - (*value) >>=8; + if (bit_width) { + if (function == ACPI_READ) + f_v |= temp << 8 * i; + if (function == ACPI_WRITE) + temp >>= 8; i++; + (u8)address ++; goto next_byte; } - - if(function == ACPI_READ){ - f_v |= (acpi_integer) (*value) << 8*i; + if (function == ACPI_READ) { + f_v |= temp << 8 * i; *value = f_v; } @@ -664,8 +662,6 @@ out: default: return_VALUE(AE_OK); } - - } |