]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/i2c/i2c-core-acpi.c
Merge tag 'powerpc-4.20-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
[linux.git] / drivers / i2c / i2c-core-acpi.c
index 7c3b4740b94b644509ae3658fa2eda4885086bba..32affd3fa8bd1ffe462c5f66abd6b9e40ba6a36f 100644 (file)
@@ -453,8 +453,12 @@ static int acpi_gsb_i2c_read_bytes(struct i2c_client *client,
                else
                        dev_err(&client->adapter->dev, "i2c read %d bytes from client@%#x starting at reg %#x failed, error: %d\n",
                                data_len, client->addr, cmd, ret);
-       } else {
+       /* 2 transfers must have completed successfully */
+       } else if (ret == 2) {
                memcpy(data, buffer, data_len);
+               ret = 0;
+       } else {
+               ret = -EIO;
        }
 
        kfree(buffer);
@@ -482,11 +486,16 @@ static int acpi_gsb_i2c_write_bytes(struct i2c_client *client,
        msgs[0].buf = buffer;
 
        ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
-       if (ret < 0)
-               dev_err(&client->adapter->dev, "i2c write failed\n");
 
        kfree(buffer);
-       return ret;
+
+       if (ret < 0) {
+               dev_err(&client->adapter->dev, "i2c write failed: %d\n", ret);
+               return ret;
+       }
+
+       /* 1 transfer must have completed successfully */
+       return (ret == 1) ? 0 : -EIO;
 }
 
 static acpi_status
@@ -590,8 +599,6 @@ i2c_acpi_space_handler(u32 function, acpi_physical_address command,
                if (action == ACPI_READ) {
                        status = acpi_gsb_i2c_read_bytes(client, command,
                                        gsb->data, info->access_length);
-                       if (status > 0)
-                               status = 0;
                } else {
                        status = acpi_gsb_i2c_write_bytes(client, command,
                                        gsb->data, info->access_length);