|
|
@ -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,9 +62,12 @@ __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 |
|
|
|
int err; |
|
|
|
|
|
|
|
err = i2c_smbus_access(file, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data); |
|
|
|
if (err < 0) |
|
|
|
return err; |
|
|
|
|
|
|
|
return 0x0FF & data.byte; |
|
|
|
} |
|
|
|
|
|
|
@ -70,10 +80,13 @@ __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 |
|
|
|
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; |
|
|
|
} |
|
|
|
|
|
|
@ -88,10 +101,13 @@ __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 |
|
|
|
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; |
|
|
|
} |
|
|
|
|
|
|
@ -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 { |
|
|
|
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, |
|
|
|
|
|
|
|
err = i2c_smbus_access(file, I2C_SMBUS_READ, command, |
|
|
|
length == 32 ? I2C_SMBUS_I2C_BLOCK_BROKEN : |
|
|
|
I2C_SMBUS_I2C_BLOCK_DATA, &data)) |
|
|
|
return -1; |
|
|
|
else { |
|
|
|
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 { |
|
|
|
|
|
|
|
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]; |
|
|
|
} |
|
|
|
} |