230 lines
6.3 KiB
Diff
230 lines
6.3 KiB
Diff
|
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)
|
||
|
+ 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_I2C_BLOCK_BROKEN, &data);
|
||
|
+}
|
||
|
+
|
||
|
+/* Returns the number of read bytes */
|
||
|
+static inline __s32 i2c_smbus_block_process_call(int file, __u8 command,
|
||
|
+ __u8 length, __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;
|
||
|
+ 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];
|
||
|
+ }
|
||
|
+}
|
||
|
+
|
||
|
+#endif /* LIB_I2C_SMBUS_H */
|