Changes of Revision 6
[-] [+] | Added | i2c-tools-r6053-Add-smbus-header.patch |
@@ -0,0 +1,229 @@ +From dbabf68c5b04a85b6fb457c539f304a84cd62eef Mon Sep 17 00:00:00 2001 +From: Jean Delvare <khali@linux-fr.org> +Date: Mon, 21 May 2012 16:46:51 +0000 +Subject: [PATCH] Add header file missed from a previous commit. + +git-svn-id: http://lm-sensors.org/svn/i2c-tools/trunk@6053 7894878c-1315-0410-8ee3-d5d059ff63e0 +--- + include/i2c/smbus.h | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 212 insertions(+) + create mode 100644 include/i2c/smbus.h + +diff --git a/include/i2c/smbus.h b/include/i2c/smbus.h +new file mode 100644 +index 0000000..bf7ed37 +--- /dev/null ++++ b/include/i2c/smbus.h +@@ -0,0 +1,212 @@ ++/* ++ smbus.h - SMBus level access helper functions ++ ++ Copyright (C) 1995-97 Simon G. Vogl ++ Copyright (C) 1998-99 Frodo Looijaard <frodol@dds.nl> ++ ++ 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 ++ the Free Software Foundation; either version 2 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ++ MA 02110-1301 USA. ++*/ ++ ++#ifndef LIB_I2C_SMBUS_H ++#define LIB_I2C_SMBUS_H ++ ++#include <sys/ioctl.h> ++#include <linux/types.h> ++#include <linux/i2c.h> ++#include <linux/i2c-dev.h> ++ ++/* Compatibility defines */ ++#ifndef I2C_SMBUS_I2C_BLOCK_BROKEN ++#define I2C_SMBUS_I2C_BLOCK_BROKEN I2C_SMBUS_I2C_BLOCK_DATA ++#endif ++#ifndef I2C_FUNC_SMBUS_PEC ++#define I2C_FUNC_SMBUS_PEC I2C_FUNC_SMBUS_HWPEC_CALC ++#endif ++ ++static inline __s32 i2c_smbus_access(int file, char read_write, __u8 command, ++ int size, union i2c_smbus_data *data) ++{ ++ struct i2c_smbus_ioctl_data args; ++ ++ args.read_write = read_write; ++ args.command = command; ++ args.size = size; ++ args.data = data; ++ return ioctl(file, I2C_SMBUS, &args); ++} ++ ++ ++static inline __s32 i2c_smbus_write_quick(int file, __u8 value) ++{ ++ return i2c_smbus_access(file, value, 0, I2C_SMBUS_QUICK, NULL); ++} ++ ++static inline __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; ++} ++ ++static inline __s32 i2c_smbus_write_byte(int file, __u8 value) ++{ ++ return i2c_smbus_access(file, I2C_SMBUS_WRITE, value, ++ I2C_SMBUS_BYTE, NULL); ++} ++ ++static inline __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; ++} ++ ++static inline __s32 i2c_smbus_write_byte_data(int file, __u8 command, ++ __u8 value) ++{ ++ union i2c_smbus_data data; ++ data.byte = value; ++ return i2c_smbus_access(file, I2C_SMBUS_WRITE, command, ++ I2C_SMBUS_BYTE_DATA, &data); ++} ++ ++static inline __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; ++} ++ ++static inline __s32 i2c_smbus_write_word_data(int file, __u8 command, ++ __u16 value) ++{ ++ union i2c_smbus_data data; ++ data.word = value; ++ return i2c_smbus_access(file, I2C_SMBUS_WRITE, command, ++ I2C_SMBUS_WORD_DATA, &data); ++} ++ ++static inline __s32 i2c_smbus_process_call(int file, __u8 command, __u16 value) ++{ ++ union i2c_smbus_data data; ++ data.word = value; ++ if (i2c_smbus_access(file, I2C_SMBUS_WRITE, command, ++ I2C_SMBUS_PROC_CALL, &data)) ++ return -1; ++ else ++ return 0x0FFFF & data.word; ++} ++ ++ ++/* Returns the number of read bytes */ ++static inline __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]; ++ } ++} ++ ++static inline __s32 i2c_smbus_write_block_data(int file, __u8 command, ++ __u8 length, const __u8 *values) ++{ ++ union i2c_smbus_data data; ++ int i; ++ if (length > 32) ++ length = 32; ++ for (i = 1; i <= length; i++) ++ data.block[i] = values[i-1]; ++ data.block[0] = length; ++ return i2c_smbus_access(file, I2C_SMBUS_WRITE, command, ++ I2C_SMBUS_BLOCK_DATA, &data); ++} ++ ++/* Returns the number of read bytes */ ++/* Until kernel 2.6.22, the length is hardcoded to 32 bytes. If you ++ ask for less than 32 bytes, your code will only work with kernels ++ 2.6.23 and later. */ ++static inline __s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, ++ __u8 length, __u8 *values) ++{ ++ union i2c_smbus_data data; ++ int i; ++ ++ 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]; ++ } ++} ++ ++static inline __s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, ++ __u8 length, ++ const __u8 *values) ++{ ++ union i2c_smbus_data data; ++ int i; ++ if (length > 32) |