diff options
author | khali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0> | 2012-07-10 13:16:54 +0000 |
---|---|---|
committer | khali <khali@7894878c-1315-0410-8ee3-d5d059ff63e0> | 2012-07-10 13:16:54 +0000 |
commit | 42ddae3307ed34e2d4f5805ba6af60f76df3650c (patch) | |
tree | ba7fda2015ebeab6b00dfccbcce0a509010adb4f /lib | |
parent | ed76a0b28cc73bc2db2071f4ca406294bacf1661 (diff) | |
download | i2c-tools-42ddae3307ed34e2d4f5805ba6af60f76df3650c.tar.gz |
libi2c: Properly propagate real error codes on read errors
git-svn-id: http://lm-sensors.org/svn/i2c-tools/trunk@6058 7894878c-1315-0410-8ee3-d5d059ff63e0
Diffstat (limited to 'lib')
-rw-r--r-- | lib/smbus.c | 106 |
1 files changed, 63 insertions, 43 deletions
diff --git a/lib/smbus.c b/lib/smbus.c index 1d96879..d8471ac 100644 --- a/lib/smbus.c +++ b/lib/smbus.c @@ -3,6 +3,7 @@ Copyright (C) 1995-97 Simon G. Vogl Copyright (C) 1998-99 Frodo Looijaard <frodol@dds.nl> + Copyright (C) 2012 Jean Delvare <khali@linux-fr.org> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -20,6 +21,7 @@ MA 02110-1301 USA. */ +#include <errno.h> #include <i2c/smbus.h> #include <sys/ioctl.h> #include <linux/types.h> @@ -38,12 +40,17 @@ __s32 i2c_smbus_access(int file, char read_write, __u8 command, int size, union i2c_smbus_data *data) { struct i2c_smbus_ioctl_data args; + __s32 err; args.read_write = read_write; args.command = command; args.size = size; args.data = data; - return ioctl(file, I2C_SMBUS, &args); + + err = ioctl(file, I2C_SMBUS, &args); + if (err == -1) + err = -errno; + return err; } @@ -55,10 +62,13 @@ __s32 i2c_smbus_write_quick(int file, __u8 value) __s32 i2c_smbus_read_byte(int file) { union i2c_smbus_data data; - if (i2c_smbus_access(file, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data)) - return -1; - else - return 0x0FF & data.byte; + int err; + + err = i2c_smbus_access(file, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data); + if (err < 0) + return err; + + return 0x0FF & data.byte; } __s32 i2c_smbus_write_byte(int file, __u8 value) @@ -70,11 +80,14 @@ __s32 i2c_smbus_write_byte(int file, __u8 value) __s32 i2c_smbus_read_byte_data(int file, __u8 command) { union i2c_smbus_data data; - if (i2c_smbus_access(file, I2C_SMBUS_READ, command, - I2C_SMBUS_BYTE_DATA, &data)) - return -1; - else - return 0x0FF & data.byte; + int err; + + err = i2c_smbus_access(file, I2C_SMBUS_READ, command, + I2C_SMBUS_BYTE_DATA, &data); + if (err < 0) + return err; + + return 0x0FF & data.byte; } __s32 i2c_smbus_write_byte_data(int file, __u8 command, __u8 value) @@ -88,11 +101,14 @@ __s32 i2c_smbus_write_byte_data(int file, __u8 command, __u8 value) __s32 i2c_smbus_read_word_data(int file, __u8 command) { union i2c_smbus_data data; - if (i2c_smbus_access(file, I2C_SMBUS_READ, command, - I2C_SMBUS_WORD_DATA, &data)) - return -1; - else - return 0x0FFFF & data.word; + int err; + + err = i2c_smbus_access(file, I2C_SMBUS_READ, command, + I2C_SMBUS_WORD_DATA, &data); + if (err < 0) + return err; + + return 0x0FFFF & data.word; } __s32 i2c_smbus_write_word_data(int file, __u8 command, __u16 value) @@ -118,15 +134,16 @@ __s32 i2c_smbus_process_call(int file, __u8 command, __u16 value) __s32 i2c_smbus_read_block_data(int file, __u8 command, __u8 *values) { union i2c_smbus_data data; - int i; - if (i2c_smbus_access(file, I2C_SMBUS_READ, command, - I2C_SMBUS_BLOCK_DATA, &data)) - return -1; - else { - for (i = 1; i <= data.block[0]; i++) - values[i-1] = data.block[i]; - return data.block[0]; - } + int i, err; + + err = i2c_smbus_access(file, I2C_SMBUS_READ, command, + I2C_SMBUS_BLOCK_DATA, &data); + if (err < 0) + return err; + + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; } __s32 i2c_smbus_write_block_data(int file, __u8 command, __u8 length, @@ -151,20 +168,21 @@ __s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, __u8 length, __u8 *values) { union i2c_smbus_data data; - int i; + int i, err; if (length > 32) length = 32; data.block[0] = length; - if (i2c_smbus_access(file, I2C_SMBUS_READ, command, - length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN : - I2C_SMBUS_I2C_BLOCK_DATA, &data)) - return -1; - else { - for (i = 1; i <= data.block[0]; i++) - values[i-1] = data.block[i]; - return data.block[0]; - } + + err = i2c_smbus_access(file, I2C_SMBUS_READ, command, + length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN : + I2C_SMBUS_I2C_BLOCK_DATA, &data); + if (err < 0) + return err; + + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; } __s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, __u8 length, @@ -186,18 +204,20 @@ __s32 i2c_smbus_block_process_call(int file, __u8 command, __u8 length, __u8 *values) { union i2c_smbus_data data; - int i; + int i, err; + if (length > 32) length = 32; for (i = 1; i <= length; i++) data.block[i] = values[i-1]; data.block[0] = length; - if (i2c_smbus_access(file, I2C_SMBUS_WRITE, command, - I2C_SMBUS_BLOCK_PROC_CALL, &data)) - return -1; - else { - for (i = 1; i <= data.block[0]; i++) - values[i-1] = data.block[i]; - return data.block[0]; - } + + err = i2c_smbus_access(file, I2C_SMBUS_WRITE, command, + I2C_SMBUS_BLOCK_PROC_CALL, &data); + if (err < 0) + return err; + + for (i = 1; i <= data.block[0]; i++) + values[i-1] = data.block[i]; + return data.block[0]; } |