summary refs log tree commit diff
path: root/drivers/acpi/ec.c
diff options
context:
space:
mode:
authorLuming Yu <luming.yu@intel.com>2005-03-19 01:54:47 -0500
committerLen Brown <len.brown@intel.com>2005-07-11 23:53:38 -0400
commitfa9cd547e097df4966b8bd5c94aeed953e32b14d (patch)
tree1f5fd7bf77154375fd337d4b98f2646cdc52fc9f /drivers/acpi/ec.c
parent451566f45a2e6cd10ba56e7220a9dd84ba3ef550 (diff)
downloadlinux-fa9cd547e097df4966b8bd5c94aeed953e32b14d.tar.gz
[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.c32
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);
 	}
-	
-
 }