Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+12 −1
Original line number Original line Diff line number Diff line
@@ -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,
		}
		}
		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,
	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,
		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)
{
{
	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;