Exemplo n.º 1
0
static int i801_block_transaction_by_block(struct i801_priv *priv,
					   union i2c_smbus_data *data,
					   char read_write, int hwpec)
{
	int i, len;
	int status;

	inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */

	/* Use 32-byte buffer to process this transaction */
	if (read_write == I2C_SMBUS_WRITE) {
		len = data->block[0];
		outb_p(len, SMBHSTDAT0(priv));
		for (i = 0; i < len; i++)
			outb_p(data->block[i+1], SMBBLKDAT(priv));
	}

	status = i801_transaction(priv, I801_BLOCK_DATA |
				  (hwpec ? SMBHSTCNT_PEC_EN : 0));
	if (status)
		return status;

	if (read_write == I2C_SMBUS_READ) {
		len = inb_p(SMBHSTDAT0(priv));
		if (len < 1 || len > I2C_SMBUS_BLOCK_MAX)
			return -EPROTO;

		data->block[0] = len;
		for (i = 0; i < len; i++)
			data->block[i + 1] = inb_p(SMBBLKDAT(priv));
	}
	return 0;
}
Exemplo n.º 2
0
static int i801_block_transaction_by_block(union i2c_smbus_data *data,
                       char read_write, int hwpec)
{
    int i, len;

    inb_p(SMBHSTCNT); /* reset the data buffer index */

    /* Use 32-byte buffer to process this transaction */
    if (read_write == I2C_SMBUS_WRITE) {
        len = data->block[0];
        outb_p(len, SMBHSTDAT0);
        for (i = 0; i < len; i++)
            outb_p(data->block[i+1], SMBBLKDAT);
    }

    if (i801_transaction(I801_BLOCK_DATA | ENABLE_INT9 |
                 I801_PEC_EN * hwpec))
        return -1;

    if (read_write == I2C_SMBUS_READ) {
        len = inb_p(SMBHSTDAT0);
        if (len < 1 || len > I2C_SMBUS_BLOCK_MAX)
            return -1;

        data->block[0] = len;
        for (i = 0; i < len; i++)
            data->block[i + 1] = inb_p(SMBBLKDAT);
    }
    return 0;
}