Commit a05f2c5a authored by Prakash Mortha's avatar Prakash Mortha Committed by Jean Delvare

i2c-viapro: Add support for SMBus Process Call transactions

Add support for SMBus Process Call transactions. These are combined
word write, word read transactions.
Signed-off-by: default avatarPrakash Mortha <pmortha@escient.com>
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
parent 596c88f4
...@@ -83,6 +83,7 @@ static unsigned short SMBHSTCFG = 0xD2; ...@@ -83,6 +83,7 @@ static unsigned short SMBHSTCFG = 0xD2;
#define VT596_BYTE 0x04 #define VT596_BYTE 0x04
#define VT596_BYTE_DATA 0x08 #define VT596_BYTE_DATA 0x08
#define VT596_WORD_DATA 0x0C #define VT596_WORD_DATA 0x0C
#define VT596_PROC_CALL 0x10
#define VT596_BLOCK_DATA 0x14 #define VT596_BLOCK_DATA 0x14
#define VT596_I2C_BLOCK_DATA 0x34 #define VT596_I2C_BLOCK_DATA 0x34
...@@ -233,6 +234,12 @@ static s32 vt596_access(struct i2c_adapter *adap, u16 addr, ...@@ -233,6 +234,12 @@ static s32 vt596_access(struct i2c_adapter *adap, u16 addr,
} }
size = VT596_WORD_DATA; size = VT596_WORD_DATA;
break; break;
case I2C_SMBUS_PROC_CALL:
outb_p(command, SMBHSTCMD);
outb_p(data->word & 0xff, SMBHSTDAT0);
outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
size = VT596_PROC_CALL;
break;
case I2C_SMBUS_I2C_BLOCK_DATA: case I2C_SMBUS_I2C_BLOCK_DATA:
if (!(vt596_features & FEATURE_I2CBLOCK)) if (!(vt596_features & FEATURE_I2CBLOCK))
goto exit_unsupported; goto exit_unsupported;
...@@ -263,6 +270,9 @@ static s32 vt596_access(struct i2c_adapter *adap, u16 addr, ...@@ -263,6 +270,9 @@ static s32 vt596_access(struct i2c_adapter *adap, u16 addr,
if (status) if (status)
return status; return status;
if (size == VT596_PROC_CALL)
read_write = I2C_SMBUS_READ;
if ((read_write == I2C_SMBUS_WRITE) || (size == VT596_QUICK)) if ((read_write == I2C_SMBUS_WRITE) || (size == VT596_QUICK))
return 0; return 0;
...@@ -272,6 +282,7 @@ static s32 vt596_access(struct i2c_adapter *adap, u16 addr, ...@@ -272,6 +282,7 @@ static s32 vt596_access(struct i2c_adapter *adap, u16 addr,
data->byte = inb_p(SMBHSTDAT0); data->byte = inb_p(SMBHSTDAT0);
break; break;
case VT596_WORD_DATA: case VT596_WORD_DATA:
case VT596_PROC_CALL:
data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8); data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8);
break; break;
case VT596_I2C_BLOCK_DATA: case VT596_I2C_BLOCK_DATA:
...@@ -296,7 +307,7 @@ static u32 vt596_func(struct i2c_adapter *adapter) ...@@ -296,7 +307,7 @@ static u32 vt596_func(struct i2c_adapter *adapter)
{ {
u32 func = I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | u32 func = I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
I2C_FUNC_SMBUS_BLOCK_DATA; I2C_SMBUS_PROC_CALL | I2C_FUNC_SMBUS_BLOCK_DATA;
if (vt596_features & FEATURE_I2CBLOCK) if (vt596_features & FEATURE_I2CBLOCK)
func |= I2C_FUNC_SMBUS_I2C_BLOCK; func |= I2C_FUNC_SMBUS_I2C_BLOCK;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment